From 1a318e770de577fe8aa4711d80d587770f305a9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Apr 2022 23:24:24 +0000 Subject: [PATCH 001/100] Bump codecov/codecov-action from 2 to 3 Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 2 to 3. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v2...v3) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/test-python.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-python.yml b/.github/workflows/test-python.yml index c9f3c09..a2fc608 100644 --- a/.github/workflows/test-python.yml +++ b/.github/workflows/test-python.yml @@ -78,7 +78,7 @@ jobs: coverage report - name: Upload coverage report to Codecov - uses: codecov/codecov-action@v2 + uses: codecov/codecov-action@v3 with: file: ${{ env.COVERAGE_DATA_FILENAME }} fail_ci_if_error: true From 9c97ed351e5091afd956d53bc46e2240b5a65bfc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Apr 2022 23:25:32 +0000 Subject: [PATCH 002/100] Bump actions/download-artifact from 2 to 3 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 2 to 3. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/sync-labels.yml | 2 +- .github/workflows/test-integration.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 28d0397..5ee9592 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -109,7 +109,7 @@ jobs: uses: actions/checkout@v3 - name: Download configuration files artifact - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: ${{ env.CONFIGURATIONS_ARTIFACT }} path: ${{ env.CONFIGURATIONS_FOLDER }} diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 943d811..be9bf3f 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -213,7 +213,7 @@ jobs: uses: actions/checkout@v3 - name: Download sketches reports artifact - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: ${{ needs.all-inputs.outputs.report-artifact-name }} path: ${{ env.SKETCHES_REPORTS_PATH }} From 91fe0e05226c46fcf3c05173de6065d920d40f22 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Apr 2022 23:25:34 +0000 Subject: [PATCH 003/100] Bump actions/upload-artifact from 2 to 3 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/sync-labels.yml | 2 +- .github/workflows/test-integration.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 28d0397..6081b1a 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -71,7 +71,7 @@ jobs: file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/${{ matrix.filename }} - name: Pass configuration files to next job via workflow artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: path: | *.yaml diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 943d811..97e224c 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -105,7 +105,7 @@ jobs: echo "::set-output name=report-artifact-name::${{ github.job }}" - name: Save sketches report as workflow artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: path: sketches-reports name: ${{ steps.report-artifact-name.outputs.report-artifact-name }} From f91d19204f55568242c9cc17d73d75114aa07abe Mon Sep 17 00:00:00 2001 From: Brendan <2bndy5@gmail.com> Date: Mon, 18 Apr 2022 15:03:03 -0700 Subject: [PATCH 004/100] output compilation time for each sketch (#61) --- compilesketches/compilesketches.py | 13 ++++++++++++- compilesketches/tests/test_compilesketches.py | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index 1be7b97..a9ec404 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -1,4 +1,5 @@ import atexit +import time import contextlib import enum import json @@ -893,9 +894,11 @@ def compile_sketch(self, sketch_path, clean_build_cache): if clean_build_cache: for cache_path in pathlib.Path("/tmp").glob(pattern="arduino*"): shutil.rmtree(path=cache_path) - + start_time = time.monotonic() compilation_data = self.run_arduino_cli_command( command=compilation_command, enable_output=self.RunCommandOutput.NONE, exit_on_failure=False) + diff_time = time.monotonic() - start_time + # Group compilation output to make the log easy to read # https://github.com/actions/toolkit/blob/master/docs/commands.md#group-and-ungroup-log-lines print("::group::Compiling sketch:", path_relative_to_workspace(path=sketch_path)) @@ -909,6 +912,14 @@ class CompilationResult: if not CompilationResult.success: print("::error::Compilation failed") + else: + time_summary = "" + if diff_time > 60: + if diff_time > 360: + time_summary += f"{int(diff_time / 360)}h " + time_summary += f"{int(diff_time / 60) % 60}m " + time_summary += f"{int(diff_time) % 60}s" + print("Compilation time elapsed:", time_summary) return CompilationResult() diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index 8074f2f..60b713d 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -1439,6 +1439,8 @@ class CompilationData: ) if not expected_success: expected_stdout += "\n::error::Compilation failed" + else: + expected_stdout += "\nCompilation time elapsed: 0s" assert capsys.readouterr().out.strip() == expected_stdout assert compilation_result.sketch == sketch_path From ec0ade171c9b439499c8616c9bfcd9e6748d4300 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Apr 2022 23:14:43 +0000 Subject: [PATCH 005/100] Bump pytest from 7.1.1 to 7.1.2 in /compilesketches Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.1.1 to 7.1.2. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.1.1...7.1.2) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 2b735ea..263065a 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt coverage==6.3.2 -pytest==7.1.1 +pytest==7.1.2 pytest-mock==3.7.0 From b7c0e75a3671b378e678fc6d374b6a94c55fac17 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 11 May 2022 00:31:35 -0700 Subject: [PATCH 006/100] Use form-based issue templates High quality feedback via GitHub issues is a very valuable contribution to the project. It is important to make the issue creation and management process as efficient as possible for the contributors, maintainers, and developers. Issue templates are helpful to the maintainers and developers because it establishes a standardized framework for the issues and encourages the contributors to provide the essential information. The contributor is now presented with a web form when creating an issue. This consists of multi-line input fields that have the same formatting, preview, and attachment capabilities as the standard GitHub Issue composer, in addition to menus and checkboxes where appropriate. The use of this form-based system should provide a much better experience for the contributors and also result in higher quality issues by establishing a standardized framework for the issues and encouraging contributors to provide the essential information. A template chooser allows the contributor to select the appropriate template type, redirects support requests to the appropriate communication channels via "Contact Links", and provides a prominent link to security policy to guide any vulnerability disclosures. The clear separation of the types of issues encourages the reporter to fit their report into a specific issue category, resulting in more clarity. Automatic labeling according to template choice allows the reporter to do the initial classification. --- .github/ISSUE_TEMPLATE/bug-report.yml | 56 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 17 +++++++ .github/ISSUE_TEMPLATE/feature-request.yml | 51 ++++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000..ef1e427 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,56 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/issue-templates/forms/general/bug-report.yml +# See: https://docs.github.com/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms + +name: Bug report +description: Report a problem with the code or documentation in this repository. +labels: + - "type: imperfection" +body: + - type: textarea + id: description + attributes: + label: Describe the problem + validations: + required: true + - type: textarea + id: reproduce + attributes: + label: To reproduce + description: Provide the specific set of steps we can follow to reproduce the problem. + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected behavior + description: What would you expect to happen after following those instructions? + validations: + required: true + - type: input + id: project-version + attributes: + label: "'arduino/compile-sketches' version" + description: | + Which version of `arduino/compile-sketches` are you using? + _This should be the most recent version available._ + validations: + required: true + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any additional information here. + validations: + required: false + - type: checkboxes + id: checklist + attributes: + label: Issue checklist + description: Please double-check that you have done each of the following things before submitting the issue. + options: + - label: I searched for previous reports in [the issue tracker](https://github.com/arduino/compile-sketches/issues?q=) + required: true + - label: I verified the problem still occurs when using the latest version + required: true + - label: My report contains all necessary details + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..137d89e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,17 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/issue-templates/template-choosers/github-actions/config.yml +# See: https://docs.github.com/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#configuring-the-template-chooser + +blank_issues_enabled: false +contact_links: + - name: Learn about using this project + url: https://github.com/arduino/compile-sketches#readme + about: Detailed usage documentation is available here. + - name: Learn about GitHub Actions + url: https://docs.github.com/actions + about: Everything you need to know to get started with GitHub Actions. + - name: Support request + url: https://forum.arduino.cc/ + about: We can help you out on the Arduino Forum! + - name: Discuss development work on the project + url: https://groups.google.com/a/arduino.cc/g/developers + about: Arduino Developers Mailing List diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 0000000..63fe618 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,51 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/issue-templates/forms/general/bug-report.yml +# See: https://docs.github.com/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms + +name: Feature request +description: Suggest an enhancement to this project. +labels: + - "type: enhancement" +body: + - type: textarea + id: description + attributes: + label: Describe the request + validations: + required: true + - type: textarea + id: current + attributes: + label: Describe the current behavior + description: | + What is the current behavior of `arduino/compile-sketches` in relation to your request? + How can we reproduce that behavior? + validations: + required: true + - type: input + id: project-version + attributes: + label: "'arduino/compile-sketches' version" + description: | + Which version of `arduino/compile-sketches` are you using? + _This should be the most recent version available._ + validations: + required: true + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any additional information here. + validations: + required: false + - type: checkboxes + id: checklist + attributes: + label: Issue checklist + description: Please double-check that you have done each of the following things before submitting the issue. + options: + - label: I searched for previous requests in [the issue tracker](https://github.com/arduino/compile-sketches/issues?q=) + required: true + - label: I verified the feature was still missing when using the latest version + required: true + - label: My request contains all necessary details + required: true From 91de5b9dbf147a58a7ad1fad1b4e81665388e68f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 May 2022 23:11:32 +0000 Subject: [PATCH 007/100] Bump coverage from 6.3.2 to 6.3.3 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 6.3.2 to 6.3.3. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/6.3.2...6.3.3) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 263065a..5e3a54e 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==6.3.2 +coverage==6.3.3 pytest==7.1.2 pytest-mock==3.7.0 From ba02745aa7c185578d167b0b5e5ebce49650b5ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 May 2022 23:21:18 +0000 Subject: [PATCH 008/100] Bump coverage from 6.3.3 to 6.4 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 6.3.3 to 6.4. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/6.3.3...6.4) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 5e3a54e..d9108fe 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==6.3.3 +coverage==6.4 pytest==7.1.2 pytest-mock==3.7.0 From a53e48fdc4132f1f1a7ecbf8a066749441bc7901 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Jun 2022 01:16:22 +0000 Subject: [PATCH 009/100] Bump coverage from 6.4 to 6.4.1 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 6.4 to 6.4.1. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/6.4...6.4.1) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index d9108fe..33843c7 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==6.4 +coverage==6.4.1 pytest==7.1.2 pytest-mock==3.7.0 From 0d1682d6822bffd1acdd4befcd91c505740fbdaf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Jun 2022 23:10:43 +0000 Subject: [PATCH 010/100] Bump pytest-mock from 3.7.0 to 3.8.1 in /compilesketches Bumps [pytest-mock](https://github.com/pytest-dev/pytest-mock) from 3.7.0 to 3.8.1. - [Release notes](https://github.com/pytest-dev/pytest-mock/releases) - [Changelog](https://github.com/pytest-dev/pytest-mock/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest-mock/compare/v3.7.0...v3.8.1) --- updated-dependencies: - dependency-name: pytest-mock dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 33843c7..53ace10 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt coverage==6.4.1 pytest==7.1.2 -pytest-mock==3.7.0 +pytest-mock==3.8.1 From c91180a1e537f5129076cdb0acdcae9c7007c974 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 23:19:35 +0000 Subject: [PATCH 011/100] Bump pytest-mock from 3.8.1 to 3.8.2 in /compilesketches Bumps [pytest-mock](https://github.com/pytest-dev/pytest-mock) from 3.8.1 to 3.8.2. - [Release notes](https://github.com/pytest-dev/pytest-mock/releases) - [Changelog](https://github.com/pytest-dev/pytest-mock/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest-mock/compare/v3.8.1...v3.8.2) --- updated-dependencies: - dependency-name: pytest-mock dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 53ace10..d962a05 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt coverage==6.4.1 pytest==7.1.2 -pytest-mock==3.8.1 +pytest-mock==3.8.2 From 2bb0c8c1812f3c16bb8e998957564bdf249f890c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Jul 2022 23:09:26 +0000 Subject: [PATCH 012/100] Bump coverage from 6.4.1 to 6.4.2 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 6.4.1 to 6.4.2. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/6.4.1...6.4.2) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index d962a05..ea72093 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==6.4.1 +coverage==6.4.2 pytest==7.1.2 pytest-mock==3.8.2 From 39241f6d010c31c7ed0414aa2346d1f1f6cf5f7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Aug 2022 23:13:24 +0000 Subject: [PATCH 013/100] Bump coverage from 6.4.2 to 6.4.3 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 6.4.2 to 6.4.3. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/6.4.2...6.4.3) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index ea72093..9e124f5 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==6.4.2 +coverage==6.4.3 pytest==7.1.2 pytest-mock==3.8.2 From 88506f0fe70aeacbacb67e2e4594d8ad452afb93 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Aug 2022 23:12:35 +0000 Subject: [PATCH 014/100] Bump coverage from 6.4.3 to 6.4.4 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 6.4.3 to 6.4.4. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/6.4.3...6.4.4) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 9e124f5..fdb2ed4 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==6.4.3 +coverage==6.4.4 pytest==7.1.2 pytest-mock==3.8.2 From 1d023b9c352afd6f37a4a54a4f7dfbd4de59ca77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 3 Sep 2022 00:23:06 +0000 Subject: [PATCH 015/100] Bump pytest from 7.1.2 to 7.1.3 in /compilesketches Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.1.2 to 7.1.3. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.1.2...7.1.3) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index fdb2ed4..49dcc2a 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt coverage==6.4.4 -pytest==7.1.2 +pytest==7.1.3 pytest-mock==3.8.2 From 600413495d84e2e2372ce1d953dd55baced46051 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Sep 2022 23:18:41 +0000 Subject: [PATCH 016/100] Bump pytest-mock from 3.8.2 to 3.9.0 in /compilesketches Bumps [pytest-mock](https://github.com/pytest-dev/pytest-mock) from 3.8.2 to 3.9.0. - [Release notes](https://github.com/pytest-dev/pytest-mock/releases) - [Changelog](https://github.com/pytest-dev/pytest-mock/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest-mock/compare/v3.8.2...v3.9.0) --- updated-dependencies: - dependency-name: pytest-mock dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 49dcc2a..e430f93 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt coverage==6.4.4 pytest==7.1.3 -pytest-mock==3.8.2 +pytest-mock==3.9.0 From 231dc97e2b52328531afb7b1252bbd25d137d70b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Sep 2022 23:16:37 +0000 Subject: [PATCH 017/100] Bump coverage from 6.4.4 to 6.5.0 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 6.4.4 to 6.5.0. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/6.4.4...6.5.0) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index e430f93..e41ca90 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==6.4.4 +coverage==6.5.0 pytest==7.1.3 pytest-mock==3.9.0 From 00ae1030af349cf1ebb58fbdf1dae311e30a3b9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Oct 2022 23:19:47 +0000 Subject: [PATCH 018/100] Bump pytest-mock from 3.9.0 to 3.10.0 in /compilesketches Bumps [pytest-mock](https://github.com/pytest-dev/pytest-mock) from 3.9.0 to 3.10.0. - [Release notes](https://github.com/pytest-dev/pytest-mock/releases) - [Changelog](https://github.com/pytest-dev/pytest-mock/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest-mock/compare/v3.9.0...v3.10.0) --- updated-dependencies: - dependency-name: pytest-mock dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index e41ca90..48399de 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt coverage==6.5.0 pytest==7.1.3 -pytest-mock==3.9.0 +pytest-mock==3.10.0 From 97e92a1c495b6fa09fe74ff03d7112729785c313 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Oct 2022 23:16:18 +0000 Subject: [PATCH 019/100] Bump gitpython from 3.1.27 to 3.1.28 in /compilesketches Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.27 to 3.1.28. - [Release notes](https://github.com/gitpython-developers/GitPython/releases) - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES) - [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.27...3.1.28) --- updated-dependencies: - dependency-name: gitpython dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/requirements.txt b/compilesketches/requirements.txt index 903b19b..38609d7 100644 --- a/compilesketches/requirements.txt +++ b/compilesketches/requirements.txt @@ -1,4 +1,4 @@ -GitPython==3.1.27 +GitPython==3.1.28 PyGithub==1.55 PyYAML==6.0 semver==2.13.0 From f7d5e600d597f5c0f88666a3e91d3bf9567aedc8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Oct 2022 23:10:33 +0000 Subject: [PATCH 020/100] Bump gitpython from 3.1.28 to 3.1.29 in /compilesketches Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.28 to 3.1.29. - [Release notes](https://github.com/gitpython-developers/GitPython/releases) - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES) - [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.28...3.1.29) --- updated-dependencies: - dependency-name: gitpython dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/requirements.txt b/compilesketches/requirements.txt index 38609d7..736ec02 100644 --- a/compilesketches/requirements.txt +++ b/compilesketches/requirements.txt @@ -1,4 +1,4 @@ -GitPython==3.1.28 +GitPython==3.1.29 PyGithub==1.55 PyYAML==6.0 semver==2.13.0 From b979ca6381e49aabdbcbaff5d4bd57743bbd554d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Oct 2022 23:18:23 +0000 Subject: [PATCH 021/100] Bump geekyeggo/delete-artifact from 1 to 2 Bumps [geekyeggo/delete-artifact](https://github.com/geekyeggo/delete-artifact) from 1 to 2. - [Release notes](https://github.com/geekyeggo/delete-artifact/releases) - [Commits](https://github.com/geekyeggo/delete-artifact/compare/v1...v2) --- updated-dependencies: - dependency-name: geekyeggo/delete-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/sync-labels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 9ce51aa..4376e4c 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -115,7 +115,7 @@ jobs: path: ${{ env.CONFIGURATIONS_FOLDER }} - name: Remove unneeded artifact - uses: geekyeggo/delete-artifact@v1 + uses: geekyeggo/delete-artifact@v2 with: name: ${{ env.CONFIGURATIONS_ARTIFACT }} From 30dc432c8ca4bc025f7974bcf1a24013019d3f4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Oct 2022 23:09:13 +0000 Subject: [PATCH 022/100] Bump pygithub from 1.55 to 1.56 in /compilesketches Bumps [pygithub](https://github.com/pygithub/pygithub) from 1.55 to 1.56. - [Release notes](https://github.com/pygithub/pygithub/releases) - [Changelog](https://github.com/PyGithub/PyGithub/blob/master/doc/changes.rst) - [Commits](https://github.com/pygithub/pygithub/compare/v1.55...v1.56) --- updated-dependencies: - dependency-name: pygithub dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- compilesketches/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/requirements.txt b/compilesketches/requirements.txt index 736ec02..21230a7 100644 --- a/compilesketches/requirements.txt +++ b/compilesketches/requirements.txt @@ -1,4 +1,4 @@ GitPython==3.1.29 -PyGithub==1.55 +PyGithub==1.56 PyYAML==6.0 semver==2.13.0 From 0a28cac412177d1b9bb1157df54b3a4c1cfe26e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Oct 2022 23:31:30 +0000 Subject: [PATCH 023/100] Bump carlosperate/download-file-action from 1 to 2 Bumps [carlosperate/download-file-action](https://github.com/carlosperate/download-file-action) from 1 to 2. - [Release notes](https://github.com/carlosperate/download-file-action/releases) - [Commits](https://github.com/carlosperate/download-file-action/compare/v1...v2) --- updated-dependencies: - dependency-name: carlosperate/download-file-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/sync-labels.yml | 4 ++-- .github/workflows/validate-action_yml.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 4376e4c..70085bd 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -31,7 +31,7 @@ jobs: - name: Download JSON schema for labels configuration file id: download-schema - uses: carlosperate/download-file-action@v1 + uses: carlosperate/download-file-action@v2 with: file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/arduino-tooling-gh-label-configuration-schema.json location: ${{ runner.temp }}/label-configuration-schema @@ -66,7 +66,7 @@ jobs: steps: - name: Download - uses: carlosperate/download-file-action@v1 + uses: carlosperate/download-file-action@v2 with: file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/${{ matrix.filename }} diff --git a/.github/workflows/validate-action_yml.yml b/.github/workflows/validate-action_yml.yml index 21068a6..5bd70f1 100644 --- a/.github/workflows/validate-action_yml.yml +++ b/.github/workflows/validate-action_yml.yml @@ -32,7 +32,7 @@ jobs: # See: https://github.com/carlosperate/download-file-action/blob/master/README.md - name: Download JSON schema for action.yml - uses: carlosperate/download-file-action@v1 + uses: carlosperate/download-file-action@v2 with: # See: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/github-action.json file-url: https://json.schemastore.org/github-action From 8917a6920629af70b34bb40630aab4c3852f1587 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Oct 2022 23:11:00 +0000 Subject: [PATCH 024/100] Bump pytest from 7.1.3 to 7.2.0 in /compilesketches Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.1.3 to 7.2.0. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.1.3...7.2.0) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 48399de..f28aae9 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt coverage==6.5.0 -pytest==7.1.3 +pytest==7.2.0 pytest-mock==3.10.0 From dadea195db4127b3a3ebbf7209e27a797ba93c74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Nov 2022 23:12:57 +0000 Subject: [PATCH 025/100] Bump pygithub from 1.56 to 1.57 in /compilesketches Bumps [pygithub](https://github.com/pygithub/pygithub) from 1.56 to 1.57. - [Release notes](https://github.com/pygithub/pygithub/releases) - [Changelog](https://github.com/PyGithub/PyGithub/blob/master/doc/changes.rst) - [Commits](https://github.com/pygithub/pygithub/compare/v1.56...v1.57) --- updated-dependencies: - dependency-name: pygithub dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- compilesketches/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/requirements.txt b/compilesketches/requirements.txt index 21230a7..025a82f 100644 --- a/compilesketches/requirements.txt +++ b/compilesketches/requirements.txt @@ -1,4 +1,4 @@ GitPython==3.1.29 -PyGithub==1.56 +PyGithub==1.57 PyYAML==6.0 semver==2.13.0 From fce3c5669c8418592efd6f2788564041591b52f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Dec 2022 23:02:35 +0000 Subject: [PATCH 026/100] Bump coverage from 6.5.0 to 7.0.0 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 6.5.0 to 7.0.0. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/6.5.0...7.0.0) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index f28aae9..ccda39d 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==6.5.0 +coverage==7.0.0 pytest==7.2.0 pytest-mock==3.10.0 From 974b38cbae598ae5f304d6ed0c3bfa0ccc12c75c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Dec 2022 23:02:49 +0000 Subject: [PATCH 027/100] Bump coverage from 7.0.0 to 7.0.1 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.0.0 to 7.0.1. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.0.0...7.0.1) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index ccda39d..345048e 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==7.0.0 +coverage==7.0.1 pytest==7.2.0 pytest-mock==3.10.0 From af1f939b662a82ee6574a527372d8abc6d4c7c9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Dec 2022 23:02:21 +0000 Subject: [PATCH 028/100] Bump gitpython from 3.1.29 to 3.1.30 in /compilesketches Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.29 to 3.1.30. - [Release notes](https://github.com/gitpython-developers/GitPython/releases) - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES) - [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.29...3.1.30) --- updated-dependencies: - dependency-name: gitpython dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/requirements.txt b/compilesketches/requirements.txt index 025a82f..79e42ae 100644 --- a/compilesketches/requirements.txt +++ b/compilesketches/requirements.txt @@ -1,4 +1,4 @@ -GitPython==3.1.29 +GitPython==3.1.30 PyGithub==1.57 PyYAML==6.0 semver==2.13.0 From ec3a55e0b5739c849c6ada08376e8ce53fe1ab69 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jan 2023 23:02:50 +0000 Subject: [PATCH 029/100] Bump coverage from 7.0.1 to 7.0.2 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.0.1 to 7.0.2. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.0.1...7.0.2) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 345048e..0c7cbfa 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==7.0.1 +coverage==7.0.2 pytest==7.2.0 pytest-mock==3.10.0 From c1c6284990d3d175dfe409e9138bf59db98e215e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Jan 2023 23:02:30 +0000 Subject: [PATCH 030/100] Bump coverage from 7.0.2 to 7.0.3 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.0.2 to 7.0.3. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.0.2...7.0.3) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 0c7cbfa..b419178 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==7.0.2 +coverage==7.0.3 pytest==7.2.0 pytest-mock==3.10.0 From 6ee2300b412f81219048a4e59ffb562cda988dda Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Jan 2023 23:06:12 +0000 Subject: [PATCH 031/100] Bump coverage from 7.0.3 to 7.0.4 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.0.3 to 7.0.4. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.0.3...7.0.4) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index b419178..8d676e2 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==7.0.3 +coverage==7.0.4 pytest==7.2.0 pytest-mock==3.10.0 From 7c5b5c5f88ee3e06ea9d7e0531542f9ce649b1c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jan 2023 23:02:22 +0000 Subject: [PATCH 032/100] Bump coverage from 7.0.4 to 7.0.5 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.0.4 to 7.0.5. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.0.4...7.0.5) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 8d676e2..4a0c19f 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==7.0.4 +coverage==7.0.5 pytest==7.2.0 pytest-mock==3.10.0 From c6d56e35eed28c3308da4607894a030a27421558 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Jan 2023 23:02:59 +0000 Subject: [PATCH 033/100] Bump pytest from 7.2.0 to 7.2.1 in /compilesketches Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.2.0 to 7.2.1. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.2.0...7.2.1) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 4a0c19f..009810d 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt coverage==7.0.5 -pytest==7.2.0 +pytest==7.2.1 pytest-mock==3.10.0 From e1fd7b17bf61d16be1f05ecc17f79380cd208061 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Jan 2023 23:03:16 +0000 Subject: [PATCH 034/100] Bump coverage from 7.0.5 to 7.1.0 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.0.5 to 7.1.0. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.0.5...7.1.0) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 009810d..bee3509 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==7.0.5 +coverage==7.1.0 pytest==7.2.1 pytest-mock==3.10.0 From c2fc943a2523188fa46ca404635c03c427c15e74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Feb 2023 23:58:01 +0000 Subject: [PATCH 035/100] Bump gitpython from 3.1.30 to 3.1.31 in /compilesketches Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.30 to 3.1.31. - [Release notes](https://github.com/gitpython-developers/GitPython/releases) - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES) - [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.30...3.1.31) --- updated-dependencies: - dependency-name: gitpython dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/requirements.txt b/compilesketches/requirements.txt index 79e42ae..f5772a9 100644 --- a/compilesketches/requirements.txt +++ b/compilesketches/requirements.txt @@ -1,4 +1,4 @@ -GitPython==3.1.30 +GitPython==3.1.31 PyGithub==1.57 PyYAML==6.0 semver==2.13.0 From d0f51eb7ea504b3c5b47cd6c2be43c83c37af244 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Feb 2023 23:58:37 +0000 Subject: [PATCH 036/100] Bump pygithub from 1.57 to 1.58.0 in /compilesketches Bumps [pygithub](https://github.com/pygithub/pygithub) from 1.57 to 1.58.0. - [Release notes](https://github.com/pygithub/pygithub/releases) - [Changelog](https://github.com/PyGithub/PyGithub/blob/master/doc/changes.rst) - [Commits](https://github.com/pygithub/pygithub/compare/v1.57...v1.58.0) --- updated-dependencies: - dependency-name: pygithub dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- compilesketches/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/requirements.txt b/compilesketches/requirements.txt index f5772a9..9f3dbe6 100644 --- a/compilesketches/requirements.txt +++ b/compilesketches/requirements.txt @@ -1,4 +1,4 @@ GitPython==3.1.31 -PyGithub==1.57 +PyGithub==1.58.0 PyYAML==6.0 semver==2.13.0 From b2f6689b5f9ecd7cad5d0d10fa201a080c8f3266 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Feb 2023 23:57:37 +0000 Subject: [PATCH 037/100] Bump coverage from 7.1.0 to 7.2.0 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.1.0 to 7.2.0. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.1.0...7.2.0) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index bee3509..4dad380 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==7.1.0 +coverage==7.2.0 pytest==7.2.1 pytest-mock==3.10.0 From ff721ab913d150473b9f0ba4d84f97f721a9c24c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Feb 2023 23:59:28 +0000 Subject: [PATCH 038/100] Bump coverage from 7.2.0 to 7.2.1 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.2.0 to 7.2.1. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.2.0...7.2.1) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 4dad380..809b044 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==7.2.0 +coverage==7.2.1 pytest==7.2.1 pytest-mock==3.10.0 From 7defa3591a5eb0d91f58e94309d0c26d189062eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Mar 2023 23:57:54 +0000 Subject: [PATCH 039/100] Bump pytest from 7.2.1 to 7.2.2 in /compilesketches Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.2.1 to 7.2.2. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.2.1...7.2.2) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 809b044..1b13a2c 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt coverage==7.2.1 -pytest==7.2.1 +pytest==7.2.2 pytest-mock==3.10.0 From f18b23ba47f40e7630d3978a1a889626e6a1d662 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 23:57:36 +0000 Subject: [PATCH 040/100] Bump coverage from 7.2.1 to 7.2.2 in /compilesketches Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.2.1 to 7.2.2. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.2.1...7.2.2) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- compilesketches/tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt index 1b13a2c..6c35044 100644 --- a/compilesketches/tests/requirements.txt +++ b/compilesketches/tests/requirements.txt @@ -1,4 +1,4 @@ --requirement ../requirements.txt -coverage==7.2.1 +coverage==7.2.2 pytest==7.2.2 pytest-mock==3.10.0 From a86705ba8929e40ca94723194be1711ca940267c Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 16 Mar 2023 15:59:08 -0700 Subject: [PATCH 041/100] Use `actions/setup-python` action to install Python for action At the time the arduino/compile-sketches action was converted to a composite action, the only step type supported for this action type was "run", where shell commands are executed. For this reason, it was necessary to use shell commands to install Python. Since that time, support was added for using other actions in composite action steps. This allows Python to be set up for use by the action in a more simple and efficient manner via the `actions/setup-python` action. The Python-based infrastructure workflows are also migrated to using `actions/setup-python` action for installing Python. In order to ensure the same version of Python is used for CI as the action, the version of Python used by the project is defined in a `.python-version` file, and all `actions/setup-python` steps pointed to that file. In order to ensure the stability of the action, the `actions/setup-python` action is pinned to a patch version. Although the common practice is to only pin the major version of actions in CI workflows, in this case there is no benefit to doing so for the `actions/setup-python` action since patch level bumps are going to be received from Dependabot regardless. --- .github/workflows/lint-python.yml | 9 ++++++++- .github/workflows/test-python.yml | 15 +++++++++++---- .python-version | 1 + action-setup.sh | 20 +++----------------- action.yml | 7 ++++++- 5 files changed, 29 insertions(+), 23 deletions(-) create mode 100644 .python-version diff --git a/.github/workflows/lint-python.yml b/.github/workflows/lint-python.yml index 5608b28..60fb062 100644 --- a/.github/workflows/lint-python.yml +++ b/.github/workflows/lint-python.yml @@ -5,11 +5,13 @@ on: paths: - '.github/workflows/lint-python.yml' - 'compilesketches/**.py' + - '.python-version' push: paths: - '.github/workflows/lint-python.yml' - 'compilesketches/**.py' + - '.python-version' # Scheduled trigger checks for workflow failures resulting from updates to the linting tools schedule: @@ -32,6 +34,11 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - name: Install Python + uses: actions/setup-python@v4.5.0 + with: + python-version-file: .python-version + - name: Run the set up script id: setup run: | @@ -40,7 +47,7 @@ jobs: - name: Install flake8 run: | source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - "${{ steps.setup.outputs.python-command }}" \ + python \ -m \ pip install \ flake8 \ diff --git a/.github/workflows/test-python.yml b/.github/workflows/test-python.yml index a2fc608..970436d 100644 --- a/.github/workflows/test-python.yml +++ b/.github/workflows/test-python.yml @@ -4,12 +4,14 @@ on: pull_request: paths: - '.github/workflows/test-python.yml' + - '.python-version' - 'action-setup.sh' - 'compilesketches/**' push: paths: - '.github/workflows/test-python.yml' + - '.python-version' - 'action-setup.sh' - 'compilesketches/**' @@ -39,6 +41,11 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - name: Install Python + uses: actions/setup-python@v4.5.0 + with: + python-version-file: .python-version + - name: Run the set up script id: setup run: | @@ -47,7 +54,7 @@ jobs: - name: Install test dependencies run: | source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - "${{ steps.setup.outputs.python-command }}" \ + python \ -m \ pip install \ --requirement "${{ env.PYTHON_PROJECT_TESTS_PATH }}/requirements.txt" @@ -56,7 +63,7 @@ jobs: run: | source "${{ steps.setup.outputs.python-venv-activate-script-path }}" export PYTHONPATH="${{ env.PYTHON_PROJECT_PATH }}" - "${{ steps.setup.outputs.python-command }}" \ + python \ -m \ coverage run \ --rcfile="${{ env.PYTHON_PROJECT_TESTS_PATH }}/.coveragerc" \ @@ -65,7 +72,7 @@ jobs: pytest "${{ env.PYTHON_PROJECT_TESTS_PATH }}" # Generate coverage data file for consumption by `codecov/codecov-action`. # Otherwise that action generates the file using the system Python environment, which doesn't work. - "${{ steps.setup.outputs.python-command }}" \ + python \ -m \ coverage xml \ -o "${{ github.workspace }}/${{ env.COVERAGE_DATA_FILENAME }}" @@ -73,7 +80,7 @@ jobs: - name: Display code coverage report run: | source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - "${{ steps.setup.outputs.python-command }}" \ + python \ -m \ coverage report diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..cc1923a --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.8 diff --git a/action-setup.sh b/action-setup.sh index 61c09a1..c44eb94 100755 --- a/action-setup.sh +++ b/action-setup.sh @@ -2,8 +2,6 @@ # Set up the Python environment for the action's script to run in -readonly PYTHON_PACKAGE_VERSION='3.8' - # https://stackoverflow.com/a/29835459 SCRIPT_PATH="$( CDPATH='' \ @@ -15,32 +13,20 @@ SCRIPT_PATH="$( )" readonly SCRIPT_PATH -readonly PYTHON_COMMAND="python${PYTHON_PACKAGE_VERSION}" readonly PYTHON_VENV_PATH="${SCRIPT_PATH}/compilesketches/.venv" readonly PYTHON_VENV_ACTIVATE_SCRIPT_PATH="${PYTHON_VENV_PATH}/bin/activate" -# Install Python -sudo apt-get install --yes software-properties-common > /dev/null -sudo add-apt-repository --yes ppa:deadsnakes/ppa > /dev/null -sudo apt-get update --yes > /dev/null -sudo apt-get install --yes python${PYTHON_PACKAGE_VERSION} > /dev/null -echo "Using Python version: $("$PYTHON_COMMAND" --version)" - -sudo apt-get install --yes python3-setuptools > /dev/null -sudo apt-get install --yes python${PYTHON_PACKAGE_VERSION}-venv > /dev/null - # Create Python virtual environment -"$PYTHON_COMMAND" -m venv --system-site-packages "$PYTHON_VENV_PATH" +python -m venv --system-site-packages "$PYTHON_VENV_PATH" # Activate Python virtual environment # shellcheck source=/dev/null . "$PYTHON_VENV_ACTIVATE_SCRIPT_PATH" # Install Python dependencies -"$PYTHON_COMMAND" -m pip install --upgrade pip > /dev/null -"$PYTHON_COMMAND" -m pip install --quiet --requirement "${SCRIPT_PATH}/compilesketches/requirements.txt" +python -m pip install --upgrade pip > /dev/null +python -m pip install --quiet --requirement "${SCRIPT_PATH}/compilesketches/requirements.txt" # Set outputs for use in GitHub Actions workflow steps # See: https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-an-output-parameter -echo "::set-output name=python-command::$PYTHON_COMMAND" echo "::set-output name=python-venv-activate-script-path::$PYTHON_VENV_ACTIVATE_SCRIPT_PATH" diff --git a/action.yml b/action.yml index 1f593b4..edd2eda 100644 --- a/action.yml +++ b/action.yml @@ -49,6 +49,11 @@ inputs: runs: using: composite steps: + - name: Install Python + uses: actions/setup-python@v4.5.0 + with: + python-version-file: ${{ github.action_path }}/.python-version + - name: Run the set up script id: setup shell: bash @@ -74,4 +79,4 @@ runs: INPUT_SKETCHES-REPORT-PATH: ${{ inputs.sketches-report-path }} run: | source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - "${{ steps.setup.outputs.python-command }}" "${{ github.action_path }}/compilesketches/compilesketches.py" + python "${{ github.action_path }}/compilesketches/compilesketches.py" From ac7e9fe7e56cddbe0a5373a33a6d968813f897b9 Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 16 Mar 2023 20:50:06 -0700 Subject: [PATCH 042/100] Update project Python version to 3.11.2 In order to ensure maximum stability of the action, the project's Python version is pinned to the patch version. --- .python-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.python-version b/.python-version index cc1923a..1e33456 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.8 +3.11.2 From 011565f5db93efd57baa591750d0180b0f9baa38 Mon Sep 17 00:00:00 2001 From: per1234 Date: Fri, 17 Mar 2023 00:45:02 -0700 Subject: [PATCH 043/100] Use Poetry for Python dependencies management Previously, pip and venv were used for dependencies management. Since the time this project was set up, the Arduino Tooling Team has settled on Poetry as the standard tool for this task. --- .github/workflows/lint-python.yml | 29 +- .github/workflows/lint-shell.yml | 24 - .github/workflows/test-python.yml | 57 +- action-setup.sh | 32 -- action.yml | 21 +- compilesketches/.flake8 | 1 - compilesketches/requirements.txt | 4 - compilesketches/tests/.coveragerc | 3 - compilesketches/tests/requirements.txt | 4 - poetry.lock | 759 +++++++++++++++++++++++++ pyproject.toml | 23 + 11 files changed, 842 insertions(+), 115 deletions(-) delete mode 100644 .github/workflows/lint-shell.yml delete mode 100755 action-setup.sh delete mode 100644 compilesketches/requirements.txt delete mode 100644 compilesketches/tests/.coveragerc delete mode 100644 compilesketches/tests/requirements.txt create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/.github/workflows/lint-python.yml b/.github/workflows/lint-python.yml index 60fb062..421d9b1 100644 --- a/.github/workflows/lint-python.yml +++ b/.github/workflows/lint-python.yml @@ -1,17 +1,25 @@ name: Lint Python code +env: + # See: https://pypi.org/project/poetry/#history + POETRY_VERSION: 1.4.0 + on: pull_request: paths: - '.github/workflows/lint-python.yml' - 'compilesketches/**.py' - '.python-version' + - '**/poetry.lock' + - '**/pyproject.toml' push: paths: - '.github/workflows/lint-python.yml' - 'compilesketches/**.py' - '.python-version' + - '**/poetry.lock' + - '**/pyproject.toml' # Scheduled trigger checks for workflow failures resulting from updates to the linting tools schedule: @@ -39,23 +47,20 @@ jobs: with: python-version-file: .python-version - - name: Run the set up script - id: setup + - name: Install Poetry run: | - "${{ github.workspace }}/action-setup.sh" + pipx \ + install \ + poetry==${{ env.POETRY_VERSION }} - - name: Install flake8 + - name: Install Python Dependencies run: | - source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - python \ - -m \ - pip install \ - flake8 \ - pep8-naming + poetry \ + install \ + --only dev - name: Lint with flake8 env: PYTHON_PROJECT_PATH: ${GITHUB_WORKSPACE}/compilesketches run: | - source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - flake8 --config "${{ env.PYTHON_PROJECT_PATH }}/.flake8" --show-source "${{ env.PYTHON_PROJECT_PATH }}" + poetry run flake8 --config "${{ env.PYTHON_PROJECT_PATH }}/.flake8" --show-source "${{ env.PYTHON_PROJECT_PATH }}" diff --git a/.github/workflows/lint-shell.yml b/.github/workflows/lint-shell.yml deleted file mode 100644 index e79a763..0000000 --- a/.github/workflows/lint-shell.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Lint shell scripts - -on: - push: - paths: - - '.github/workflows/lint-shell.yml' - - '**.sh' - pull_request: - paths: - - '.github/workflows/lint-shell.yml' - - '**.sh' - -jobs: - lint: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v3 - - # Recursively lint all shell scripts in the repository - # See: https://github.com/azohra/shell-linter/blob/latest/README.md - - name: ShellCheck - uses: azohra/shell-linter@latest diff --git a/.github/workflows/test-python.yml b/.github/workflows/test-python.yml index 970436d..0642047 100644 --- a/.github/workflows/test-python.yml +++ b/.github/workflows/test-python.yml @@ -1,18 +1,24 @@ name: Test Python code +env: + # See: https://pypi.org/project/poetry/#history + POETRY_VERSION: 1.4.0 + on: pull_request: paths: - '.github/workflows/test-python.yml' - '.python-version' - - 'action-setup.sh' + - '**/poetry.lock' + - '**/pyproject.toml' - 'compilesketches/**' push: paths: - '.github/workflows/test-python.yml' - '.python-version' - - 'action-setup.sh' + - '**/poetry.lock' + - '**/pyproject.toml' - 'compilesketches/**' # Catch issues resulting from new patch releases of Python in the APT repository @@ -46,43 +52,40 @@ jobs: with: python-version-file: .python-version - - name: Run the set up script - id: setup + - name: Install Poetry run: | - "${{ github.workspace }}/action-setup.sh" + pipx \ + install \ + poetry==${{ env.POETRY_VERSION }} - - name: Install test dependencies + - name: Install Python Dependencies run: | - source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - python \ - -m \ - pip install \ - --requirement "${{ env.PYTHON_PROJECT_TESTS_PATH }}/requirements.txt" + poetry install - name: Run Python unit tests and record code coverage data run: | - source "${{ steps.setup.outputs.python-venv-activate-script-path }}" export PYTHONPATH="${{ env.PYTHON_PROJECT_PATH }}" - python \ - -m \ - coverage run \ - --rcfile="${{ env.PYTHON_PROJECT_TESTS_PATH }}/.coveragerc" \ - --source="${{ env.PYTHON_PROJECT_PATH }}" \ - --module \ - pytest "${{ env.PYTHON_PROJECT_TESTS_PATH }}" + poetry run \ + python \ + -m \ + coverage run \ + --source="${{ env.PYTHON_PROJECT_PATH }}" \ + --module \ + pytest "${{ env.PYTHON_PROJECT_TESTS_PATH }}" # Generate coverage data file for consumption by `codecov/codecov-action`. # Otherwise that action generates the file using the system Python environment, which doesn't work. - python \ - -m \ - coverage xml \ - -o "${{ github.workspace }}/${{ env.COVERAGE_DATA_FILENAME }}" + poetry run \ + python \ + -m \ + coverage xml \ + -o "${{ github.workspace }}/${{ env.COVERAGE_DATA_FILENAME }}" - name: Display code coverage report run: | - source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - python \ - -m \ - coverage report + poetry run \ + python \ + -m \ + coverage report - name: Upload coverage report to Codecov uses: codecov/codecov-action@v3 diff --git a/action-setup.sh b/action-setup.sh deleted file mode 100755 index c44eb94..0000000 --- a/action-setup.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -# Set up the Python environment for the action's script to run in - -# https://stackoverflow.com/a/29835459 -SCRIPT_PATH="$( - CDPATH='' \ - cd -- "$( - dirname -- "$0" - )" && ( - pwd -P - ) -)" -readonly SCRIPT_PATH - -readonly PYTHON_VENV_PATH="${SCRIPT_PATH}/compilesketches/.venv" -readonly PYTHON_VENV_ACTIVATE_SCRIPT_PATH="${PYTHON_VENV_PATH}/bin/activate" - -# Create Python virtual environment -python -m venv --system-site-packages "$PYTHON_VENV_PATH" - -# Activate Python virtual environment -# shellcheck source=/dev/null -. "$PYTHON_VENV_ACTIVATE_SCRIPT_PATH" - -# Install Python dependencies -python -m pip install --upgrade pip > /dev/null -python -m pip install --quiet --requirement "${SCRIPT_PATH}/compilesketches/requirements.txt" - -# Set outputs for use in GitHub Actions workflow steps -# See: https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-an-output-parameter -echo "::set-output name=python-venv-activate-script-path::$PYTHON_VENV_ACTIVATE_SCRIPT_PATH" diff --git a/action.yml b/action.yml index edd2eda..6c450f1 100644 --- a/action.yml +++ b/action.yml @@ -54,14 +54,18 @@ runs: with: python-version-file: ${{ github.action_path }}/.python-version - - name: Run the set up script - id: setup + - name: Install Poetry shell: bash run: | - # Group action setup log output - echo "::group::Action set up" - "${{ github.action_path }}/action-setup.sh" - echo "::endgroup::" + pipx install \ + poetry==1.4.0 + + - name: Install Python Dependencies + shell: bash + working-directory: ${{ github.action_path }} + run: | + poetry install \ + --only main - name: Run script shell: bash @@ -77,6 +81,7 @@ runs: INPUT_ENABLE-DELTAS-REPORT: ${{ inputs.enable-deltas-report }} INPUT_ENABLE-WARNINGS-REPORT: ${{ inputs.enable-warnings-report }} INPUT_SKETCHES-REPORT-PATH: ${{ inputs.sketches-report-path }} + working-directory: ${{ github.action_path }} run: | - source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - python "${{ github.action_path }}/compilesketches/compilesketches.py" + poetry run \ + python "${{ github.action_path }}/compilesketches/compilesketches.py" diff --git a/compilesketches/.flake8 b/compilesketches/.flake8 index ca383b0..8f80241 100644 --- a/compilesketches/.flake8 +++ b/compilesketches/.flake8 @@ -1,6 +1,5 @@ [flake8] doctests = True -extend-exclude = .venv # W503 and W504 are mutually exclusive. PEP 8 recommends line break before. ignore = W503 max-complexity = 10 diff --git a/compilesketches/requirements.txt b/compilesketches/requirements.txt deleted file mode 100644 index 9f3dbe6..0000000 --- a/compilesketches/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -GitPython==3.1.31 -PyGithub==1.58.0 -PyYAML==6.0 -semver==2.13.0 diff --git a/compilesketches/tests/.coveragerc b/compilesketches/tests/.coveragerc deleted file mode 100644 index 9ca48dd..0000000 --- a/compilesketches/tests/.coveragerc +++ /dev/null @@ -1,3 +0,0 @@ -[run] -omit = - */.venv/* diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt deleted file mode 100644 index 6c35044..0000000 --- a/compilesketches/tests/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ ---requirement ../requirements.txt -coverage==7.2.2 -pytest==7.2.2 -pytest-mock==3.10.0 diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..cf33fcb --- /dev/null +++ b/poetry.lock @@ -0,0 +1,759 @@ +# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. + +[[package]] +name = "attrs" +version = "22.2.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, + {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] +tests = ["attrs[tests-no-zope]", "zope.interface"] +tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] + +[[package]] +name = "certifi" +version = "2022.12.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "coverage" +version = "7.2.2" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "coverage-7.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c90e73bdecb7b0d1cea65a08cb41e9d672ac6d7995603d6465ed4914b98b9ad7"}, + {file = "coverage-7.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e2926b8abedf750c2ecf5035c07515770944acf02e1c46ab08f6348d24c5f94d"}, + {file = "coverage-7.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57b77b9099f172804e695a40ebaa374f79e4fb8b92f3e167f66facbf92e8e7f5"}, + {file = "coverage-7.2.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efe1c0adad110bf0ad7fb59f833880e489a61e39d699d37249bdf42f80590169"}, + {file = "coverage-7.2.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2199988e0bc8325d941b209f4fd1c6fa007024b1442c5576f1a32ca2e48941e6"}, + {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:81f63e0fb74effd5be736cfe07d710307cc0a3ccb8f4741f7f053c057615a137"}, + {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:186e0fc9cf497365036d51d4d2ab76113fb74f729bd25da0975daab2e107fd90"}, + {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:420f94a35e3e00a2b43ad5740f935358e24478354ce41c99407cddd283be00d2"}, + {file = "coverage-7.2.2-cp310-cp310-win32.whl", hash = "sha256:38004671848b5745bb05d4d621526fca30cee164db42a1f185615f39dc997292"}, + {file = "coverage-7.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:0ce383d5f56d0729d2dd40e53fe3afeb8f2237244b0975e1427bfb2cf0d32bab"}, + {file = "coverage-7.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3eb55b7b26389dd4f8ae911ba9bc8c027411163839dea4c8b8be54c4ee9ae10b"}, + {file = "coverage-7.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d2b96123a453a2d7f3995ddb9f28d01fd112319a7a4d5ca99796a7ff43f02af5"}, + {file = "coverage-7.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:299bc75cb2a41e6741b5e470b8c9fb78d931edbd0cd009c58e5c84de57c06731"}, + {file = "coverage-7.2.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e1df45c23d4230e3d56d04414f9057eba501f78db60d4eeecfcb940501b08fd"}, + {file = "coverage-7.2.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:006ed5582e9cbc8115d2e22d6d2144a0725db542f654d9d4fda86793832f873d"}, + {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d683d230b5774816e7d784d7ed8444f2a40e7a450e5720d58af593cb0b94a212"}, + {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8efb48fa743d1c1a65ee8787b5b552681610f06c40a40b7ef94a5b517d885c54"}, + {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4c752d5264053a7cf2fe81c9e14f8a4fb261370a7bb344c2a011836a96fb3f57"}, + {file = "coverage-7.2.2-cp311-cp311-win32.whl", hash = "sha256:55272f33da9a5d7cccd3774aeca7a01e500a614eaea2a77091e9be000ecd401d"}, + {file = "coverage-7.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:92ebc1619650409da324d001b3a36f14f63644c7f0a588e331f3b0f67491f512"}, + {file = "coverage-7.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5afdad4cc4cc199fdf3e18088812edcf8f4c5a3c8e6cb69127513ad4cb7471a9"}, + {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0484d9dd1e6f481b24070c87561c8d7151bdd8b044c93ac99faafd01f695c78e"}, + {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d530191aa9c66ab4f190be8ac8cc7cfd8f4f3217da379606f3dd4e3d83feba69"}, + {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac0f522c3b6109c4b764ffec71bf04ebc0523e926ca7cbe6c5ac88f84faced0"}, + {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ba279aae162b20444881fc3ed4e4f934c1cf8620f3dab3b531480cf602c76b7f"}, + {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:53d0fd4c17175aded9c633e319360d41a1f3c6e352ba94edcb0fa5167e2bad67"}, + {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c99cb7c26a3039a8a4ee3ca1efdde471e61b4837108847fb7d5be7789ed8fd9"}, + {file = "coverage-7.2.2-cp37-cp37m-win32.whl", hash = "sha256:5cc0783844c84af2522e3a99b9b761a979a3ef10fb87fc4048d1ee174e18a7d8"}, + {file = "coverage-7.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:817295f06eacdc8623dc4df7d8b49cea65925030d4e1e2a7c7218380c0072c25"}, + {file = "coverage-7.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6146910231ece63facfc5984234ad1b06a36cecc9fd0c028e59ac7c9b18c38c6"}, + {file = "coverage-7.2.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:387fb46cb8e53ba7304d80aadca5dca84a2fbf6fe3faf6951d8cf2d46485d1e5"}, + {file = "coverage-7.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046936ab032a2810dcaafd39cc4ef6dd295df1a7cbead08fe996d4765fca9fe4"}, + {file = "coverage-7.2.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e627dee428a176ffb13697a2c4318d3f60b2ccdde3acdc9b3f304206ec130ccd"}, + {file = "coverage-7.2.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fa54fb483decc45f94011898727802309a109d89446a3c76387d016057d2c84"}, + {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3668291b50b69a0c1ef9f462c7df2c235da3c4073f49543b01e7eb1dee7dd540"}, + {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7c20b731211261dc9739bbe080c579a1835b0c2d9b274e5fcd903c3a7821cf88"}, + {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5764e1f7471cb8f64b8cda0554f3d4c4085ae4b417bfeab236799863703e5de2"}, + {file = "coverage-7.2.2-cp38-cp38-win32.whl", hash = "sha256:4f01911c010122f49a3e9bdc730eccc66f9b72bd410a3a9d3cb8448bb50d65d3"}, + {file = "coverage-7.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:c448b5c9e3df5448a362208b8d4b9ed85305528313fca1b479f14f9fe0d873b8"}, + {file = "coverage-7.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfe7085783cda55e53510482fa7b5efc761fad1abe4d653b32710eb548ebdd2d"}, + {file = "coverage-7.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9d22e94e6dc86de981b1b684b342bec5e331401599ce652900ec59db52940005"}, + {file = "coverage-7.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:507e4720791977934bba016101579b8c500fb21c5fa3cd4cf256477331ddd988"}, + {file = "coverage-7.2.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc4803779f0e4b06a2361f666e76f5c2e3715e8e379889d02251ec911befd149"}, + {file = "coverage-7.2.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db8c2c5ace167fd25ab5dd732714c51d4633f58bac21fb0ff63b0349f62755a8"}, + {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f68ee32d7c4164f1e2c8797535a6d0a3733355f5861e0f667e37df2d4b07140"}, + {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d52f0a114b6a58305b11a5cdecd42b2e7f1ec77eb20e2b33969d702feafdd016"}, + {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:797aad79e7b6182cb49c08cc5d2f7aa7b2128133b0926060d0a8889ac43843be"}, + {file = "coverage-7.2.2-cp39-cp39-win32.whl", hash = "sha256:db45eec1dfccdadb179b0f9ca616872c6f700d23945ecc8f21bb105d74b1c5fc"}, + {file = "coverage-7.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:8dbe2647bf58d2c5a6c5bcc685f23b5f371909a5624e9f5cd51436d6a9f6c6ef"}, + {file = "coverage-7.2.2-pp37.pp38.pp39-none-any.whl", hash = "sha256:872d6ce1f5be73f05bea4df498c140b9e7ee5418bfa2cc8204e7f9b817caa968"}, + {file = "coverage-7.2.2.tar.gz", hash = "sha256:36dd42da34fe94ed98c39887b86db9d06777b1c8f860520e21126a75507024f2"}, +] + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "deprecated" +version = "1.2.13" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, + {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest (<5)", "PyTest-Cov", "PyTest-Cov (<2.6)", "bump2version (<1)", "configparser (<5)", "importlib-metadata (<3)", "importlib-resources (<4)", "sphinx (<2)", "sphinxcontrib-websupport (<2)", "tox", "zipp (<2)"] + +[[package]] +name = "flake8" +version = "5.0.4" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" + +[[package]] +name = "gitdb" +version = "4.0.10" +description = "Git Object Database" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.31" +description = "GitPython is a Python library used to interact with Git repositories" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, + {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "packaging" +version = "23.0" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, + {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, +] + +[[package]] +name = "pep8-naming" +version = "0.13.3" +description = "Check PEP-8 naming conventions, plugin for flake8" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971"}, + {file = "pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80"}, +] + +[package.dependencies] +flake8 = ">=5.0.0" + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycodestyle" +version = "2.9.1" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pyflakes" +version = "2.5.0" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] + +[[package]] +name = "pygithub" +version = "1.58.0" +description = "Use the full Github API v3" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyGithub-1.58.0-py3-none-any.whl", hash = "sha256:b7bac601492a2b6c876ef326e4ffa3c1923e32707e415da76bfb8307ee8ffb7e"}, + {file = "PyGithub-1.58.0.tar.gz", hash = "sha256:e325f5ca2c111d19dea2796c8f1e7ae11da77287007736582196341390d31d35"}, +] + +[package.dependencies] +deprecated = "*" +pyjwt = ">=2.4.0" +pynacl = ">=1.4.0" +requests = ">=2.14.0" + +[package.extras] +integrations = ["cryptography"] + +[[package]] +name = "pyjwt" +version = "2.6.0" +description = "JSON Web Token implementation in Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.6.0-py3-none-any.whl", hash = "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14"}, + {file = "PyJWT-2.6.0.tar.gz", hash = "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd"}, +] + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "pynacl" +version = "1.5.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + +[package.dependencies] +cffi = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] + +[[package]] +name = "pytest" +version = "7.2.2" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, + {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, +] + +[package.dependencies] +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-mock" +version = "3.10.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-mock-3.10.0.tar.gz", hash = "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"}, + {file = "pytest_mock-3.10.0-py3-none-any.whl", hash = "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b"}, +] + +[package.dependencies] +pytest = ">=5.0" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "requests" +version = "2.28.2" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, + {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "semver" +version = "2.13.0" +description = "Python helper for Semantic Versioning (http://semver.org/)" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, + {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, +] + +[[package]] +name = "smmap" +version = "5.0.0" +description = "A pure Python implementation of a sliding window memory map manager" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] + +[[package]] +name = "urllib3" +version = "1.26.15" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "3.11.2" +content-hash = "f10d0924625935c307af749c2ade20a628383337648854a7665165563b3aba49" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..a0f3f25 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,23 @@ +[tool.poetry] +name = "compilesketches" +version = "0.0.0" +description = "" +authors = ["Arduino "] + +[tool.poetry.dependencies] +python = "3.11.2" +GitPython = "3.1.31" +PyGithub = "1.58.0" +PyYAML = "6.0" +semver = "2.13.0" + +[tool.poetry.group.dev.dependencies] +coverage = "7.2.2" +pytest = "7.2.2" +pytest-mock = "3.10.0" +flake8 = "5.0.4" +pep8-naming = "0.13.3" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" From 986bbe2d36abdc28510cdb72f8dce984f4215c1e Mon Sep 17 00:00:00 2001 From: per1234 Date: Fri, 17 Mar 2023 00:45:15 -0700 Subject: [PATCH 044/100] Move pytest configuration to pyproject.toml Rather than having a separate configuration file for the pytest configuration, it can be consolidated into the general purpose pyproject.toml configuration file. --- compilesketches/tests/pytest.ini | 5 ----- pyproject.toml | 7 +++++++ 2 files changed, 7 insertions(+), 5 deletions(-) delete mode 100644 compilesketches/tests/pytest.ini diff --git a/compilesketches/tests/pytest.ini b/compilesketches/tests/pytest.ini deleted file mode 100644 index f076002..0000000 --- a/compilesketches/tests/pytest.ini +++ /dev/null @@ -1,5 +0,0 @@ -[pytest] -filterwarnings = - error - ignore::DeprecationWarning - ignore::ResourceWarning diff --git a/pyproject.toml b/pyproject.toml index a0f3f25..2e27768 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,6 +18,13 @@ pytest-mock = "3.10.0" flake8 = "5.0.4" pep8-naming = "0.13.3" +[tool.pytest.ini_options] +filterwarnings = [ + "error", + "ignore::DeprecationWarning", + "ignore::ResourceWarning" +] + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" From af9837712ad34602b099fdb587eb72cfd9d8fff3 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Mar 2023 21:27:41 -0700 Subject: [PATCH 045/100] Add "Additional resources" links to readme --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 7be3edd..5007a09 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ This action checks whether [Arduino](https://www.arduino.cc/) sketches compile a - [How it works](#how-it-works) - [`enable-warnings-report`](#enable-warnings-report) - [Example usage](#example-usage) +- [Additional resources](#additional-resources) @@ -226,3 +227,9 @@ Set to `true` to cause the action to record the compiler warning count for each - name: Stepper version: 1.1.3 ``` + +## Additional resources + +- [Introductory article about **arduino/compile-sketches**](https://blog.arduino.cc/2021/04/09/test-your-arduino-projects-with-github-actions/) +- [**GitHub Actions** documentation](https://docs.github.com/actions/learn-github-actions/understanding-github-actions) +- [Discuss or request assistance on **Arduino Forum**](https://forum.arduino.cc/) From c4fa302d60bbbaf1c91517a5cd38c3c31a0ffdee Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Mar 2023 21:28:33 -0700 Subject: [PATCH 046/100] Add an FAQ document This will serve as a container for more in-depth documentation to supplement the fundamental reference provided in the readme. --- README.md | 1 + docs/FAQ.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 docs/FAQ.md diff --git a/README.md b/README.md index 5007a09..abae657 100644 --- a/README.md +++ b/README.md @@ -231,5 +231,6 @@ Set to `true` to cause the action to record the compiler warning count for each ## Additional resources - [Introductory article about **arduino/compile-sketches**](https://blog.arduino.cc/2021/04/09/test-your-arduino-projects-with-github-actions/) +- [Frequently asked questions about **arduino/compile-sketches**](docs/FAQ.md#frequently-asked-questions) - [**GitHub Actions** documentation](https://docs.github.com/actions/learn-github-actions/understanding-github-actions) - [Discuss or request assistance on **Arduino Forum**](https://forum.arduino.cc/) diff --git a/docs/FAQ.md b/docs/FAQ.md new file mode 100644 index 0000000..cc37fe9 --- /dev/null +++ b/docs/FAQ.md @@ -0,0 +1,43 @@ +# Frequently Asked Questions + +## How can I install dependencies of a boards platform? + +### Managed Dependencies + +The Arduino **Boards Manager** system installs tool dependencies along with a platform. When you specify a [**Boards Manager**-sourced platform dependency](../README.md#boards-manager) via the action's [`platforms` input](../README.md#platforms) the managed platform dependencies are installed automatically. + +If an alternative [platform dependency source](../README.md#supported-platform-sources) is used this automatic tool dependency installation does not occur. The convenient way to install the tool dependencies in this case is to install a **Boards Manager**-sourced platform that has a dependency on the required tools in addition to the target platform from the alternative source. + +--- + +**Example:** + +```yaml +- uses: arduino/compile-sketches@v1 + with: + platforms: | + # Use Boards Manager to install the latest release of the platform to get the toolchain. + - name: arduino:avr + # Overwrite the Boards Manager installation with the development version of the platform. + - source-url: https://github.com/arduino/ArduinoCore-avr.git + name: arduino:avr +``` + +--- + +### External Dependencies + +Arduino boards platforms typically bundle all dependencies. However, there are some platforms that require the user to manually install dependencies on their system in order to use the platform. + +The **arduino/compile-sketches** action runs in the same environment as the rest of the steps of the [workflow job](https://docs.github.com/actions/using-jobs/using-jobs-in-a-workflow), which means you can simply perform the dependency installation in a prior [step](https://docs.github.com/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idsteps) of the job. + +--- + +**Example:** + +```yaml +- run: +- uses: arduino/compile-sketches@v1 +``` + +--- From 042dd4a28f263b0608987d15e27507e5fd5d849e Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 18 Mar 2023 02:58:53 -0700 Subject: [PATCH 047/100] Test support of external Python package platform dependencies Although Arduino boards platforms traditionally have bundled all dependencies, there are some cases where the user will need to use a preceeding workflow step to install external dependencies in the GitHub Actions runner environment. Since it is a "composite action", the action supports this. The action uses a virtual environment for its own Python package dependencies. This virtual environment might cause Python packages installed via the user's workflow (e.g., the pyserial dependency of the ESP32 platform) to not be accessible to the compilation commands. The added integration test will catch any regressions in the support for external Python package platform dependencies. --- .github/workflows/test-integration.yml | 26 +++++++++++++++++++ .../PythonPackageDependent/boards.txt | 8 ++++++ .../PythonPackageDependent/dependent.py | 2 ++ .../PythonPackageDependent/platform.txt | 3 +++ 4 files changed, 39 insertions(+) create mode 100644 .github/workflows/testdata/platforms/PythonPackageDependent/boards.txt create mode 100644 .github/workflows/testdata/platforms/PythonPackageDependent/dependent.py create mode 100644 .github/workflows/testdata/platforms/PythonPackageDependent/platform.txt diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index b40a9eb..f4aa46d 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -19,6 +19,7 @@ on: env: SKETCHES_REPORTS_PATH: sketches-reports + TESTDATA_PLATFORMS_PATH: .github/workflows/testdata/platforms TESTDATA_SKETCHES_PATH: .github/workflows/testdata/sketches TESTDATA_REPORTS_PATH: .github/workflows/testdata/reports @@ -203,6 +204,31 @@ jobs: sketch-paths: | - examples/Sweep + python-package-dependency: + runs-on: ubuntu-latest + + steps: + - name: Checkout local repo + uses: actions/checkout@v3 + + - name: Install Python package dependency + run: pip install cowsay + + - name: Run action with board that has external Python package dependency + # Use action from local path + uses: ./ + with: + platforms: | + - name: arduino:avr + - source-path: ${{ env.TESTDATA_PLATFORMS_PATH }}/PythonPackageDependent + name: PythonPackageDependent:avr + fqbn: PythonPackageDependent:avr:package_dependent + libraries: | + [] + sketch-paths: | + - ${{ env.TESTDATA_SKETCHES_PATH }}/BareMinimum + + check-sketches-reports: needs: all-inputs runs-on: ubuntu-latest diff --git a/.github/workflows/testdata/platforms/PythonPackageDependent/boards.txt b/.github/workflows/testdata/platforms/PythonPackageDependent/boards.txt new file mode 100644 index 0000000..41554a0 --- /dev/null +++ b/.github/workflows/testdata/platforms/PythonPackageDependent/boards.txt @@ -0,0 +1,8 @@ +package_dependent.name=External Python Package Dependent Board +package_dependent.upload.maximum_size=32256 +package_dependent.upload.maximum_data_size=2048 +package_dependent.build.mcu=atmega328p +package_dependent.build.f_cpu=16000000L +package_dependent.build.board=FOO +package_dependent.build.core=arduino:arduino +package_dependent.build.variant=arduino:standard diff --git a/.github/workflows/testdata/platforms/PythonPackageDependent/dependent.py b/.github/workflows/testdata/platforms/PythonPackageDependent/dependent.py new file mode 100644 index 0000000..b372e82 --- /dev/null +++ b/.github/workflows/testdata/platforms/PythonPackageDependent/dependent.py @@ -0,0 +1,2 @@ +# Import external package to verify Python package dependencies can be installed by user into runner environment. +import cowsay # noqa: F401 diff --git a/.github/workflows/testdata/platforms/PythonPackageDependent/platform.txt b/.github/workflows/testdata/platforms/PythonPackageDependent/platform.txt new file mode 100644 index 0000000..ada9a86 --- /dev/null +++ b/.github/workflows/testdata/platforms/PythonPackageDependent/platform.txt @@ -0,0 +1,3 @@ +name=External Python Package Dependent Platform +version=0.0.0 +recipe.hooks.prebuild.1.pattern=python "{runtime.platform.path}/dependent.py" From 4c2850340f7be5ab270d6506df5f9f1d1f8c4c86 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Mar 2023 01:24:17 -0700 Subject: [PATCH 048/100] Restore support for external platform Python package dependencies Although Arduino boards platforms traditionally have bundled all dependencies, there are some cases where the user will need to use a preceding workflow step to install external dependencies in the GitHub Actions runner environment. Since it is a "composite action", this is feasible and was previously supported. However, support for Python package dependencies is more complicated due to the action script running in a Python virtual environment which isolates it from packages installed globally. The workaround for this was to use the `--system-site-packages` flag in the venv invocation that created the action's Python virtual environment. This approach introduced a requirement that the project Python version match the minor version series of the runner system Python. That requirement was violated when the workflow's runner was updated to `ubuntu-22.04` which has system Python 3.10.x, whereas the action used 3.8. The breakage went unnoticed because the sole Python package platform dependency in real world usage, pyserial, had been preinstalled in the runner's Linux package manager "site-packages" folder, which caused it to be installed in the action's virtual environment even though it would not have if depending on the user installation of the package as was previously the case. The solution is to use a path configuration file to add the path of the system Python's "user site-packages" folder (where package dependencies installed via the workflow are located) to the module search paths used by the action's Python virtual environment. This is actually superior to the previous approach of using the `--system-site-packages` flag in the venv invocation (this flag is also supported by pipx and Poetry) because: - It avoids the chance of interference with the virtual environment through the unnecessary introduction of the global "site-packages" path into the module search paths along with the intended introduction of the "user site-packages" path. - It allows any version of Python to be used to run the action, rather than being forced to use the same minor version series as the runner's system Python (which can be updated at any time and also depends on the workflow configuration) --- .github/workflows/test-integration.yml | 6 +++++- action.yml | 24 ++++++++++++++++++++++++ docs/FAQ.md | 17 +++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index f4aa46d..d5af059 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -212,7 +212,11 @@ jobs: uses: actions/checkout@v3 - name: Install Python package dependency - run: pip install cowsay + run: | + pip install \ + --ignore-installed \ + --user \ + cowsay - name: Run action with board that has external Python package dependency # Use action from local path diff --git a/action.yml b/action.yml index 6c450f1..29cd16b 100644 --- a/action.yml +++ b/action.yml @@ -49,6 +49,13 @@ inputs: runs: using: composite steps: + # User installations of external Python package platform dependencies will be located here. + - name: Get system Python "user site-packages" path + id: system-user-site-packages + shell: bash + run: | + echo "path=$(python -m site --user-site)" >> $GITHUB_OUTPUT + - name: Install Python uses: actions/setup-python@v4.5.0 with: @@ -67,6 +74,23 @@ runs: poetry install \ --only main + - name: Make user-installed Python packages available to platforms + shell: bash + working-directory: ${{ github.action_path }} + run: | + readonly PYTHON_ENVIRONMENT_PATH="$( + poetry env info \ + --path + )" + readonly VENV_SITE_PACKAGES_PATH="$( + poetry run \ + python -c \ + 'import site; print(site.getsitepackages()[0])' + )" + echo \ + "${{ steps.system-user-site-packages.outputs.path }}" > \ + "${VENV_SITE_PACKAGES_PATH}/system-user-site-packages.pth" + - name: Run script shell: bash env: diff --git a/docs/FAQ.md b/docs/FAQ.md index cc37fe9..ae56065 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -41,3 +41,20 @@ The **arduino/compile-sketches** action runs in the same environment as the rest ``` --- + +#### Python Packages + +The **arduino/compile-sketches** action uses a Python [virtual environment](https://docs.python.org/glossary.html#term-virtual-environment). In order to enable user installation of Python [package](https://docs.python.org/glossary.html#term-package) dependencies of boards platforms, the packages installed in the "[user site-packages](https://peps.python.org/pep-0370/)" folder are included in this virtual environment. + +In order to be certain your installation of a package dependency will be available to the platform, add the [`--ignore-installed`](https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-ignore-installed) and [`--user`](https://pip.pypa.io/en/stable/cli/pip_install/#install-user) flags to the [**pip**](https://pip.pypa.io/) command used to install the package. + +--- + +**Example:** + +```yaml +- run: pip install --ignore-installed --user pyserial +- uses: arduino/compile-sketches@v1 +``` + +--- \ No newline at end of file From 32b69515e6c2c744ee9359f15d17a8b1a0afd756 Mon Sep 17 00:00:00 2001 From: per1234 Date: Mon, 20 Mar 2023 01:13:56 -0700 Subject: [PATCH 049/100] Remove superfluous absolute path to action script It is no longer necessary to specify the full path to the script in the invocation command now that the steps working directory has been set to the root folder of the action repository. --- action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/action.yml b/action.yml index 29cd16b..d32a065 100644 --- a/action.yml +++ b/action.yml @@ -108,4 +108,4 @@ runs: working-directory: ${{ github.action_path }} run: | poetry run \ - python "${{ github.action_path }}/compilesketches/compilesketches.py" + python compilesketches/compilesketches.py From add981214aae776e5177610e093a1fe39fa502a4 Mon Sep 17 00:00:00 2001 From: per1234 Date: Mon, 20 Mar 2023 19:14:32 -0700 Subject: [PATCH 050/100] Remove leftover items in workflow path filter Previously, a script was used to install Python and venv for use by the action. The path of this script was added to the paths filter in the relevant workflows so that they would be triggered on any change to the script. The script was removed in favor of the use of the actions/setup-python script for installation of Python. The script path was not removed from the workflow at that time. --- .github/workflows/test-integration.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index d5af059..46929cd 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -6,7 +6,6 @@ on: - '.github/workflows/test-integration.yml' - '.github/workflows/testdata/**' - 'action.yml' - - 'action-setup.sh' - 'compilesketches/**' push: @@ -14,7 +13,6 @@ on: - '.github/workflows/test-integration.yml' - '.github/workflows/testdata/**' - 'action.yml' - - 'action-setup.sh' - 'compilesketches/**' env: From dc45fe17606c6609e3aefe9d1ee93571a9f3437c Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Mar 2023 17:13:47 -0700 Subject: [PATCH 051/100] Use project Python to install Poetry By default, pipx uses the runner's system Python installation to install Poetry. Although this works, it is best to use the controlled Python installation (installed via the `actions/setup-python` step) for all project operations. --- action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/action.yml b/action.yml index d32a065..06fd288 100644 --- a/action.yml +++ b/action.yml @@ -65,6 +65,7 @@ runs: shell: bash run: | pipx install \ + --python "$(which python)" \ poetry==1.4.0 - name: Install Python Dependencies From 26f371d11d74630214bd5be4a41295cd5355679b Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Mar 2023 21:57:38 -0700 Subject: [PATCH 052/100] Test support of pyserial external dependency of ESP32 platform Although Arduino boards platforms traditionally have bundled all dependencies, the ESP32 boards platform expects the pyserial Python package to be preinstalled on Linux systems. Although there is already test coverage and support for user installation of arbitrary Python package dependencies of a platform, the situation is more complex when it comes to this important boards platform. The problem is that there is an established use pattern that should be supported to avoid breaking user workflows. The added test checks for regressions in that support. --- .github/workflows/test-integration.yml | 29 +++++++++++++++++++ .../platforms/PyserialDependent/boards.txt | 8 +++++ .../platforms/PyserialDependent/platform.txt | 5 ++++ 3 files changed, 42 insertions(+) create mode 100644 .github/workflows/testdata/platforms/PyserialDependent/boards.txt create mode 100644 .github/workflows/testdata/platforms/PyserialDependent/platform.txt diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 46929cd..73b2607 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -231,6 +231,35 @@ jobs: - ${{ env.TESTDATA_SKETCHES_PATH }}/BareMinimum + # Targeted testing for ESP32 boards platform support. + pyserial-dependency: + runs-on: ubuntu-latest + + steps: + - name: Checkout local repo + uses: actions/checkout@v3 + + - name: Install pyserial + run: | + # Use of pip3 and omission of recommended flags done to reproduce established use pattern: + # https://github.com/arduino-libraries/ArduinoIoTCloud/blob/1.11.0/.github/workflows/compile-examples.yml#L206 + pip3 install pyserial + + - name: Run action with board that has pyserial dependency + # Use action from local path + uses: ./ + with: + platforms: | + - name: arduino:avr + - source-path: ${{ env.TESTDATA_PLATFORMS_PATH }}/PyserialDependent + name: PyserialDependent:avr + fqbn: PyserialDependent:avr:pyserial_dependent + libraries: | + [] + sketch-paths: | + - ${{ env.TESTDATA_SKETCHES_PATH }}/BareMinimum + + check-sketches-reports: needs: all-inputs runs-on: ubuntu-latest diff --git a/.github/workflows/testdata/platforms/PyserialDependent/boards.txt b/.github/workflows/testdata/platforms/PyserialDependent/boards.txt new file mode 100644 index 0000000..ba4d86b --- /dev/null +++ b/.github/workflows/testdata/platforms/PyserialDependent/boards.txt @@ -0,0 +1,8 @@ +pyserial_dependent.name=pyserial Dependent Board +pyserial_dependent.upload.maximum_size=32256 +pyserial_dependent.upload.maximum_data_size=2048 +pyserial_dependent.build.mcu=atmega328p +pyserial_dependent.build.f_cpu=16000000L +pyserial_dependent.build.board=FOO +pyserial_dependent.build.core=arduino:arduino +pyserial_dependent.build.variant=arduino:standard diff --git a/.github/workflows/testdata/platforms/PyserialDependent/platform.txt b/.github/workflows/testdata/platforms/PyserialDependent/platform.txt new file mode 100644 index 0000000..11879ca --- /dev/null +++ b/.github/workflows/testdata/platforms/PyserialDependent/platform.txt @@ -0,0 +1,5 @@ +name=pyserial Dependent Platform +version=0.0.0 +# python3 is used to parallel ESP32 platform configuration: +# https://github.com/espressif/arduino-esp32/blob/2.0.7/platform.txt#L220 +recipe.hooks.prebuild.1.pattern=python3 -c 'import serial' From 69fd7b0d9e3a195bbf1c23b50fb7530455a085b8 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Mar 2023 23:33:55 -0700 Subject: [PATCH 053/100] Add pyserial package to action virtual environment Although Arduino boards platforms traditionally have bundled all dependencies, the ESP32 boards platform expects the pyserial Python package to be preinstalled on Linux systems. Although there is already test coverage and support for user installation of arbitrary Python package dependencies of a platform, the situation is more complex when it comes to this important boards platform. The problem is that there is an established use pattern that should be supported to avoid breaking user workflows. The pattern is the use of a `pip install pyserial` command in the workflow to install the package. That command correctly installs the package in the "user site-packages" folder when the job runs in the `ubuntu-18.04` GitHub Actions runner, as was the case when the use pattern was established. However, pyserial is installed in the Linux package manager "site-packages" folder of the Ubuntu GitHub Actions runner starting from ubuntu-20.04 (most workflows run the arduino/compile-sketches job in the `ubuntu-latest` runner, which is currently `ubuntu-22.04`). This causes the established installation command to terminate without installing the package: ``` Requirement already satisfied: pyserial in /usr/lib/python3/dist-packages (3.5) ``` This did not cause a problem previously because the action was configured to include all system site-packages in the action's Python virtual environment. Because this approach resulted in the uncontrolled introduction of irrelevant packages into the action's Python virtual environment, the action was changed to only include the "user site-packages" in the virtual environment. That is fine if the now-recommended `--ignore-installed` flag is added to the pyserial installation command, but it breaks the established workflows. Although the goal was always to provide a flexible system that would allow the user installation of any arbitrary platform dependency, rather than hardcoding specific dependencies in the action itself, unfortunately I have not been able to find any way to progress in the improvement of the action without breaking the established workflows that compile for ESP32 boards. So as a workaround I am reluctantly adding the pyserial package to the action's virtual environment. This workaround will be reverted before the 2.0.0 release of the action so the pyserial installation command should be retained in workflows and occurrences of the historical `pip install pyserial` (or `pip3 install pyserial`) commands should be updated to the recommended command: ``` pip install --ignore-installed --user pyserial ``` --- action.yml | 2 +- poetry.lock | 19 +++++++++++++++++-- pyproject.toml | 8 ++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/action.yml b/action.yml index 06fd288..cb1e415 100644 --- a/action.yml +++ b/action.yml @@ -73,7 +73,7 @@ runs: working-directory: ${{ github.action_path }} run: | poetry install \ - --only main + --only main,external - name: Make user-installed Python packages available to platforms shell: bash diff --git a/poetry.lock b/poetry.lock index cf33fcb..0f7fd8c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. [[package]] name = "attrs" @@ -515,6 +515,21 @@ cffi = ">=1.4.1" docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] +[[package]] +name = "pyserial" +version = "3.5" +description = "Python Serial Port Extension" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, + {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, +] + +[package.extras] +cp2110 = ["hidapi"] + [[package]] name = "pytest" version = "7.2.2" @@ -756,4 +771,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "3.11.2" -content-hash = "f10d0924625935c307af749c2ade20a628383337648854a7665165563b3aba49" +content-hash = "35ddf7146c03b75108eb3c7396e518ef8066fcfd2c1094eed4f560c68a5242a2" diff --git a/pyproject.toml b/pyproject.toml index 2e27768..a3f0901 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,6 +18,14 @@ pytest-mock = "3.10.0" flake8 = "5.0.4" pep8-naming = "0.13.3" +# Provided only for use by boards platforms +# NOTE: This group is a temporary workaround that will be removed at the 2.0.0 release of the action. +[tool.poetry.group.external] +optional = true + +[tool.poetry.group.external.dependencies] +pyserial = "3.5" + [tool.pytest.ini_options] filterwarnings = [ "error", From 32339e6211c6c14cf5f123cf6ca4210a4b79502a Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 23 Mar 2023 00:08:00 -0700 Subject: [PATCH 054/100] Group action setup log output The setup of the action produces a significant amount of output, which is printed in the worflow run logs. This output is not of interest to the user so long as the action itself is working correctly so it is only noise in their logs. A log group was previously used to collapse all that setup output in the logs. This was inadvertently removed during recent development work. It is hereby restored. --- action.yml | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/action.yml b/action.yml index cb1e415..1ca43d2 100644 --- a/action.yml +++ b/action.yml @@ -54,6 +54,7 @@ runs: id: system-user-site-packages shell: bash run: | + # Get system Python "user site-packages" path. echo "path=$(python -m site --user-site)" >> $GITHUB_OUTPUT - name: Install Python @@ -61,24 +62,22 @@ runs: with: python-version-file: ${{ github.action_path }}/.python-version - - name: Install Poetry + - name: Action setup shell: bash + working-directory: ${{ github.action_path }} run: | + echo "::group::Action setup" + + # Install Poetry. pipx install \ --python "$(which python)" \ poetry==1.4.0 - - name: Install Python Dependencies - shell: bash - working-directory: ${{ github.action_path }} - run: | + # Install Python dependencies. poetry install \ --only main,external - - name: Make user-installed Python packages available to platforms - shell: bash - working-directory: ${{ github.action_path }} - run: | + # Make user-installed Python packages available to platforms. readonly PYTHON_ENVIRONMENT_PATH="$( poetry env info \ --path @@ -92,6 +91,9 @@ runs: "${{ steps.system-user-site-packages.outputs.path }}" > \ "${VENV_SITE_PACKAGES_PATH}/system-user-site-packages.pth" + # Terminate action setup group + echo "::endgroup::" + - name: Run script shell: bash env: @@ -108,5 +110,6 @@ runs: INPUT_SKETCHES-REPORT-PATH: ${{ inputs.sketches-report-path }} working-directory: ${{ github.action_path }} run: | + # Run action poetry run \ python compilesketches/compilesketches.py From 66c4411ddd0a8e164bf4cda68541a239469d1b8e Mon Sep 17 00:00:00 2001 From: Brendan <2bndy5@gmail.com> Date: Tue, 3 Jan 2023 12:11:54 -0800 Subject: [PATCH 055/100] update set-output cmds --- .github/workflows/sync-labels.yml | 2 +- .github/workflows/test-integration.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 70085bd..1c87f1d 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -103,7 +103,7 @@ jobs: run: | # Use of this flag in the github-label-sync command will cause it to only check the validity of the # configuration. - echo "::set-output name=flag::--dry-run" + echo "flag=--dry-run" >> "$GITHUB_OUTPUT" - name: Checkout repository uses: actions/checkout@v3 diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 73b2607..867c439 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -101,7 +101,7 @@ jobs: - name: Set report artifact name id: report-artifact-name run: | - echo "::set-output name=report-artifact-name::${{ github.job }}" + echo "report-artifact-name=${{ github.job }}" >> "$GITHUB_OUTPUT" - name: Save sketches report as workflow artifact uses: actions/upload-artifact@v3 From 7e1f3467d6cdebd4f094af4dfc97b5211549cb2f Mon Sep 17 00:00:00 2001 From: per1234 Date: Fri, 24 Mar 2023 23:03:43 -0700 Subject: [PATCH 056/100] Move comment inside relevant section of Python project file The previous approach of placing the comment before the start of the section caused Poetry to insert items of the previous section under the comment. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index a3f0901..ffa610d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,9 +18,9 @@ pytest-mock = "3.10.0" flake8 = "5.0.4" pep8-naming = "0.13.3" +[tool.poetry.group.external] # Provided only for use by boards platforms # NOTE: This group is a temporary workaround that will be removed at the 2.0.0 release of the action. -[tool.poetry.group.external] optional = true [tool.poetry.group.external.dependencies] From 0b6522b6ce64d33b52d737f4db4f076d33a5c316 Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 23 Mar 2023 23:21:39 -0700 Subject: [PATCH 057/100] Add missing items to integration test workflow path filter For the sake of efficiency, the integration test workflow is configured to only be triggered on changes to relevant files. Recent changes to the project infrastructure introduced additional relevant files, but those were not added to the path filter at that time. --- .github/workflows/test-integration.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 867c439..5752ca1 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -5,6 +5,9 @@ on: paths: - '.github/workflows/test-integration.yml' - '.github/workflows/testdata/**' + - '.python-version' + - 'poetry.lock' + - 'pyproject.toml' - 'action.yml' - 'compilesketches/**' @@ -12,6 +15,9 @@ on: paths: - '.github/workflows/test-integration.yml' - '.github/workflows/testdata/**' + - '.python-version' + - 'poetry.lock' + - 'pyproject.toml' - 'action.yml' - 'compilesketches/**' From 5bf853cbc32bf50bc9da059536e6db9b4966d19e Mon Sep 17 00:00:00 2001 From: per1234 Date: Fri, 17 Mar 2023 00:57:59 -0700 Subject: [PATCH 058/100] Update infrastructure for action metadata validation A task and GitHub Actions workflow are provided here for validating the action.yml metadata file of GitHub Actions actions. On every push or pull request that affects the metadata file, and periodically, validate action.yml against its JSON schema. --- .../workflows/check-action-metadata-task.yml | 76 +++ .github/workflows/validate-action_yml.yml | 47 -- .gitignore | 2 + README.md | 1 + Taskfile.yml | 72 +++ package-lock.json | 501 ++++++++++++++++++ package.json | 5 + 7 files changed, 657 insertions(+), 47 deletions(-) create mode 100644 .github/workflows/check-action-metadata-task.yml delete mode 100644 .github/workflows/validate-action_yml.yml create mode 100644 Taskfile.yml create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.github/workflows/check-action-metadata-task.yml b/.github/workflows/check-action-metadata-task.yml new file mode 100644 index 0000000..8eca242 --- /dev/null +++ b/.github/workflows/check-action-metadata-task.yml @@ -0,0 +1,76 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-action-metadata-task.md +name: Check Action Metadata + +env: + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: 16.x + +# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-action-metadata-task.ya?ml" + - "action.ya?ml" + - "package.json" + - "package-lock.json" + - "Taskfile.ya?ml" + pull_request: + paths: + - ".github/workflows/check-action-metadata-task.ya?ml" + - "action.ya?ml" + - "package.json" + - "package-lock.json" + - "Taskfile.ya?ml" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage from changes to the JSON schema. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + validate: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Validate action.yml + run: task --silent action:validate diff --git a/.github/workflows/validate-action_yml.yml b/.github/workflows/validate-action_yml.yml deleted file mode 100644 index 5bd70f1..0000000 --- a/.github/workflows/validate-action_yml.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Validate action.yml - -on: - pull_request: - paths: - - ".github/workflows/validate-action_yml.yml" - - "action.yml" - push: - paths: - - ".github/workflows/validate-action_yml.yml" - - "action.yml" - # Scheduled trigger to catch workflow failure resulting from changes to the JSON schema - schedule: - # run every Tuesday at 3 AM UTC - - cron: "0 3 * * 2" - # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch - workflow_dispatch: - # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#repository_dispatch - repository_dispatch: - -jobs: - validate: - runs-on: ubuntu-latest - - env: - JSON_SCHEMA_FOLDER: etc/github-action-json-schema - JSON_SCHEMA_FILENAME: github-action.json - - steps: - - name: Checkout local repository - uses: actions/checkout@v3 - - # See: https://github.com/carlosperate/download-file-action/blob/master/README.md - - name: Download JSON schema for action.yml - uses: carlosperate/download-file-action@v2 - with: - # See: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/github-action.json - file-url: https://json.schemastore.org/github-action - location: ${{ env.JSON_SCHEMA_FOLDER }} - file-name: ${{ env.JSON_SCHEMA_FILENAME }} - - - name: Install JSON schema validator - run: sudo npm install --global ajv-cli - - # See: https://github.com/ajv-validator/ajv-cli/blob/master/README.md - - name: Validate action.yml - run: ajv -s "${{ env.JSON_SCHEMA_FOLDER }}/${{ env.JSON_SCHEMA_FILENAME }}" -d action.yml diff --git a/.gitignore b/.gitignore index f6f487b..e153926 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ venv/ *.bak *.code-workspace *.sublime-workspace + +/node_modules/ diff --git a/README.md b/README.md index abae657..cfa588b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # `arduino/compile-sketches` action +[![Check Action Metadata status](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml) [![Tests](https://github.com/arduino/compile-sketches/workflows/Test%20Python%20code/badge.svg)](https://github.com/arduino/compile-sketches/actions?workflow=Test+Python+code) [![Lint](https://github.com/arduino/compile-sketches/workflows/Lint%20Python%20code/badge.svg)](https://github.com/arduino/compile-sketches/actions?workflow=Lint+Python+code) [![Spell Check](https://github.com/arduino/compile-sketches/workflows/Spell%20Check/badge.svg)](https://github.com/arduino/compile-sketches/actions?workflow=Spell+Check) diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 0000000..b2c1d58 --- /dev/null +++ b/Taskfile.yml @@ -0,0 +1,72 @@ +# See: https://taskfile.dev/#/usage +version: "3" + +tasks: + check: + desc: Check for problems with the project + deps: + - task: action:validate + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-action-metadata-task/Taskfile.yml + action:validate: + desc: Validate GitHub Actions metadata against JSON schema + vars: + ACTION_METADATA_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="github-action-schema-XXXXXXXXXX.json" + deps: + - task: npm:install-deps + cmds: + - | + wget \ + --quiet \ + --output-document="{{.ACTION_METADATA_SCHEMA_PATH}}" \ + https://json.schemastore.org/github-action + - | + npx \ + ajv-cli \ + validate \ + --strict=false \ + -s "{{.ACTION_METADATA_SCHEMA_PATH}}" \ + -d "action.yml" + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/npm-task/Taskfile.yml + npm:install-deps: + desc: Install dependencies managed by npm + run: once + cmds: + - npm install + + # Make a temporary file named according to the passed TEMPLATE variable and print the path passed to stdout + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/windows-task/Taskfile.yml + utility:mktemp-file: + vars: + RAW_PATH: + sh: mktemp --tmpdir "{{.TEMPLATE}}" + cmds: + - task: utility:normalize-path + vars: + RAW_PATH: "{{.RAW_PATH}}" + + # Make a temporary folder named according to the passed TEMPLATE variable and print the path passed to stdout + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/windows-task/Taskfile.yml + utility:mktemp-folder: + vars: + RAW_PATH: + sh: mktemp --directory --tmpdir "{{.TEMPLATE}}" + cmds: + - task: utility:normalize-path + vars: + RAW_PATH: "{{.RAW_PATH}}" + + # Print a normalized version of the path passed via the RAW_PATH variable to stdout + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/windows-task/Taskfile.yml + utility:normalize-path: + cmds: + - | + if [[ "{{.OS}}" == "Windows_NT" ]] && which cygpath &>/dev/null; then + # Even though the shell handles POSIX format absolute paths as expected, external applications do not. + # So paths passed to such applications must first be converted to Windows format. + cygpath -w "{{.RAW_PATH}}" + else + echo "{{.RAW_PATH}}" + fi diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3a3c6b2 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,501 @@ +{ + "name": "compile-sketches", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "devDependencies": { + "ajv-cli": "5.0.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-cli": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ajv-cli/-/ajv-cli-5.0.0.tgz", + "integrity": "sha512-LY4m6dUv44HTyhV+u2z5uX4EhPYTM38Iv1jdgDJJJCyOOuqB8KtZEGjPZ2T+sh5ZIJrXUfgErYx/j3gLd3+PlQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0", + "fast-json-patch": "^2.0.0", + "glob": "^7.1.0", + "js-yaml": "^3.14.0", + "json-schema-migrate": "^2.0.0", + "json5": "^2.1.3", + "minimist": "^1.2.0" + }, + "bin": { + "ajv": "dist/index.js" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-patch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.2.1.tgz", + "integrity": "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^2.0.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fast-json-patch/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-migrate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz", + "integrity": "sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + } + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-cli": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ajv-cli/-/ajv-cli-5.0.0.tgz", + "integrity": "sha512-LY4m6dUv44HTyhV+u2z5uX4EhPYTM38Iv1jdgDJJJCyOOuqB8KtZEGjPZ2T+sh5ZIJrXUfgErYx/j3gLd3+PlQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0", + "fast-json-patch": "^2.0.0", + "glob": "^7.1.0", + "js-yaml": "^3.14.0", + "json-schema-migrate": "^2.0.0", + "json5": "^2.1.3", + "minimist": "^1.2.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-patch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.2.1.tgz", + "integrity": "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "dev": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-migrate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz", + "integrity": "sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..0c9bdd6 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "ajv-cli": "5.0.0" + } +} From e791977713f282c5daa4b5fa9025da2f193f94f2 Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 23 Mar 2023 23:00:09 -0700 Subject: [PATCH 059/100] Fix Dependabot target path for Python dependencies When the project was migrated to using Poetry as the dependencies management system, the dependencies metadata file was moved from the Python project subfolder to the root of the repository, where it can be used to manage all development tool dependencies in addition to the Python code dependencies. The Dependabot configuration file was not updated accordingly at that time. --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ecd65d8..d64d848 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -12,7 +12,7 @@ updates: labels: - "topic: infrastructure" - package-ecosystem: pip - directory: /compilesketches/ + directory: / schedule: interval: daily labels: From 869cb9788a7b563c98303c6b60159d9fb0adbc07 Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 23 Mar 2023 23:00:52 -0700 Subject: [PATCH 060/100] Update comments in Dependabot config to reflect support for action's GHA dependencies Originally, Dependabot only provided support for managing the GitHub Actions action dependencies of workflows. The comments in the Dependabot configuration file reflected that situation. Composite actions can now use other actions and Dependabot will also manage those dependencies. The comments are updated accordingly. --- .github/dependabot.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d64d848..9972e9d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -2,11 +2,11 @@ version: 2 updates: - # Configure check for outdated GitHub Actions actions in workflows. + # Configure check for outdated GitHub Actions actions in workflows and action metadata. # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/dependabot/README.md # See: https://docs.github.com/en/code-security/supply-chain-security/keeping-your-actions-up-to-date-with-dependabot - package-ecosystem: github-actions - directory: / # Check the repository's workflows under /.github/workflows/ + directory: / schedule: interval: daily labels: From 2c3e66f3e91a9506c3fabd4ffb7c499ee5a86a09 Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 23 Mar 2023 23:08:18 -0700 Subject: [PATCH 061/100] Configure Dependabot to check for outdated npm package dependencies Dependabot will periodically check all npm package dependencies of the project. If any are found to be outdated, it will submit a pull request to update them. --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9972e9d..1aa441f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -11,6 +11,12 @@ updates: interval: daily labels: - "topic: infrastructure" + - package-ecosystem: npm + directory: / + schedule: + interval: daily + labels: + - "topic: infrastructure" - package-ecosystem: pip directory: / schedule: From 4525fabb32b0151f07b665ac4db8a448d4352f66 Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 23 Mar 2023 23:17:13 -0700 Subject: [PATCH 062/100] Assign per1234 to all Dependabot PRs As primary maintainer of the project, GitHub user per1234 is responsible for managing Dependabot pull requests. Configuring Dependabot to automatically set the assignment will be more convenient. --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1aa441f..ecd76cf 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,18 +6,24 @@ updates: # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/dependabot/README.md # See: https://docs.github.com/en/code-security/supply-chain-security/keeping-your-actions-up-to-date-with-dependabot - package-ecosystem: github-actions + assignees: + - per1234 directory: / schedule: interval: daily labels: - "topic: infrastructure" - package-ecosystem: npm + assignees: + - per1234 directory: / schedule: interval: daily labels: - "topic: infrastructure" - package-ecosystem: pip + assignees: + - per1234 directory: / schedule: interval: daily From 71b4fd2d2c72b91ef5ff78413ec8ec5f3052999d Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 18 Mar 2023 02:47:12 -0700 Subject: [PATCH 063/100] Update infrastructure for checking for problems with Python code Arduino tooling projects use a standardized infrastructure. A centralized collection of reusable infrastructure assets is maintained in a dedicated repository: https://github.com/arduino/tooling-project-assets Since the time this project's infrastructure was installed, some advancements have been made in the upstream "template" assets. The project's infrastructure is hereby brought up to date with the state of the art upstream assets. The significant changes: - Migration to the use of the Task task runner to allow contributors to easily run the same operations locally as is done by the CI system on GitHub. - The project will now be formatted using the Black code formatter tool, the standard for Arduino Tooling projects. --- .flake8 | 12 +++ .github/workflows/check-python-task.yml | 121 ++++++++++++++++++++++++ .github/workflows/lint-python.yml | 66 ------------- README.md | 2 +- Taskfile.yml | 36 +++++++ compilesketches/.flake8 | 7 -- poetry.lock | 105 +++++++++++++++++++- pyproject.toml | 4 + 8 files changed, 278 insertions(+), 75 deletions(-) create mode 100644 .flake8 create mode 100644 .github/workflows/check-python-task.yml delete mode 100644 .github/workflows/lint-python.yml delete mode 100644 compilesketches/.flake8 diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..efde3a0 --- /dev/null +++ b/.flake8 @@ -0,0 +1,12 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-python/.flake8 +# See: https://flake8.pycqa.org/en/latest/user/configuration.html +# The code style defined in this file is the official standardized style to be used in all Arduino tooling projects and +# should not be modified. + +[flake8] +doctests = True +# W503 and W504 are mutually exclusive. PEP 8 recommends line break before. +ignore = W503 +max-complexity = 10 +max-line-length = 120 +select = E,W,F,C,N diff --git a/.github/workflows/check-python-task.yml b/.github/workflows/check-python-task.yml new file mode 100644 index 0000000..17a5e72 --- /dev/null +++ b/.github/workflows/check-python-task.yml @@ -0,0 +1,121 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-python-task.md +name: Check Python + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-python-task.ya?ml" + - "**/.flake8" + - "**/poetry.lock" + - "**/pyproject.toml" + - "**/setup.cfg" + - ".python-version" + - "Taskfile.ya?ml" + - "**/tox.ini" + - "**.py" + pull_request: + paths: + - ".github/workflows/check-python-task.ya?ml" + - "**/.flake8" + - "**/poetry.lock" + - "**/pyproject.toml" + - "**/setup.cfg" + - ".python-version" + - "Taskfile.ya?ml" + - "**/tox.ini" + - "**.py" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 8 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + lint: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Python + uses: actions/setup-python@v4 + with: + python-version-file: .python-version + + - name: Install Poetry + run: | + pipx install \ + --python "$(which python)" \ + poetry + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Run flake8 + uses: liskin/gh-problem-matcher-wrap@v2 + with: + linters: flake8 + run: task python:lint + + formatting: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Python + uses: actions/setup-python@v4 + with: + python-version-file: .python-version + + - name: Install Poetry + run: | + pipx install \ + --python "$(which python)" \ + poetry + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Format Python code + run: task python:format + + - name: Check formatting + run: git diff --color --exit-code diff --git a/.github/workflows/lint-python.yml b/.github/workflows/lint-python.yml deleted file mode 100644 index 421d9b1..0000000 --- a/.github/workflows/lint-python.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: Lint Python code - -env: - # See: https://pypi.org/project/poetry/#history - POETRY_VERSION: 1.4.0 - -on: - pull_request: - paths: - - '.github/workflows/lint-python.yml' - - 'compilesketches/**.py' - - '.python-version' - - '**/poetry.lock' - - '**/pyproject.toml' - - push: - paths: - - '.github/workflows/lint-python.yml' - - 'compilesketches/**.py' - - '.python-version' - - '**/poetry.lock' - - '**/pyproject.toml' - - # Scheduled trigger checks for workflow failures resulting from updates to the linting tools - schedule: - # run every Tuesday at 3 AM UTC - - cron: "0 3 * * 2" - - # workflow_dispatch event allows the workflow to be triggered manually - # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch - workflow_dispatch: - - # repository_dispatch event allows the workflow to be triggered via the GitHub API - # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#repository_dispatch - repository_dispatch: - -jobs: - lint: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Python - uses: actions/setup-python@v4.5.0 - with: - python-version-file: .python-version - - - name: Install Poetry - run: | - pipx \ - install \ - poetry==${{ env.POETRY_VERSION }} - - - name: Install Python Dependencies - run: | - poetry \ - install \ - --only dev - - - name: Lint with flake8 - env: - PYTHON_PROJECT_PATH: ${GITHUB_WORKSPACE}/compilesketches - run: | - poetry run flake8 --config "${{ env.PYTHON_PROJECT_PATH }}/.flake8" --show-source "${{ env.PYTHON_PROJECT_PATH }}" diff --git a/README.md b/README.md index cfa588b..12f4e19 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Check Action Metadata status](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml) [![Tests](https://github.com/arduino/compile-sketches/workflows/Test%20Python%20code/badge.svg)](https://github.com/arduino/compile-sketches/actions?workflow=Test+Python+code) -[![Lint](https://github.com/arduino/compile-sketches/workflows/Lint%20Python%20code/badge.svg)](https://github.com/arduino/compile-sketches/actions?workflow=Lint+Python+code) +[![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) [![Spell Check](https://github.com/arduino/compile-sketches/workflows/Spell%20Check/badge.svg)](https://github.com/arduino/compile-sketches/actions?workflow=Spell+Check) [![codecov](https://codecov.io/gh/arduino/compile-sketches/branch/main/graph/badge.svg?token=Uv6f1ebMZ4)](https://codecov.io/gh/arduino/compile-sketches) diff --git a/Taskfile.yml b/Taskfile.yml index b2c1d58..41a0727 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -6,6 +6,12 @@ tasks: desc: Check for problems with the project deps: - task: action:validate + - task: python:lint + + fix: + desc: Make automated corrections to the project's files + deps: + - task: python:format # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-action-metadata-task/Taskfile.yml action:validate: @@ -36,6 +42,36 @@ tasks: cmds: - npm install + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/poetry-task/Taskfile.yml + poetry:install-deps: + desc: Install dependencies managed by Poetry + run: when_changed + cmds: + - | + poetry install \ + --no-root \ + {{if .POETRY_GROUPS}} --only {{.POETRY_GROUPS}} {{end}} + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-python-task/Taskfile.yml + python:format: + desc: Format Python files + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev + cmds: + - poetry run black . + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-python-task/Taskfile.yml + python:lint: + desc: Lint Python code + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev + cmds: + - poetry run flake8 --show-source + # Make a temporary file named according to the passed TEMPLATE variable and print the path passed to stdout # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/windows-task/Taskfile.yml utility:mktemp-file: diff --git a/compilesketches/.flake8 b/compilesketches/.flake8 deleted file mode 100644 index 8f80241..0000000 --- a/compilesketches/.flake8 +++ /dev/null @@ -1,7 +0,0 @@ -[flake8] -doctests = True -# W503 and W504 are mutually exclusive. PEP 8 recommends line break before. -ignore = W503 -max-complexity = 10 -max-line-length = 120 -select = E,W,F,C,N diff --git a/poetry.lock b/poetry.lock index 0f7fd8c..ecb51cb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -19,6 +19,54 @@ docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib- tests = ["attrs[tests-no-zope]", "zope.interface"] tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +[[package]] +name = "black" +version = "23.1.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "black-23.1.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b"}, + {file = "black-23.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104"}, + {file = "black-23.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958"}, + {file = "black-23.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a"}, + {file = "black-23.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481"}, + {file = "black-23.1.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad"}, + {file = "black-23.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8"}, + {file = "black-23.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580"}, + {file = "black-23.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468"}, + {file = "black-23.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739"}, + {file = "black-23.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9"}, + {file = "black-23.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555"}, + {file = "black-23.1.0-py3-none-any.whl", hash = "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32"}, + {file = "black-23.1.0.tar.gz", hash = "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + [[package]] name = "certifi" version = "2022.12.7" @@ -193,6 +241,21 @@ files = [ {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, ] +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] name = "colorama" version = "0.4.6" @@ -370,6 +433,18 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + [[package]] name = "packaging" version = "23.0" @@ -382,6 +457,18 @@ files = [ {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, ] +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + [[package]] name = "pep8-naming" version = "0.13.3" @@ -397,6 +484,22 @@ files = [ [package.dependencies] flake8 = ">=5.0.0" +[[package]] +name = "platformdirs" +version = "3.1.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.1.1-py3-none-any.whl", hash = "sha256:e5986afb596e4bb5bde29a79ac9061aa955b94fca2399b7aaac4090860920dd8"}, + {file = "platformdirs-3.1.1.tar.gz", hash = "sha256:024996549ee88ec1a9aa99ff7f8fc819bb59e2c3477b410d90a16d32d6e707aa"}, +] + +[package.extras] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + [[package]] name = "pluggy" version = "1.0.0" @@ -771,4 +874,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "3.11.2" -content-hash = "35ddf7146c03b75108eb3c7396e518ef8066fcfd2c1094eed4f560c68a5242a2" +content-hash = "c975d20f32852d848f235549d9dd58b6870a2e744226a479d39f75832e5fd82f" diff --git a/pyproject.toml b/pyproject.toml index ffa610d..cd23db1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,6 @@ +[tool.black] +line-length = 120 + [tool.poetry] name = "compilesketches" version = "0.0.0" @@ -12,6 +15,7 @@ PyYAML = "6.0" semver = "2.13.0" [tool.poetry.group.dev.dependencies] +black = "23.1.0" coverage = "7.2.2" pytest = "7.2.2" pytest-mock = "3.10.0" From 8866d4a333f42f8d6eab1483735c132e4afb19be Mon Sep 17 00:00:00 2001 From: per1234 Date: Fri, 24 Mar 2023 20:51:56 -0700 Subject: [PATCH 064/100] Bring Python formatting into Black code style compliance The Black code formatter tool is now used for formatting of the project's Python code. There are some differences between the standard Black code style and the previous code style used in the project. --- compilesketches/compilesketches.py | 489 ++-- compilesketches/tests/test_compilesketches.py | 2292 ++++++++++------- 2 files changed, 1551 insertions(+), 1230 deletions(-) diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index a9ec404..e1dee5f 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -27,18 +27,24 @@ def main(): print("::warning::The size-report-sketch input is no longer used") if "INPUT_SIZE-DELTAS-REPORT-FOLDER-NAME" in os.environ: - print("::warning::The size-deltas-report-folder-name input is deprecated. Use the equivalent input: " - "sketches-report-path instead.") + print( + "::warning::The size-deltas-report-folder-name input is deprecated. Use the equivalent input: " + "sketches-report-path instead." + ) os.environ["INPUT_SKETCHES-REPORT-PATH"] = os.environ["INPUT_SIZE-DELTAS-REPORT-FOLDER-NAME"] if "INPUT_ENABLE-SIZE-DELTAS-REPORT" in os.environ: - print("::warning::The enable-size-deltas-report input is deprecated. Use the equivalent input: " - "enable-deltas-report instead.") + print( + "::warning::The enable-size-deltas-report input is deprecated. Use the equivalent input: " + "enable-deltas-report instead." + ) os.environ["INPUT_ENABLE-DELTAS-REPORT"] = os.environ["INPUT_ENABLE-SIZE-DELTAS-REPORT"] if "INPUT_ENABLE-SIZE-TRENDS-REPORT" in os.environ: - print("::warning::The size trends report feature has been moved to a dedicated action. See the documentation " - "at https://github.com/arduino/actions/tree/report-size-trends-action/libraries/report-size-trends") + print( + "::warning::The size trends report feature has been moved to a dedicated action. See the documentation " + "at https://github.com/arduino/actions/tree/report-size-trends-action/libraries/report-size-trends" + ) compile_sketches = CompileSketches( cli_version=os.environ["INPUT_CLI-VERSION"], @@ -51,7 +57,7 @@ def main(): github_token=os.environ["INPUT_GITHUB-TOKEN"], enable_deltas_report=os.environ["INPUT_ENABLE-DELTAS-REPORT"], enable_warnings_report=os.environ["INPUT_ENABLE-WARNINGS-REPORT"], - sketches_report_path=os.environ["INPUT_SKETCHES-REPORT-PATH"] + sketches_report_path=os.environ["INPUT_SKETCHES-REPORT-PATH"], ) compile_sketches.compile_sketches() @@ -120,8 +126,20 @@ class ReportKeys: latest_release_indicator = "latest" - def __init__(self, cli_version, fqbn_arg, platforms, libraries, sketch_paths, cli_compile_flags, verbose, - github_token, enable_deltas_report, enable_warnings_report, sketches_report_path): + def __init__( + self, + cli_version, + fqbn_arg, + platforms, + libraries, + sketch_paths, + cli_compile_flags, + verbose, + github_token, + enable_deltas_report, + enable_warnings_report, + sketches_report_path, + ): """Process, store, and validate the action's inputs.""" self.cli_version = cli_version @@ -185,8 +203,10 @@ def get_pull_request_base_ref(self): try: repository_api = self.github_api.get_repo(full_name_or_id=os.environ["GITHUB_REPOSITORY"]) except github.UnknownObjectException: - print("::error::Unable to access repository data. Please specify the github-token input in your " - "workflow configuration.") + print( + "::error::Unable to access repository data. Please specify the github-token input in your " + "workflow configuration." + ) sys.exit(1) return repository_api.get_pull(number=pull_request_number).base.ref @@ -235,7 +255,7 @@ def install_arduino_cli(self): # The Arduino CLI has no root folder, so just install the arduino-cli executable from the archive root source_path="arduino-cli", destination_parent_path=self.arduino_cli_installation_path, - force=False + force=False, ) # Configure the location of the Arduino CLI user directory @@ -289,10 +309,12 @@ def install_from_download(self, url, source_path, destination_parent_path, desti print("::error::Archive source path:", source_path, "not found") sys.exit(1) - self.install_from_path(source_path=absolute_source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name, - force=force) + self.install_from_path( + source_path=absolute_source_path, + destination_parent_path=destination_parent_path, + destination_name=destination_name, + force=force, + ) def install_platforms(self): """Install Arduino boards platforms.""" @@ -338,14 +360,14 @@ def sort_dependency_list(self, dependency_list): if dependency is not None: if self.dependency_source_url_key in dependency: # Repositories are identified by the URL starting with git:// or ending in .git - if ( - dependency[self.dependency_source_url_key].rstrip("/").endswith(".git") - or dependency[self.dependency_source_url_key].startswith("git://") - ): + if dependency[self.dependency_source_url_key].rstrip("/").endswith(".git") or dependency[ + self.dependency_source_url_key + ].startswith("git://"): sorted_dependencies.repository.append(dependency) - elif re.match( - pattern=".*/package_.*index.json", string=dependency[self.dependency_source_url_key] - ) is not None: + elif ( + re.match(pattern=".*/package_.*index.json", string=dependency[self.dependency_source_url_key]) + is not None + ): # URLs that match the filename requirements of the package_index.json specification are assumed # to be additional Board Manager URLs (platform index) sorted_dependencies.manager.append(dependency) @@ -391,12 +413,14 @@ def install_platforms_from_board_manager(self, platform_list): core_install_command.append(self.get_manager_dependency_name(platform)) # Download the platform index for the platform - self.run_arduino_cli_command(command=core_update_index_command, - enable_output=self.get_run_command_output_level()) + self.run_arduino_cli_command( + command=core_update_index_command, enable_output=self.get_run_command_output_level() + ) # Install the platform - self.run_arduino_cli_command(command=core_install_command, - enable_output=self.get_run_command_output_level()) + self.run_arduino_cli_command( + command=core_install_command, enable_output=self.get_run_command_output_level() + ) def get_manager_dependency_name(self, dependency): """Return the appropriate name value for a manager dependency. This allows the NAME@VERSION syntax to be used @@ -438,9 +462,9 @@ def run_arduino_cli_command(self, command, enable_output=RunCommandOutput.ON_FAI full_command.extend(command) if self.verbose: full_command.extend(["--log-level", debug_output_log_level, "--verbose"]) - arduino_cli_output = self.run_command(command=full_command, - enable_output=enable_output, - exit_on_failure=exit_on_failure) + arduino_cli_output = self.run_command( + command=full_command, enable_output=enable_output, exit_on_failure=exit_on_failure + ) return arduino_cli_output @@ -458,15 +482,19 @@ def run_command(self, command, enable_output=RunCommandOutput.ON_FAILURE, exit_o command_data = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) # Print output if appropriate - if (enable_output == self.RunCommandOutput.ALWAYS - or (command_data.returncode != 0 - and (enable_output == self.RunCommandOutput.ON_FAILURE - or enable_output == self.RunCommandOutput.ALWAYS))): - + if enable_output == self.RunCommandOutput.ALWAYS or ( + command_data.returncode != 0 + and (enable_output == self.RunCommandOutput.ON_FAILURE or enable_output == self.RunCommandOutput.ALWAYS) + ): # Cast args to string and join them to form a string - print("::group::Running command:", list_to_string(command_data.args), "\n", - command_data.stdout, "\n", - "::endgroup::") + print( + "::group::Running command:", + list_to_string(command_data.args), + "\n", + command_data.stdout, + "\n", + "::endgroup::", + ) if command_data.returncode != 0: print("::error::Command failed") @@ -494,10 +522,12 @@ def install_platforms_from_path(self, platform_list): platform_installation_path = self.get_platform_installation_path(platform=platform) # Install the platform - self.install_from_path(source_path=source_path, - destination_parent_path=platform_installation_path.path.parent, - destination_name=platform_installation_path.path.name, - force=platform_installation_path.is_overwrite) + self.install_from_path( + source_path=source_path, + destination_parent_path=platform_installation_path.path.parent, + destination_name=platform_installation_path.path.name, + force=platform_installation_path.is_overwrite, + ) def get_platform_installation_path(self, platform): """Determines the correct installation path for the given platform and returns an object with the attributes: @@ -532,13 +562,11 @@ def __init__(self): for installed_platform in installed_platform_list: if installed_platform[self.cli_json_key("core list", "ID")] == platform[self.dependency_name_key]: # The platform has been installed via Board Manager, so do an overwrite - platform_installation_path.path = ( - self.board_manager_platforms_path.joinpath( - platform_vendor, - "hardware", - platform_architecture, - installed_platform[self.cli_json_key("core list", "Installed")] - ) + platform_installation_path.path = self.board_manager_platforms_path.joinpath( + platform_vendor, + "hardware", + platform_architecture, + installed_platform[self.cli_json_key("core list", "Installed")], ) platform_installation_path.is_overwrite = True @@ -600,12 +628,14 @@ def install_platforms_from_repository(self, platform_list): destination_path = self.get_platform_installation_path(platform=platform) - self.install_from_repository(url=platform[self.dependency_source_url_key], - git_ref=git_ref, - source_path=source_path, - destination_parent_path=destination_path.path.parent, - destination_name=destination_path.path.name, - force=destination_path.is_overwrite) + self.install_from_repository( + url=platform[self.dependency_source_url_key], + git_ref=git_ref, + source_path=source_path, + destination_parent_path=destination_path.path.parent, + destination_name=destination_path.path.name, + force=destination_path.is_overwrite, + ) def get_repository_dependency_ref(self, dependency): """Return the appropriate git ref value for a repository dependency @@ -620,13 +650,9 @@ def get_repository_dependency_ref(self, dependency): return git_ref - def install_from_repository(self, - url, - git_ref, - source_path, - destination_parent_path, - destination_name=None, - force=False): + def install_from_repository( + self, url, git_ref, source_path, destination_parent_path, destination_name=None, force=False + ): """Install by cloning a repository Keyword arguments: @@ -646,10 +672,12 @@ def install_from_repository(self, clone_folder = tempfile.mkdtemp(dir=self.temporary_directory.name, prefix="install_from_repository-") self.clone_repository(url=url, git_ref=git_ref, destination_path=clone_folder) # Install to the final location - self.install_from_path(source_path=pathlib.Path(clone_folder, source_path), - destination_parent_path=destination_parent_path, - destination_name=destination_name, - force=force) + self.install_from_path( + source_path=pathlib.Path(clone_folder, source_path), + destination_parent_path=destination_parent_path, + destination_name=destination_name, + force=force, + ) def clone_repository(self, url, git_ref, destination_path): """Clone a Git repository to a specified location and check out the specified ref @@ -695,11 +723,13 @@ def install_platforms_from_download(self, platform_list): destination_path = self.get_platform_installation_path(platform=platform) - self.install_from_download(url=platform[self.dependency_source_url_key], - source_path=source_path, - destination_parent_path=destination_path.path.parent, - destination_name=destination_path.path.name, - force=destination_path.is_overwrite) + self.install_from_download( + url=platform[self.dependency_source_url_key], + source_path=source_path, + destination_parent_path=destination_path.path.parent, + destination_name=destination_path.path.name, + force=destination_path.is_overwrite, + ) def install_libraries(self): """Install Arduino libraries.""" @@ -711,8 +741,7 @@ def install_libraries(self): library_list = self.sort_dependency_list(libraries.value) else: # libraries input uses the old space-separated list syntax - library_list.manager = [{self.dependency_name_key: library_name} - for library_name in libraries.value] + library_list.manager = [{self.dependency_name_key: library_name} for library_name in libraries.value] # The original behavior of the action was to assume the root of the repo is a library to be installed, so # that behavior is retained when using the old input syntax @@ -767,9 +796,7 @@ def install_libraries_from_path(self, library_list): if self.dependency_destination_name_key in library: # If a name was specified, use it destination_name = library[self.dependency_destination_name_key] - elif ( - source_path == absolute_path(os.environ["GITHUB_WORKSPACE"]) - ): + elif source_path == absolute_path(os.environ["GITHUB_WORKSPACE"]): # If source_path is the root of the workspace (i.e., repository root), name the folder according to the # repository name, otherwise it will unexpectedly be "workspace" destination_name = os.environ["GITHUB_REPOSITORY"].split(sep="/")[1] @@ -777,10 +804,12 @@ def install_libraries_from_path(self, library_list): # Use the existing folder name destination_name = None - self.install_from_path(source_path=source_path, - destination_parent_path=self.libraries_path, - destination_name=destination_name, - force=True) + self.install_from_path( + source_path=source_path, + destination_parent_path=self.libraries_path, + destination_name=destination_name, + force=True, + ) def install_libraries_from_repository(self, library_list): """Install libraries by cloning Git repositories @@ -806,12 +835,14 @@ def install_libraries_from_repository(self, library_list): else: source_path = "." - self.install_from_repository(url=library[self.dependency_source_url_key], - git_ref=git_ref, - source_path=source_path, - destination_parent_path=self.libraries_path, - destination_name=destination_name, - force=True) + self.install_from_repository( + url=library[self.dependency_source_url_key], + git_ref=git_ref, + source_path=source_path, + destination_parent_path=self.libraries_path, + destination_name=destination_name, + force=True, + ) def install_libraries_from_download(self, library_list): """Install libraries by downloading them @@ -831,11 +862,13 @@ def install_libraries_from_download(self, library_list): else: destination_name = None - self.install_from_download(url=library[self.dependency_source_url_key], - source_path=source_path, - destination_parent_path=self.libraries_path, - destination_name=destination_name, - force=True) + self.install_from_download( + url=library[self.dependency_source_url_key], + source_path=source_path, + destination_parent_path=self.libraries_path, + destination_name=destination_name, + force=True, + ) def find_sketches(self): """Return a list of all sketches under the paths specified in the sketch paths list recursively.""" @@ -896,7 +929,8 @@ def compile_sketch(self, sketch_path, clean_build_cache): shutil.rmtree(path=cache_path) start_time = time.monotonic() compilation_data = self.run_arduino_cli_command( - command=compilation_command, enable_output=self.RunCommandOutput.NONE, exit_on_failure=False) + command=compilation_command, enable_output=self.RunCommandOutput.NONE, exit_on_failure=False + ) diff_time = time.monotonic() - start_time # Group compilation output to make the log easy to read @@ -936,9 +970,9 @@ def get_sketch_report(self, compilation_result): current_warning_count = None previous_sizes = None previous_warning_count = None - if self.do_deltas_report(compilation_result=compilation_result, - current_sizes=current_sizes, - current_warnings=current_warning_count): + if self.do_deltas_report( + compilation_result=compilation_result, current_sizes=current_sizes, current_warnings=current_warning_count + ): # Get data for the sketch at the base ref # Get the head ref repository = git.Repo(path=os.environ["GITHUB_WORKSPACE"]) @@ -949,29 +983,28 @@ def get_sketch_report(self, compilation_result): # Compile the sketch again print("Compiling previous version of sketch to determine memory usage change") - previous_compilation_result = self.compile_sketch(sketch_path=compilation_result.sketch, - clean_build_cache=self.enable_warnings_report) + previous_compilation_result = self.compile_sketch( + sketch_path=compilation_result.sketch, clean_build_cache=self.enable_warnings_report + ) # git checkout the head ref to return the repository to its previous state repository.git.checkout(original_git_ref, recurse_submodules=True) previous_sizes = self.get_sizes_from_output(compilation_result=previous_compilation_result) if self.enable_warnings_report: - previous_warning_count = ( - self.get_warning_count_from_output(compilation_result=previous_compilation_result) + previous_warning_count = self.get_warning_count_from_output( + compilation_result=previous_compilation_result ) # Add global data for sketch to report sketch_report = { self.ReportKeys.name: str(path_relative_to_workspace(path=compilation_result.sketch)), self.ReportKeys.compilation_success: compilation_result.success, - self.ReportKeys.sizes: self.get_sizes_report(current_sizes=current_sizes, - previous_sizes=previous_sizes), + self.ReportKeys.sizes: self.get_sizes_report(current_sizes=current_sizes, previous_sizes=previous_sizes), } if self.enable_warnings_report: - sketch_report[self.ReportKeys.warnings] = ( - self.get_warnings_report(current_warnings=current_warning_count, - previous_warnings=previous_warning_count) + sketch_report[self.ReportKeys.warnings] = self.get_warnings_report( + current_warnings=current_warning_count, previous_warnings=previous_warning_count ) return sketch_report @@ -992,8 +1025,8 @@ def get_sizes_from_output(self, compilation_result): # The regular expression for the total memory self.ReportKeys.maximum: ( r"Sketch uses [0-9]+ bytes .*of program storage space\. Maximum is ([0-9]+) bytes." - ) - } + ), + }, }, { "name": "RAM for global variables", @@ -1001,9 +1034,9 @@ def get_sizes_from_output(self, compilation_result): self.ReportKeys.absolute: r"Global variables use ([0-9]+) bytes .*of dynamic memory", self.ReportKeys.maximum: ( r"Global variables use [0-9]+ bytes .*of dynamic memory.*\. Maximum is ([0-9]+) bytes." - ) - } - } + ), + }, + }, ] sizes = [] @@ -1013,26 +1046,30 @@ def get_sizes_from_output(self, compilation_result): # Set default memory usage value, to be used if memory usage can't be determined self.ReportKeys.absolute: self.not_applicable_indicator, self.ReportKeys.maximum: self.not_applicable_indicator, - self.ReportKeys.relative: self.not_applicable_indicator + self.ReportKeys.relative: self.not_applicable_indicator, } if compilation_result.success is True: # Determine memory usage of the sketch by parsing Arduino CLI's output - size_data = self.get_size_data_from_output(compilation_output=compilation_result.output, - memory_type=memory_type, - size_data_type=self.ReportKeys.absolute) + size_data = self.get_size_data_from_output( + compilation_output=compilation_result.output, + memory_type=memory_type, + size_data_type=self.ReportKeys.absolute, + ) if size_data: size[self.ReportKeys.absolute] = size_data - size_data = self.get_size_data_from_output(compilation_output=compilation_result.output, - memory_type=memory_type, - size_data_type=self.ReportKeys.maximum) + size_data = self.get_size_data_from_output( + compilation_output=compilation_result.output, + memory_type=memory_type, + size_data_type=self.ReportKeys.maximum, + ) if size_data: size[self.ReportKeys.maximum] = size_data size[self.ReportKeys.relative] = round( (100 * size[self.ReportKeys.absolute] / size[self.ReportKeys.maximum]), - self.relative_size_report_decimal_places + self.relative_size_report_decimal_places, ) sizes.append(size) @@ -1062,7 +1099,9 @@ def get_size_data_from_output(self, compilation_output, memory_type, size_data_t # - upload.maximum_size is not defined in boards.txt # RAM usage will not be reported in the Arduino CLI output self.verbose_print( - "::warning::Unable to determine the: \"" + size_data_type + "\" value for memory type: \"" + '::warning::Unable to determine the: "' + + size_data_type + + '" value for memory type: "' + memory_type["name"] + "\". The board's platform may not have been configured to provide this information." ) @@ -1096,12 +1135,8 @@ def do_deltas_report(self, compilation_result, current_sizes, current_warnings): self.enable_deltas_report and compilation_result.success and ( - any(size.get(self.ReportKeys.absolute) != self.not_applicable_indicator for - size in current_sizes) - or ( - current_warnings is not None - and current_warnings != self.not_applicable_indicator - ) + any(size.get(self.ReportKeys.absolute) != self.not_applicable_indicator for size in current_sizes) + or (current_warnings is not None and current_warnings != self.not_applicable_indicator) ) ) @@ -1111,12 +1146,14 @@ def checkout_deltas_base_ref(self): # git fetch the deltas base ref origin_remote = repository.remotes["origin"] - origin_remote.fetch(refspec=self.deltas_base_ref, - verbose=self.verbose, - no_tags=True, - prune=True, - depth=1, - recurse_submodules=True) + origin_remote.fetch( + refspec=self.deltas_base_ref, + verbose=self.verbose, + no_tags=True, + prune=True, + depth=1, + recurse_submodules=True, + ) # git checkout the deltas base ref repository.git.checkout(self.deltas_base_ref, recurse_submodules=True) @@ -1135,8 +1172,7 @@ def get_sizes_report(self, current_sizes, previous_sizes): sizes_report = [] for current_size, previous_size in zip(current_sizes, previous_sizes): - sizes_report.append(self.get_size_report(current_size=current_size, - previous_size=previous_size)) + sizes_report.append(self.get_size_report(current_size=current_size, previous_size=previous_size)) return sizes_report @@ -1153,8 +1189,8 @@ def get_size_report(self, current_size, previous_size): self.ReportKeys.maximum: current_size[self.ReportKeys.maximum], self.ReportKeys.current: { self.ReportKeys.absolute: current_size[self.ReportKeys.absolute], - self.ReportKeys.relative: current_size[self.ReportKeys.relative] - } + self.ReportKeys.relative: current_size[self.ReportKeys.relative], + }, } if previous_size is not None: @@ -1165,7 +1201,7 @@ def get_size_report(self, current_size, previous_size): ): absolute_delta = self.not_applicable_indicator else: - absolute_delta = (current_size[self.ReportKeys.absolute] - previous_size[self.ReportKeys.absolute]) + absolute_delta = current_size[self.ReportKeys.absolute] - previous_size[self.ReportKeys.absolute] if ( absolute_delta == self.not_applicable_indicator @@ -1174,8 +1210,10 @@ def get_size_report(self, current_size, previous_size): relative_delta = self.not_applicable_indicator else: # Calculate from absolute values to avoid rounding errors - relative_delta = round((100 * absolute_delta / size_report[self.ReportKeys.maximum]), - self.relative_size_report_decimal_places) + relative_delta = round( + (100 * absolute_delta / size_report[self.ReportKeys.maximum]), + self.relative_size_report_decimal_places, + ) # Size deltas reports are enabled # Print the memory usage change data to the log @@ -1186,11 +1224,11 @@ def get_size_report(self, current_size, previous_size): size_report[self.ReportKeys.previous] = { self.ReportKeys.absolute: previous_size[self.ReportKeys.absolute], - self.ReportKeys.relative: previous_size[self.ReportKeys.relative] + self.ReportKeys.relative: previous_size[self.ReportKeys.relative], } size_report[self.ReportKeys.delta] = { self.ReportKeys.absolute: absolute_delta, - self.ReportKeys.relative: relative_delta + self.ReportKeys.relative: relative_delta, } return size_report @@ -1211,10 +1249,7 @@ def get_warnings_report(self, current_warnings, previous_warnings): if previous_warnings is not None: # Deltas reports are enabled # Calculate the change in the warnings count - if ( - current_warnings == self.not_applicable_indicator - or previous_warnings == self.not_applicable_indicator - ): + if current_warnings == self.not_applicable_indicator or previous_warnings == self.not_applicable_indicator: warnings_delta = self.not_applicable_indicator else: warnings_delta = current_warnings - previous_warnings @@ -1222,12 +1257,8 @@ def get_warnings_report(self, current_warnings, previous_warnings): # Print the warning count change to the log print("Change in compiler warning count:", warnings_delta) - warnings_report[self.ReportKeys.previous] = { - self.ReportKeys.absolute: previous_warnings - } - warnings_report[self.ReportKeys.delta] = { - self.ReportKeys.absolute: warnings_delta - } + warnings_report[self.ReportKeys.previous] = {self.ReportKeys.absolute: previous_warnings} + warnings_report[self.ReportKeys.delta] = {self.ReportKeys.absolute: warnings_delta} return warnings_report @@ -1241,19 +1272,13 @@ def get_sketches_report(self, sketch_report_list): sketches_report = { self.ReportKeys.commit_hash: current_git_ref, - self.ReportKeys.commit_url: ("https://github.com/" - + os.environ["GITHUB_REPOSITORY"] - + "/commit/" - + current_git_ref), + self.ReportKeys.commit_url: ( + "https://github.com/" + os.environ["GITHUB_REPOSITORY"] + "/commit/" + current_git_ref + ), # The action is currently designed to only compile for one board per run, so the boards list will only have # a single element, but this provides a report format that can accommodate the possible addition of multiple # boards support - self.ReportKeys.boards: [ - { - self.ReportKeys.board: self.fqbn, - self.ReportKeys.sketches: sketch_report_list - } - ] + self.ReportKeys.boards: [{self.ReportKeys.board: self.fqbn, self.ReportKeys.sketches: sketch_report_list}], } sizes_summary_report = self.get_sizes_summary_report(sketch_report_list=sketch_report_list) @@ -1278,7 +1303,8 @@ def get_sizes_summary_report(self, sketch_report_list): if self.ReportKeys.delta in size_report: # Determine the sizes_summary_report index for this memory type size_summary_report_index_list = [ - index for index, size_summary in enumerate(sizes_summary_report) + index + for index, size_summary in enumerate(sizes_summary_report) if size_summary.get(self.ReportKeys.name) == size_report[self.ReportKeys.name] ] if not size_summary_report_index_list: @@ -1290,77 +1316,94 @@ def get_sizes_summary_report(self, sketch_report_list): self.ReportKeys.delta: { self.ReportKeys.absolute: { self.ReportKeys.minimum: size_report[self.ReportKeys.delta][ - self.ReportKeys.absolute], + self.ReportKeys.absolute + ], self.ReportKeys.maximum: size_report[self.ReportKeys.delta][ - self.ReportKeys.absolute] + self.ReportKeys.absolute + ], }, self.ReportKeys.relative: { self.ReportKeys.minimum: size_report[self.ReportKeys.delta][ - self.ReportKeys.relative], + self.ReportKeys.relative + ], self.ReportKeys.maximum: size_report[self.ReportKeys.delta][ - self.ReportKeys.relative] + self.ReportKeys.relative + ], }, - } + }, } ) else: size_summary_report_index = size_summary_report_index_list[0] if ( - sizes_summary_report[size_summary_report_index][ - self.ReportKeys.maximum] == self.not_applicable_indicator + sizes_summary_report[size_summary_report_index][self.ReportKeys.maximum] + == self.not_applicable_indicator ): - sizes_summary_report[size_summary_report_index][ - self.ReportKeys.maximum] = size_report[self.ReportKeys.maximum] + sizes_summary_report[size_summary_report_index][self.ReportKeys.maximum] = size_report[ + self.ReportKeys.maximum + ] if ( sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.minimum] == self.not_applicable_indicator + self.ReportKeys.absolute + ][self.ReportKeys.minimum] + == self.not_applicable_indicator ): sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.minimum] = size_report[self.ReportKeys.delta][ - self.ReportKeys.absolute] + self.ReportKeys.absolute + ][self.ReportKeys.minimum] = size_report[self.ReportKeys.delta][self.ReportKeys.absolute] sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.relative][self.ReportKeys.minimum] = size_report[self.ReportKeys.delta][ - self.ReportKeys.relative] + self.ReportKeys.relative + ][self.ReportKeys.minimum] = size_report[self.ReportKeys.delta][self.ReportKeys.relative] sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][ - self.ReportKeys.absolute] + self.ReportKeys.absolute + ][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][self.ReportKeys.absolute] sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.relative][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][ - self.ReportKeys.relative] + self.ReportKeys.relative + ][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][self.ReportKeys.relative] elif size_report[self.ReportKeys.delta][self.ReportKeys.absolute] != ( self.not_applicable_indicator ): - if (size_report[self.ReportKeys.delta][self.ReportKeys.absolute] + if ( + size_report[self.ReportKeys.delta][self.ReportKeys.absolute] < sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.minimum]): + self.ReportKeys.absolute + ][self.ReportKeys.minimum] + ): sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.minimum] = ( - size_report[self.ReportKeys.delta][self.ReportKeys.absolute] - ) + self.ReportKeys.absolute + ][self.ReportKeys.minimum] = size_report[self.ReportKeys.delta][ + self.ReportKeys.absolute + ] sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.relative][self.ReportKeys.minimum] = ( - size_report[self.ReportKeys.delta][self.ReportKeys.relative] - ) + self.ReportKeys.relative + ][self.ReportKeys.minimum] = size_report[self.ReportKeys.delta][ + self.ReportKeys.relative + ] - if (size_report[self.ReportKeys.delta][self.ReportKeys.absolute] + if ( + size_report[self.ReportKeys.delta][self.ReportKeys.absolute] > sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.maximum]): + self.ReportKeys.absolute + ][self.ReportKeys.maximum] + ): sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.maximum] = ( - size_report[self.ReportKeys.delta][self.ReportKeys.absolute] - ) + self.ReportKeys.absolute + ][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][ + self.ReportKeys.absolute + ] sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.relative][self.ReportKeys.maximum] = ( - size_report[self.ReportKeys.delta][self.ReportKeys.relative] - ) + self.ReportKeys.relative + ][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][ + self.ReportKeys.relative + ] return sizes_summary_report @@ -1377,14 +1420,11 @@ def get_warnings_summary_report(self, sketch_report_list): self.ReportKeys.warnings in sketch_report and self.ReportKeys.delta in sketch_report[self.ReportKeys.warnings] ): - sketch_report_delta = ( - sketch_report[self.ReportKeys.warnings][self.ReportKeys.delta][self.ReportKeys.absolute] - ) + sketch_report_delta = sketch_report[self.ReportKeys.warnings][self.ReportKeys.delta][ + self.ReportKeys.absolute + ] - if ( - summary_report_minimum is None - or summary_report_minimum == self.not_applicable_indicator - ): + if summary_report_minimum is None or summary_report_minimum == self.not_applicable_indicator: summary_report_minimum = sketch_report_delta elif ( sketch_report_delta != self.not_applicable_indicator @@ -1392,10 +1432,7 @@ def get_warnings_summary_report(self, sketch_report_list): ): summary_report_minimum = sketch_report_delta - if ( - summary_report_maximum is None - or summary_report_maximum == self.not_applicable_indicator - ): + if summary_report_maximum is None or summary_report_maximum == self.not_applicable_indicator: summary_report_maximum = sketch_report_delta elif ( sketch_report_delta != self.not_applicable_indicator @@ -1408,7 +1445,7 @@ def get_warnings_summary_report(self, sketch_report_list): self.ReportKeys.delta: { self.ReportKeys.absolute: { self.ReportKeys.minimum: summary_report_minimum, - self.ReportKeys.maximum: summary_report_maximum + self.ReportKeys.maximum: summary_report_maximum, } } } @@ -1431,8 +1468,9 @@ def create_sketches_report_file(self, sketches_report): sketches_report_path.mkdir(parents=True, exist_ok=True) # Write the memory usage data to a file named according to the FQBN - with open(file=sketches_report_path.joinpath(self.fqbn.replace(":", "-") + ".json"), mode="w", - encoding="utf-8") as report_file: + with open( + file=sketches_report_path.joinpath(self.fqbn.replace(":", "-") + ".json"), mode="w", encoding="utf-8" + ) as report_file: json.dump(obj=sketches_report, fp=report_file, indent=2) def cli_json_key(self, command, original_key_name): @@ -1453,13 +1491,9 @@ def cli_json_key(self, command, original_key_name): "websiteURL": "website_url", "archiveFileName": "archive_filename", "propertiesId": "properties_id", - "toolsDependencies": "tools_dependencies" - }, - "board list": { - "FQBN": "fqbn", - "VID": "vid", - "PID": "pid" + "toolsDependencies": "tools_dependencies", }, + "board list": {"FQBN": "fqbn", "VID": "vid", "PID": "pid"}, "board listall": { "FQBN": "fqbn", "Email": "email", @@ -1468,7 +1502,7 @@ def cli_json_key(self, command, original_key_name): "Latest": "latest", "Name": "name", "Maintainer": "maintainer", - "Website": "website" + "Website": "website", }, "board search": { "FQBN": "fqbn", @@ -1478,7 +1512,7 @@ def cli_json_key(self, command, original_key_name): "Latest": "latest", "Name": "name", "Maintainer": "maintainer", - "Website": "website" + "Website": "website", }, "core list": { "Boards": "boards", @@ -1488,7 +1522,7 @@ def cli_json_key(self, command, original_key_name): "Latest": "latest", "Maintainer": "maintainer", "Name": "name", - "Website": "website" + "Website": "website", }, "core search": { "Boards": "boards", @@ -1497,25 +1531,16 @@ def cli_json_key(self, command, original_key_name): "Latest": "latest", "Maintainer": "maintainer", "Name": "name", - "Website": "website" - }, - "lib deps": { - "versionRequired": "version_required", - "versionInstalled": "version_installed" + "Website": "website", }, - "lib search": { - "archivefilename": "archive_filename", - "cachepath": "cache_path" - } + "lib deps": {"versionRequired": "version_required", "versionInstalled": "version_installed"}, + "lib search": {"archivefilename": "archive_filename", "cachepath": "cache_path"}, } if ( - ( - not semver.VersionInfo.isvalid(version=self.cli_version) - or semver.compare(ver1=self.cli_version, ver2=final_original_interface_version) > 0 - ) - and (command in key_translation and original_key_name in key_translation[command]) - ): + not semver.VersionInfo.isvalid(version=self.cli_version) + or semver.compare(ver1=self.cli_version, ver2=final_original_interface_version) > 0 + ) and (command in key_translation and original_key_name in key_translation[command]): return key_translation[command][original_key_name] return original_key_name diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index 60b713d..21f51df 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -32,22 +32,24 @@ def get_compilesketches_object( deltas_base_ref="foodeltasbaseref", enable_deltas_report="false", enable_warnings_report="false", - sketches_report_path="foo report_folder_name" + sketches_report_path="foo report_folder_name", ): - with unittest.mock.patch("compilesketches.CompileSketches.get_deltas_base_ref", - autospec=True, - return_value=deltas_base_ref): - compilesketches_object = compilesketches.CompileSketches(cli_version=cli_version, - fqbn_arg=fqbn_arg, - platforms=platforms, - libraries=libraries, - sketch_paths=sketch_paths, - cli_compile_flags=cli_compile_flags, - verbose=verbose, - github_token=github_token, - enable_deltas_report=enable_deltas_report, - enable_warnings_report=enable_warnings_report, - sketches_report_path=sketches_report_path) + with unittest.mock.patch( + "compilesketches.CompileSketches.get_deltas_base_ref", autospec=True, return_value=deltas_base_ref + ): + compilesketches_object = compilesketches.CompileSketches( + cli_version=cli_version, + fqbn_arg=fqbn_arg, + platforms=platforms, + libraries=libraries, + sketch_paths=sketch_paths, + cli_compile_flags=cli_compile_flags, + verbose=verbose, + github_token=github_token, + enable_deltas_report=enable_deltas_report, + enable_warnings_report=enable_warnings_report, + sketches_report_path=sketches_report_path, + ) compilesketches_object.github_api = github_api @@ -74,13 +76,19 @@ def directories_are_same(left_directory, right_directory): def test_directories_are_same(): assert directories_are_same(left_directory=test_data_path, right_directory=test_data_path) is True - assert directories_are_same( - left_directory=test_data_path.joinpath("HasSketches"), right_directory=test_data_path.joinpath("NoSketches") - ) is False - assert directories_are_same( - left_directory=test_data_path.joinpath("HasSketches", "NoSketches"), - right_directory=test_data_path.joinpath("NoSketches") - ) is False + assert ( + directories_are_same( + left_directory=test_data_path.joinpath("HasSketches"), right_directory=test_data_path.joinpath("NoSketches") + ) + is False + ) + assert ( + directories_are_same( + left_directory=test_data_path.joinpath("HasSketches", "NoSketches"), + right_directory=test_data_path.joinpath("NoSketches"), + ) + is False + ) @pytest.fixture @@ -126,8 +134,9 @@ def compile_sketches(self): @pytest.mark.parametrize("use_size_report_sketch", [True, False]) -def test_main_size_report_sketch_deprecation_warning(capsys, monkeypatch, setup_action_inputs, - stub_compilesketches_object, use_size_report_sketch): +def test_main_size_report_sketch_deprecation_warning( + capsys, monkeypatch, setup_action_inputs, stub_compilesketches_object, use_size_report_sketch +): if use_size_report_sketch: monkeypatch.setenv("INPUT_SIZE-REPORT-SKETCH", "foo") @@ -141,8 +150,9 @@ def test_main_size_report_sketch_deprecation_warning(capsys, monkeypatch, setup_ @pytest.mark.parametrize("use_enable_size_trends_report", [True, False]) -def test_main_enable_size_trends_report_deprecation_warning(capsys, monkeypatch, setup_action_inputs, - stub_compilesketches_object, use_enable_size_trends_report): +def test_main_enable_size_trends_report_deprecation_warning( + capsys, monkeypatch, setup_action_inputs, stub_compilesketches_object, use_enable_size_trends_report +): if use_enable_size_trends_report: monkeypatch.setenv("INPUT_ENABLE-SIZE-TRENDS-REPORT", "true") @@ -151,19 +161,18 @@ def test_main_enable_size_trends_report_deprecation_warning(capsys, monkeypatch, expected_output = "" if use_enable_size_trends_report: expected_output = ( - expected_output - + "::warning::The size trends report feature has been moved to a dedicated action. See the " - "documentation at " - "https://github.com/arduino/actions/tree/report-size-trends-action/libraries/report-size-trends" + expected_output + "::warning::The size trends report feature has been moved to a dedicated action. See the " + "documentation at " + "https://github.com/arduino/actions/tree/report-size-trends-action/libraries/report-size-trends" ) assert capsys.readouterr().out.strip() == expected_output @pytest.mark.parametrize("use_size_deltas_report_folder_name", [True, False]) -def test_main_size_deltas_report_folder_name_deprecation(capsys, monkeypatch, setup_action_inputs, - stub_compilesketches_object, - use_size_deltas_report_folder_name): +def test_main_size_deltas_report_folder_name_deprecation( + capsys, monkeypatch, setup_action_inputs, stub_compilesketches_object, use_size_deltas_report_folder_name +): size_deltas_report_folder_name = "foo-size-deltas-report-folder-name" if use_size_deltas_report_folder_name: monkeypatch.setenv("INPUT_SIZE-DELTAS-REPORT-FOLDER-NAME", size_deltas_report_folder_name) @@ -175,7 +184,7 @@ def test_main_size_deltas_report_folder_name_deprecation(capsys, monkeypatch, se expected_output = ( expected_output + "::warning::The size-deltas-report-folder-name input is deprecated. Use the equivalent input: " - "sketches-report-path instead." + "sketches-report-path instead." ) assert capsys.readouterr().out.strip() == expected_output @@ -189,8 +198,9 @@ def test_main_size_deltas_report_folder_name_deprecation(capsys, monkeypatch, se @pytest.mark.parametrize("use_enable_size_deltas_report", [True, False]) -def test_main_enable_size_deltas_report_deprecation(capsys, monkeypatch, setup_action_inputs, - stub_compilesketches_object, use_enable_size_deltas_report): +def test_main_enable_size_deltas_report_deprecation( + capsys, monkeypatch, setup_action_inputs, stub_compilesketches_object, use_enable_size_deltas_report +): enable_size_deltas_report = "foo-enable-size-deltas-report" if use_enable_size_deltas_report: monkeypatch.setenv("INPUT_ENABLE-SIZE-DELTAS-REPORT", enable_size_deltas_report) @@ -200,9 +210,8 @@ def test_main_enable_size_deltas_report_deprecation(capsys, monkeypatch, setup_a expected_output = "" if use_enable_size_deltas_report: expected_output = ( - expected_output - + "::warning::The enable-size-deltas-report input is deprecated. Use the equivalent input: " - "enable-deltas-report instead." + expected_output + "::warning::The enable-size-deltas-report input is deprecated. Use the equivalent input: " + "enable-deltas-report instead." ) assert capsys.readouterr().out.strip() == expected_output @@ -236,7 +245,7 @@ def compile_sketches(self): github_token=setup_action_inputs.github_token, enable_deltas_report=setup_action_inputs.enable_deltas_report, enable_warnings_report=setup_action_inputs.enable_warnings_report, - sketches_report_path=setup_action_inputs.sketches_report_path + sketches_report_path=setup_action_inputs.sketches_report_path, ) CompileSketches.compile_sketches.assert_called_once() @@ -249,8 +258,10 @@ def test_compilesketches(): platforms = unittest.mock.sentinel.platforms libraries = unittest.mock.sentinel.libraries sketch_paths = "examples/FooSketchPath examples/BarSketchPath" - expected_sketch_paths_list = [compilesketches.absolute_path(path="examples/FooSketchPath"), - compilesketches.absolute_path(path="examples/BarSketchPath")] + expected_sketch_paths_list = [ + compilesketches.absolute_path(path="examples/FooSketchPath"), + compilesketches.absolute_path(path="examples/BarSketchPath"), + ] cli_compile_flags = "- --foo\n- --bar" expected_cli_compile_flags = ["--foo", "--bar"] verbose = "false" @@ -260,12 +271,12 @@ def test_compilesketches(): enable_warnings_report = "true" sketches_report_path = "FooSketchesReportFolder" - with unittest.mock.patch("compilesketches.CompileSketches.get_deltas_base_ref", - autospec=True, - return_value=expected_deltas_base_ref): + with unittest.mock.patch( + "compilesketches.CompileSketches.get_deltas_base_ref", autospec=True, return_value=expected_deltas_base_ref + ): compile_sketches = compilesketches.CompileSketches( cli_version=cli_version, - fqbn_arg="\'\"" + expected_fqbn + "\" \"" + expected_additional_url + "\"\'", + fqbn_arg="'\"" + expected_fqbn + '" "' + expected_additional_url + "\"'", platforms=platforms, libraries=libraries, sketch_paths=sketch_paths, @@ -274,7 +285,7 @@ def test_compilesketches(): github_token=github_token, enable_deltas_report=enable_deltas_report, enable_warnings_report=enable_warnings_report, - sketches_report_path=sketches_report_path + sketches_report_path=sketches_report_path, ) assert compile_sketches.cli_version == cli_version @@ -292,8 +303,10 @@ def test_compilesketches(): assert get_compilesketches_object(cli_compile_flags="").cli_compile_flags is None assert get_compilesketches_object(cli_compile_flags="- --foo").cli_compile_flags == ["--foo"] - assert get_compilesketches_object(cli_compile_flags="- --foo\n- \"bar baz\"").cli_compile_flags == ["--foo", - "bar baz"] + assert get_compilesketches_object(cli_compile_flags='- --foo\n- "bar baz"').cli_compile_flags == [ + "--foo", + "bar baz", + ] # Test invalid enable_deltas_report value with pytest.raises(expected_exception=SystemExit, match="1"): @@ -308,16 +321,24 @@ def test_compilesketches(): assert compile_sketches.deltas_base_ref is None -@pytest.mark.parametrize("event_name, expected_ref", - [("pull_request", unittest.mock.sentinel.pull_request_base_ref), - ("push", unittest.mock.sentinel.parent_commit_ref)]) +@pytest.mark.parametrize( + "event_name, expected_ref", + [ + ("pull_request", unittest.mock.sentinel.pull_request_base_ref), + ("push", unittest.mock.sentinel.parent_commit_ref), + ], +) def test_get_deltas_base_ref(monkeypatch, mocker, event_name, expected_ref): monkeypatch.setenv("GITHUB_EVENT_NAME", event_name) - mocker.patch("compilesketches.CompileSketches.get_pull_request_base_ref", autospec=True, - return_value=unittest.mock.sentinel.pull_request_base_ref) - mocker.patch("compilesketches.get_parent_commit_ref", autospec=True, - return_value=unittest.mock.sentinel.parent_commit_ref) + mocker.patch( + "compilesketches.CompileSketches.get_pull_request_base_ref", + autospec=True, + return_value=unittest.mock.sentinel.pull_request_base_ref, + ) + mocker.patch( + "compilesketches.get_parent_commit_ref", autospec=True, return_value=unittest.mock.sentinel.parent_commit_ref + ) compile_sketches = get_compilesketches_object() @@ -327,6 +348,7 @@ def test_get_deltas_base_ref(monkeypatch, mocker, event_name, expected_ref): def test_get_pull_request_base_ref(monkeypatch, mocker): class Github: """Stub""" + ref = unittest.mock.sentinel.pull_request_base_ref def __init__(self): @@ -352,9 +374,9 @@ def get_pull(self, number): github_api_object.get_repo.assert_called_once_with(full_name_or_id=os.environ["GITHUB_REPOSITORY"]) github_api_object.get_pull.assert_called_once_with(number=42) # PR number is hardcoded into test file - mocker.patch.object(Github, - "get_repo", - side_effect=github.UnknownObjectException(status=42, data="foo", headers=None)) + mocker.patch.object( + Github, "get_repo", side_effect=github.UnknownObjectException(status=42, data="foo", headers=None) + ) with pytest.raises(expected_exception=SystemExit, match="1"): compile_sketches.get_pull_request_base_ref() @@ -364,6 +386,7 @@ def test_get_parent_commit_ref(mocker): class Repo: """Stub""" + hexsha = parent_commit_ref def __init__(self): @@ -377,16 +400,19 @@ def __init__(self): git.Repo.assert_called_once_with(path=os.environ["GITHUB_WORKSPACE"]) -@pytest.mark.parametrize("enable_warnings_report, expected_clean_build_cache", - [("true", True), - ("false", False)]) -@pytest.mark.parametrize("compilation_success_list, expected_success", - [([True, True, True], True), - ([False, True, True], False), - ([True, False, True], False), - ([True, True, False], False)]) -def test_compile_sketches(mocker, enable_warnings_report, expected_clean_build_cache, compilation_success_list, - expected_success): +@pytest.mark.parametrize("enable_warnings_report, expected_clean_build_cache", [("true", True), ("false", False)]) +@pytest.mark.parametrize( + "compilation_success_list, expected_success", + [ + ([True, True, True], True), + ([False, True, True], False), + ([True, False, True], False), + ([True, True, False], False), + ], +) +def test_compile_sketches( + mocker, enable_warnings_report, expected_clean_build_cache, compilation_success_list, expected_success +): sketch_list = [unittest.mock.sentinel.sketch1, unittest.mock.sentinel.sketch2, unittest.mock.sentinel.sketch3] compilation_result_list = [] @@ -403,8 +429,7 @@ def test_compile_sketches(mocker, enable_warnings_report, expected_clean_build_c mocker.patch("compilesketches.CompileSketches.find_sketches", autospec=True, return_value=sketch_list) mocker.patch("compilesketches.CompileSketches.compile_sketch", autospec=True, side_effect=compilation_result_list) mocker.patch("compilesketches.CompileSketches.get_sketch_report", autospec=True, return_value=sketch_report) - mocker.patch("compilesketches.CompileSketches.get_sketches_report", autospec=True, - return_value=sketches_report) + mocker.patch("compilesketches.CompileSketches.get_sketches_report", autospec=True, return_value=sketches_report) mocker.patch("compilesketches.CompileSketches.create_sketches_report_file", autospec=True) if expected_success: @@ -422,21 +447,20 @@ def test_compile_sketches(mocker, enable_warnings_report, expected_clean_build_c get_sketch_report_calls = [] sketch_report_list = [] for sketch, compilation_result in zip(sketch_list, compilation_result_list): - compile_sketch_calls.append(unittest.mock.call(compile_sketches, - sketch_path=sketch, - clean_build_cache=expected_clean_build_cache)) - get_sketch_report_calls.append(unittest.mock.call(compile_sketches, - compilation_result=compilation_result)) + compile_sketch_calls.append( + unittest.mock.call(compile_sketches, sketch_path=sketch, clean_build_cache=expected_clean_build_cache) + ) + get_sketch_report_calls.append(unittest.mock.call(compile_sketches, compilation_result=compilation_result)) sketch_report_list.append(sketch_report) compile_sketches.compile_sketch.assert_has_calls(calls=compile_sketch_calls) compile_sketches.get_sketch_report.assert_has_calls(calls=get_sketch_report_calls) - compile_sketches.get_sketches_report.assert_called_once_with(compile_sketches, - sketch_report_list=sketch_report_list) + compile_sketches.get_sketches_report.assert_called_once_with( + compile_sketches, sketch_report_list=sketch_report_list + ) compile_sketches.create_sketches_report_file.assert_called_once_with( - compile_sketches, - sketches_report=sketches_report + compile_sketches, sketches_report=sketches_report ) @@ -460,7 +484,7 @@ def test_install_arduino_cli(mocker): url="https://downloads.arduino.cc/arduino-cli/arduino-cli_" + cli_version + "_Linux_64bit.tar.gz", source_path="arduino-cli", destination_parent_path=arduino_cli_installation_path, - force=False + force=False, ) assert os.environ["ARDUINO_DIRECTORIES_USER"] == str(arduino_cli_user_directory_path) @@ -485,12 +509,12 @@ def test_install_platforms(mocker, platforms): compile_sketches = get_compilesketches_object(platforms=platforms) - mocker.patch("compilesketches.CompileSketches.get_fqbn_platform_dependency", - autospec=True, - return_value=fqbn_platform_dependency) - mocker.patch("compilesketches.CompileSketches.sort_dependency_list", - autospec=True, - return_value=dependency_list) + mocker.patch( + "compilesketches.CompileSketches.get_fqbn_platform_dependency", + autospec=True, + return_value=fqbn_platform_dependency, + ) + mocker.patch("compilesketches.CompileSketches.sort_dependency_list", autospec=True, return_value=dependency_list) mocker.patch("compilesketches.CompileSketches.install_platforms_from_board_manager", autospec=True) mocker.patch("compilesketches.CompileSketches.install_platforms_from_path", autospec=True) mocker.patch("compilesketches.CompileSketches.install_platforms_from_repository", autospec=True) @@ -500,39 +524,39 @@ def test_install_platforms(mocker, platforms): if platforms == "": compile_sketches.install_platforms_from_board_manager.assert_called_once_with( - compile_sketches, - platform_list=[fqbn_platform_dependency] + compile_sketches, platform_list=[fqbn_platform_dependency] ) compile_sketches.install_platforms_from_path.assert_not_called() compile_sketches.install_platforms_from_repository.assert_not_called() compile_sketches.install_platforms_from_download.assert_not_called() else: compile_sketches.install_platforms_from_board_manager.assert_called_once_with( - compile_sketches, - platform_list=dependency_list_manager + compile_sketches, platform_list=dependency_list_manager ) compile_sketches.install_platforms_from_path.assert_called_once_with( - compile_sketches, - platform_list=dependency_list_path + compile_sketches, platform_list=dependency_list_path ) compile_sketches.install_platforms_from_repository.assert_called_once_with( - compile_sketches, - platform_list=dependency_list_repository + compile_sketches, platform_list=dependency_list_repository ) compile_sketches.install_platforms_from_download.assert_called_once_with( - compile_sketches, - platform_list=dependency_list_download + compile_sketches, platform_list=dependency_list_download ) @pytest.mark.parametrize( "fqbn_arg, expected_platform, expected_additional_url", - [("arduino:avr:uno", "arduino:avr", None), - # FQBN with space, additional Board Manager URL - ('\'"foo bar:baz:asdf" "https://example.com/platform_foo_index.json"\'', "foo bar:baz", - "https://example.com/platform_foo_index.json"), - # Custom board option - ("arduino:avr:nano:cpu=atmega328old", "arduino:avr", None)] + [ + ("arduino:avr:uno", "arduino:avr", None), + # FQBN with space, additional Board Manager URL + ( + '\'"foo bar:baz:asdf" "https://example.com/platform_foo_index.json"\'', + "foo bar:baz", + "https://example.com/platform_foo_index.json", + ), + # Custom board option + ("arduino:avr:nano:cpu=atmega328old", "arduino:avr", None), + ], ) def test_get_fqbn_platform_dependency(fqbn_arg, expected_platform, expected_additional_url): compile_sketches = get_compilesketches_object(fqbn_arg=fqbn_arg) @@ -548,86 +572,125 @@ def test_get_fqbn_platform_dependency(fqbn_arg, expected_platform, expected_addi @pytest.mark.parametrize( "dependency_list, expected_dependency_type_list", - [([None], []), - ([{compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar.git"}], ["repository"]), - ( - [{compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar.git/"}], - ["repository"]), - ([{compilesketches.CompileSketches.dependency_source_url_key: "git://example.com/foo/bar"}], ["repository"]), - ([{compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar"}], ["download"]), - ([{compilesketches.CompileSketches.dependency_source_path_key: "foo/bar"}], ["path"]), - ([{compilesketches.CompileSketches.dependency_name_key: "FooBar"}], ["manager"]), - ([{compilesketches.CompileSketches.dependency_name_key: "FooBar", - compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/package_foo_index.json"}], - ["manager"]), - ([{compilesketches.CompileSketches.dependency_source_url_key: "git://example.com/foo/bar"}, - {compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar"}, - {compilesketches.CompileSketches.dependency_source_path_key: "foo/bar"}, - {compilesketches.CompileSketches.dependency_name_key: "FooBar"}], - ["repository", "download", "path", "manager"]), - ([{compilesketches.CompileSketches.dependency_source_url_key: "git://example.com/foo/bar"}], ["repository"]), - ] + [ + ([None], []), + ( + [{compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar.git"}], + ["repository"], + ), + ( + [{compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar.git/"}], + ["repository"], + ), + ([{compilesketches.CompileSketches.dependency_source_url_key: "git://example.com/foo/bar"}], ["repository"]), + ([{compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar"}], ["download"]), + ([{compilesketches.CompileSketches.dependency_source_path_key: "foo/bar"}], ["path"]), + ([{compilesketches.CompileSketches.dependency_name_key: "FooBar"}], ["manager"]), + ( + [ + { + compilesketches.CompileSketches.dependency_name_key: "FooBar", + compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/package_foo_index.json", + } + ], + ["manager"], + ), + ( + [ + {compilesketches.CompileSketches.dependency_source_url_key: "git://example.com/foo/bar"}, + {compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar"}, + {compilesketches.CompileSketches.dependency_source_path_key: "foo/bar"}, + {compilesketches.CompileSketches.dependency_name_key: "FooBar"}, + ], + ["repository", "download", "path", "manager"], + ), + ([{compilesketches.CompileSketches.dependency_source_url_key: "git://example.com/foo/bar"}], ["repository"]), + ], ) def test_sort_dependency_list(dependency_list, expected_dependency_type_list): compile_sketches = get_compilesketches_object() for dependency, expected_dependency_type in zip(dependency_list, expected_dependency_type_list): - assert dependency in getattr(compile_sketches.sort_dependency_list(dependency_list=[dependency]), - expected_dependency_type) + assert dependency in getattr( + compile_sketches.sort_dependency_list(dependency_list=[dependency]), expected_dependency_type + ) @pytest.mark.parametrize( "platform_list, expected_core_update_index_command_list, expected_core_install_command_list", - [( - [{compilesketches.CompileSketches.dependency_name_key: "Foo"}, - {compilesketches.CompileSketches.dependency_name_key: "Bar"}], - [["core", "update-index"], ["core", "update-index"]], - [["core", "install", "Foo"], ["core", "install", "Bar"]] - ), ( - # Additional Board Manager URL - [{compilesketches.CompileSketches.dependency_name_key: "Foo", - compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/package_foo_index.json"}, - {compilesketches.CompileSketches.dependency_name_key: "Bar", - compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/package_bar_index.json"}], - [["core", "update-index", "--additional-urls", "https://example.com/package_foo_index.json"], - ["core", "update-index", "--additional-urls", "https://example.com/package_bar_index.json"]], - [["core", "install", "--additional-urls", "https://example.com/package_foo_index.json", "Foo"], - ["core", "install", "--additional-urls", "https://example.com/package_bar_index.json", "Bar"]] - )]) -def test_install_platforms_from_board_manager(mocker, - platform_list, - expected_core_update_index_command_list, - expected_core_install_command_list): + [ + ( + [ + {compilesketches.CompileSketches.dependency_name_key: "Foo"}, + {compilesketches.CompileSketches.dependency_name_key: "Bar"}, + ], + [["core", "update-index"], ["core", "update-index"]], + [["core", "install", "Foo"], ["core", "install", "Bar"]], + ), + ( + # Additional Board Manager URL + [ + { + compilesketches.CompileSketches.dependency_name_key: "Foo", + compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/package_foo_index.json", + }, + { + compilesketches.CompileSketches.dependency_name_key: "Bar", + compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/package_bar_index.json", + }, + ], + [ + ["core", "update-index", "--additional-urls", "https://example.com/package_foo_index.json"], + ["core", "update-index", "--additional-urls", "https://example.com/package_bar_index.json"], + ], + [ + ["core", "install", "--additional-urls", "https://example.com/package_foo_index.json", "Foo"], + ["core", "install", "--additional-urls", "https://example.com/package_bar_index.json", "Bar"], + ], + ), + ], +) +def test_install_platforms_from_board_manager( + mocker, platform_list, expected_core_update_index_command_list, expected_core_install_command_list +): run_command_output_level = unittest.mock.sentinel.run_command_output_level compile_sketches = get_compilesketches_object() - mocker.patch("compilesketches.CompileSketches.get_run_command_output_level", autospec=True, - return_value=run_command_output_level) + mocker.patch( + "compilesketches.CompileSketches.get_run_command_output_level", + autospec=True, + return_value=run_command_output_level, + ) mocker.patch("compilesketches.CompileSketches.run_arduino_cli_command", autospec=True) compile_sketches.install_platforms_from_board_manager(platform_list=platform_list) run_arduino_cli_command_calls = [] for expected_core_update_index_command, expected_core_install_command in zip( - expected_core_update_index_command_list, - expected_core_install_command_list + expected_core_update_index_command_list, expected_core_install_command_list ): - run_arduino_cli_command_calls.extend([ - unittest.mock.call(compile_sketches, - command=expected_core_update_index_command, - enable_output=run_command_output_level), - unittest.mock.call(compile_sketches, - command=expected_core_install_command, - enable_output=run_command_output_level) - ]) + run_arduino_cli_command_calls.extend( + [ + unittest.mock.call( + compile_sketches, command=expected_core_update_index_command, enable_output=run_command_output_level + ), + unittest.mock.call( + compile_sketches, command=expected_core_install_command, enable_output=run_command_output_level + ), + ] + ) compile_sketches.run_arduino_cli_command.assert_has_calls(calls=run_arduino_cli_command_calls) -@pytest.mark.parametrize("verbose, expected_output_level", - [("true", compilesketches.CompileSketches.RunCommandOutput.ALWAYS), - ("false", compilesketches.CompileSketches.RunCommandOutput.ON_FAILURE)]) +@pytest.mark.parametrize( + "verbose, expected_output_level", + [ + ("true", compilesketches.CompileSketches.RunCommandOutput.ALWAYS), + ("false", compilesketches.CompileSketches.RunCommandOutput.ON_FAILURE), + ], +) def test_get_run_command_output_level(verbose, expected_output_level): compile_sketches = get_compilesketches_object(verbose=verbose) @@ -649,9 +712,12 @@ def test_run_arduino_cli_command(mocker, verbose): mocker.patch("compilesketches.CompileSketches.run_command", autospec=True, return_value=run_command_return) - assert compile_sketches.run_arduino_cli_command(command=command, - enable_output=enable_output, - exit_on_failure=exit_on_failure) == run_command_return + assert ( + compile_sketches.run_arduino_cli_command( + command=command, enable_output=enable_output, exit_on_failure=exit_on_failure + ) + == run_command_return + ) expected_run_command_command = [arduino_cli_installation_path.joinpath("arduino-cli")] expected_run_command_command.extend(command) @@ -661,18 +727,22 @@ def test_run_arduino_cli_command(mocker, verbose): compile_sketches, command=expected_run_command_command, enable_output=enable_output, - exit_on_failure=exit_on_failure + exit_on_failure=exit_on_failure, ) -@pytest.mark.parametrize("enable_output", [compilesketches.CompileSketches.RunCommandOutput.NONE, - compilesketches.CompileSketches.RunCommandOutput.ON_FAILURE, - compilesketches.CompileSketches.RunCommandOutput.ALWAYS]) -@pytest.mark.parametrize("exit_on_failure, returncode, expected_success", - [(False, 0, True), - (False, 1, True), - (True, 0, True), - (True, 1, False)]) +@pytest.mark.parametrize( + "enable_output", + [ + compilesketches.CompileSketches.RunCommandOutput.NONE, + compilesketches.CompileSketches.RunCommandOutput.ON_FAILURE, + compilesketches.CompileSketches.RunCommandOutput.ALWAYS, + ], +) +@pytest.mark.parametrize( + "exit_on_failure, returncode, expected_success", + [(False, 0, True), (False, 1, True), (True, 0, True), (True, 1, False)], +) def test_run_command(capsys, mocker, enable_output, exit_on_failure, returncode, expected_success): command = unittest.mock.sentinel.command @@ -690,23 +760,28 @@ class CommandData: mocker.patch("subprocess.run", autospec=True, return_value=command_data) if expected_success: - run_command_output = compile_sketches.run_command(command=command, - enable_output=enable_output, - exit_on_failure=exit_on_failure) + run_command_output = compile_sketches.run_command( + command=command, enable_output=enable_output, exit_on_failure=exit_on_failure + ) assert run_command_output == command_data else: with pytest.raises(expected_exception=SystemExit, match=str(returncode)): - compile_sketches.run_command(command=command, - enable_output=enable_output, - exit_on_failure=exit_on_failure) - - expected_output = ("::group::Running command: " + " ".join(command_data.args) + " \n " - + str(CommandData.stdout) + " \n " - + "::endgroup::") + compile_sketches.run_command(command=command, enable_output=enable_output, exit_on_failure=exit_on_failure) + + expected_output = ( + "::group::Running command: " + + " ".join(command_data.args) + + " \n " + + str(CommandData.stdout) + + " \n " + + "::endgroup::" + ) - if returncode != 0 and (enable_output == compilesketches.CompileSketches.RunCommandOutput.ON_FAILURE - or enable_output == compilesketches.CompileSketches.RunCommandOutput.ALWAYS): + if returncode != 0 and ( + enable_output == compilesketches.CompileSketches.RunCommandOutput.ON_FAILURE + or enable_output == compilesketches.CompileSketches.RunCommandOutput.ALWAYS + ): expected_output = expected_output + "\n::error::Command failed" elif enable_output == compilesketches.CompileSketches.RunCommandOutput.ALWAYS: expected_output = expected_output @@ -720,12 +795,25 @@ class CommandData: @pytest.mark.parametrize( "dependency, expected_name", - [({compilesketches.CompileSketches.dependency_name_key: "Foo", - compilesketches.CompileSketches.dependency_version_key: "1.2.3"}, "Foo@1.2.3"), - ({compilesketches.CompileSketches.dependency_name_key: "Foo", - compilesketches.CompileSketches.dependency_version_key: "latest"}, "Foo"), - ({compilesketches.CompileSketches.dependency_name_key: "Foo@1.2.3"}, "Foo@1.2.3"), - ({compilesketches.CompileSketches.dependency_name_key: "Foo"}, "Foo")]) + [ + ( + { + compilesketches.CompileSketches.dependency_name_key: "Foo", + compilesketches.CompileSketches.dependency_version_key: "1.2.3", + }, + "Foo@1.2.3", + ), + ( + { + compilesketches.CompileSketches.dependency_name_key: "Foo", + compilesketches.CompileSketches.dependency_version_key: "latest", + }, + "Foo", + ), + ({compilesketches.CompileSketches.dependency_name_key: "Foo@1.2.3"}, "Foo@1.2.3"), + ({compilesketches.CompileSketches.dependency_name_key: "Foo"}, "Foo"), + ], +) def test_get_manager_dependency_name(dependency, expected_name): compile_sketches = get_compilesketches_object() assert compile_sketches.get_manager_dependency_name(dependency=dependency) == expected_name @@ -733,8 +821,10 @@ def test_get_manager_dependency_name(dependency, expected_name): @pytest.mark.parametrize( "path_exists, platform_list", - [(False, [{compilesketches.CompileSketches.dependency_source_path_key: pathlib.Path("Foo")}]), - (True, [{compilesketches.CompileSketches.dependency_source_path_key: pathlib.Path("Foo")}])] + [ + (False, [{compilesketches.CompileSketches.dependency_source_path_key: pathlib.Path("Foo")}]), + (True, [{compilesketches.CompileSketches.dependency_source_path_key: pathlib.Path("Foo")}]), + ], ) def test_install_platforms_from_path(capsys, mocker, path_exists, platform_list): class PlatformInstallationPath: @@ -748,9 +838,11 @@ def __init__(self): compile_sketches = get_compilesketches_object() mocker.patch.object(pathlib.Path, "exists", autospec=True, return_value=path_exists) - mocker.patch("compilesketches.CompileSketches.get_platform_installation_path", - autospec=True, - return_value=platform_installation_path) + mocker.patch( + "compilesketches.CompileSketches.get_platform_installation_path", + autospec=True, + return_value=platform_installation_path, + ) mocker.patch("compilesketches.CompileSketches.install_from_path", autospec=True) if not path_exists: @@ -778,7 +870,7 @@ def __init__(self): ), destination_parent_path=platform_installation_path.path.parent, destination_name=platform_installation_path.path.name, - force=platform_installation_path.is_overwrite + force=platform_installation_path.is_overwrite, ) ) @@ -789,22 +881,23 @@ def __init__(self): @pytest.mark.parametrize( - "platform," - "command_data_stdout," - "expected_installation_path", + "platform," "command_data_stdout," "expected_installation_path", # No match to previously installed platforms - [({compilesketches.CompileSketches.dependency_name_key: "foo:bar"}, - "[{\"ID\": \"asdf:zxcv\"}]", - pathlib.PurePath("/foo/UserPlatformsPath/foo/bar")), - # Match with previously installed platform - ({compilesketches.CompileSketches.dependency_name_key: "foo:bar"}, - "[{\"ID\": \"foo:bar\", \"Installed\": \"1.2.3\"}]", - pathlib.PurePath("/foo/BoardManagerPlatformsPath/foo/hardware/bar/1.2.3"))] + [ + ( + {compilesketches.CompileSketches.dependency_name_key: "foo:bar"}, + '[{"ID": "asdf:zxcv"}]', + pathlib.PurePath("/foo/UserPlatformsPath/foo/bar"), + ), + # Match with previously installed platform + ( + {compilesketches.CompileSketches.dependency_name_key: "foo:bar"}, + '[{"ID": "foo:bar", "Installed": "1.2.3"}]', + pathlib.PurePath("/foo/BoardManagerPlatformsPath/foo/hardware/bar/1.2.3"), + ), + ], ) -def test_get_platform_installation_path(mocker, - platform, - command_data_stdout, - expected_installation_path): +def test_get_platform_installation_path(mocker, platform, command_data_stdout, expected_installation_path): class CommandData: def __init__(self, stdout): self.stdout = stdout @@ -820,17 +913,21 @@ def __init__(self, stdout): platform_installation_path = compile_sketches.get_platform_installation_path(platform=platform) assert platform_installation_path.path == expected_installation_path - run_arduino_cli_command_calls = [unittest.mock.call(compile_sketches, command=["core", "update-index"]), - unittest.mock.call(compile_sketches, command=["core", "list", "--format", "json"])] + run_arduino_cli_command_calls = [ + unittest.mock.call(compile_sketches, command=["core", "update-index"]), + unittest.mock.call(compile_sketches, command=["core", "list", "--format", "json"]), + ] compilesketches.CompileSketches.run_arduino_cli_command.assert_has_calls(calls=run_arduino_cli_command_calls) def test_install_platforms_from_repository(mocker): platform_list = [ - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url, - compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, - compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name}, - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2} + { + compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url, + compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, + compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name, + }, + {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2}, ] git_ref = unittest.mock.sentinel.git_ref @@ -849,9 +946,11 @@ def __init__(self): compile_sketches = get_compilesketches_object() mocker.patch("compilesketches.CompileSketches.get_repository_dependency_ref", autospec=True, return_value=git_ref) - mocker.patch("compilesketches.CompileSketches.get_platform_installation_path", - autospec=True, - return_value=platform_installation_path) + mocker.patch( + "compilesketches.CompileSketches.get_platform_installation_path", + autospec=True, + return_value=platform_installation_path, + ) mocker.patch("compilesketches.CompileSketches.install_from_repository", autospec=True, return_value=git_ref) compile_sketches.install_platforms_from_repository(platform_list=platform_list) @@ -859,19 +958,21 @@ def __init__(self): get_repository_dependency_ref_calls = [] get_platform_installation_path_calls = [] install_from_repository_calls = [] - for platform, expected_source_path, expected_destination_name in zip(platform_list, - expected_source_path_list, - expected_destination_name_list): + for platform, expected_source_path, expected_destination_name in zip( + platform_list, expected_source_path_list, expected_destination_name_list + ): get_repository_dependency_ref_calls.append(unittest.mock.call(compile_sketches, dependency=platform)) get_platform_installation_path_calls.append(unittest.mock.call(compile_sketches, platform=platform)) install_from_repository_calls.append( - unittest.mock.call(compile_sketches, - url=platform[compilesketches.CompileSketches.dependency_source_url_key], - git_ref=git_ref, - source_path=expected_source_path, - destination_parent_path=platform_installation_path.path.parent, - destination_name=platform_installation_path.path.name, - force=platform_installation_path.is_overwrite) + unittest.mock.call( + compile_sketches, + url=platform[compilesketches.CompileSketches.dependency_source_url_key], + git_ref=git_ref, + source_path=expected_source_path, + destination_parent_path=platform_installation_path.path.parent, + destination_name=platform_installation_path.path.name, + force=platform_installation_path.is_overwrite, + ) ) compile_sketches.get_repository_dependency_ref.assert_has_calls(calls=get_repository_dependency_ref_calls) @@ -880,8 +981,7 @@ def __init__(self): @pytest.mark.parametrize( "dependency, expected_ref", - [({compilesketches.CompileSketches.dependency_version_key: "1.2.3"}, "1.2.3"), - ({}, None)] + [({compilesketches.CompileSketches.dependency_version_key: "1.2.3"}, "1.2.3"), ({}, None)], ) def test_get_repository_dependency_ref(dependency, expected_ref): compile_sketches = get_compilesketches_object() @@ -890,10 +990,12 @@ def test_get_repository_dependency_ref(dependency, expected_ref): def test_install_platforms_from_download(mocker): platform_list = [ - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url1, - compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, - compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name}, - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2} + { + compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url1, + compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, + compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name, + }, + {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2}, ] class PlatformInstallationPath: @@ -908,75 +1010,97 @@ def __init__(self): compile_sketches = get_compilesketches_object() - mocker.patch("compilesketches.CompileSketches.get_platform_installation_path", - autospec=True, - return_value=platform_installation_path) + mocker.patch( + "compilesketches.CompileSketches.get_platform_installation_path", + autospec=True, + return_value=platform_installation_path, + ) mocker.patch("compilesketches.CompileSketches.install_from_download", autospec=True) compile_sketches.install_platforms_from_download(platform_list=platform_list) get_platform_installation_path_calls = [] install_from_download_calls = [] - for platform, expected_source_path, in zip(platform_list, expected_source_path_list): + for ( + platform, + expected_source_path, + ) in zip(platform_list, expected_source_path_list): get_platform_installation_path_calls.append(unittest.mock.call(compile_sketches, platform=platform)) install_from_download_calls.append( - unittest.mock.call(compile_sketches, - url=platform[compilesketches.CompileSketches.dependency_source_url_key], - source_path=expected_source_path, - destination_parent_path=platform_installation_path.path.parent, - destination_name=platform_installation_path.path.name, - force=platform_installation_path.is_overwrite) + unittest.mock.call( + compile_sketches, + url=platform[compilesketches.CompileSketches.dependency_source_url_key], + source_path=expected_source_path, + destination_parent_path=platform_installation_path.path.parent, + destination_name=platform_installation_path.path.name, + force=platform_installation_path.is_overwrite, + ) ) compile_sketches.install_from_download.assert_has_calls(calls=install_from_download_calls) @pytest.mark.parametrize( "libraries, expected_manager, expected_path, expected_repository, expected_download", - [("", - [], - [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], - [], - []), - ("foo bar", - [{compilesketches.CompileSketches.dependency_name_key: "foo"}, - {compilesketches.CompileSketches.dependency_name_key: "bar"}], - [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], - [], - []), - ("\"foo\" \"bar\"", - [{compilesketches.CompileSketches.dependency_name_key: "foo"}, - {compilesketches.CompileSketches.dependency_name_key: "bar"}], - [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], - [], - []), - ("-", - [], - [], - [], - []), - ("- " + compilesketches.CompileSketches.dependency_name_key + ": foo", - [{compilesketches.CompileSketches.dependency_name_key: "foo"}], - [], - [], - []), - ("- " + compilesketches.CompileSketches.dependency_source_path_key + ": /foo/bar", - [], - [{compilesketches.CompileSketches.dependency_source_path_key: "/foo/bar"}], - [], - []), - ("- " + compilesketches.CompileSketches.dependency_source_url_key + ": https://example.com/foo.git", - [], - [], - [{"source-url": "https://example.com/foo.git"}], - []), - ("- " + compilesketches.CompileSketches.dependency_source_url_key + ": https://example.com/foo.zip", - [], - [], - [], - [{"source-url": "https://example.com/foo.zip"}])] + [ + ( + "", + [], + [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], + [], + [], + ), + ( + "foo bar", + [ + {compilesketches.CompileSketches.dependency_name_key: "foo"}, + {compilesketches.CompileSketches.dependency_name_key: "bar"}, + ], + [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], + [], + [], + ), + ( + '"foo" "bar"', + [ + {compilesketches.CompileSketches.dependency_name_key: "foo"}, + {compilesketches.CompileSketches.dependency_name_key: "bar"}, + ], + [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], + [], + [], + ), + ("-", [], [], [], []), + ( + "- " + compilesketches.CompileSketches.dependency_name_key + ": foo", + [{compilesketches.CompileSketches.dependency_name_key: "foo"}], + [], + [], + [], + ), + ( + "- " + compilesketches.CompileSketches.dependency_source_path_key + ": /foo/bar", + [], + [{compilesketches.CompileSketches.dependency_source_path_key: "/foo/bar"}], + [], + [], + ), + ( + "- " + compilesketches.CompileSketches.dependency_source_url_key + ": https://example.com/foo.git", + [], + [], + [{"source-url": "https://example.com/foo.git"}], + [], + ), + ( + "- " + compilesketches.CompileSketches.dependency_source_url_key + ": https://example.com/foo.zip", + [], + [], + [], + [{"source-url": "https://example.com/foo.zip"}], + ), + ], ) -def test_install_libraries(mocker, libraries, expected_manager, expected_path, expected_repository, - expected_download): +def test_install_libraries(mocker, libraries, expected_manager, expected_path, expected_repository, expected_download): libraries_path = pathlib.Path("/foo/LibrariesPath") compile_sketches = get_compilesketches_object(libraries=libraries) @@ -991,29 +1115,29 @@ def test_install_libraries(mocker, libraries, expected_manager, expected_path, e if len(expected_manager) > 0: compile_sketches.install_libraries_from_library_manager.assert_called_once_with( - compile_sketches, - library_list=expected_manager) + compile_sketches, library_list=expected_manager + ) else: compile_sketches.install_libraries_from_library_manager.assert_not_called() if len(expected_path) > 0: compile_sketches.install_libraries_from_path.assert_called_once_with( - compile_sketches, - library_list=expected_path) + compile_sketches, library_list=expected_path + ) else: compile_sketches.install_libraries_from_path.assert_not_called() if len(expected_repository) > 0: compile_sketches.install_libraries_from_repository.assert_called_once_with( - compile_sketches, - library_list=expected_repository) + compile_sketches, library_list=expected_repository + ) else: compile_sketches.install_libraries_from_repository.assert_not_called() if len(expected_download) > 0: compile_sketches.install_libraries_from_download.assert_called_once_with( - compile_sketches, - library_list=expected_download) + compile_sketches, library_list=expected_download + ) else: compile_sketches.install_libraries_from_download.assert_not_called() @@ -1024,8 +1148,11 @@ def test_install_libraries_from_library_manager(mocker): library_list = [{compile_sketches.dependency_name_key: "foo"}, {compile_sketches.dependency_name_key: "bar"}] - mocker.patch("compilesketches.CompileSketches.get_run_command_output_level", autospec=True, - return_value=run_command_output_level) + mocker.patch( + "compilesketches.CompileSketches.get_run_command_output_level", + autospec=True, + return_value=run_command_output_level, + ) mocker.patch("compilesketches.CompileSketches.run_arduino_cli_command", autospec=True) compile_sketches.install_libraries_from_library_manager(library_list=library_list) @@ -1037,11 +1164,7 @@ def test_install_libraries_from_library_manager(mocker): lib_install_command = lib_install_base_command.copy() lib_install_command.append(library["name"]) run_arduino_cli_command_calls.append( - unittest.mock.call( - compile_sketches, - command=lib_install_command, - enable_output=run_command_output_level - ) + unittest.mock.call(compile_sketches, command=lib_install_command, enable_output=run_command_output_level) ) # noinspection PyUnresolvedReferences @@ -1050,22 +1173,43 @@ def test_install_libraries_from_library_manager(mocker): @pytest.mark.parametrize( "path_exists, library_list, expected_destination_name_list", - [(False, - [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"] + "/Nonexistent"}], - []), - (True, - [{compilesketches.CompileSketches.dependency_destination_name_key: "FooName", - compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"] + "/FooLibrary"}], - ["FooName"]), - (True, - [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], - ["FooRepoName"]), - (True, - [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"] + "/Bar"}], - [None])] + [ + ( + False, + [ + { + compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"] + + "/Nonexistent" + } + ], + [], + ), + ( + True, + [ + { + compilesketches.CompileSketches.dependency_destination_name_key: "FooName", + compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"] + + "/FooLibrary", + } + ], + ["FooName"], + ), + ( + True, + [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], + ["FooRepoName"], + ), + ( + True, + [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"] + "/Bar"}], + [None], + ), + ], ) -def test_install_libraries_from_path(capsys, monkeypatch, mocker, path_exists, library_list, - expected_destination_name_list): +def test_install_libraries_from_path( + capsys, monkeypatch, mocker, path_exists, library_list, expected_destination_name_list +): libraries_path = pathlib.Path("/foo/LibrariesPath") monkeypatch.setenv("GITHUB_REPOSITORY", "foo/FooRepoName") @@ -1098,7 +1242,7 @@ def test_install_libraries_from_path(capsys, monkeypatch, mocker, path_exists, l ), destination_parent_path=libraries_path, destination_name=expected_destination_name, - force=True + force=True, ) ) @@ -1109,10 +1253,12 @@ def test_install_libraries_from_path(capsys, monkeypatch, mocker, path_exists, l def test_install_libraries_from_repository(mocker): git_ref = unittest.mock.sentinel.git_ref library_list = [ - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url, - compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, - compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name}, - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2} + { + compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url, + compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, + compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name, + }, + {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2}, ] expected_source_path_list = [unittest.mock.sentinel.source_path, "."] expected_destination_name_list = [unittest.mock.sentinel.destination_name, None] @@ -1126,18 +1272,20 @@ def test_install_libraries_from_repository(mocker): get_repository_dependency_ref_calls = [] install_from_repository_calls = [] - for library, expected_source_path, expected_destination_name in zip(library_list, - expected_source_path_list, - expected_destination_name_list): + for library, expected_source_path, expected_destination_name in zip( + library_list, expected_source_path_list, expected_destination_name_list + ): get_repository_dependency_ref_calls.append(unittest.mock.call(compile_sketches, dependency=library)) install_from_repository_calls.append( - unittest.mock.call(compile_sketches, - url=library[compilesketches.CompileSketches.dependency_source_url_key], - git_ref=git_ref, - source_path=expected_source_path, - destination_parent_path=compile_sketches.libraries_path, - destination_name=expected_destination_name, - force=True) + unittest.mock.call( + compile_sketches, + url=library[compilesketches.CompileSketches.dependency_source_url_key], + git_ref=git_ref, + source_path=expected_source_path, + destination_parent_path=compile_sketches.libraries_path, + destination_name=expected_destination_name, + force=True, + ) ) compile_sketches.get_repository_dependency_ref.assert_has_calls(calls=get_repository_dependency_ref_calls) @@ -1146,10 +1294,12 @@ def test_install_libraries_from_repository(mocker): def test_install_libraries_from_download(mocker): library_list = [ - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url1, - compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, - compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name}, - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2} + { + compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url1, + compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, + compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name, + }, + {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2}, ] expected_source_path_list = [unittest.mock.sentinel.source_path, "."] @@ -1162,15 +1312,18 @@ def test_install_libraries_from_download(mocker): compile_sketches.install_libraries_from_download(library_list=library_list) install_libraries_from_download_calls = [] - for library, expected_source_path, expected_destination_name in zip(library_list, expected_source_path_list, - expected_destination_name_list): + for library, expected_source_path, expected_destination_name in zip( + library_list, expected_source_path_list, expected_destination_name_list + ): install_libraries_from_download_calls.append( - unittest.mock.call(compile_sketches, - url=library[compilesketches.CompileSketches.dependency_source_url_key], - source_path=expected_source_path, - destination_parent_path=compilesketches.CompileSketches.libraries_path, - destination_name=expected_destination_name, - force=True) + unittest.mock.call( + compile_sketches, + url=library[compilesketches.CompileSketches.dependency_source_url_key], + source_path=expected_source_path, + destination_parent_path=compilesketches.CompileSketches.libraries_path, + destination_name=expected_destination_name, + force=True, + ) ) compile_sketches.install_from_download.assert_has_calls(calls=install_libraries_from_download_calls) @@ -1179,9 +1332,7 @@ def test_find_sketches(capsys): nonexistent_sketch_path = "/foo/NonexistentSketch" # Test sketch path doesn't exist - compile_sketches = get_compilesketches_object( - sketch_paths="\'\"" + nonexistent_sketch_path + "\"\'" - ) + compile_sketches = get_compilesketches_object(sketch_paths="'\"" + nonexistent_sketch_path + "\"'") with pytest.raises(expected_exception=SystemExit, match="1"): compile_sketches.find_sketches() assert capsys.readouterr().out.strip() == ( @@ -1192,53 +1343,49 @@ def test_find_sketches(capsys): # Test sketch path is a sketch file compile_sketches = get_compilesketches_object( - sketch_paths="\'" + str(test_data_path.joinpath("HasSketches", "Sketch1", "Sketch1.ino")) + "\'" + sketch_paths="'" + str(test_data_path.joinpath("HasSketches", "Sketch1", "Sketch1.ino")) + "'" ) - assert compile_sketches.find_sketches() == [ - test_data_path.joinpath("HasSketches", "Sketch1") - ] + assert compile_sketches.find_sketches() == [test_data_path.joinpath("HasSketches", "Sketch1")] # Test sketch path is a non-sketch file non_sketch_path = str(test_data_path.joinpath("NoSketches", "NotSketch", "NotSketch.foo")) - compile_sketches = get_compilesketches_object(sketch_paths="\'" + non_sketch_path + "\'") + compile_sketches = get_compilesketches_object(sketch_paths="'" + non_sketch_path + "'") with pytest.raises(expected_exception=SystemExit, match="1"): compile_sketches.find_sketches() assert capsys.readouterr().out.strip() == ("::error::Sketch path: " + non_sketch_path + " is not a sketch") # Test sketch path is a sketch folder compile_sketches = get_compilesketches_object( - sketch_paths="\'" + str(test_data_path.joinpath("HasSketches", "Sketch1")) + "\'" + sketch_paths="'" + str(test_data_path.joinpath("HasSketches", "Sketch1")) + "'" ) - assert compile_sketches.find_sketches() == [ - test_data_path.joinpath("HasSketches", "Sketch1") - ] + assert compile_sketches.find_sketches() == [test_data_path.joinpath("HasSketches", "Sketch1")] # Test sketch path does contain sketches - compile_sketches = get_compilesketches_object( - sketch_paths="\'" + str(test_data_path.joinpath("HasSketches")) + "\'") + compile_sketches = get_compilesketches_object(sketch_paths="'" + str(test_data_path.joinpath("HasSketches")) + "'") assert compile_sketches.find_sketches() == [ test_data_path.joinpath("HasSketches", "Sketch1"), - test_data_path.joinpath("HasSketches", "Sketch2") + test_data_path.joinpath("HasSketches", "Sketch2"), ] # Test sketch path doesn't contain any sketches no_sketches_path = str(test_data_path.joinpath("NoSketches")) - compile_sketches = get_compilesketches_object( - sketch_paths="\'" + no_sketches_path + "\'") + compile_sketches = get_compilesketches_object(sketch_paths="'" + no_sketches_path + "'") with pytest.raises(expected_exception=SystemExit, match="1"): compile_sketches.find_sketches() - assert capsys.readouterr().out.strip() == ("::error::No sketches were found in " - + no_sketches_path) + assert capsys.readouterr().out.strip() == ("::error::No sketches were found in " + no_sketches_path) @pytest.mark.parametrize( "input_value, expected_list, expected_was_yaml_list", - [("", [], False), - ("foo", ["foo"], False), - ("\'\"foo bar\" baz\'", ["foo bar", "baz"], False), - ("foo: bar", ["foo:", "bar"], False), - ("-", [None], True), - ("- foo: asdf\n bar: qwer\n- baz: zxcv", [{"foo": "asdf", "bar": "qwer"}, {"baz": "zxcv"}], True)]) + [ + ("", [], False), + ("foo", ["foo"], False), + ("'\"foo bar\" baz'", ["foo bar", "baz"], False), + ("foo: bar", ["foo:", "bar"], False), + ("-", [None], True), + ("- foo: asdf\n bar: qwer\n- baz: zxcv", [{"foo": "asdf", "bar": "qwer"}, {"baz": "zxcv"}], True), + ], +) def test_get_list_from_multiformat_input(input_value, expected_list, expected_was_yaml_list): input_list = compilesketches.get_list_from_multiformat_input(input_value=input_value) assert input_list.value == expected_list @@ -1248,26 +1395,30 @@ def test_get_list_from_multiformat_input(input_value, expected_list, expected_wa # noinspection PyUnresolvedReferences @pytest.mark.parametrize( "source_sub_path, destination_parent_sub_path, destination_name, expected_destination_sub_path", - [("foo/source-path", - "bar/destination-parent-path", - None, - "bar/destination-parent-path/source-path"), - ("foo/source-path", - "bar/destination-parent-path", - "destination-name", - "bar/destination-parent-path/destination-name")]) + [ + ("foo/source-path", "bar/destination-parent-path", None, "bar/destination-parent-path/source-path"), + ( + "foo/source-path", + "bar/destination-parent-path", + "destination-name", + "bar/destination-parent-path/destination-name", + ), + ], +) @pytest.mark.parametrize("exists", ["no", "yes", "symlink", "broken"]) @pytest.mark.parametrize("force", [True, False]) @pytest.mark.parametrize("is_dir", [True, False]) -def test_install_from_path(capsys, - tmp_path, - source_sub_path, - destination_parent_sub_path, - destination_name, - expected_destination_sub_path, - exists, - force, - is_dir): +def test_install_from_path( + capsys, + tmp_path, + source_sub_path, + destination_parent_sub_path, + destination_name, + expected_destination_sub_path, + exists, + force, + is_dir, +): source_path = tmp_path.joinpath(source_sub_path) # Generate source path @@ -1302,19 +1453,22 @@ def test_install_from_path(capsys, if exists != "no" and not force: with pytest.raises(expected_exception=SystemExit, match="1"): - compile_sketches.install_from_path(source_path=source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name, - force=force) + compile_sketches.install_from_path( + source_path=source_path, + destination_parent_path=destination_parent_path, + destination_name=destination_name, + force=force, + ) assert capsys.readouterr().out.strip() == ( - "::error::Installation already exists: " - + str(expected_destination_path) + "::error::Installation already exists: " + str(expected_destination_path) ) else: - compile_sketches.install_from_path(source_path=source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name, - force=force) + compile_sketches.install_from_path( + source_path=source_path, + destination_parent_path=destination_parent_path, + destination_name=destination_name, + force=force, + ) assert expected_destination_path.resolve() == source_path @@ -1338,37 +1492,38 @@ def prep_test_folders(): # Test existing destination_parent_path prep_test_folders() destination_parent_path.mkdir(parents=True) - compile_sketches.install_from_path(source_path=source_path, destination_parent_path=destination_parent_path, - destination_name=None) - assert directories_are_same(left_directory=source_path, - right_directory=destination_parent_path.joinpath(source_path.name)) + compile_sketches.install_from_path( + source_path=source_path, destination_parent_path=destination_parent_path, destination_name=None + ) + assert directories_are_same( + left_directory=source_path, right_directory=destination_parent_path.joinpath(source_path.name) + ) # Test custom folder name prep_test_folders() destination_name = "foo-destination-name" - compile_sketches.install_from_path(source_path=source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name) - assert directories_are_same(left_directory=source_path, - right_directory=destination_parent_path.joinpath(destination_name)) + compile_sketches.install_from_path( + source_path=source_path, destination_parent_path=destination_parent_path, destination_name=destination_name + ) + assert directories_are_same( + left_directory=source_path, right_directory=destination_parent_path.joinpath(destination_name) + ) # Test install of file # Test naming according to source prep_test_folders() - compile_sketches.install_from_path(source_path=test_file_path, - destination_parent_path=destination_parent_path, - destination_name=None) - assert filecmp.cmp(f1=test_file_path, - f2=destination_parent_path.joinpath(test_file_path.name)) + compile_sketches.install_from_path( + source_path=test_file_path, destination_parent_path=destination_parent_path, destination_name=None + ) + assert filecmp.cmp(f1=test_file_path, f2=destination_parent_path.joinpath(test_file_path.name)) # Test custom folder name prep_test_folders() destination_name = "foo-destination-name" - compile_sketches.install_from_path(source_path=test_file_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name) - assert filecmp.cmp(f1=test_file_path, - f2=destination_parent_path.joinpath(destination_name)) + compile_sketches.install_from_path( + source_path=test_file_path, destination_parent_path=destination_parent_path, destination_name=destination_name + ) + assert filecmp.cmp(f1=test_file_path, f2=destination_parent_path.joinpath(destination_name)) def test_path_is_sketch(): @@ -1376,29 +1531,26 @@ def test_path_is_sketch(): assert compilesketches.path_is_sketch(path=test_data_path.joinpath("HasSketches", "Sketch1", "Sketch1.ino")) is True # Not a sketch file - assert compilesketches.path_is_sketch( - path=test_data_path.joinpath("NoSketches", "NotSketch", "NotSketch.foo")) is False + assert ( + compilesketches.path_is_sketch(path=test_data_path.joinpath("NoSketches", "NotSketch", "NotSketch.foo")) + is False + ) # Sketch folder with .ino sketch file - assert compilesketches.path_is_sketch( - path=test_data_path.joinpath("HasSketches", "Sketch1")) is True + assert compilesketches.path_is_sketch(path=test_data_path.joinpath("HasSketches", "Sketch1")) is True # Sketch folder with .pde sketch file - assert compilesketches.path_is_sketch( - path=test_data_path.joinpath("HasSketches", "Sketch2")) is True + assert compilesketches.path_is_sketch(path=test_data_path.joinpath("HasSketches", "Sketch2")) is True # No files in path - assert compilesketches.path_is_sketch( - path=test_data_path.joinpath("HasSketches")) is False + assert compilesketches.path_is_sketch(path=test_data_path.joinpath("HasSketches")) is False # Not a sketch folder - assert compilesketches.path_is_sketch( - path=test_data_path.joinpath("NoSketches", "NotSketch")) is False + assert compilesketches.path_is_sketch(path=test_data_path.joinpath("NoSketches", "NotSketch")) is False @pytest.mark.parametrize("clean_build_cache", [True, False]) -@pytest.mark.parametrize("returncode, expected_success", [(1, False), - (0, True)]) +@pytest.mark.parametrize("returncode, expected_success", [(1, False), (0, True)]) def test_compile_sketch(capsys, mocker, clean_build_cache, returncode, expected_success): stdout = unittest.mock.sentinel.stdout sketch_path = pathlib.Path("FooSketch", "FooSketch.ino").resolve() @@ -1414,15 +1566,13 @@ class CompilationData: compile_sketches = get_compilesketches_object() - mocker.patch("compilesketches.CompileSketches.run_arduino_cli_command", autospec=True, - return_value=CompilationData()) + mocker.patch( + "compilesketches.CompileSketches.run_arduino_cli_command", autospec=True, return_value=CompilationData() + ) mocker.patch.object(pathlib.Path, "glob", autospec=True, return_value=build_cache_paths) mocker.patch("shutil.rmtree", autospec=True) - compilation_result = compile_sketches.compile_sketch( - sketch_path=sketch_path, - clean_build_cache=clean_build_cache - ) + compilation_result = compile_sketches.compile_sketch(sketch_path=sketch_path, clean_build_cache=clean_build_cache) if clean_build_cache: rmtree_calls = [] @@ -1433,8 +1583,11 @@ class CompilationData: shutil.rmtree.assert_has_calls(calls=rmtree_calls) expected_stdout = ( - "::group::Compiling sketch: " + str(compilesketches.path_relative_to_workspace(path=sketch_path)) + "\n" - + str(stdout) + "\n" + "::group::Compiling sketch: " + + str(compilesketches.path_relative_to_workspace(path=sketch_path)) + + "\n" + + str(stdout) + + "\n" + "::endgroup::" ) if not expected_success: @@ -1483,16 +1636,16 @@ def checkout(self): compile_sketches = get_compilesketches_object(enable_warnings_report=enable_warnings_report) - mocker.patch("compilesketches.CompileSketches.get_sizes_from_output", autospec=True, - side_effect=sizes_list) - mocker.patch("compilesketches.CompileSketches.get_warning_count_from_output", autospec=True, - side_effect=warning_count_list) - mocker.patch("compilesketches.CompileSketches.do_deltas_report", autospec=True, - return_value=do_deltas_report) + mocker.patch("compilesketches.CompileSketches.get_sizes_from_output", autospec=True, side_effect=sizes_list) + mocker.patch( + "compilesketches.CompileSketches.get_warning_count_from_output", autospec=True, side_effect=warning_count_list + ) + mocker.patch("compilesketches.CompileSketches.do_deltas_report", autospec=True, return_value=do_deltas_report) mocker.patch("git.Repo", autospec=True, return_value=Repo()) mocker.patch("compilesketches.CompileSketches.checkout_deltas_base_ref", autospec=True) - mocker.patch("compilesketches.CompileSketches.compile_sketch", autospec=True, - return_value=previous_compilation_result) + mocker.patch( + "compilesketches.CompileSketches.compile_sketch", autospec=True, return_value=previous_compilation_result + ) mocker.patch.object(Repo, "checkout") mocker.patch("compilesketches.CompileSketches.get_sizes_report", autospec=True, return_value=sizes_report) mocker.patch("compilesketches.CompileSketches.get_warnings_report", autospec=True, return_value=warnings_report) @@ -1502,7 +1655,8 @@ def checkout(self): get_sizes_from_output_calls = [unittest.mock.call(compile_sketches, compilation_result=compilation_result)] if enable_warnings_report == "true": get_warning_count_from_output_calls = [ - unittest.mock.call(compile_sketches, compilation_result=compilation_result)] + unittest.mock.call(compile_sketches, compilation_result=compilation_result) + ] else: get_warning_count_from_output_calls = [] @@ -1511,22 +1665,28 @@ def checkout(self): else: expected_current_warnings = None # noinspection PyUnresolvedReferences - compilesketches.CompileSketches.do_deltas_report.assert_called_once_with(compile_sketches, - compilation_result=compilation_result, - current_sizes=sizes_list[0], - current_warnings=expected_current_warnings) + compilesketches.CompileSketches.do_deltas_report.assert_called_once_with( + compile_sketches, + compilation_result=compilation_result, + current_sizes=sizes_list[0], + current_warnings=expected_current_warnings, + ) if do_deltas_report: git.Repo.assert_called_once_with(path=os.environ["GITHUB_WORKSPACE"]) compile_sketches.checkout_deltas_base_ref.assert_called_once() - compile_sketches.compile_sketch.assert_called_once_with(compile_sketches, - sketch_path=compilation_result.sketch, - clean_build_cache=(enable_warnings_report == "true")) + compile_sketches.compile_sketch.assert_called_once_with( + compile_sketches, + sketch_path=compilation_result.sketch, + clean_build_cache=(enable_warnings_report == "true"), + ) Repo.checkout.assert_called_once_with(original_git_ref, recurse_submodules=True) get_sizes_from_output_calls.append( - unittest.mock.call(compile_sketches, compilation_result=previous_compilation_result)) + unittest.mock.call(compile_sketches, compilation_result=previous_compilation_result) + ) if enable_warnings_report == "true": get_warning_count_from_output_calls.append( - unittest.mock.call(compile_sketches, compilation_result=previous_compilation_result)) + unittest.mock.call(compile_sketches, compilation_result=previous_compilation_result) + ) expected_previous_sizes = sizes_list[1] expected_previous_warnings = warning_count_list[1] @@ -1534,20 +1694,20 @@ def checkout(self): expected_previous_sizes = None expected_previous_warnings = None - compilesketches.CompileSketches.get_sizes_from_output.assert_has_calls( - calls=get_sizes_from_output_calls) + compilesketches.CompileSketches.get_sizes_from_output.assert_has_calls(calls=get_sizes_from_output_calls) compilesketches.CompileSketches.get_warning_count_from_output.assert_has_calls( - calls=get_warning_count_from_output_calls) + calls=get_warning_count_from_output_calls + ) - compile_sketches.get_sizes_report.assert_called_once_with(compile_sketches, - current_sizes=sizes_list[0], - previous_sizes=expected_previous_sizes) + compile_sketches.get_sizes_report.assert_called_once_with( + compile_sketches, current_sizes=sizes_list[0], previous_sizes=expected_previous_sizes + ) if enable_warnings_report == "true": # noinspection PyUnresolvedReferences - compile_sketches.get_warnings_report.assert_called_once_with(compile_sketches, - current_warnings=warning_count_list[0], - previous_warnings=expected_previous_warnings) + compile_sketches.get_warnings_report.assert_called_once_with( + compile_sketches, current_warnings=warning_count_list[0], previous_warnings=expected_previous_warnings + ) expected_sketch_report = { compile_sketches.ReportKeys.name: ( @@ -1563,130 +1723,140 @@ def checkout(self): @pytest.mark.parametrize( "compilation_success, compilation_output, flash, maximum_flash, relative_flash, ram, maximum_ram, relative_ram", - [(False, - "foo output", - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator), - (True, - "/home/per/.arduino15/packages/arduino/hardware/megaavr/1.8.5/cores/arduino/NANO_compat.cpp:23:2: warning: #warni" - "ng \"ATMEGA328 registers emulation is enabled. You may encounter some speed issue. Please consider to disable it" - " in the Tools menu\" [-Wcpp]\n" - " #warning \"ATMEGA328 registers emulation is enabled. You may encounter some speed issue. Please consider to dis" - "able it in the Tools menu\"\n" - " ^~~~~~~\n" - "Sketch uses {flash} bytes (1%) of program storage space. Maximum is {maximum_flash} bytes.\n" - "Global variables use {ram} bytes (0%) of dynamic memory, leaving 6122 bytes for local variables. Maximum is" - " {maximum_ram} bytes.\n", - 802, 1604, 50.0, 22, 33, 66.67), - (True, - "In file included from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/in" - "clude/samd21.h:69:0,\n" - " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:10" - "5,\n" - " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540" - ",\n" - " from /home/per/.arduino15/packages/arduino/hardware/samd/1.8.6/cores/arduino/Arduino.h:48,\n" - " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/GPS.h:23,\n" - " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/GPS.cpp:28:\n" - "/home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226" - ":0: warning: \"LITTLE_ENDIAN\" redefined\n" - " #define LITTLE_ENDIAN 1\n" - " \n" - "In file included from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" - "de/sys/types.h:67:0,\n" - " from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" - "de/stdio.h:61,\n" - " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/minmea/minmea.h:16,\n" - " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/GPS.cpp:23:\n" - "/home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17" - ":0: note: this is the location of the previous definition\n" - " #define LITTLE_ENDIAN _LITTLE_ENDIAN\n" - " \n" - "Sketch uses {flash} bytes (12%) of program storage space. Maximum is {maximum_flash} bytes.\n" - "Global variables use {ram} bytes of dynamic memory.\n", - 32740, - 32740, - 100.0, - 3648, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator), - (True, - "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp: In function 'void _initISR(Tc*, uint8_t, uint32_t, IRQn_Ty" - "pe, uint8_t, uint8_t)':\n" - "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp:120:56: warning: unused parameter 'id' [-Wunused-parameter]" - "\n" - " static void _initISR(Tc *tc, uint8_t channel, uint32_t id, IRQn_Type irqn, uint8_t gcmForTimer, uint8_t intEnab" - " leBit)\n" - " ^~\n" - "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp: In function 'void finISR(timer16_Sequence_t)':\n" - "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp:174:39: warning: unused parameter 'timer' [-Wunused-paramet" - "er]\n" - " static void finISR(timer16_Sequence_t timer)\n" - " ^~~~~\n" - "Sketch uses {flash} bytes (4%) of program storage space. Maximum is {maximum_flash} bytes.\n", - 12636, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator), - (True, - "In file included from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/in" - "clude/samd21.h:69:0,\n" - " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:10" - "5,\n" - " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540" - ",\n" - " from /home/per/.arduino15/packages/arduino/hardware/samd/1.8.6/cores/arduino/Arduino.h:48,\n" - " from /home/per/Arduino/libraries/RTCZero/src/RTCZero.h:23,\n" - " from /home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp:22:\n" - "/home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226" - ":0: warning: \"LITTLE_ENDIAN\" redefined\n" - " #define LITTLE_ENDIAN 1\n" - " \n" - "In file included from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" - "de/sys/types.h:67:0,\n" - " from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" - "de/time.h:28,\n" - " from /home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp:20:\n" - "/home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17" - ":0: note: this is the location of the previous definition\n" - " #define LITTLE_ENDIAN _LITTLE_ENDIAN\n" - " \n" - "/home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp: In member function 'void RTCZero::begin(bool)':\n" - "/home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp:96:26: warning: 'oldTime.RTC_MODE2_CLOCK_Type::reg' may be u" - "sed uninitialized in this function [-Wmaybe-uninitialized]\n" - " RTC->MODE2.CLOCK.reg = oldTime.reg;\n" - "Couldn't determine program size", - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator)] + [ + ( + False, + "foo output", + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + ), + ( + True, + "/home/per/.arduino15/packages/arduino/hardware/megaavr/1.8.5/cores/arduino/NANO_compat.cpp:23:2: warning: #warni" + 'ng "ATMEGA328 registers emulation is enabled. You may encounter some speed issue. Please consider to disable it' + ' in the Tools menu" [-Wcpp]\n' + ' #warning "ATMEGA328 registers emulation is enabled. You may encounter some speed issue. Please consider to dis' + 'able it in the Tools menu"\n' + " ^~~~~~~\n" + "Sketch uses {flash} bytes (1%) of program storage space. Maximum is {maximum_flash} bytes.\n" + "Global variables use {ram} bytes (0%) of dynamic memory, leaving 6122 bytes for local variables. Maximum is" + " {maximum_ram} bytes.\n", + 802, + 1604, + 50.0, + 22, + 33, + 66.67, + ), + ( + True, + "In file included from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/in" + "clude/samd21.h:69:0,\n" + " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:10" + "5,\n" + " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540" + ",\n" + " from /home/per/.arduino15/packages/arduino/hardware/samd/1.8.6/cores/arduino/Arduino.h:48,\n" + " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/GPS.h:23,\n" + " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/GPS.cpp:28:\n" + "/home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226" + ':0: warning: "LITTLE_ENDIAN" redefined\n' + " #define LITTLE_ENDIAN 1\n" + " \n" + "In file included from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" + "de/sys/types.h:67:0,\n" + " from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" + "de/stdio.h:61,\n" + " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/minmea/minmea.h:16,\n" + " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/GPS.cpp:23:\n" + "/home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17" + ":0: note: this is the location of the previous definition\n" + " #define LITTLE_ENDIAN _LITTLE_ENDIAN\n" + " \n" + "Sketch uses {flash} bytes (12%) of program storage space. Maximum is {maximum_flash} bytes.\n" + "Global variables use {ram} bytes of dynamic memory.\n", + 32740, + 32740, + 100.0, + 3648, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + ), + ( + True, + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp: In function 'void _initISR(Tc*, uint8_t, uint32_t, IRQn_Ty" + "pe, uint8_t, uint8_t)':\n" + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp:120:56: warning: unused parameter 'id' [-Wunused-parameter]" + "\n" + " static void _initISR(Tc *tc, uint8_t channel, uint32_t id, IRQn_Type irqn, uint8_t gcmForTimer, uint8_t intEnab" + " leBit)\n" + " ^~\n" + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp: In function 'void finISR(timer16_Sequence_t)':\n" + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp:174:39: warning: unused parameter 'timer' [-Wunused-paramet" + "er]\n" + " static void finISR(timer16_Sequence_t timer)\n" + " ^~~~~\n" + "Sketch uses {flash} bytes (4%) of program storage space. Maximum is {maximum_flash} bytes.\n", + 12636, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + ), + ( + True, + "In file included from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/in" + "clude/samd21.h:69:0,\n" + " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:10" + "5,\n" + " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540" + ",\n" + " from /home/per/.arduino15/packages/arduino/hardware/samd/1.8.6/cores/arduino/Arduino.h:48,\n" + " from /home/per/Arduino/libraries/RTCZero/src/RTCZero.h:23,\n" + " from /home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp:22:\n" + "/home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226" + ':0: warning: "LITTLE_ENDIAN" redefined\n' + " #define LITTLE_ENDIAN 1\n" + " \n" + "In file included from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" + "de/sys/types.h:67:0,\n" + " from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" + "de/time.h:28,\n" + " from /home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp:20:\n" + "/home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17" + ":0: note: this is the location of the previous definition\n" + " #define LITTLE_ENDIAN _LITTLE_ENDIAN\n" + " \n" + "/home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp: In member function 'void RTCZero::begin(bool)':\n" + "/home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp:96:26: warning: 'oldTime.RTC_MODE2_CLOCK_Type::reg' may be u" + "sed uninitialized in this function [-Wmaybe-uninitialized]\n" + " RTC->MODE2.CLOCK.reg = oldTime.reg;\n" + "Couldn't determine program size", + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + ), + ], ) -def test_get_sizes_from_output(compilation_success, - compilation_output, - flash, - maximum_flash, - relative_flash, - ram, - maximum_ram, - relative_ram): +def test_get_sizes_from_output( + compilation_success, compilation_output, flash, maximum_flash, relative_flash, ram, maximum_ram, relative_ram +): sketch_path = pathlib.PurePath("foo/bar") - compilation_output = compilation_output.format(flash=str(flash), - maximum_flash=str(maximum_flash), - ram=str(ram), - maximum_ram=str(maximum_ram)) + compilation_output = compilation_output.format( + flash=str(flash), maximum_flash=str(maximum_flash), ram=str(ram), maximum_ram=str(maximum_ram) + ) compile_sketches = get_compilesketches_object() - compilation_result = type("CompilationResult", (), - {"sketch": sketch_path, - "success": compilation_success, - "output": compilation_output}) + compilation_result = type( + "CompilationResult", (), {"sketch": sketch_path, "success": compilation_success, "output": compilation_output} + ) sizes = compile_sketches.get_sizes_from_output(compilation_result=compilation_result) @@ -1695,42 +1865,48 @@ def test_get_sizes_from_output(compilation_success, compile_sketches.ReportKeys.name: "flash", compile_sketches.ReportKeys.absolute: flash, compile_sketches.ReportKeys.maximum: maximum_flash, - compile_sketches.ReportKeys.relative: relative_flash + compile_sketches.ReportKeys.relative: relative_flash, }, { compile_sketches.ReportKeys.name: "RAM for global variables", compile_sketches.ReportKeys.absolute: ram, compile_sketches.ReportKeys.maximum: maximum_ram, - compile_sketches.ReportKeys.relative: relative_ram - } + compile_sketches.ReportKeys.relative: relative_ram, + }, ] @pytest.mark.parametrize( "compilation_output, memory_type, size_data_type, expected_output", - [("foo output", - { - "name": "RAM for global variables", - "regex": { - get_compilesketches_object().ReportKeys.maximum: ( - r"Global variables use [0-9]+ bytes .*of dynamic memory.*\. Maximum is ([0-9]+) bytes." - ) - } - }, - get_compilesketches_object().ReportKeys.maximum, - None), - ("Global variables use 11 bytes (0%) of dynamic memory, leaving 22 bytes for local variables. Maximum is" - + " {expected_output} bytes.", - { - "name": "RAM for global variables", - "regex": { - get_compilesketches_object().ReportKeys.maximum: ( - r"Global variables use [0-9]+ bytes .*of dynamic memory.*\. Maximum is ([0-9]+) bytes." - ) - } - }, - get_compilesketches_object().ReportKeys.maximum, - 42)] + [ + ( + "foo output", + { + "name": "RAM for global variables", + "regex": { + get_compilesketches_object().ReportKeys.maximum: ( + r"Global variables use [0-9]+ bytes .*of dynamic memory.*\. Maximum is ([0-9]+) bytes." + ) + }, + }, + get_compilesketches_object().ReportKeys.maximum, + None, + ), + ( + "Global variables use 11 bytes (0%) of dynamic memory, leaving 22 bytes for local variables. Maximum is" + + " {expected_output} bytes.", + { + "name": "RAM for global variables", + "regex": { + get_compilesketches_object().ReportKeys.maximum: ( + r"Global variables use [0-9]+ bytes .*of dynamic memory.*\. Maximum is ([0-9]+) bytes." + ) + }, + }, + get_compilesketches_object().ReportKeys.maximum, + 42, + ), + ], ) def test_get_size_data_from_output(capsys, compilation_output, memory_type, size_data_type, expected_output): compilation_output = compilation_output.format(expected_output=str(expected_output)) @@ -1742,7 +1918,9 @@ def test_get_size_data_from_output(capsys, compilation_output, memory_type, size assert size_data == expected_output if expected_output is None: expected_stdout = ( - "::warning::Unable to determine the: \"" + str(size_data_type) + "\" value for memory type: \"" + '::warning::Unable to determine the: "' + + str(size_data_type) + + '" value for memory type: "' + memory_type["name"] + "\". The board's platform may not have been configured to provide this information." ) @@ -1751,21 +1929,23 @@ def test_get_size_data_from_output(capsys, compilation_output, memory_type, size @pytest.mark.parametrize( "compilation_success, test_compilation_output_filename, expected_warning_count", - [(True, - pathlib.Path("test_get_warning_count_from_output", "has-warnings.txt"), - 45), - (True, - pathlib.Path("test_get_warning_count_from_output", "no-warnings.txt"), - 0), - (False, - pathlib.Path("test_get_warning_count_from_output", "has-warnings.txt"), - get_compilesketches_object().not_applicable_indicator)]) + [ + (True, pathlib.Path("test_get_warning_count_from_output", "has-warnings.txt"), 45), + (True, pathlib.Path("test_get_warning_count_from_output", "no-warnings.txt"), 0), + ( + False, + pathlib.Path("test_get_warning_count_from_output", "has-warnings.txt"), + get_compilesketches_object().not_applicable_indicator, + ), + ], +) def test_get_warning_count_from_output(compilation_success, test_compilation_output_filename, expected_warning_count): compile_sketches = get_compilesketches_object() - with open(file=test_data_path.joinpath(test_compilation_output_filename), - mode='r', - encoding="utf-8") as test_compilation_output_file: + with open( + file=test_data_path.joinpath(test_compilation_output_filename), mode="r", encoding="utf-8" + ) as test_compilation_output_file: + class CompilationResult: success = compilation_success output = test_compilation_output_file.read() @@ -1774,72 +1954,114 @@ class CompilationResult: @pytest.mark.parametrize( - "enable_deltas_report," - "compilation_success," - "current_sizes," - "current_warnings," - "do_deltas_report_expected", - [("true", - True, - [{compilesketches.CompileSketches.ReportKeys.name: "foo", - compilesketches.CompileSketches.ReportKeys.absolute: 24}, - {compilesketches.CompileSketches.ReportKeys.name: "bar", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}], - compilesketches.CompileSketches.not_applicable_indicator, - True), - ("true", - True, - [{compilesketches.CompileSketches.ReportKeys.name: "foo", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}, - {compilesketches.CompileSketches.ReportKeys.name: "bar", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}], - 42, - True), - ("false", - True, - [{compilesketches.CompileSketches.ReportKeys.name: "foo", - compilesketches.CompileSketches.ReportKeys.absolute: 24}], - True, - False), - ("true", - False, - [{compilesketches.CompileSketches.ReportKeys.name: "foo", - compilesketches.CompileSketches.ReportKeys.absolute: 24}], - 42, - False), - ("true", - True, - [{compilesketches.CompileSketches.ReportKeys.name: "foo", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}, - {compilesketches.CompileSketches.ReportKeys.name: "bar", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}], - compilesketches.CompileSketches.not_applicable_indicator, - False), - ("true", - True, - [{compilesketches.CompileSketches.ReportKeys.name: "foo", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}, - {compilesketches.CompileSketches.ReportKeys.name: "bar", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}], - None, - False) - ] + "enable_deltas_report," "compilation_success," "current_sizes," "current_warnings," "do_deltas_report_expected", + [ + ( + "true", + True, + [ + { + compilesketches.CompileSketches.ReportKeys.name: "foo", + compilesketches.CompileSketches.ReportKeys.absolute: 24, + }, + { + compilesketches.CompileSketches.ReportKeys.name: "bar", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + ], + compilesketches.CompileSketches.not_applicable_indicator, + True, + ), + ( + "true", + True, + [ + { + compilesketches.CompileSketches.ReportKeys.name: "foo", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + { + compilesketches.CompileSketches.ReportKeys.name: "bar", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + ], + 42, + True, + ), + ( + "false", + True, + [ + { + compilesketches.CompileSketches.ReportKeys.name: "foo", + compilesketches.CompileSketches.ReportKeys.absolute: 24, + } + ], + True, + False, + ), + ( + "true", + False, + [ + { + compilesketches.CompileSketches.ReportKeys.name: "foo", + compilesketches.CompileSketches.ReportKeys.absolute: 24, + } + ], + 42, + False, + ), + ( + "true", + True, + [ + { + compilesketches.CompileSketches.ReportKeys.name: "foo", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + { + compilesketches.CompileSketches.ReportKeys.name: "bar", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + ], + compilesketches.CompileSketches.not_applicable_indicator, + False, + ), + ( + "true", + True, + [ + { + compilesketches.CompileSketches.ReportKeys.name: "foo", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + { + compilesketches.CompileSketches.ReportKeys.name: "bar", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + ], + None, + False, + ), + ], ) -def test_do_deltas_report(monkeypatch, - enable_deltas_report, - compilation_success, - current_sizes, - current_warnings, - do_deltas_report_expected): +def test_do_deltas_report( + monkeypatch, enable_deltas_report, compilation_success, current_sizes, current_warnings, do_deltas_report_expected +): compile_sketches = get_compilesketches_object(enable_deltas_report=enable_deltas_report) - compilation_result = type("CompilationResult", (), - {"sketch": "/foo/SketchName", - "success": compilation_success, - "output": "foo compilation output"}) - assert compile_sketches.do_deltas_report(compilation_result=compilation_result, - current_sizes=current_sizes, - current_warnings=current_warnings) == do_deltas_report_expected + compilation_result = type( + "CompilationResult", + (), + {"sketch": "/foo/SketchName", "success": compilation_success, "output": "foo compilation output"}, + ) + assert ( + compile_sketches.do_deltas_report( + compilation_result=compilation_result, current_sizes=current_sizes, current_warnings=current_warnings + ) + == do_deltas_report_expected + ) def test_checkout_deltas_base_ref(monkeypatch, mocker): @@ -1866,12 +2088,14 @@ def checkout(self): compile_sketches.checkout_deltas_base_ref() git.Repo.assert_called_once_with(path=os.environ["GITHUB_WORKSPACE"]) - Repo.fetch.assert_called_once_with(refspec=deltas_base_ref, - verbose=compile_sketches.verbose, - no_tags=True, - prune=True, - depth=1, - recurse_submodules=True) + Repo.fetch.assert_called_once_with( + refspec=deltas_base_ref, + verbose=compile_sketches.verbose, + no_tags=True, + prune=True, + depth=1, + recurse_submodules=True, + ) Repo.checkout.assert_called_once_with(deltas_base_ref, recurse_submodules=True) @@ -1888,9 +2112,9 @@ def test_get_sizes_report(mocker): get_size_report_calls = [] for current_size, previous_size in zip(current_sizes, previous_sizes): - get_size_report_calls.append(unittest.mock.call(compile_sketches, - current_size=current_size, - previous_size=previous_size)) + get_size_report_calls.append( + unittest.mock.call(compile_sketches, current_size=current_size, previous_size=previous_size) + ) compile_sketches.get_size_report.assert_has_calls(get_size_report_calls) @@ -1902,60 +2126,67 @@ def test_get_sizes_report(mocker): get_size_report_calls = [] for current_size in current_sizes: - get_size_report_calls.append(unittest.mock.call(compile_sketches, - current_size=current_size, - previous_size=None)) + get_size_report_calls.append( + unittest.mock.call(compile_sketches, current_size=current_size, previous_size=None) + ) compile_sketches.get_size_report.assert_has_calls(get_size_report_calls) @pytest.mark.parametrize( "size_maximum, current_absolute, previous_size, expected_absolute_delta, expected_relative_delta", - [(compilesketches.CompileSketches.not_applicable_indicator, - compilesketches.CompileSketches.not_applicable_indicator, - {compilesketches.CompileSketches.ReportKeys.absolute: 11, - compilesketches.CompileSketches.ReportKeys.relative: 9.91}, - compilesketches.CompileSketches.not_applicable_indicator, - compilesketches.CompileSketches.not_applicable_indicator), - (111, - 42, - {compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, - compilesketches.CompileSketches.ReportKeys.relative: compilesketches.CompileSketches.not_applicable_indicator}, - compilesketches.CompileSketches.not_applicable_indicator, - compilesketches.CompileSketches.not_applicable_indicator), - (111, - 42, - {compilesketches.CompileSketches.ReportKeys.absolute: 11, - compilesketches.CompileSketches.ReportKeys.relative: 9.91}, - 31, - 27.93), - (111, - 42, - None, - None, - None)] + [ + ( + compilesketches.CompileSketches.not_applicable_indicator, + compilesketches.CompileSketches.not_applicable_indicator, + { + compilesketches.CompileSketches.ReportKeys.absolute: 11, + compilesketches.CompileSketches.ReportKeys.relative: 9.91, + }, + compilesketches.CompileSketches.not_applicable_indicator, + compilesketches.CompileSketches.not_applicable_indicator, + ), + ( + 111, + 42, + { + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + compilesketches.CompileSketches.ReportKeys.relative: compilesketches.CompileSketches.not_applicable_indicator, + }, + compilesketches.CompileSketches.not_applicable_indicator, + compilesketches.CompileSketches.not_applicable_indicator, + ), + ( + 111, + 42, + { + compilesketches.CompileSketches.ReportKeys.absolute: 11, + compilesketches.CompileSketches.ReportKeys.relative: 9.91, + }, + 31, + 27.93, + ), + (111, 42, None, None, None), + ], ) -def test_get_size_report(capsys, - size_maximum, - current_absolute, - previous_size, - expected_absolute_delta, - expected_relative_delta): +def test_get_size_report( + capsys, size_maximum, current_absolute, previous_size, expected_absolute_delta, expected_relative_delta +): size_name = "Foo size name" current_relative = 42 current_size = { compilesketches.CompileSketches.ReportKeys.name: size_name, compilesketches.CompileSketches.ReportKeys.maximum: size_maximum, compilesketches.CompileSketches.ReportKeys.absolute: current_absolute, - compilesketches.CompileSketches.ReportKeys.relative: current_relative + compilesketches.CompileSketches.ReportKeys.relative: current_relative, } expected_size_report = { compilesketches.CompileSketches.ReportKeys.name: size_name, compilesketches.CompileSketches.ReportKeys.maximum: size_maximum, compilesketches.CompileSketches.ReportKeys.current: { compilesketches.CompileSketches.ReportKeys.absolute: current_absolute, - compilesketches.CompileSketches.ReportKeys.relative: current_relative - } + compilesketches.CompileSketches.ReportKeys.relative: current_relative, + }, } compile_sketches = get_compilesketches_object() @@ -1967,19 +2198,26 @@ def test_get_size_report(capsys, else: expected_size_report[compilesketches.CompileSketches.ReportKeys.previous] = { compilesketches.CompileSketches.ReportKeys.absolute: previous_size[ - compilesketches.CompileSketches.ReportKeys.absolute], + compilesketches.CompileSketches.ReportKeys.absolute + ], compilesketches.CompileSketches.ReportKeys.relative: previous_size[ - compilesketches.CompileSketches.ReportKeys.relative] + compilesketches.CompileSketches.ReportKeys.relative + ], } expected_size_report[compilesketches.CompileSketches.ReportKeys.delta] = { compilesketches.CompileSketches.ReportKeys.absolute: expected_absolute_delta, - compilesketches.CompileSketches.ReportKeys.relative: expected_relative_delta + compilesketches.CompileSketches.ReportKeys.relative: expected_relative_delta, } if expected_relative_delta == compilesketches.CompileSketches.not_applicable_indicator: assert capsys.readouterr().out.strip() == ("Change in " + size_name + ": " + str(expected_absolute_delta)) else: assert capsys.readouterr().out.strip() == ( - "Change in " + size_name + ": " + str(expected_absolute_delta) + " (" + str(expected_relative_delta) + "Change in " + + size_name + + ": " + + str(expected_absolute_delta) + + " (" + + str(expected_relative_delta) + "%)" ) @@ -1988,49 +2226,58 @@ def test_get_size_report(capsys, @pytest.mark.parametrize( "current_warnings, previous_warnings, expected_report", - [(42, - None, - { - compilesketches.CompileSketches.ReportKeys.current: { - compilesketches.CompileSketches.ReportKeys.absolute: 42 - } - }), - (42, - compilesketches.CompileSketches.not_applicable_indicator, - { - compilesketches.CompileSketches.ReportKeys.current: { - compilesketches.CompileSketches.ReportKeys.absolute: 42 - }, - compilesketches.CompileSketches.ReportKeys.previous: { - compilesketches.CompileSketches.ReportKeys.absolute: ( - compilesketches.CompileSketches.not_applicable_indicator - ) - }, - compilesketches.CompileSketches.ReportKeys.delta: { - compilesketches.CompileSketches.ReportKeys.absolute: ( - compilesketches.CompileSketches.not_applicable_indicator - ) - } - }), - (42, - 43, - { - compilesketches.CompileSketches.ReportKeys.current: { - compilesketches.CompileSketches.ReportKeys.absolute: 42 - }, - compilesketches.CompileSketches.ReportKeys.previous: { - compilesketches.CompileSketches.ReportKeys.absolute: 43 - }, - compilesketches.CompileSketches.ReportKeys.delta: { - compilesketches.CompileSketches.ReportKeys.absolute: -1 - } - })]) + [ + ( + 42, + None, + { + compilesketches.CompileSketches.ReportKeys.current: { + compilesketches.CompileSketches.ReportKeys.absolute: 42 + } + }, + ), + ( + 42, + compilesketches.CompileSketches.not_applicable_indicator, + { + compilesketches.CompileSketches.ReportKeys.current: { + compilesketches.CompileSketches.ReportKeys.absolute: 42 + }, + compilesketches.CompileSketches.ReportKeys.previous: { + compilesketches.CompileSketches.ReportKeys.absolute: ( + compilesketches.CompileSketches.not_applicable_indicator + ) + }, + compilesketches.CompileSketches.ReportKeys.delta: { + compilesketches.CompileSketches.ReportKeys.absolute: ( + compilesketches.CompileSketches.not_applicable_indicator + ) + }, + }, + ), + ( + 42, + 43, + { + compilesketches.CompileSketches.ReportKeys.current: { + compilesketches.CompileSketches.ReportKeys.absolute: 42 + }, + compilesketches.CompileSketches.ReportKeys.previous: { + compilesketches.CompileSketches.ReportKeys.absolute: 43 + }, + compilesketches.CompileSketches.ReportKeys.delta: { + compilesketches.CompileSketches.ReportKeys.absolute: -1 + }, + }, + ), + ], +) def test_get_warnings_report(current_warnings, previous_warnings, expected_report): compile_sketches = get_compilesketches_object() - assert compile_sketches.get_warnings_report( - current_warnings=current_warnings, - previous_warnings=previous_warnings - ) == expected_report + assert ( + compile_sketches.get_warnings_report(current_warnings=current_warnings, previous_warnings=previous_warnings) + == expected_report + ) def test_get_sketches_report(monkeypatch, mocker): @@ -2046,38 +2293,41 @@ def test_get_sketches_report(monkeypatch, mocker): warnings_summary_report = unittest.mock.sentinel.warnings_summary_report sketch_report_list = unittest.mock.sentinel.sketch_report_list - mocker.patch("compilesketches.CompileSketches.get_sizes_summary_report", - autospec=True, - return_value=sizes_summary_report) + mocker.patch( + "compilesketches.CompileSketches.get_sizes_summary_report", autospec=True, return_value=sizes_summary_report + ) - mocker.patch("compilesketches.CompileSketches.get_warnings_summary_report", - autospec=True, - return_value=warnings_summary_report) + mocker.patch( + "compilesketches.CompileSketches.get_warnings_summary_report", + autospec=True, + return_value=warnings_summary_report, + ) compile_sketches = get_compilesketches_object(fqbn_arg=fqbn_arg) assert compile_sketches.get_sketches_report(sketch_report_list=sketch_report_list) == { compilesketches.CompileSketches.ReportKeys.commit_hash: current_git_ref, - compilesketches.CompileSketches.ReportKeys.commit_url: ("https://github.com/" - + github_repository - + "/commit/" - + current_git_ref), + compilesketches.CompileSketches.ReportKeys.commit_url: ( + "https://github.com/" + github_repository + "/commit/" + current_git_ref + ), compilesketches.CompileSketches.ReportKeys.boards: [ { compilesketches.CompileSketches.ReportKeys.board: compile_sketches.fqbn, compilesketches.CompileSketches.ReportKeys.sizes: sizes_summary_report, compilesketches.CompileSketches.ReportKeys.warnings: warnings_summary_report, - compilesketches.CompileSketches.ReportKeys.sketches: sketch_report_list + compilesketches.CompileSketches.ReportKeys.sketches: sketch_report_list, } - ] + ], } - compile_sketches.get_sizes_summary_report.assert_called_once_with(compile_sketches, - sketch_report_list=sketch_report_list) + compile_sketches.get_sizes_summary_report.assert_called_once_with( + compile_sketches, sketch_report_list=sketch_report_list + ) # noinspection PyUnresolvedReferences - compile_sketches.get_warnings_summary_report.assert_called_once_with(compile_sketches, - sketch_report_list=sketch_report_list) + compile_sketches.get_warnings_summary_report.assert_called_once_with( + compile_sketches, sketch_report_list=sketch_report_list + ) # Test no summary report data (size deltas not enabled) compilesketches.CompileSketches.get_sizes_summary_report.return_value = [] @@ -2085,16 +2335,15 @@ def test_get_sketches_report(monkeypatch, mocker): assert compile_sketches.get_sketches_report(sketch_report_list=sketch_report_list) == { compilesketches.CompileSketches.ReportKeys.commit_hash: current_git_ref, - compilesketches.CompileSketches.ReportKeys.commit_url: ("https://github.com/" - + github_repository - + "/commit/" - + current_git_ref), + compilesketches.CompileSketches.ReportKeys.commit_url: ( + "https://github.com/" + github_repository + "/commit/" + current_git_ref + ), compilesketches.CompileSketches.ReportKeys.boards: [ { compilesketches.CompileSketches.ReportKeys.board: compile_sketches.fqbn, - compilesketches.CompileSketches.ReportKeys.sketches: sketch_report_list + compilesketches.CompileSketches.ReportKeys.sketches: sketch_report_list, } - ] + ], } @@ -2107,17 +2356,17 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: 111, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 42, - compilesketches.CompileSketches.ReportKeys.relative: 5.142 - } + compilesketches.CompileSketches.ReportKeys.relative: 5.142, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 11, - compilesketches.CompileSketches.ReportKeys.relative: 2.242 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 2.242, + }, + }, ] }, { @@ -2127,19 +2376,19 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: 111, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 8, - compilesketches.CompileSketches.ReportKeys.relative: 1.542 - } + compilesketches.CompileSketches.ReportKeys.relative: 1.542, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 33, - compilesketches.CompileSketches.ReportKeys.relative: 10.042 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 10.042, + }, + }, ] - } + }, ] expected_sizes_summary_report = [ @@ -2149,13 +2398,13 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 8, - compilesketches.CompileSketches.ReportKeys.maximum: 42 + compilesketches.CompileSketches.ReportKeys.maximum: 42, }, compilesketches.CompileSketches.ReportKeys.relative: { compilesketches.CompileSketches.ReportKeys.minimum: 1.542, - compilesketches.CompileSketches.ReportKeys.maximum: 5.142 - } - } + compilesketches.CompileSketches.ReportKeys.maximum: 5.142, + }, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", @@ -2163,14 +2412,14 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 11, - compilesketches.CompileSketches.ReportKeys.maximum: 33 + compilesketches.CompileSketches.ReportKeys.maximum: 33, }, compilesketches.CompileSketches.ReportKeys.relative: { compilesketches.CompileSketches.ReportKeys.minimum: 2.242, - compilesketches.CompileSketches.ReportKeys.maximum: 10.042 - } - } - } + compilesketches.CompileSketches.ReportKeys.maximum: 10.042, + }, + }, + }, ] compile_sketches = get_compilesketches_object() @@ -2188,17 +2437,17 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: "N/A", compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: "N/A", - compilesketches.CompileSketches.ReportKeys.relative: "N/A" - } + compilesketches.CompileSketches.ReportKeys.relative: "N/A", + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 11, - compilesketches.CompileSketches.ReportKeys.relative: 2.742 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 2.742, + }, + }, ] }, { @@ -2208,19 +2457,19 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: 111, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 8, - compilesketches.CompileSketches.ReportKeys.relative: 2.442 - } + compilesketches.CompileSketches.ReportKeys.relative: 2.442, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 33, - compilesketches.CompileSketches.ReportKeys.relative: 4.942 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 4.942, + }, + }, ] - } + }, ] expected_sizes_summary_report = [ @@ -2230,13 +2479,13 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 8, - compilesketches.CompileSketches.ReportKeys.maximum: 8 + compilesketches.CompileSketches.ReportKeys.maximum: 8, }, compilesketches.CompileSketches.ReportKeys.relative: { compilesketches.CompileSketches.ReportKeys.minimum: 2.442, - compilesketches.CompileSketches.ReportKeys.maximum: 2.442 - } - } + compilesketches.CompileSketches.ReportKeys.maximum: 2.442, + }, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", @@ -2244,14 +2493,14 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 11, - compilesketches.CompileSketches.ReportKeys.maximum: 33 + compilesketches.CompileSketches.ReportKeys.maximum: 33, }, compilesketches.CompileSketches.ReportKeys.relative: { compilesketches.CompileSketches.ReportKeys.minimum: 2.742, - compilesketches.CompileSketches.ReportKeys.maximum: 4.942 - } - } - } + compilesketches.CompileSketches.ReportKeys.maximum: 4.942, + }, + }, + }, ] assert compile_sketches.get_sizes_summary_report(sketch_report_list=sketch_report_list) == ( @@ -2267,17 +2516,17 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: "N/A", compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: "N/A", - compilesketches.CompileSketches.ReportKeys.relative: "N/A" - } + compilesketches.CompileSketches.ReportKeys.relative: "N/A", + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 11, - compilesketches.CompileSketches.ReportKeys.relative: 0.842 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 0.842, + }, + }, ] }, { @@ -2287,19 +2536,19 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: "N/A", compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: "N/A", - compilesketches.CompileSketches.ReportKeys.relative: "N/A" - } + compilesketches.CompileSketches.ReportKeys.relative: "N/A", + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 33, - compilesketches.CompileSketches.ReportKeys.relative: 7.742 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 7.742, + }, + }, ] - } + }, ] expected_sizes_summary_report = [ @@ -2309,13 +2558,13 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: "N/A", - compilesketches.CompileSketches.ReportKeys.maximum: "N/A" + compilesketches.CompileSketches.ReportKeys.maximum: "N/A", }, compilesketches.CompileSketches.ReportKeys.relative: { compilesketches.CompileSketches.ReportKeys.minimum: "N/A", - compilesketches.CompileSketches.ReportKeys.maximum: "N/A" - } - } + compilesketches.CompileSketches.ReportKeys.maximum: "N/A", + }, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", @@ -2323,14 +2572,14 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 11, - compilesketches.CompileSketches.ReportKeys.maximum: 33 + compilesketches.CompileSketches.ReportKeys.maximum: 33, }, compilesketches.CompileSketches.ReportKeys.relative: { compilesketches.CompileSketches.ReportKeys.minimum: 0.842, - compilesketches.CompileSketches.ReportKeys.maximum: 7.742 - } - } - } + compilesketches.CompileSketches.ReportKeys.maximum: 7.742, + }, + }, + }, ] assert compile_sketches.get_sizes_summary_report(sketch_report_list=sketch_report_list) == ( @@ -2346,17 +2595,17 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: 111, compilesketches.CompileSketches.ReportKeys.current: { compilesketches.CompileSketches.ReportKeys.absolute: 42, - compilesketches.CompileSketches.ReportKeys.relative: 2.342 - } + compilesketches.CompileSketches.ReportKeys.relative: 2.342, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.current: { compilesketches.CompileSketches.ReportKeys.absolute: 11, - compilesketches.CompileSketches.ReportKeys.relative: 1.142 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 1.142, + }, + }, ] }, { @@ -2366,19 +2615,19 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: 111, compilesketches.CompileSketches.ReportKeys.current: { compilesketches.CompileSketches.ReportKeys.absolute: 5, - compilesketches.CompileSketches.ReportKeys.relative: 0.542 - } + compilesketches.CompileSketches.ReportKeys.relative: 0.542, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 111, compilesketches.CompileSketches.ReportKeys.current: { compilesketches.CompileSketches.ReportKeys.absolute: 33, - compilesketches.CompileSketches.ReportKeys.relative: 3.342 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 3.342, + }, + }, ] - } + }, ] expected_sizes_summary_report = [] @@ -2405,14 +2654,14 @@ def test_get_warnings_summary_report(): compilesketches.CompileSketches.ReportKeys.absolute: 3 } } - } + }, ] expected_warnings_summary_report = { compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 3, - compilesketches.CompileSketches.ReportKeys.maximum: 42 + compilesketches.CompileSketches.ReportKeys.maximum: 42, } } } @@ -2435,14 +2684,14 @@ def test_get_warnings_summary_report(): compilesketches.CompileSketches.ReportKeys.absolute: 42 } } - } + }, ] expected_warnings_summary_report = { compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 3, - compilesketches.CompileSketches.ReportKeys.maximum: 42 + compilesketches.CompileSketches.ReportKeys.maximum: 42, } } } @@ -2466,14 +2715,14 @@ def test_get_warnings_summary_report(): compilesketches.CompileSketches.ReportKeys.absolute: 3 } } - } + }, ] expected_warnings_summary_report = { compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 3, - compilesketches.CompileSketches.ReportKeys.maximum: 3 + compilesketches.CompileSketches.ReportKeys.maximum: 3, } } } @@ -2496,14 +2745,14 @@ def test_get_warnings_summary_report(): compilesketches.CompileSketches.ReportKeys.absolute: compile_sketches.not_applicable_indicator } } - } + }, ] expected_warnings_summary_report = { compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 42, - compilesketches.CompileSketches.ReportKeys.maximum: 42 + compilesketches.CompileSketches.ReportKeys.maximum: 42, } } } @@ -2526,14 +2775,14 @@ def test_get_warnings_summary_report(): compilesketches.CompileSketches.ReportKeys.absolute: compile_sketches.not_applicable_indicator } } - } + }, ] expected_warnings_summary_report = { compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: compile_sketches.not_applicable_indicator, - compilesketches.CompileSketches.ReportKeys.maximum: compile_sketches.not_applicable_indicator + compilesketches.CompileSketches.ReportKeys.maximum: compile_sketches.not_applicable_indicator, } } } @@ -2557,7 +2806,7 @@ def test_get_warnings_summary_report(): compilesketches.CompileSketches.ReportKeys.absolute: 3 } } - } + }, ] expected_warnings_summary_report = {} @@ -2578,20 +2827,23 @@ def test_get_warnings_summary_report(): def test_create_sketches_report_file(monkeypatch, tmp_path): sketches_report_path = tmp_path - sketches_report = [{ - "sketch": "examples/Foo", - "compilation_success": True, - "flash": 444, - "ram": 9, - "previous_flash": 1438, - "previous_ram": 184, - "flash_delta": -994, - "ram_delta": -175, - "fqbn": "arduino:avr:uno" - }] - - compile_sketches = get_compilesketches_object(sketches_report_path=str(sketches_report_path), - fqbn_arg="arduino:avr:uno") + sketches_report = [ + { + "sketch": "examples/Foo", + "compilation_success": True, + "flash": 444, + "ram": 9, + "previous_flash": 1438, + "previous_ram": 184, + "flash_delta": -994, + "ram_delta": -175, + "fqbn": "arduino:avr:uno", + } + ] + + compile_sketches = get_compilesketches_object( + sketches_report_path=str(sketches_report_path), fqbn_arg="arduino:avr:uno" + ) compile_sketches.create_sketches_report_file(sketches_report=sketches_report) @@ -2599,13 +2851,17 @@ def test_create_sketches_report_file(monkeypatch, tmp_path): assert json.load(sketch_report_file) == sketches_report -@pytest.mark.parametrize("cli_version, command, original_key, expected_key", - [("latest", "core list", "ID", "id"), # Non-semver - ("1.0.0", "core list", "ID", "id"), # > - ("0.17.0", "core list", "ID", "ID"), # == - ("0.14.0-rc2", "core list", "ID", "ID"), # < - ("1.0.0", "foo", "ID", "ID"), # Command has no translation - ("1.0.0", "core list", "foo", "foo")]) # Key has no translation +@pytest.mark.parametrize( + "cli_version, command, original_key, expected_key", + [ + ("latest", "core list", "ID", "id"), # Non-semver + ("1.0.0", "core list", "ID", "id"), # > + ("0.17.0", "core list", "ID", "ID"), # == + ("0.14.0-rc2", "core list", "ID", "ID"), # < + ("1.0.0", "foo", "ID", "ID"), # Command has no translation + ("1.0.0", "core list", "foo", "foo"), + ], +) # Key has no translation def test_cli_json_key(cli_version, command, original_key, expected_key): compile_sketches = get_compilesketches_object(cli_version=cli_version) @@ -2623,36 +2879,48 @@ def test_verbose_print(capsys, verbose): compile_sketches.verbose_print(string_print_argument, int_print_argument, path_print_argument) if verbose == "true": - assert capsys.readouterr().out.strip() == (string_print_argument + " " - + str(int_print_argument) + " " - + str(path_print_argument)) + assert capsys.readouterr().out.strip() == ( + string_print_argument + " " + str(int_print_argument) + " " + str(path_print_argument) + ) else: assert capsys.readouterr().out.strip() == "" -@pytest.mark.parametrize("list_argument, expected_list", - [("", []), - ("foobar", ["foobar"]), - ("foo bar", ["foo", "bar"]), - ("\"foo bar\"", ["foo bar"]), - ("\'foo bar\'", ["foo bar"]), - ("\'\"foo bar\" \"baz\"\'", ["foo bar", "baz"]), - ("\'\"foo bar\" baz\'", ["foo bar", "baz"])]) +@pytest.mark.parametrize( + "list_argument, expected_list", + [ + ("", []), + ("foobar", ["foobar"]), + ("foo bar", ["foo", "bar"]), + ('"foo bar"', ["foo bar"]), + ("'foo bar'", ["foo bar"]), + ('\'"foo bar" "baz"\'', ["foo bar", "baz"]), + ("'\"foo bar\" baz'", ["foo bar", "baz"]), + ], +) def test_parse_list_input(list_argument, expected_list): assert compilesketches.parse_list_input(list_argument) == expected_list -@pytest.mark.parametrize("fqbn_arg, expected_fqbn, expected_additional_url", - [("foo:bar:baz", "foo:bar:baz", None), - ("\"foo:bar:baz\"", "foo:bar:baz", None), - ("\"foo asdf:bar:baz\"", "foo asdf:bar:baz", None), - ("\'foo:bar:baz\'", "foo:bar:baz", None), - ("\'\"foo asdf:bar:baz\" https://example.com/package_foo_index.json\'", - "foo asdf:bar:baz", - "https://example.com/package_foo_index.json"), - ("\'\"foo asdf:bar:baz\" \"https://example.com/package_foo_index.json\"\'", - "foo asdf:bar:baz", - "https://example.com/package_foo_index.json")]) +@pytest.mark.parametrize( + "fqbn_arg, expected_fqbn, expected_additional_url", + [ + ("foo:bar:baz", "foo:bar:baz", None), + ('"foo:bar:baz"', "foo:bar:baz", None), + ('"foo asdf:bar:baz"', "foo asdf:bar:baz", None), + ("'foo:bar:baz'", "foo:bar:baz", None), + ( + "'\"foo asdf:bar:baz\" https://example.com/package_foo_index.json'", + "foo asdf:bar:baz", + "https://example.com/package_foo_index.json", + ), + ( + '\'"foo asdf:bar:baz" "https://example.com/package_foo_index.json"\'', + "foo asdf:bar:baz", + "https://example.com/package_foo_index.json", + ), + ], +) def test_parse_fqbn_arg_input(fqbn_arg, expected_fqbn, expected_additional_url): parsed_fqbn_arg = compilesketches.parse_fqbn_arg_input(fqbn_arg=fqbn_arg) @@ -2660,32 +2928,41 @@ def test_parse_fqbn_arg_input(fqbn_arg, expected_fqbn, expected_additional_url): assert parsed_fqbn_arg["additional_url"] == expected_additional_url -@pytest.mark.parametrize("boolean_input, expected_output", - [("true", True), ("True", True), ("false", False), ("False", False), ("foo", None)]) +@pytest.mark.parametrize( + "boolean_input, expected_output", + [("true", True), ("True", True), ("false", False), ("False", False), ("foo", None)], +) def test_parse_boolean_input(boolean_input, expected_output): assert compilesketches.parse_boolean_input(boolean_input=boolean_input) == expected_output -@pytest.mark.parametrize("path, expected_relative_path", - # Path under workspace - [(os.environ["GITHUB_WORKSPACE"] + "/baz", pathlib.PurePath("baz")), - # Path outside workspace - ("/bar/foo", pathlib.Path("/").resolve().joinpath("bar", "foo"))]) +@pytest.mark.parametrize( + "path, expected_relative_path", + # Path under workspace + [ + (os.environ["GITHUB_WORKSPACE"] + "/baz", pathlib.PurePath("baz")), + # Path outside workspace + ("/bar/foo", pathlib.Path("/").resolve().joinpath("bar", "foo")), + ], +) def test_path_relative_to_workspace(path, expected_relative_path): assert compilesketches.path_relative_to_workspace(path=path) == expected_relative_path assert compilesketches.path_relative_to_workspace(path=pathlib.PurePath(path)) == expected_relative_path -@pytest.mark.parametrize("path, expected_absolute_path", - # Absolute path - [("/asdf", pathlib.Path("/").resolve().joinpath("asdf")), - # Relative path - ("asdf", pathlib.Path(os.environ["GITHUB_WORKSPACE"]).resolve().joinpath("asdf")), - # Use of ~ - ("~/foo", pathlib.Path.home().joinpath("foo")), - # Use of .. - ("/foo/bar/../baz", pathlib.Path("/").resolve().joinpath("foo", "baz")) - ]) +@pytest.mark.parametrize( + "path, expected_absolute_path", + # Absolute path + [ + ("/asdf", pathlib.Path("/").resolve().joinpath("asdf")), + # Relative path + ("asdf", pathlib.Path(os.environ["GITHUB_WORKSPACE"]).resolve().joinpath("asdf")), + # Use of ~ + ("~/foo", pathlib.Path.home().joinpath("foo")), + # Use of .. + ("/foo/bar/../baz", pathlib.Path("/").resolve().joinpath("foo", "baz")), + ], +) def test_absolute_path(path, expected_absolute_path): assert compilesketches.absolute_path(path=path) == expected_absolute_path assert compilesketches.absolute_path(path=pathlib.PurePath(path)) == expected_absolute_path @@ -2693,15 +2970,13 @@ def test_absolute_path(path, expected_absolute_path): @pytest.mark.parametrize( "path, expected_path", - [("foo/bar-relative-path", pathlib.PurePath("foo/bar-relative-path")), - ("/foo/bar-absolute-path", pathlib.Path("/").resolve().joinpath("foo", "bar-absolute-path"))] + [ + ("foo/bar-relative-path", pathlib.PurePath("foo/bar-relative-path")), + ("/foo/bar-absolute-path", pathlib.Path("/").resolve().joinpath("foo", "bar-absolute-path")), + ], ) def test_absolute_relative_path_conversion(path, expected_path): - assert compilesketches.path_relative_to_workspace( - path=compilesketches.absolute_path( - path=path - ) - ) == expected_path + assert compilesketches.path_relative_to_workspace(path=compilesketches.absolute_path(path=path)) == expected_path def test_list_to_string(): @@ -2709,19 +2984,19 @@ def test_list_to_string(): assert compilesketches.list_to_string([42, path]) == "42 " + str(path) -@pytest.mark.parametrize("arcname, source_path, destination_name, expected_destination_name, expected_success", - [("FooArcname", ".", None, "FooArcname", True), - ("FooArcname", "./Sketch1", "FooDestinationName", "FooDestinationName", True), - ("FooArcname", "Sketch1", None, "Sketch1", True), - (".", "Sketch1", None, "Sketch1", True), - ("FooArcname", "Nonexistent", None, "", False), ]) -def test_install_from_download(capsys, - tmp_path, - arcname, - source_path, - destination_name, - expected_destination_name, - expected_success): +@pytest.mark.parametrize( + "arcname, source_path, destination_name, expected_destination_name, expected_success", + [ + ("FooArcname", ".", None, "FooArcname", True), + ("FooArcname", "./Sketch1", "FooDestinationName", "FooDestinationName", True), + ("FooArcname", "Sketch1", None, "Sketch1", True), + (".", "Sketch1", None, "Sketch1", True), + ("FooArcname", "Nonexistent", None, "", False), + ], +) +def test_install_from_download( + capsys, tmp_path, arcname, source_path, destination_name, expected_destination_name, expected_success +): url_source_path = test_data_path.joinpath("HasSketches") compile_sketches = get_compilesketches_object() @@ -2739,39 +3014,58 @@ def test_install_from_download(capsys, destination_parent_path = tmp_path.joinpath("destination_parent_path") if expected_success: - compile_sketches.install_from_download(url=url, - source_path=source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name) + compile_sketches.install_from_download( + url=url, + source_path=source_path, + destination_parent_path=destination_parent_path, + destination_name=destination_name, + ) # Verify that the installation matches the source - assert directories_are_same(left_directory=url_source_path.joinpath(source_path), - right_directory=destination_parent_path.joinpath(expected_destination_name)) + assert directories_are_same( + left_directory=url_source_path.joinpath(source_path), + right_directory=destination_parent_path.joinpath(expected_destination_name), + ) else: with pytest.raises(expected_exception=SystemExit, match="1"): - compile_sketches.install_from_download(url=url, - source_path=source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name) + compile_sketches.install_from_download( + url=url, + source_path=source_path, + destination_parent_path=destination_parent_path, + destination_name=destination_name, + ) assert capsys.readouterr().out.strip() == ("::error::Archive source path: " + source_path + " not found") -@pytest.mark.parametrize("archive_extract_path, expected_archive_root_path", - [(test_data_path.joinpath("test_get_archive_root_folder_name", "has-root"), - test_data_path.joinpath("test_get_archive_root_folder_name", "has-root", "root")), - (test_data_path.joinpath("test_get_archive_root_folder_name", "has-file"), - test_data_path.joinpath("test_get_archive_root_folder_name", "has-file")), - (test_data_path.joinpath("test_get_archive_root_folder_name", "has-folders"), - test_data_path.joinpath("test_get_archive_root_folder_name", "has-folders"))]) +@pytest.mark.parametrize( + "archive_extract_path, expected_archive_root_path", + [ + ( + test_data_path.joinpath("test_get_archive_root_folder_name", "has-root"), + test_data_path.joinpath("test_get_archive_root_folder_name", "has-root", "root"), + ), + ( + test_data_path.joinpath("test_get_archive_root_folder_name", "has-file"), + test_data_path.joinpath("test_get_archive_root_folder_name", "has-file"), + ), + ( + test_data_path.joinpath("test_get_archive_root_folder_name", "has-folders"), + test_data_path.joinpath("test_get_archive_root_folder_name", "has-folders"), + ), + ], +) def test_get_archive_root_path(archive_extract_path, expected_archive_root_path): assert compilesketches.get_archive_root_path(archive_extract_path) == expected_archive_root_path -@pytest.mark.parametrize("url, source_path, destination_name, expected_destination_name", - [("https://example.com/foo/FooRepositoryName.git", ".", None, "FooRepositoryName"), - ("https://example.com/foo/FooRepositoryName.git/", "./examples", "FooDestinationName", - "FooDestinationName"), - ("git://example.com/foo/FooRepositoryName", "examples", None, None)]) +@pytest.mark.parametrize( + "url, source_path, destination_name, expected_destination_name", + [ + ("https://example.com/foo/FooRepositoryName.git", ".", None, "FooRepositoryName"), + ("https://example.com/foo/FooRepositoryName.git/", "./examples", "FooDestinationName", "FooDestinationName"), + ("git://example.com/foo/FooRepositoryName", "examples", None, None), + ], +) def test_install_from_repository(mocker, url, source_path, destination_name, expected_destination_name): git_ref = unittest.mock.sentinel.git_ref destination_parent_path = unittest.mock.sentinel.destination_parent_path @@ -2784,27 +3078,29 @@ def test_install_from_repository(mocker, url, source_path, destination_name, exp compile_sketches = get_compilesketches_object() - compile_sketches.install_from_repository(url=url, - git_ref=git_ref, - source_path=source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name, - force=force) + compile_sketches.install_from_repository( + url=url, + git_ref=git_ref, + source_path=source_path, + destination_parent_path=destination_parent_path, + destination_name=destination_name, + force=force, + ) # noinspection PyUnresolvedReferences - tempfile.mkdtemp.assert_called_once_with(dir=compile_sketches.temporary_directory.name, - prefix="install_from_repository-") - compile_sketches.clone_repository.assert_called_once_with(compile_sketches, - url=url, - git_ref=git_ref, - destination_path=clone_path) + tempfile.mkdtemp.assert_called_once_with( + dir=compile_sketches.temporary_directory.name, prefix="install_from_repository-" + ) + compile_sketches.clone_repository.assert_called_once_with( + compile_sketches, url=url, git_ref=git_ref, destination_path=clone_path + ) # noinspection PyUnresolvedReferences compile_sketches.install_from_path.assert_called_once_with( compile_sketches, source_path=clone_path.joinpath(source_path), destination_parent_path=destination_parent_path, destination_name=expected_destination_name, - force=force + force=force, ) @@ -2832,12 +3128,12 @@ def test_clone_repository(tmp_path, git_ref): cloned_repository.git.checkout(git_ref) # Verify that the installation matches the test clone - assert directories_are_same(left_directory=destination_path, - right_directory=test_clone_path) + assert directories_are_same(left_directory=destination_path, right_directory=test_clone_path) -@pytest.mark.parametrize("github_event, expected_hash", - [("pull_request", "pull_request-head-sha"), ("push", "push-head-sha")]) +@pytest.mark.parametrize( + "github_event, expected_hash", [("pull_request", "pull_request-head-sha"), ("push", "push-head-sha")] +) def test_get_head_commit_hash(monkeypatch, mocker, github_event, expected_hash): # Stub class Repo: From 8356c7214d7e8061800c5979759bd0afa7ba6e8f Mon Sep 17 00:00:00 2001 From: per1234 Date: Fri, 24 Mar 2023 23:19:08 -0700 Subject: [PATCH 065/100] Resolve conflict between Black and Flake8 code styles The project uses the Arduino tooling standard target line length of 120. Flake8's rule E501 uses this as a hard limit, erroring if any line in a Python file exceeds it. Black uses 120 as a target length, but may format some lines longer than 120 when it considers complying with the limit to be harmful. So rule E501 must be disabled. The line length limit will still be enforced by the formatting check. --- .flake8 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.flake8 b/.flake8 index efde3a0..57b9d24 100644 --- a/.flake8 +++ b/.flake8 @@ -6,7 +6,7 @@ [flake8] doctests = True # W503 and W504 are mutually exclusive. PEP 8 recommends line break before. -ignore = W503 +ignore = E501,W503 max-complexity = 10 max-line-length = 120 select = E,W,F,C,N From db75bcc9c7c34b07992d6b863d2361848d238a06 Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 23 Mar 2023 22:41:45 -0700 Subject: [PATCH 066/100] Update infrastructure for spell checking project contents Arduino tooling projects use a standardized infrastructure. A centralized collection of reusable infrastructure assets is maintained in a dedicated repository: https://github.com/arduino/tooling-project-assets Since the time this project's infrastructure was installed, some advancements have been made in the upstream "template" assets. The project's infrastructure is hereby brought up to date with the state of the art upstream assets. The significant changes: - Migration to the use of the Task task runner to allow contributors to easily run the same operations locally as is done by the CI system on GitHub. - Use of Poetry and Dependabot for controlled management of the dependencies. --- .codespellrc | 9 ++++ .github/workflows/spell-check-task.yml | 66 ++++++++++++++++++++++++++ .github/workflows/spell-check.yml | 16 ------- README.md | 2 +- Taskfile.yml | 22 +++++++++ etc/codespell-ignore-words-list.txt | 2 - poetry.lock | 20 +++++++- pyproject.toml | 1 + 8 files changed, 118 insertions(+), 20 deletions(-) create mode 100644 .codespellrc create mode 100644 .github/workflows/spell-check-task.yml delete mode 100644 .github/workflows/spell-check.yml delete mode 100644 etc/codespell-ignore-words-list.txt diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 0000000..17c575c --- /dev/null +++ b/.codespellrc @@ -0,0 +1,9 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check/.codespellrc +# See: https://github.com/codespell-project/codespell#using-a-config-file +[codespell] +# In the event of a false positive, add the problematic word, in all lowercase, to a comma-separated list here: +ignore-words-list = afterall,clude +skip = ./.git,./.licenses,.pytest_cache,__pycache__,node_modules,./go.mod,./go.sum,./package-lock.json,./poetry.lock,./yarn.lock +builtin = clear,informal,en-GB_to_en-US +check-filenames = +check-hidden = diff --git a/.github/workflows/spell-check-task.yml b/.github/workflows/spell-check-task.yml new file mode 100644 index 0000000..20a3958 --- /dev/null +++ b/.github/workflows/spell-check-task.yml @@ -0,0 +1,66 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/spell-check-task.md +name: Spell Check + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + pull_request: + schedule: + # Run every Tuesday at 8 AM UTC to catch new misspelling detections resulting from dictionary updates. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + spellcheck: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Python + uses: actions/setup-python@v4 + with: + python-version-file: .python-version + + - name: Install Poetry + run: | + pipx install \ + --python "$(which python)" \ + poetry + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Spell check + run: task general:check-spelling diff --git a/.github/workflows/spell-check.yml b/.github/workflows/spell-check.yml deleted file mode 100644 index cddb949..0000000 --- a/.github/workflows/spell-check.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Spell Check - -on: [push, pull_request] - -jobs: - spellcheck: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Spell check - uses: arduino/actions/libraries/spell-check@master - with: - ignore-words-list: etc/codespell-ignore-words-list.txt diff --git a/README.md b/README.md index 12f4e19..9bc1020 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Check Action Metadata status](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml) [![Tests](https://github.com/arduino/compile-sketches/workflows/Test%20Python%20code/badge.svg)](https://github.com/arduino/compile-sketches/actions?workflow=Test+Python+code) [![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) -[![Spell Check](https://github.com/arduino/compile-sketches/workflows/Spell%20Check/badge.svg)](https://github.com/arduino/compile-sketches/actions?workflow=Spell+Check) +[![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) [![codecov](https://codecov.io/gh/arduino/compile-sketches/branch/main/graph/badge.svg?token=Uv6f1ebMZ4)](https://codecov.io/gh/arduino/compile-sketches) This action checks whether [Arduino](https://www.arduino.cc/) sketches compile and produces a report of data from the compilations. diff --git a/Taskfile.yml b/Taskfile.yml index 41a0727..99abfb1 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -6,11 +6,13 @@ tasks: desc: Check for problems with the project deps: - task: action:validate + - task: general:check-spelling - task: python:lint fix: desc: Make automated corrections to the project's files deps: + - task: general:correct-spelling - task: python:format # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-action-metadata-task/Taskfile.yml @@ -35,6 +37,26 @@ tasks: -s "{{.ACTION_METADATA_SCHEMA_PATH}}" \ -d "action.yml" + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check-task/Taskfile.yml + general:check-spelling: + desc: Check for commonly misspelled words + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev + cmds: + - poetry run codespell + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check-task/Taskfile.yml + general:correct-spelling: + desc: Correct commonly misspelled words where possible + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev + cmds: + - poetry run codespell --write-changes + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/npm-task/Taskfile.yml npm:install-deps: desc: Install dependencies managed by npm diff --git a/etc/codespell-ignore-words-list.txt b/etc/codespell-ignore-words-list.txt deleted file mode 100644 index bef1c14..0000000 --- a/etc/codespell-ignore-words-list.txt +++ /dev/null @@ -1,2 +0,0 @@ -afterall -clude diff --git a/poetry.lock b/poetry.lock index ecb51cb..d3750a1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -256,6 +256,24 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} +[[package]] +name = "codespell" +version = "2.2.4" +description = "Codespell" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "codespell-2.2.4-py3-none-any.whl", hash = "sha256:7d984b8130108e6f82524b7d09f8b7bf2fb1e398c5d4b37d9e2bd310145b3e29"}, + {file = "codespell-2.2.4.tar.gz", hash = "sha256:0b4620473c257d9cde1ff8998b26b2bb209a35c2b7489f5dc3436024298ce83a"}, +] + +[package.extras] +dev = ["Pygments", "build", "chardet", "flake8", "flake8-pyproject", "pytest", "pytest-cov", "pytest-dependency", "tomli"] +hard-encoding-detection = ["chardet"] +toml = ["tomli"] +types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"] + [[package]] name = "colorama" version = "0.4.6" @@ -874,4 +892,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "3.11.2" -content-hash = "c975d20f32852d848f235549d9dd58b6870a2e744226a479d39f75832e5fd82f" +content-hash = "8907a887cd8e83e4387e3b601da1d616577abcf736b2605f514316d5d410b002" diff --git a/pyproject.toml b/pyproject.toml index cd23db1..3825f34 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,6 +16,7 @@ semver = "2.13.0" [tool.poetry.group.dev.dependencies] black = "23.1.0" +codespell = "2.2.4" coverage = "7.2.2" pytest = "7.2.2" pytest-mock = "3.10.0" From 7e1fd1fdc07df8d9942bb75b5fe4b5cde1504a7a Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 23 Mar 2023 22:57:17 -0700 Subject: [PATCH 067/100] Update infrastructure for GitHub issue label management Arduino tooling projects use a standardized infrastructure. A centralized collection of reusable infrastructure assets is maintained in a dedicated repository: https://github.com/arduino/tooling-project-assets Since the time this project's infrastructure was installed, some advancements have been made in the upstream "template" assets. The project's infrastructure is hereby brought up to date with the state of the art upstream assets. The significant changes: - Use of npm and Dependabot for controlled management of the dependencies. --- .../{sync-labels.yml => sync-labels-npm.yml} | 66 +- README.md | 1 + package-lock.json | 1626 ++++++++++++++++- package.json | 4 +- 4 files changed, 1669 insertions(+), 28 deletions(-) rename .github/workflows/{sync-labels.yml => sync-labels-npm.yml} (72%) diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels-npm.yml similarity index 72% rename from .github/workflows/sync-labels.yml rename to .github/workflows/sync-labels-npm.yml index 1c87f1d..c044fef 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels-npm.yml @@ -1,26 +1,32 @@ -# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/sync-labels.md +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/sync-labels-npm.md name: Sync Labels -# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows +env: + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: 16.x + CONFIGURATIONS_FOLDER: .github/label-configuration-files + CONFIGURATIONS_ARTIFACT: label-configuration-files + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows on: push: paths: - - ".github/workflows/sync-labels.ya?ml" + - ".github/workflows/sync-labels-npm.ya?ml" - ".github/label-configuration-files/*.ya?ml" + - "package.json" + - "package-lock.json" pull_request: paths: - - ".github/workflows/sync-labels.ya?ml" + - ".github/workflows/sync-labels-npm.ya?ml" - ".github/label-configuration-files/*.ya?ml" + - "package.json" + - "package-lock.json" schedule: # Run daily at 8 AM UTC to sync with changes to shared label configurations. - cron: "0 8 * * *" workflow_dispatch: repository_dispatch: -env: - CONFIGURATIONS_FOLDER: .github/label-configuration-files - CONFIGURATIONS_ARTIFACT: label-configuration-files - jobs: check: runs-on: ubuntu-latest @@ -29,6 +35,11 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + - name: Download JSON schema for labels configuration file id: download-schema uses: carlosperate/download-file-action@v2 @@ -37,20 +48,19 @@ jobs: location: ${{ runner.temp }}/label-configuration-schema - name: Install JSON schema validator - run: | - sudo npm install \ - --global \ - ajv-cli \ - ajv-formats + run: npm install - name: Validate local labels configuration run: | # See: https://github.com/ajv-validator/ajv-cli#readme - ajv validate \ - --all-errors \ - -c ajv-formats \ - -s "${{ steps.download-schema.outputs.file-path }}" \ - -d "${{ env.CONFIGURATIONS_FOLDER }}/*.{yml,yaml}" + npx \ + --package=ajv-cli \ + --package=ajv-formats \ + ajv validate \ + --all-errors \ + -c ajv-formats \ + -s "${{ steps.download-schema.outputs.file-path }}" \ + -d "${{ env.CONFIGURATIONS_FOLDER }}/*.{yml,yaml}" download: needs: check @@ -86,7 +96,7 @@ jobs: steps: - name: Set environment variables run: | - # See: https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable + # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable echo "MERGED_CONFIGURATION_PATH=${{ runner.temp }}/labels.yml" >> "$GITHUB_ENV" - name: Determine whether to dry run @@ -103,7 +113,7 @@ jobs: run: | # Use of this flag in the github-label-sync command will cause it to only check the validity of the # configuration. - echo "flag=--dry-run" >> "$GITHUB_OUTPUT" + echo "flag=--dry-run" >> $GITHUB_OUTPUT - name: Checkout repository uses: actions/checkout@v3 @@ -119,6 +129,11 @@ jobs: with: name: ${{ env.CONFIGURATIONS_ARTIFACT }} + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + - name: Merge label configuration files run: | # Merge all configuration files @@ -126,14 +141,15 @@ jobs: cat "${{ env.CONFIGURATIONS_FOLDER }}"/*.@(yml|yaml) > "${{ env.MERGED_CONFIGURATION_PATH }}" - name: Install github-label-sync - run: sudo npm install --global github-label-sync + run: npm install - name: Sync labels env: GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | # See: https://github.com/Financial-Times/github-label-sync - github-label-sync \ - --labels "${{ env.MERGED_CONFIGURATION_PATH }}" \ - ${{ steps.dry-run.outputs.flag }} \ - ${{ github.repository }} + npx \ + github-label-sync \ + --labels "${{ env.MERGED_CONFIGURATION_PATH }}" \ + ${{ steps.dry-run.outputs.flag }} \ + ${{ github.repository }} diff --git a/README.md b/README.md index 9bc1020..53221a5 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ [![Tests](https://github.com/arduino/compile-sketches/workflows/Test%20Python%20code/badge.svg)](https://github.com/arduino/compile-sketches/actions?workflow=Test+Python+code) [![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) [![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) +[![Sync Labels status](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml) [![codecov](https://codecov.io/gh/arduino/compile-sketches/branch/main/graph/badge.svg?token=Uv6f1ebMZ4)](https://codecov.io/gh/arduino/compile-sketches) This action checks whether [Arduino](https://www.arduino.cc/) sketches compile and produces a report of data from the compilations. diff --git a/package-lock.json b/package-lock.json index 3a3c6b2..635bfde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,47 @@ "packages": { "": { "devDependencies": { - "ajv-cli": "5.0.0" + "ajv-cli": "5.0.0", + "ajv-formats": "2.1.1", + "github-label-sync": "2.3.1" } }, + "node_modules/@financial-times/origami-service-makefile": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@financial-times/origami-service-makefile/-/origami-service-makefile-7.0.3.tgz", + "integrity": "sha512-aKe65sZ3XgZ/0Sm0MDLbGrcO3G4DRv/bVW4Gpmw68cRZV9IBE7h/pwfR3Rs7njNSZMFkjS4rPG/YySv9brQByA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -50,6 +88,38 @@ } } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -59,12 +129,75 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/array-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", + "integrity": "sha512-GVYjmpL05al4dNlKJm53mKE4w9OOLiuVHWorsIA3YVz+Hu0hcn6PtE3Ydl0EqU7v+7ABC4mjjWsnLUxbpno+CA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -75,12 +208,182 @@ "concat-map": "0.0.1" } }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.8", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", + "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -94,6 +397,21 @@ "node": ">=4" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -118,12 +436,99 @@ "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", "dev": true }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/github-label-sync": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/github-label-sync/-/github-label-sync-2.3.1.tgz", + "integrity": "sha512-3gGNc+y9OtwzR1aTlAOZKJmQ1QUzufxUG6c7rVTFLtNJvqTwyd80bOUxXuwyk2jIq7tWa0fx+Xep78BXxAU2WQ==", + "dev": true, + "dependencies": { + "@financial-times/origami-service-makefile": "^7.0.3", + "ajv": "^8.6.3", + "chalk": "^4.1.2", + "commander": "^6.2.1", + "got": "^12.5.3", + "js-yaml": "^3.14.1", + "node.extend": "^2.0.2", + "octonode": "^0.10.2" + }, + "bin": { + "github-label-sync": "bin/github-label-sync.js" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -144,6 +549,131 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/got": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", + "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/har-validator/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -160,6 +690,27 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/is": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -173,6 +724,24 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, "node_modules/json-schema-migrate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz", @@ -188,6 +757,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -200,6 +775,75 @@ "node": ">=6" } }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -221,6 +865,55 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/node.extend": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", + "integrity": "sha512-pDT4Dchl94/+kkgdwyS2PauDFjZG0Hk0IcHIB+LkW27HLDtdoeMxHTxZh39DYbPP8UflWXWj9JcdDozF+YDOpQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3", + "is": "^3.2.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/octonode": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/octonode/-/octonode-0.10.2.tgz", + "integrity": "sha512-lxKJxAvrw3BuM0Wu3A/TRyFkYxMFWbMm8p7fDO3EoG9KDgOy53d91bjlGR1mmNk1EoF5LjGBx7BmIB+PfmMKLQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.0", + "deep-extend": "^0.6.0", + "randomstring": "^1.1.5", + "request": "^2.72.0" + }, + "engines": { + "node": ">0.4.11" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -230,6 +923,15 @@ "wrappy": "1" } }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -239,6 +941,18 @@ "node": ">=0.10.0" } }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -248,6 +962,81 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", + "integrity": "sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==", + "dev": true + }, + "node_modules/randomstring": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.3.tgz", + "integrity": "sha512-3dEFySepTzp2CvH6W/ASYGguPPveBuz5MpZ7MuoUkoVehmyNl9+F9c9GFVrz2QPbM9NXTIHGcmJDY/3j4677kQ==", + "dev": true, + "dependencies": { + "array-uniq": "1.0.2", + "randombytes": "2.0.3" + }, + "bin": { + "randomstring": "bin/randomstring" + }, + "engines": { + "node": "*" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -257,19 +1046,158 @@ "node": ">=0.10.0" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { - "punycode": "^2.1.0" + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, "node_modules/wrappy": { @@ -280,6 +1208,33 @@ } }, "dependencies": { + "@financial-times/origami-service-makefile": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@financial-times/origami-service-makefile/-/origami-service-makefile-7.0.3.tgz", + "integrity": "sha512-aKe65sZ3XgZ/0Sm0MDLbGrcO3G4DRv/bVW4Gpmw68cRZV9IBE7h/pwfR3Rs7njNSZMFkjS4rPG/YySv9brQByA==", + "dev": true + }, + "@sindresorhus/is": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.1" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, "ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -307,6 +1262,24 @@ "minimist": "^1.2.0" } }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -316,12 +1289,66 @@ "sprintf-js": "~1.0.2" } }, + "array-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", + "integrity": "sha512-GVYjmpL05al4dNlKJm53mKE4w9OOLiuVHWorsIA3YVz+Hu0hcn6PtE3Ydl0EqU7v+7ABC4mjjWsnLUxbpno+CA==", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -332,18 +1359,157 @@ "concat-map": "0.0.1" } }, + "cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true + }, + "cacheable-request": { + "version": "10.2.8", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", + "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -367,12 +1533,78 @@ } } }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "github-label-sync": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/github-label-sync/-/github-label-sync-2.3.1.tgz", + "integrity": "sha512-3gGNc+y9OtwzR1aTlAOZKJmQ1QUzufxUG6c7rVTFLtNJvqTwyd80bOUxXuwyk2jIq7tWa0fx+Xep78BXxAU2WQ==", + "dev": true, + "requires": { + "@financial-times/origami-service-makefile": "^7.0.3", + "ajv": "^8.6.3", + "chalk": "^4.1.2", + "commander": "^6.2.1", + "got": "^12.5.3", + "js-yaml": "^3.14.1", + "node.extend": "^2.0.2", + "octonode": "^0.10.2" + } + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -387,6 +1619,103 @@ "path-is-absolute": "^1.0.0" } }, + "got": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", + "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", + "dev": true, + "requires": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + } + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -403,6 +1732,24 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "is": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, "js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -413,6 +1760,24 @@ "esprima": "^4.0.0" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, "json-schema-migrate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz", @@ -428,12 +1793,66 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -449,6 +1868,40 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, + "node.extend": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", + "integrity": "sha512-pDT4Dchl94/+kkgdwyS2PauDFjZG0Hk0IcHIB+LkW27HLDtdoeMxHTxZh39DYbPP8UflWXWj9JcdDozF+YDOpQ==", + "dev": true, + "requires": { + "has": "^1.0.3", + "is": "^3.2.1" + } + }, + "normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "octonode": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/octonode/-/octonode-0.10.2.tgz", + "integrity": "sha512-lxKJxAvrw3BuM0Wu3A/TRyFkYxMFWbMm8p7fDO3EoG9KDgOy53d91bjlGR1mmNk1EoF5LjGBx7BmIB+PfmMKLQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "deep-extend": "^0.6.0", + "randomstring": "^1.1.5", + "request": "^2.72.0" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -458,30 +1911,182 @@ "wrappy": "1" } }, + "p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "randombytes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", + "integrity": "sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==", + "dev": true + }, + "randomstring": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.3.tgz", + "integrity": "sha512-3dEFySepTzp2CvH6W/ASYGguPPveBuz5MpZ7MuoUkoVehmyNl9+F9c9GFVrz2QPbM9NXTIHGcmJDY/3j4677kQ==", + "dev": true, + "requires": { + "array-uniq": "1.0.2", + "randombytes": "2.0.3" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "requires": { + "lowercase-keys": "^3.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -491,6 +2096,23 @@ "punycode": "^2.1.0" } }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 0c9bdd6..58eea90 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,7 @@ { "devDependencies": { - "ajv-cli": "5.0.0" + "ajv-cli": "5.0.0", + "ajv-formats": "2.1.1", + "github-label-sync": "2.3.1" } } From d2e398d36a879a78c4effaf6d2be15ca655f17b1 Mon Sep 17 00:00:00 2001 From: per1234 Date: Fri, 24 Mar 2023 03:00:45 -0700 Subject: [PATCH 068/100] Update infrastructure for running Python unit tests Arduino tooling projects use a standardized infrastructure. A centralized collection of reusable infrastructure assets is maintained in a dedicated repository: https://github.com/arduino/tooling-project-assets Since the time this project's infrastructure was installed, some advancements have been made in the upstream "template" assets. The project's infrastructure is hereby brought up to date with the state of the art upstream assets. The significant changes: - Migration to the use of the Task task runner to allow contributors to easily run the same operations locally as is done by the CI system on GitHub. --- .github/workflows/test-python-poetry-task.yml | 111 ++++++++++++++++++ .github/workflows/test-python.yml | 94 --------------- README.md | 2 +- Taskfile.yml | 31 +++++ compilesketches/tests/pytest.ini | 10 ++ pyproject.toml | 7 -- 6 files changed, 153 insertions(+), 102 deletions(-) create mode 100644 .github/workflows/test-python-poetry-task.yml delete mode 100644 .github/workflows/test-python.yml create mode 100644 compilesketches/tests/pytest.ini diff --git a/.github/workflows/test-python-poetry-task.yml b/.github/workflows/test-python-poetry-task.yml new file mode 100644 index 0000000..3feb0ea --- /dev/null +++ b/.github/workflows/test-python-poetry-task.yml @@ -0,0 +1,111 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/test-python-poetry-task.md +name: Test Python + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/test-python-poetry-task.ya?ml" + - ".github/.?codecov.ya?ml" + - "dev/.?codecov.ya?ml" + - ".?codecov.ya?ml" + - "Taskfile.ya?ml" + - ".python-version" + - "poetry.lock" + - "pyproject.toml" + - "compilesketches/tests/**" + - "**.py" + pull_request: + paths: + - ".github/workflows/test-python-poetry-task.ya?ml" + - ".github/.?codecov.ya?ml" + - "dev/.?codecov.ya?ml" + - ".?codecov.ya?ml" + - "Taskfile.ya?ml" + - ".python-version" + - "poetry.lock" + - "pyproject.toml" + - "compilesketches/tests/**" + - "**.py" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 12 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + test: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + env: + COVERAGE_DATA_FILENAME: coverage.xml + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Python + uses: actions/setup-python@v4 + with: + python-version-file: .python-version + + - name: Install Poetry + run: | + pipx install \ + --python "$(which python)" \ + poetry + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Run tests + uses: liskin/gh-problem-matcher-wrap@v2 + with: + linters: pytest + run: task python:test + + - name: Display code coverage report + run: task python:coverage-report + + # codecov/codecov-action only makes the conversion if the `coverage` package is installed in the global runner + # environment + - name: Convert code coverage report to format required by Codecov + run: | + poetry run \ + coverage xml \ + -o "${{ github.workspace }}/${{ env.COVERAGE_DATA_FILENAME }}" + + - name: Upload coverage report to Codecov + uses: codecov/codecov-action@v3 + with: + fail_ci_if_error: true + file: ${{ env.COVERAGE_DATA_FILENAME }} diff --git a/.github/workflows/test-python.yml b/.github/workflows/test-python.yml deleted file mode 100644 index 0642047..0000000 --- a/.github/workflows/test-python.yml +++ /dev/null @@ -1,94 +0,0 @@ -name: Test Python code - -env: - # See: https://pypi.org/project/poetry/#history - POETRY_VERSION: 1.4.0 - -on: - pull_request: - paths: - - '.github/workflows/test-python.yml' - - '.python-version' - - '**/poetry.lock' - - '**/pyproject.toml' - - 'compilesketches/**' - - push: - paths: - - '.github/workflows/test-python.yml' - - '.python-version' - - '**/poetry.lock' - - '**/pyproject.toml' - - 'compilesketches/**' - - # Catch issues resulting from new patch releases of Python in the APT repository - schedule: - # run every Tuesday at 3 AM UTC - - cron: "0 3 * * 2" - - # workflow_dispatch event allows the workflow to be triggered manually - # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch - workflow_dispatch: - - # repository_dispatch event allows the workflow to be triggered via the GitHub API - # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#repository_dispatch - repository_dispatch: - -jobs: - test: - runs-on: ubuntu-latest - - env: - PYTHON_PROJECT_PATH: ${GITHUB_WORKSPACE}/compilesketches - PYTHON_PROJECT_TESTS_PATH: ${GITHUB_WORKSPACE}/compilesketches/tests - COVERAGE_DATA_FILENAME: coverage.xml - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Python - uses: actions/setup-python@v4.5.0 - with: - python-version-file: .python-version - - - name: Install Poetry - run: | - pipx \ - install \ - poetry==${{ env.POETRY_VERSION }} - - - name: Install Python Dependencies - run: | - poetry install - - - name: Run Python unit tests and record code coverage data - run: | - export PYTHONPATH="${{ env.PYTHON_PROJECT_PATH }}" - poetry run \ - python \ - -m \ - coverage run \ - --source="${{ env.PYTHON_PROJECT_PATH }}" \ - --module \ - pytest "${{ env.PYTHON_PROJECT_TESTS_PATH }}" - # Generate coverage data file for consumption by `codecov/codecov-action`. - # Otherwise that action generates the file using the system Python environment, which doesn't work. - poetry run \ - python \ - -m \ - coverage xml \ - -o "${{ github.workspace }}/${{ env.COVERAGE_DATA_FILENAME }}" - - - name: Display code coverage report - run: | - poetry run \ - python \ - -m \ - coverage report - - - name: Upload coverage report to Codecov - uses: codecov/codecov-action@v3 - with: - file: ${{ env.COVERAGE_DATA_FILENAME }} - fail_ci_if_error: true diff --git a/README.md b/README.md index 53221a5..7bdaaf4 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # `arduino/compile-sketches` action [![Check Action Metadata status](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml) -[![Tests](https://github.com/arduino/compile-sketches/workflows/Test%20Python%20code/badge.svg)](https://github.com/arduino/compile-sketches/actions?workflow=Test+Python+code) [![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) [![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) [![Sync Labels status](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml) +[![Test Python status](https://github.com/arduino/compile-sketches/actions/workflows/test-python-poetry-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/test-python-poetry-task.yml) [![codecov](https://codecov.io/gh/arduino/compile-sketches/branch/main/graph/badge.svg?token=Uv6f1ebMZ4)](https://codecov.io/gh/arduino/compile-sketches) This action checks whether [Arduino](https://www.arduino.cc/) sketches compile and produces a report of data from the compilations. diff --git a/Taskfile.yml b/Taskfile.yml index 99abfb1..986c722 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -1,6 +1,9 @@ # See: https://taskfile.dev/#/usage version: "3" +vars: + PYTHON_PROJECT_PATH: compilesketches + tasks: check: desc: Check for problems with the project @@ -8,6 +11,7 @@ tasks: - task: action:validate - task: general:check-spelling - task: python:lint + - task: python:test fix: desc: Make automated corrections to the project's files @@ -74,6 +78,17 @@ tasks: --no-root \ {{if .POETRY_GROUPS}} --only {{.POETRY_GROUPS}} {{end}} + python:coverage-report: + desc: Show code coverage report + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev + cmds: + - | + poetry run \ + coverage report + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-python-task/Taskfile.yml python:format: desc: Format Python files @@ -94,6 +109,22 @@ tasks: cmds: - poetry run flake8 --show-source + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/test-python-poetry-task/Taskfile.yml + python:test: + desc: Run Python tests + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev,main + cmds: + - | + export PYTHONPATH="${PWD}/{{.PYTHON_PROJECT_PATH}}" + poetry run \ + coverage run \ + --source="{{.PYTHON_PROJECT_PATH}}" \ + --module \ + pytest "{{.PYTHON_PROJECT_PATH}}/tests" + # Make a temporary file named according to the passed TEMPLATE variable and print the path passed to stdout # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/windows-task/Taskfile.yml utility:mktemp-file: diff --git a/compilesketches/tests/pytest.ini b/compilesketches/tests/pytest.ini new file mode 100644 index 0000000..b8beed3 --- /dev/null +++ b/compilesketches/tests/pytest.ini @@ -0,0 +1,10 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/test-python/pytest.ini +[pytest] +filterwarnings = + error + ignore::DeprecationWarning + ignore::ResourceWarning + +# --capture=no - disable per-test capture +# --tb=long sets the length of the traceback in case of failures +addopts = --capture=no --tb=long --verbose diff --git a/pyproject.toml b/pyproject.toml index 3825f34..c216859 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,13 +31,6 @@ optional = true [tool.poetry.group.external.dependencies] pyserial = "3.5" -[tool.pytest.ini_options] -filterwarnings = [ - "error", - "ignore::DeprecationWarning", - "ignore::ResourceWarning" -] - [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" From 85fddde75831fe90089e397eb3815a9d7a335eb1 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 03:00:38 -0700 Subject: [PATCH 069/100] Configure integration workflow for authenticated API requests The `arduino/compile-sketches` GitHub Actions action queries the GitHub API for the base ref of the pull request, which is used for the memory deltas determination. GitHub does rate limiting of API requests and if the limit is exceeded, a spurious failure of the workflow run will occur. Authenticated API requests are given a more generous API request allowance, so providing the action with the automatically generated GitHub access token stored in `secrets.GITHUB_TOKEN` to use for the API requests should prevent any such workflow run failures. --- .github/workflows/test-integration.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 5752ca1..bd9fcfd 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -84,6 +84,7 @@ jobs: uses: ./ with: cli-version: 0.15.1 + github-token: ${{ secrets.GITHUB_TOKEN }} platforms: ${{ matrix.board.platforms }} fqbn: ${{ matrix.board.fqbn }} libraries: ${{ matrix.board.libraries }} @@ -202,6 +203,7 @@ jobs: - name: Run action again uses: ./extras/compile-sketches with: + github-token: ${{ secrets.GITHUB_TOKEN }} platforms: ${{ matrix.board.platforms }} fqbn: ${{ matrix.board.fqbn }} libraries: ${{ matrix.board.libraries }} @@ -226,6 +228,7 @@ jobs: # Use action from local path uses: ./ with: + github-token: ${{ secrets.GITHUB_TOKEN }} platforms: | - name: arduino:avr - source-path: ${{ env.TESTDATA_PLATFORMS_PATH }}/PythonPackageDependent @@ -255,6 +258,7 @@ jobs: # Use action from local path uses: ./ with: + github-token: ${{ secrets.GITHUB_TOKEN }} platforms: | - name: arduino:avr - source-path: ${{ env.TESTDATA_PLATFORMS_PATH }}/PyserialDependent @@ -343,6 +347,7 @@ jobs: uses: ./ with: fqbn: arduino:avr:uno + github-token: ${{ secrets.GITHUB_TOKEN }} libraries: | - sketch-paths: | From 588c3451effdb34dfbd8da29120b4d76200f2cc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Mar 2023 10:11:38 +0000 Subject: [PATCH 070/100] Bump flake8 from 5.0.4 to 6.0.0 Bumps [flake8](https://github.com/pycqa/flake8) from 5.0.4 to 6.0.0. - [Release notes](https://github.com/pycqa/flake8/releases) - [Commits](https://github.com/pycqa/flake8/compare/5.0.4...6.0.0) --- updated-dependencies: - dependency-name: flake8 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- poetry.lock | 30 +++++++++++++++--------------- pyproject.toml | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/poetry.lock b/poetry.lock index d3750a1..400c24f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. +# This file is automatically @generated by Poetry and should not be changed by hand. [[package]] name = "attrs" @@ -370,20 +370,20 @@ dev = ["PyTest", "PyTest (<5)", "PyTest-Cov", "PyTest-Cov (<2.6)", "bump2version [[package]] name = "flake8" -version = "5.0.4" +version = "6.0.0" description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8.1" files = [ - {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, - {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, + {file = "flake8-6.0.0-py2.py3-none-any.whl", hash = "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7"}, + {file = "flake8-6.0.0.tar.gz", hash = "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"}, ] [package.dependencies] mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.9.0,<2.10.0" -pyflakes = ">=2.5.0,<2.6.0" +pycodestyle = ">=2.10.0,<2.11.0" +pyflakes = ">=3.0.0,<3.1.0" [[package]] name = "gitdb" @@ -536,14 +536,14 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pycodestyle" -version = "2.9.1" +version = "2.10.0" description = "Python style guide checker" category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, - {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, + {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, + {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, ] [[package]] @@ -560,14 +560,14 @@ files = [ [[package]] name = "pyflakes" -version = "2.5.0" +version = "3.0.1" description = "passive checker of Python programs" category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, - {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, + {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, + {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, ] [[package]] @@ -891,5 +891,5 @@ files = [ [metadata] lock-version = "2.0" -python-versions = "3.11.2" -content-hash = "8907a887cd8e83e4387e3b601da1d616577abcf736b2605f514316d5d410b002" +python-versions = "~3.11" +content-hash = "979b02966f30b73e271b177b1e71aef9b4585418b028882018b3e80c7263677e" diff --git a/pyproject.toml b/pyproject.toml index c216859..15f00e0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ codespell = "2.2.4" coverage = "7.2.2" pytest = "7.2.2" pytest-mock = "3.10.0" -flake8 = "5.0.4" +flake8 = "6.0.0" pep8-naming = "0.13.3" [tool.poetry.group.external] From 5906a1276f10bfda6a057ffc7c2adc0dde5a9fc9 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 03:13:36 -0700 Subject: [PATCH 071/100] Add infrastructure for checking project filesystem There are differences in the filename restrictions between operating systems. The use of filenames that are not valid on one operating system in the project will cause problems for contributors or users (e.g., not possible to check out the repository). Tasks are added to check for non-portable filenames: - Presence of characters prohibited by an operating system in filenames - Use of filenames reserved by an operating system Tasks are also added to check for problems with symbolic links ("symlinks") contained in the project: - Broken symlinks - Circular symlinks A GitHub Actions workflow is included to run the tasks on any change to the project files in order to avoid the introduction of problems with the project filesystem, and periodically in order to catch breakage caused by external changes. --- .github/workflows/check-files-task.yml | 73 +++++++++++++++++++ README.md | 1 + Taskfile.yml | 97 ++++++++++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 .github/workflows/check-files-task.yml diff --git a/.github/workflows/check-files-task.yml b/.github/workflows/check-files-task.yml new file mode 100644 index 0000000..bb5690e --- /dev/null +++ b/.github/workflows/check-files-task.yml @@ -0,0 +1,73 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-files-task.md +name: Check Files + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + pull_request: + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 8 * * THU" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check-filenames: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Check filenames + run: task --silent general:check-filenames + + check-symlinks: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Check symlinks + run: task --silent general:check-symlinks diff --git a/README.md b/README.md index 7bdaaf4..0c4818f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # `arduino/compile-sketches` action [![Check Action Metadata status](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml) +[![Check Files status](https://github.com/arduino/compile-sketches/actions/workflows/check-files-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-files-task.yml) [![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) [![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) [![Sync Labels status](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml) diff --git a/Taskfile.yml b/Taskfile.yml index 986c722..85d4cb2 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -41,6 +41,76 @@ tasks: -s "{{.ACTION_METADATA_SCHEMA_PATH}}" \ -d "action.yml" + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-files-task/Taskfile.yml + general:check-filenames: + desc: Check for non-portable filenames + cmds: + - | + find . \ + -type d -name '.git' -prune -o \ + -type d -name '.licenses' -prune -o \ + -type d -name '__pycache__' -prune -o \ + -type d -name 'node_modules' -prune -o \ + -exec \ + sh \ + -c \ + ' \ + basename "$0" | \ + grep \ + --perl-regexp \ + --regexp='"'"'([<>:"/\\|?*\x{0000}-\x{001F}])|(.+\.$)'"'"' \ + --silent \ + && \ + echo "$0" + ' \ + '{}' \ + \; \ + -execdir \ + false \ + '{}' \ + + \ + || \ + { + echo + echo "Prohibited characters found in filenames" + echo "See:" + echo "https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions:~:text=except%20for%20the%20following" + false + } + - | + find . \ + -type d -name '.git' -prune -o \ + -type d -name '.licenses' -prune -o \ + -type d -name '__pycache__' -prune -o \ + -type d -name 'node_modules' -prune -o \ + -exec \ + sh \ + -c \ + ' \ + basename "$0" | \ + grep \ + --ignore-case \ + --extended-regexp \ + --regexp='"'"'^(con|prn|aux|nul|com[0-9]+|lpt[0-9]+)$'"'"' \ + --silent \ + && \ + echo "$0" + ' \ + '{}' \ + \; \ + -execdir \ + false \ + '{}' \ + + \ + || \ + { + echo + echo "Reserved filenames found" + echo "See:" + echo "https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions:~:text=use%20the%20following-,reserved%20names,-for%20the%20name" + false + } + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check-task/Taskfile.yml general:check-spelling: desc: Check for commonly misspelled words @@ -51,6 +121,33 @@ tasks: cmds: - poetry run codespell + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-files-task/Taskfile.yml + general:check-symlinks: + desc: Check for bad symlinks + cmds: + - | + find . \ + -type d -name '.git' -prune -o \ + -type d -name '.licenses' -prune -o \ + -type d -name '__pycache__' -prune -o \ + -type d -name 'node_modules' -prune -o \ + -type l \ + -execdir \ + test ! -e '{}' \ + \; \ + -exec \ + echo '{}' \ + \; \ + -execdir \ + false \ + '{}' \ + + \ + || \ + { + echo 'Broken or circular symlink found' + false + } + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check-task/Taskfile.yml general:correct-spelling: desc: Correct commonly misspelled words where possible From a30cf9e33f5ef4e62cd738c2cf57710d7f61bc05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Mar 2023 10:22:24 +0000 Subject: [PATCH 072/100] Bump pygithub from 1.58.0 to 1.58.1 Bumps [pygithub](https://github.com/pygithub/pygithub) from 1.58.0 to 1.58.1. - [Release notes](https://github.com/pygithub/pygithub/releases) - [Changelog](https://github.com/PyGithub/PyGithub/blob/v1.58.1/doc/changes.rst) - [Commits](https://github.com/pygithub/pygithub/compare/v1.58.0...v1.58.1) --- updated-dependencies: - dependency-name: pygithub dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- poetry.lock | 58 +++++++++++++++++++++++++++++++++++++++++++------- pyproject.toml | 2 +- 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index 400c24f..2b612ec 100644 --- a/poetry.lock +++ b/poetry.lock @@ -350,6 +350,48 @@ files = [ [package.extras] toml = ["tomli"] +[[package]] +name = "cryptography" +version = "40.0.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cryptography-40.0.1-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:918cb89086c7d98b1b86b9fdb70c712e5a9325ba6f7d7cfb509e784e0cfc6917"}, + {file = "cryptography-40.0.1-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:9618a87212cb5200500e304e43691111570e1f10ec3f35569fdfcd17e28fd797"}, + {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a4805a4ca729d65570a1b7cac84eac1e431085d40387b7d3bbaa47e39890b88"}, + {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63dac2d25c47f12a7b8aa60e528bfb3c51c5a6c5a9f7c86987909c6c79765554"}, + {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0a4e3406cfed6b1f6d6e87ed243363652b2586b2d917b0609ca4f97072994405"}, + {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1e0af458515d5e4028aad75f3bb3fe7a31e46ad920648cd59b64d3da842e4356"}, + {file = "cryptography-40.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d8aa3609d337ad85e4eb9bb0f8bcf6e4409bfb86e706efa9a027912169e89122"}, + {file = "cryptography-40.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cf91e428c51ef692b82ce786583e214f58392399cf65c341bc7301d096fa3ba2"}, + {file = "cryptography-40.0.1-cp36-abi3-win32.whl", hash = "sha256:650883cc064297ef3676b1db1b7b1df6081794c4ada96fa457253c4cc40f97db"}, + {file = "cryptography-40.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:a805a7bce4a77d51696410005b3e85ae2839bad9aa38894afc0aa99d8e0c3160"}, + {file = "cryptography-40.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd033d74067d8928ef00a6b1327c8ea0452523967ca4463666eeba65ca350d4c"}, + {file = "cryptography-40.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d36bbeb99704aabefdca5aee4eba04455d7a27ceabd16f3b3ba9bdcc31da86c4"}, + {file = "cryptography-40.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:32057d3d0ab7d4453778367ca43e99ddb711770477c4f072a51b3ca69602780a"}, + {file = "cryptography-40.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f5d7b79fa56bc29580faafc2ff736ce05ba31feaa9d4735048b0de7d9ceb2b94"}, + {file = "cryptography-40.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7c872413353c70e0263a9368c4993710070e70ab3e5318d85510cc91cce77e7c"}, + {file = "cryptography-40.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:28d63d75bf7ae4045b10de5413fb1d6338616e79015999ad9cf6fc538f772d41"}, + {file = "cryptography-40.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6f2bbd72f717ce33100e6467572abaedc61f1acb87b8d546001328d7f466b778"}, + {file = "cryptography-40.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cc3a621076d824d75ab1e1e530e66e7e8564e357dd723f2533225d40fe35c60c"}, + {file = "cryptography-40.0.1.tar.gz", hash = "sha256:2803f2f8b1e95f614419926c7e6f55d828afc614ca5ed61543877ae668cc3472"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +pep8test = ["black", "check-manifest", "mypy", "ruff"] +sdist = ["setuptools-rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] +tox = ["tox"] + [[package]] name = "deprecated" version = "1.2.13" @@ -572,25 +614,22 @@ files = [ [[package]] name = "pygithub" -version = "1.58.0" +version = "1.58.1" description = "Use the full Github API v3" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "PyGithub-1.58.0-py3-none-any.whl", hash = "sha256:b7bac601492a2b6c876ef326e4ffa3c1923e32707e415da76bfb8307ee8ffb7e"}, - {file = "PyGithub-1.58.0.tar.gz", hash = "sha256:e325f5ca2c111d19dea2796c8f1e7ae11da77287007736582196341390d31d35"}, + {file = "PyGithub-1.58.1-py3-none-any.whl", hash = "sha256:4e7fe9c3ec30d5fde5b4fbb97f18821c9dbf372bf6df337fe66f6689a65e0a83"}, + {file = "PyGithub-1.58.1.tar.gz", hash = "sha256:7d528b4ad92bc13122129fafd444ce3d04c47d2d801f6446b6e6ee2d410235b3"}, ] [package.dependencies] deprecated = "*" -pyjwt = ">=2.4.0" +pyjwt = {version = ">=2.4.0", extras = ["crypto"]} pynacl = ">=1.4.0" requests = ">=2.14.0" -[package.extras] -integrations = ["cryptography"] - [[package]] name = "pyjwt" version = "2.6.0" @@ -603,6 +642,9 @@ files = [ {file = "PyJWT-2.6.0.tar.gz", hash = "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd"}, ] +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + [package.extras] crypto = ["cryptography (>=3.4.0)"] dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] @@ -892,4 +934,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "~3.11" -content-hash = "979b02966f30b73e271b177b1e71aef9b4585418b028882018b3e80c7263677e" +content-hash = "90bcf233ee68f28be781628ee2739f788d357c921b75a07c5a71cec0359b3490" diff --git a/pyproject.toml b/pyproject.toml index 15f00e0..4a26849 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ authors = ["Arduino "] [tool.poetry.dependencies] python = "3.11.2" GitPython = "3.1.31" -PyGithub = "1.58.0" +PyGithub = "1.58.1" PyYAML = "6.0" semver = "2.13.0" From 8c8dc29dbce250458dd67c44655edffd36fce9bb Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 03:34:14 -0700 Subject: [PATCH 073/100] Add CI workflow to check general file formatting On every push, pull request, and periodically, check whether the repository's files are formatted according to .editorconfig. --- .ecrc | 14 ++++ .editorconfig | 60 ++++++++++++++ .../check-general-formatting-task.yml | 79 +++++++++++++++++++ README.md | 1 + Taskfile.yml | 13 +++ 5 files changed, 167 insertions(+) create mode 100644 .ecrc create mode 100644 .editorconfig create mode 100644 .github/workflows/check-general-formatting-task.yml diff --git a/.ecrc b/.ecrc new file mode 100644 index 0000000..0d68a48 --- /dev/null +++ b/.ecrc @@ -0,0 +1,14 @@ +{ + "Exclude": [ + "^\\.git[/\\\\]", + "^\\.licenses[/\\\\]", + ".pytest_cache[/\\\\]", + "__pycache__[/\\\\]", + "node_modules[/\\\\]", + "^LICENSE\\.txt$", + "^poetry\\.lock$", + "\\.py$", + "^compilesketches[/\\\\]tests[/\\\\]testdata[/\\\\]test_get_warning_count_from_output[/\\\\]has-warnings\\.txt$", + "^compilesketches[/\\\\]tests[/\\\\]testdata[/\\\\]test_get_warning_count_from_output[/\\\\]no-warnings\\.txt$" + ] +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..eda8544 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,60 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/general/.editorconfig +# See: https://editorconfig.org/ +# The formatting style defined in this file is the official standardized style to be used in all Arduino Tooling +# projects and should not be modified. +# Note: indent style for each file type is defined even when it matches the universal config in order to make it clear +# that this type has an official style. + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{adoc,asc,asciidoc}] +indent_size = 2 +indent_style = space + +[*.{bash,sh}] +indent_size = 2 +indent_style = space + +[*.{c,cc,cp,cpp,cxx,h,hh,hpp,hxx,ii,inl,ino,ixx,pde,tpl,tpp,txx}] +indent_size = 2 +indent_style = space + +[*.{go,mod}] +indent_style = tab + +[*.java] +indent_size = 2 +indent_style = space + +[*.{js,jsx,json,jsonc,json5,ts,tsx}] +indent_size = 2 +indent_style = space + +[*.{md,mdx,mkdn,mdown,markdown}] +indent_size = unset +indent_style = space + +[*.proto] +indent_size = 2 +indent_style = space + +[*.py] +indent_size = 4 +indent_style = space + +[*.svg] +indent_size = 2 +indent_style = space + +[*.{yaml,yml}] +indent_size = 2 +indent_style = space + +[{.gitconfig,.gitmodules}] +indent_style = tab diff --git a/.github/workflows/check-general-formatting-task.yml b/.github/workflows/check-general-formatting-task.yml new file mode 100644 index 0000000..7a19a41 --- /dev/null +++ b/.github/workflows/check-general-formatting-task.yml @@ -0,0 +1,79 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-general-formatting-task.md +name: Check General Formatting + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + pull_request: + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage caused by changes to tools. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Set environment variables + run: | + # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable + echo "EC_INSTALL_PATH=${{ runner.temp }}/editorconfig-checker" >> "$GITHUB_ENV" + + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Download latest editorconfig-checker release binary package + id: download + uses: MrOctopus/download-asset-action@1.0 + with: + repository: editorconfig-checker/editorconfig-checker + excludes: prerelease, draft + asset: linux-amd64.tar.gz + target: ${{ env.EC_INSTALL_PATH }} + + - name: Install editorconfig-checker + run: | + cd "${{ env.EC_INSTALL_PATH }}" + tar --extract --file="${{ steps.download.outputs.name }}" + # Give the binary a standard name + mv "${{ env.EC_INSTALL_PATH }}/bin/ec-linux-amd64" "${{ env.EC_INSTALL_PATH }}/bin/ec" + # Add installation to PATH: + # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-system-path + echo "${{ env.EC_INSTALL_PATH }}/bin" >> "$GITHUB_PATH" + + - name: Check formatting + run: task --silent general:check-formatting diff --git a/README.md b/README.md index 0c4818f..0829a30 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![Check Action Metadata status](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml) [![Check Files status](https://github.com/arduino/compile-sketches/actions/workflows/check-files-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-files-task.yml) +[![Check General Formatting status](https://github.com/arduino/compile-sketches/actions/workflows/check-general-formatting-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-general-formatting-task.yml) [![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) [![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) [![Sync Labels status](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml) diff --git a/Taskfile.yml b/Taskfile.yml index 85d4cb2..0756748 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -9,6 +9,7 @@ tasks: desc: Check for problems with the project deps: - task: action:validate + - task: general:check-formatting - task: general:check-spelling - task: python:lint - task: python:test @@ -111,6 +112,18 @@ tasks: false } + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-general-formatting-task/Taskfile.yml + general:check-formatting: + desc: Check basic formatting style of all files + cmds: + - | + if ! which ec &>/dev/null; then + echo "ec not found or not in PATH." + echo "Please install: https://github.com/editorconfig-checker/editorconfig-checker#installation" + exit 1 + fi + - ec + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check-task/Taskfile.yml general:check-spelling: desc: Check for commonly misspelled words From 1b2969bd6b0c125c2a84672ccc0913c0a946a665 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 03:38:34 -0700 Subject: [PATCH 074/100] Use standardized filename for license It is a text file, so the appropriate filename is LICENSE.txt. This is the standard in all Arduino tooling projects. --- LICENSE => LICENSE.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename LICENSE => LICENSE.txt (100%) diff --git a/LICENSE b/LICENSE.txt similarity index 100% rename from LICENSE rename to LICENSE.txt From af425db2cc79962d1d39f665e6aac6cb5710b759 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 03:54:32 -0700 Subject: [PATCH 075/100] Fix general formatting inconsistencies in files Basic standardized file formatting style is defined in the project's .editorconfig file. Some files were non-compliant. --- .../reports/all-inputs/arduino-avr-uno.json | 2 +- .../all-inputs/esp8266-esp8266-huzzah.json | 2 +- .../has-warnings.txt | 648 +++++++++--------- .../no-warnings.txt | 192 +++--- docs/FAQ.md | 2 +- pyproject.toml | 72 +- 6 files changed, 459 insertions(+), 459 deletions(-) diff --git a/.github/workflows/testdata/reports/all-inputs/arduino-avr-uno.json b/.github/workflows/testdata/reports/all-inputs/arduino-avr-uno.json index c4ef529..cbc1527 100644 --- a/.github/workflows/testdata/reports/all-inputs/arduino-avr-uno.json +++ b/.github/workflows/testdata/reports/all-inputs/arduino-avr-uno.json @@ -193,4 +193,4 @@ } } ] -} \ No newline at end of file +} diff --git a/.github/workflows/testdata/reports/all-inputs/esp8266-esp8266-huzzah.json b/.github/workflows/testdata/reports/all-inputs/esp8266-esp8266-huzzah.json index 242a6ed..fa28e0e 100644 --- a/.github/workflows/testdata/reports/all-inputs/esp8266-esp8266-huzzah.json +++ b/.github/workflows/testdata/reports/all-inputs/esp8266-esp8266-huzzah.json @@ -193,4 +193,4 @@ } } ] -} \ No newline at end of file +} diff --git a/compilesketches/tests/testdata/test_get_warning_count_from_output/has-warnings.txt b/compilesketches/tests/testdata/test_get_warning_count_from_output/has-warnings.txt index 2b96b7f..8156a4a 100644 --- a/compilesketches/tests/testdata/test_get_warning_count_from_output/has-warnings.txt +++ b/compilesketches/tests/testdata/test_get_warning_count_from_output/has-warnings.txt @@ -1,324 +1,324 @@ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:32, - from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1, - from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.pbc); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.inp); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -In file included from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1:0, - from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: -/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h: In function 'void initProperties()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:100:64: warning: 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - #define addProperty( v, ...) addPropertyReal(v, #v, __VA_ARGS__) - ^ -/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:21:16: note: in expansion of macro 'addProperty' - ArduinoCloud.addProperty(switchButton, WRITE, ON_CHANGE, onSwitchButtonChange); - ^~~~~~~~~~~ -In file included from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1:0, - from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:107:10: note: declared here - void addPropertyReal(bool& property, String name, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -In file included from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1:0, - from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:100:64: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - #define addProperty( v, ...) addPropertyReal(v, #v, __VA_ARGS__) - ^ -/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:22:16: note: in expansion of macro 'addProperty' - ArduinoCloud.addProperty(location, READ, ON_CHANGE); - ^~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:106:10: note: declared here - void addPropertyReal(Property& property, String name, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:100:64: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - #define addProperty( v, ...) addPropertyReal(v, #v, __VA_ARGS__) - ^ -/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:23:16: note: in expansion of macro 'addProperty' - ArduinoCloud.addProperty(color, READWRITE, ON_CHANGE, onColorChange); - ^~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:106:10: note: declared here - void addPropertyReal(Property& property, String name, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -In file included from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.cpp:22:0: -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h: In constructor 'ConnectionHandler::ConnectionHandler(bool)': -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:209:28: warning: 'ConnectionHandler::_current_net_connection_state' will be initialized after [-Wreorder] - NetworkConnectionState _current_net_connection_state; - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:208:19: warning: 'long unsigned int ConnectionHandler::_lastConnectionTickTime' [-Wreorder] - unsigned long _lastConnectionTickTime; - ^~~~~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.cpp:28:1: warning: when initialized here [-Wreorder] - ConnectionHandler::ConnectionHandler(bool const keep_alive) - ^~~~~~~~~~~~~~~~~ -In file included from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:22:0, - from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.h:25, - from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.cpp:22: -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.cpp: In member function 'virtual NetworkConnectionState WiFiConnectionHandler::update_handleInit()': -/github/home/Arduino/libraries/WiFi101/src/WiFi101.h:24:38: warning: comparison with string literal results in unspecified behavior [-Waddress] - #define WIFI_FIRMWARE_LATEST_MODEL_B "19.6.1" - ^ -/github/home/Arduino/libraries/WiFi101/src/WiFi101.h:27:32: note: in expansion of macro 'WIFI_FIRMWARE_LATEST_MODEL_B' - #define WIFI_FIRMWARE_REQUIRED WIFI_FIRMWARE_LATEST_MODEL_B - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:29:42: note: in expansion of macro 'WIFI_FIRMWARE_REQUIRED' - #define WIFI_FIRMWARE_VERSION_REQUIRED WIFI_FIRMWARE_REQUIRED - ^~~~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.cpp:69:32: note: in expansion of macro 'WIFI_FIRMWARE_VERSION_REQUIRED' - if (WiFi.firmwareVersion() < WIFI_FIRMWARE_VERSION_REQUIRED) - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In file included from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21.h:69:0, - from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:105, - from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540, - from /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Arduino.h:48, - from /github/home/Arduino/libraries/WiFi101/src/utility/WiFiSocket.h:28, - from /github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:36: -/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226:0: warning: "LITTLE_ENDIAN" redefined - #define LITTLE_ENDIAN 1 - -In file included from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/sys/types.h:67:0, - from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/time.h:28, - from /github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:28: -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17:0: note: this is the location of the previous definition - #define LITTLE_ENDIAN _LITTLE_ENDIAN - -/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp: In member function 'char* WiFiClass::firmwareVersion()': -/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:343:7: warning: '%d' directive writing between 1 and 3 bytes into a region of size between 1 and 5 [-Wformat-overflow=] - char* WiFiClass::firmwareVersion() - ^~~~~~~~~ -/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:343:7: note: directive argument in the range [0, 255] -/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:356:10: note: 'sprintf' output between 6 and 12 bytes into a destination of size 9 - sprintf(_version, "%d.%d.%d", rev.u8FirmwareMajor, rev.u8FirmwareMinor, rev.u8FirmwarePatch); - ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/Arduino_DebugUtils/src/Arduino_DebugUtils.cpp: In member function 'void Arduino_DebugUtils::print(int, const __FlashStringHelper*, ...)': -/github/home/Arduino/libraries/Arduino_DebugUtils/src/Arduino_DebugUtils.cpp:86:3: warning: second parameter of 'va_start' not last named argument [-Wvarargs] - va_start(args, fmt_str.c_str()); - ^~~~~~~~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:32, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.pbc); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.inp); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:52:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:124:10: note: declared here - void addPropertyReal(Property& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:85:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:125:10: note: declared here - void addPropertyReal(bool& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:91:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here - void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) - ^~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(float&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:107:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(float&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:126:10: note: declared here - void addPropertyReal(float& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(float&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:113:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here - void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) - ^~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(int&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:129:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(int&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:127:10: note: declared here - void addPropertyReal(int& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(int&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:135:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here - void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) - ^~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(String&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:151:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(String&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:128:10: note: declared here - void addPropertyReal(String& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(String&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:157:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here - void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) - ^~~~~~~~~~~~~~~~~~~~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:32, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.h:27, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp:25: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.pbc); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.inp); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp:28:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h: In copy constructor 'CryptoUtil::CryptoUtil(const CryptoUtil&)': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h:60:33: warning: unused parameter 'other' [-Wunused-parameter] - CryptoUtil(CryptoUtil const & other) { } - ^~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp: In member function 'ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SyncTime()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp:208:23: warning: unused variable 'internal_posix_time' [-Wunused-variable] - unsigned long const internal_posix_time = _time_service.getTime(); - ^~~~~~~~~~~~~~~~~~~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBOREncoder.h:25, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBOREncoder.cpp:22: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.pbc); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.inp); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.cpp:28: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.pbc); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.inp); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/stdio.h: In function 'open_memstream': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/lib/tinycbor/src/open_memstream.c:108:1: warning: control reaches end of non-void function [-Wreturn-type] - } - ^ -At top level: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/lib/tinycbor/src/open_memstream.c:77:12: warning: 'close_buffer' defined but not used [-Wunused-function] - static int close_buffer(void *cookie) - ^~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/lib/tinycbor/src/open_memstream.c:52:16: warning: 'write_to_buffer' defined but not used [-Wunused-function] - static RetType write_to_buffer(void *cookie, const char *data, LenType len) - ^~~~~~~~~~~~~~~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/property/PropertyContainer.h:25:0, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/property/PropertyContainer.cpp:22: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.pbc); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.inp); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.cpp:35:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.h: In constructor 'BearSSLClient::BearSSLClient(Client*, const br_x509_trust_anchor*, int, GetTimeCallbackFunc)': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.h:95:8: warning: 'BearSSLClient::_noSNI' will be initialized after [-Wreorder] - bool _noSNI; - ^~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.h:93:23: warning: 'long unsigned int (* BearSSLClient::_get_time_func)()' [-Wreorder] - GetTimeCallbackFunc _get_time_func; - ^~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.cpp:39:1: warning: when initialized here [-Wreorder] - BearSSLClient::BearSSLClient(Client* client, const br_x509_trust_anchor* myTAs, int myNumTAs, GetTimeCallbackFunc func) : - ^~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/profile/aiotc_profile.c: In function 'aiotc_client_profile_init': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/profile/aiotc_profile.c:54:7: warning: unused variable 'id' [-Wunused-variable] - int id; - ^~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.cpp:22:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h: In copy constructor 'CryptoUtil::CryptoUtil(const CryptoUtil&)': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h:60:33: warning: unused parameter 'other' [-Wunused-parameter] - CryptoUtil(CryptoUtil const & other) { } - ^~~~~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/NTPUtils.cpp:25:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/NTPUtils.h:57:53: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] - static char constexpr * NTP_TIME_SERVER = "time.arduino.cc"; - ^~~~~~~~~~~~~~~~~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/TimeService.cpp:26:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/NTPUtils.h:57:53: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] - static char constexpr * NTP_TIME_SERVER = "time.arduino.cc"; - ^~~~~~~~~~~~~~~~~ -In file included from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21.h:69:0, - from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:105, - from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540, - from /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Arduino.h:48, - from /github/home/Arduino/libraries/RTCZero/src/RTCZero.h:23, - from /github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp:22: -/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226:0: warning: "LITTLE_ENDIAN" redefined - #define LITTLE_ENDIAN 1 - -In file included from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/sys/types.h:67:0, - from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/time.h:28, - from /github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp:20: -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17:0: note: this is the location of the previous definition - #define LITTLE_ENDIAN _LITTLE_ENDIAN - -/github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp: In member function 'void RTCZero::begin(bool)': -/github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp:96:26: warning: 'oldTime.RTC_MODE2_CLOCK_Type::reg' may be used uninitialized in this function [-Wmaybe-uninitialized] - RTC->MODE2.CLOCK.reg = oldTime.reg; -Sketch uses 134184 bytes (51%) of program storage space. Maximum is 262144 bytes. -Global variables use 23208 bytes (70%) of dynamic memory, leaving 9560 bytes for local variables. Maximum is 32768 bytes. +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:32, + from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1, + from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.pbc); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.inp); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +In file included from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1:0, + from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: +/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h: In function 'void initProperties()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:100:64: warning: 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + #define addProperty( v, ...) addPropertyReal(v, #v, __VA_ARGS__) + ^ +/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:21:16: note: in expansion of macro 'addProperty' + ArduinoCloud.addProperty(switchButton, WRITE, ON_CHANGE, onSwitchButtonChange); + ^~~~~~~~~~~ +In file included from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1:0, + from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:107:10: note: declared here + void addPropertyReal(bool& property, String name, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +In file included from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1:0, + from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:100:64: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + #define addProperty( v, ...) addPropertyReal(v, #v, __VA_ARGS__) + ^ +/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:22:16: note: in expansion of macro 'addProperty' + ArduinoCloud.addProperty(location, READ, ON_CHANGE); + ^~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:106:10: note: declared here + void addPropertyReal(Property& property, String name, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:100:64: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + #define addProperty( v, ...) addPropertyReal(v, #v, __VA_ARGS__) + ^ +/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:23:16: note: in expansion of macro 'addProperty' + ArduinoCloud.addProperty(color, READWRITE, ON_CHANGE, onColorChange); + ^~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:106:10: note: declared here + void addPropertyReal(Property& property, String name, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +In file included from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.cpp:22:0: +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h: In constructor 'ConnectionHandler::ConnectionHandler(bool)': +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:209:28: warning: 'ConnectionHandler::_current_net_connection_state' will be initialized after [-Wreorder] + NetworkConnectionState _current_net_connection_state; + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:208:19: warning: 'long unsigned int ConnectionHandler::_lastConnectionTickTime' [-Wreorder] + unsigned long _lastConnectionTickTime; + ^~~~~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.cpp:28:1: warning: when initialized here [-Wreorder] + ConnectionHandler::ConnectionHandler(bool const keep_alive) + ^~~~~~~~~~~~~~~~~ +In file included from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:22:0, + from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.h:25, + from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.cpp:22: +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.cpp: In member function 'virtual NetworkConnectionState WiFiConnectionHandler::update_handleInit()': +/github/home/Arduino/libraries/WiFi101/src/WiFi101.h:24:38: warning: comparison with string literal results in unspecified behavior [-Waddress] + #define WIFI_FIRMWARE_LATEST_MODEL_B "19.6.1" + ^ +/github/home/Arduino/libraries/WiFi101/src/WiFi101.h:27:32: note: in expansion of macro 'WIFI_FIRMWARE_LATEST_MODEL_B' + #define WIFI_FIRMWARE_REQUIRED WIFI_FIRMWARE_LATEST_MODEL_B + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:29:42: note: in expansion of macro 'WIFI_FIRMWARE_REQUIRED' + #define WIFI_FIRMWARE_VERSION_REQUIRED WIFI_FIRMWARE_REQUIRED + ^~~~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.cpp:69:32: note: in expansion of macro 'WIFI_FIRMWARE_VERSION_REQUIRED' + if (WiFi.firmwareVersion() < WIFI_FIRMWARE_VERSION_REQUIRED) + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +In file included from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21.h:69:0, + from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:105, + from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540, + from /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Arduino.h:48, + from /github/home/Arduino/libraries/WiFi101/src/utility/WiFiSocket.h:28, + from /github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:36: +/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226:0: warning: "LITTLE_ENDIAN" redefined + #define LITTLE_ENDIAN 1 + +In file included from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/sys/types.h:67:0, + from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/time.h:28, + from /github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:28: +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17:0: note: this is the location of the previous definition + #define LITTLE_ENDIAN _LITTLE_ENDIAN + +/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp: In member function 'char* WiFiClass::firmwareVersion()': +/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:343:7: warning: '%d' directive writing between 1 and 3 bytes into a region of size between 1 and 5 [-Wformat-overflow=] + char* WiFiClass::firmwareVersion() + ^~~~~~~~~ +/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:343:7: note: directive argument in the range [0, 255] +/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:356:10: note: 'sprintf' output between 6 and 12 bytes into a destination of size 9 + sprintf(_version, "%d.%d.%d", rev.u8FirmwareMajor, rev.u8FirmwareMinor, rev.u8FirmwarePatch); + ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/Arduino_DebugUtils/src/Arduino_DebugUtils.cpp: In member function 'void Arduino_DebugUtils::print(int, const __FlashStringHelper*, ...)': +/github/home/Arduino/libraries/Arduino_DebugUtils/src/Arduino_DebugUtils.cpp:86:3: warning: second parameter of 'va_start' not last named argument [-Wvarargs] + va_start(args, fmt_str.c_str()); + ^~~~~~~~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:32, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.pbc); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.inp); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:52:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:124:10: note: declared here + void addPropertyReal(Property& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:85:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:125:10: note: declared here + void addPropertyReal(bool& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:91:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here + void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) + ^~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(float&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:107:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(float&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:126:10: note: declared here + void addPropertyReal(float& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(float&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:113:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here + void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) + ^~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(int&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:129:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(int&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:127:10: note: declared here + void addPropertyReal(int& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(int&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:135:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here + void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) + ^~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(String&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:151:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(String&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:128:10: note: declared here + void addPropertyReal(String& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(String&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:157:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here + void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) + ^~~~~~~~~~~~~~~~~~~~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:32, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.h:27, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp:25: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.pbc); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.inp); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp:28:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h: In copy constructor 'CryptoUtil::CryptoUtil(const CryptoUtil&)': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h:60:33: warning: unused parameter 'other' [-Wunused-parameter] + CryptoUtil(CryptoUtil const & other) { } + ^~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp: In member function 'ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SyncTime()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp:208:23: warning: unused variable 'internal_posix_time' [-Wunused-variable] + unsigned long const internal_posix_time = _time_service.getTime(); + ^~~~~~~~~~~~~~~~~~~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBOREncoder.h:25, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBOREncoder.cpp:22: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.pbc); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.inp); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.cpp:28: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.pbc); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.inp); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/stdio.h: In function 'open_memstream': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/lib/tinycbor/src/open_memstream.c:108:1: warning: control reaches end of non-void function [-Wreturn-type] + } + ^ +At top level: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/lib/tinycbor/src/open_memstream.c:77:12: warning: 'close_buffer' defined but not used [-Wunused-function] + static int close_buffer(void *cookie) + ^~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/lib/tinycbor/src/open_memstream.c:52:16: warning: 'write_to_buffer' defined but not used [-Wunused-function] + static RetType write_to_buffer(void *cookie, const char *data, LenType len) + ^~~~~~~~~~~~~~~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/property/PropertyContainer.h:25:0, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/property/PropertyContainer.cpp:22: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.pbc); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.inp); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.cpp:35:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.h: In constructor 'BearSSLClient::BearSSLClient(Client*, const br_x509_trust_anchor*, int, GetTimeCallbackFunc)': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.h:95:8: warning: 'BearSSLClient::_noSNI' will be initialized after [-Wreorder] + bool _noSNI; + ^~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.h:93:23: warning: 'long unsigned int (* BearSSLClient::_get_time_func)()' [-Wreorder] + GetTimeCallbackFunc _get_time_func; + ^~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.cpp:39:1: warning: when initialized here [-Wreorder] + BearSSLClient::BearSSLClient(Client* client, const br_x509_trust_anchor* myTAs, int myNumTAs, GetTimeCallbackFunc func) : + ^~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/profile/aiotc_profile.c: In function 'aiotc_client_profile_init': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/profile/aiotc_profile.c:54:7: warning: unused variable 'id' [-Wunused-variable] + int id; + ^~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.cpp:22:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h: In copy constructor 'CryptoUtil::CryptoUtil(const CryptoUtil&)': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h:60:33: warning: unused parameter 'other' [-Wunused-parameter] + CryptoUtil(CryptoUtil const & other) { } + ^~~~~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/NTPUtils.cpp:25:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/NTPUtils.h:57:53: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] + static char constexpr * NTP_TIME_SERVER = "time.arduino.cc"; + ^~~~~~~~~~~~~~~~~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/TimeService.cpp:26:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/NTPUtils.h:57:53: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] + static char constexpr * NTP_TIME_SERVER = "time.arduino.cc"; + ^~~~~~~~~~~~~~~~~ +In file included from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21.h:69:0, + from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:105, + from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540, + from /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Arduino.h:48, + from /github/home/Arduino/libraries/RTCZero/src/RTCZero.h:23, + from /github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp:22: +/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226:0: warning: "LITTLE_ENDIAN" redefined + #define LITTLE_ENDIAN 1 + +In file included from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/sys/types.h:67:0, + from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/time.h:28, + from /github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp:20: +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17:0: note: this is the location of the previous definition + #define LITTLE_ENDIAN _LITTLE_ENDIAN + +/github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp: In member function 'void RTCZero::begin(bool)': +/github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp:96:26: warning: 'oldTime.RTC_MODE2_CLOCK_Type::reg' may be used uninitialized in this function [-Wmaybe-uninitialized] + RTC->MODE2.CLOCK.reg = oldTime.reg; +Sketch uses 134184 bytes (51%) of program storage space. Maximum is 262144 bytes. +Global variables use 23208 bytes (70%) of dynamic memory, leaving 9560 bytes for local variables. Maximum is 32768 bytes. diff --git a/compilesketches/tests/testdata/test_get_warning_count_from_output/no-warnings.txt b/compilesketches/tests/testdata/test_get_warning_count_from_output/no-warnings.txt index f5f157f..087aa80 100644 --- a/compilesketches/tests/testdata/test_get_warning_count_from_output/no-warnings.txt +++ b/compilesketches/tests/testdata/test_get_warning_count_from_output/no-warnings.txt @@ -1,96 +1,96 @@ -Using board 'mkrwifi1010' from platform in folder: /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8 -Using core 'arduino' from platform in folder: /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8 -Detecting libraries used... -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /dev/null -Alternatives for Arduino_LSM9DS1.h: [Arduino_LSM9DS1@1.1.0] -ResolveLibrary(Arduino_LSM9DS1.h) - -> candidates: [Arduino_LSM9DS1@1.1.0] -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /dev/null -Alternatives for Wire.h: [Wire@1.0] -ResolveLibrary(Wire.h) - -> candidates: [Wire@1.0] -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /dev/null -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/Arduino/libraries/Arduino_LSM9DS1/src/LSM9DS1.cpp -o /dev/null -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire/Wire.cpp -o /dev/null -Generating function prototypes... -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/preproc/ctags_target_for_gcc_minus_e.cpp -/github/home/.arduino15/packages/builtin/tools/ctags/5.8-arduino11/ctags -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/preproc/ctags_target_for_gcc_minus_e.cpp -Compiling sketch... -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp.o -Compiling libraries... -Compiling library "Arduino_LSM9DS1" -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/Arduino/libraries/Arduino_LSM9DS1/src/LSM9DS1.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Arduino_LSM9DS1/LSM9DS1.cpp.o -Compiling library "Wire" -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire/Wire.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Wire/Wire.cpp.o -Compiling core... -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010/variant.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/variant.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -c -g -x assembler-with-cpp -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/pulse_asm.S -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse_asm.S.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/WInterrupts.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WInterrupts.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/cortex_handlers.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/cortex_handlers.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/delay.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/delay.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/hooks.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/hooks.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/itoa.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/itoa.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/pulse.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/startup.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/startup.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_analog.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_analog.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_digital.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_digital.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_private.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_private.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_shift.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_shift.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/samd21_host.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/samd21_host.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/avr/dtostrf.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/avr/dtostrf.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/IPAddress.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/IPAddress.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Print.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Print.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Reset.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Reset.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/SERCOM.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/SERCOM.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Stream.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Stream.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Tone.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Tone.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Uart.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Uart.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/WMath.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WMath.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/WString.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WString.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/abi.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/abi.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/main.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/main.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/new.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/new.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/CDC.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/CDC.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/PluggableUSB.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/PluggableUSB.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/USBCore.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/USBCore.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse_asm.S.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/samd21_host.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WInterrupts.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/avr/dtostrf.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/cortex_handlers.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/delay.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/hooks.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/itoa.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/startup.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_analog.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_digital.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_private.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_shift.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/IPAddress.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Print.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Reset.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/SERCOM.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Stream.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Tone.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/CDC.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/PluggableUSB.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/USBCore.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Uart.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WMath.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WString.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/abi.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/main.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/new.cpp.o -Archiving built core (caching) in: /tmp/arduino-core-cache/core_arduino_samd_mkrwifi1010_c2ac4c84ccc3ab26fc3af2e1db872c29.a -Linking everything together... -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -L/tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412 -Os -Wl,--gc-sections -save-temps -T/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010/linker_scripts/gcc/flash_with_bootloader.ld -Wl,-Map,/tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.map --specs=nano.specs --specs=nosys.specs -mcpu=cortex-m0plus -mthumb -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp.o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Arduino_LSM9DS1/LSM9DS1.cpp.o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Wire/Wire.cpp.o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/variant.cpp.o -Wl,--start-group -L/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Lib/GCC/ -larm_cortexM0l_math -lm /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a -Wl,--end-group -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-objcopy -O binary /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.bin -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-objcopy -O ihex -R .eeprom /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.hex -Using library Arduino_LSM9DS1 at version 1.1.0 in folder: /github/home/Arduino/libraries/Arduino_LSM9DS1 -Using library Wire at version 1.0 in folder: /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-size -A /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf -Sketch uses 23356 bytes (8%) of program storage space. Maximum is 262144 bytes. -Global variables use 3544 bytes (10%) of dynamic memory, leaving 29224 bytes for local variables. Maximum is 32768 bytes. +Using board 'mkrwifi1010' from platform in folder: /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8 +Using core 'arduino' from platform in folder: /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8 +Detecting libraries used... +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /dev/null +Alternatives for Arduino_LSM9DS1.h: [Arduino_LSM9DS1@1.1.0] +ResolveLibrary(Arduino_LSM9DS1.h) + -> candidates: [Arduino_LSM9DS1@1.1.0] +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /dev/null +Alternatives for Wire.h: [Wire@1.0] +ResolveLibrary(Wire.h) + -> candidates: [Wire@1.0] +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /dev/null +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/Arduino/libraries/Arduino_LSM9DS1/src/LSM9DS1.cpp -o /dev/null +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire/Wire.cpp -o /dev/null +Generating function prototypes... +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/preproc/ctags_target_for_gcc_minus_e.cpp +/github/home/.arduino15/packages/builtin/tools/ctags/5.8-arduino11/ctags -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/preproc/ctags_target_for_gcc_minus_e.cpp +Compiling sketch... +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp.o +Compiling libraries... +Compiling library "Arduino_LSM9DS1" +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/Arduino/libraries/Arduino_LSM9DS1/src/LSM9DS1.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Arduino_LSM9DS1/LSM9DS1.cpp.o +Compiling library "Wire" +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire/Wire.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Wire/Wire.cpp.o +Compiling core... +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010/variant.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/variant.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -c -g -x assembler-with-cpp -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/pulse_asm.S -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse_asm.S.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/WInterrupts.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WInterrupts.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/cortex_handlers.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/cortex_handlers.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/delay.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/delay.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/hooks.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/hooks.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/itoa.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/itoa.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/pulse.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/startup.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/startup.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_analog.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_analog.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_digital.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_digital.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_private.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_private.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_shift.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_shift.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/samd21_host.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/samd21_host.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/avr/dtostrf.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/avr/dtostrf.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/IPAddress.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/IPAddress.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Print.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Print.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Reset.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Reset.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/SERCOM.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/SERCOM.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Stream.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Stream.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Tone.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Tone.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Uart.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Uart.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/WMath.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WMath.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/WString.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WString.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/abi.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/abi.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/main.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/main.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/new.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/new.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/CDC.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/CDC.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/PluggableUSB.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/PluggableUSB.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/USBCore.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/USBCore.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse_asm.S.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/samd21_host.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WInterrupts.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/avr/dtostrf.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/cortex_handlers.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/delay.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/hooks.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/itoa.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/startup.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_analog.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_digital.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_private.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_shift.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/IPAddress.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Print.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Reset.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/SERCOM.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Stream.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Tone.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/CDC.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/PluggableUSB.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/USBCore.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Uart.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WMath.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WString.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/abi.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/main.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/new.cpp.o +Archiving built core (caching) in: /tmp/arduino-core-cache/core_arduino_samd_mkrwifi1010_c2ac4c84ccc3ab26fc3af2e1db872c29.a +Linking everything together... +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -L/tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412 -Os -Wl,--gc-sections -save-temps -T/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010/linker_scripts/gcc/flash_with_bootloader.ld -Wl,-Map,/tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.map --specs=nano.specs --specs=nosys.specs -mcpu=cortex-m0plus -mthumb -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp.o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Arduino_LSM9DS1/LSM9DS1.cpp.o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Wire/Wire.cpp.o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/variant.cpp.o -Wl,--start-group -L/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Lib/GCC/ -larm_cortexM0l_math -lm /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a -Wl,--end-group +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-objcopy -O binary /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.bin +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-objcopy -O ihex -R .eeprom /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.hex +Using library Arduino_LSM9DS1 at version 1.1.0 in folder: /github/home/Arduino/libraries/Arduino_LSM9DS1 +Using library Wire at version 1.0 in folder: /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-size -A /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf +Sketch uses 23356 bytes (8%) of program storage space. Maximum is 262144 bytes. +Global variables use 3544 bytes (10%) of dynamic memory, leaving 29224 bytes for local variables. Maximum is 32768 bytes. diff --git a/docs/FAQ.md b/docs/FAQ.md index ae56065..29b31f9 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -57,4 +57,4 @@ In order to be certain your installation of a package dependency will be availab - uses: arduino/compile-sketches@v1 ``` ---- \ No newline at end of file +--- diff --git a/pyproject.toml b/pyproject.toml index 4a26849..dd24ab2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,36 +1,36 @@ -[tool.black] -line-length = 120 - -[tool.poetry] -name = "compilesketches" -version = "0.0.0" -description = "" -authors = ["Arduino "] - -[tool.poetry.dependencies] -python = "3.11.2" -GitPython = "3.1.31" -PyGithub = "1.58.1" -PyYAML = "6.0" -semver = "2.13.0" - -[tool.poetry.group.dev.dependencies] -black = "23.1.0" -codespell = "2.2.4" -coverage = "7.2.2" -pytest = "7.2.2" -pytest-mock = "3.10.0" -flake8 = "6.0.0" -pep8-naming = "0.13.3" - -[tool.poetry.group.external] -# Provided only for use by boards platforms -# NOTE: This group is a temporary workaround that will be removed at the 2.0.0 release of the action. -optional = true - -[tool.poetry.group.external.dependencies] -pyserial = "3.5" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" +[tool.black] +line-length = 120 + +[tool.poetry] +name = "compilesketches" +version = "0.0.0" +description = "" +authors = ["Arduino "] + +[tool.poetry.dependencies] +python = "3.11.2" +GitPython = "3.1.31" +PyGithub = "1.58.1" +PyYAML = "6.0" +semver = "2.13.0" + +[tool.poetry.group.dev.dependencies] +black = "23.1.0" +codespell = "2.2.4" +coverage = "7.2.2" +pytest = "7.2.2" +pytest-mock = "3.10.0" +flake8 = "6.0.0" +pep8-naming = "0.13.3" + +[tool.poetry.group.external] +# Provided only for use by boards platforms +# NOTE: This group is a temporary workaround that will be removed at the 2.0.0 release of the action. +optional = true + +[tool.poetry.group.external.dependencies] +pyserial = "3.5" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" From a69ec39b817d637ebbcdc4fba7b02136ac68ba53 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 04:21:23 -0700 Subject: [PATCH 076/100] Add CI workflow to check the license file Whenever one of the recognized license file names are modified in the repository, the workflow runs to check whether the license can be recognized and whether it is of the expected type. GitHub has a useful automated license detection system that determines the license type used by a repository, and surfaces that information in the repository home page, the search web interface, and the GitHub API. This license detection system requires that the license be defined by a dedicated file with one of several standardized filenames and paths. GitHub's license detection system uses the popular licensee tool, so this file also serves to define the license type for any other usages of licensee, as well as to human readers of the file. For this reason, and to ensure it remains a valid legal instrument, it's important that there be no non-standard modifications to the license file or collisions with other supported license files. This workflow ensures that any changes which would change the license type or which license file is used by the detection are caught automatically. --- .github/workflows/check-license.yml | 96 +++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 97 insertions(+) create mode 100644 .github/workflows/check-license.yml diff --git a/.github/workflows/check-license.yml b/.github/workflows/check-license.yml new file mode 100644 index 0000000..4492bcc --- /dev/null +++ b/.github/workflows/check-license.yml @@ -0,0 +1,96 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-license.md +name: Check License + +env: + EXPECTED_LICENSE_FILENAME: LICENSE.txt + # SPDX identifier: https://spdx.org/licenses/ + EXPECTED_LICENSE_TYPE: GPL-3.0 + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-license.ya?ml" + # See: https://github.com/licensee/licensee/blob/master/docs/what-we-look-at.md#detecting-the-license-file + - "[cC][oO][pP][yY][iI][nN][gG]*" + - "[cC][oO][pP][yY][rR][iI][gG][hH][tH]*" + - "[lL][iI][cC][eE][nN][cCsS][eE]*" + - "[oO][fF][lL]*" + - "[pP][aA][tT][eE][nN][tT][sS]*" + pull_request: + paths: + - ".github/workflows/check-license.ya?ml" + - "[cC][oO][pP][yY][iI][nN][gG]*" + - "[cC][oO][pP][yY][rR][iI][gG][hH][tH]*" + - "[lL][iI][cC][eE][nN][cCsS][eE]*" + - "[oO][fF][lL]*" + - "[pP][aA][tT][eE][nN][tT][sS]*" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 6 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check-license: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ruby # Install latest version + + - name: Install licensee + run: gem install licensee + + - name: Check license file + run: | + EXIT_STATUS=0 + # See: https://github.com/licensee/licensee + LICENSEE_OUTPUT="$(licensee detect --json --confidence=100)" + + DETECTED_LICENSE_FILE="$(echo "$LICENSEE_OUTPUT" | jq .matched_files[0].filename | tr --delete '\r')" + echo "Detected license file: $DETECTED_LICENSE_FILE" + if [ "$DETECTED_LICENSE_FILE" != "\"${EXPECTED_LICENSE_FILENAME}\"" ]; then + echo "::error file=${DETECTED_LICENSE_FILE}::detected license file $DETECTED_LICENSE_FILE doesn't match expected: $EXPECTED_LICENSE_FILENAME" + EXIT_STATUS=1 + fi + + DETECTED_LICENSE_TYPE="$(echo "$LICENSEE_OUTPUT" | jq .matched_files[0].matched_license | tr --delete '\r')" + echo "Detected license type: $DETECTED_LICENSE_TYPE" + if [ "$DETECTED_LICENSE_TYPE" != "\"${EXPECTED_LICENSE_TYPE}\"" ]; then + echo "::error file=${DETECTED_LICENSE_FILE}::detected license type $DETECTED_LICENSE_TYPE doesn't match expected \"${EXPECTED_LICENSE_TYPE}\"" + EXIT_STATUS=1 + fi + + exit $EXIT_STATUS diff --git a/README.md b/README.md index 0829a30..d8836ac 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Check Action Metadata status](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml) [![Check Files status](https://github.com/arduino/compile-sketches/actions/workflows/check-files-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-files-task.yml) [![Check General Formatting status](https://github.com/arduino/compile-sketches/actions/workflows/check-general-formatting-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-general-formatting-task.yml) +[![Check License status](https://github.com/arduino/compile-sketches/actions/workflows/check-license.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-license.ym [![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) [![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) [![Sync Labels status](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml) From 4d9fbe30f6b3e02fd52b23328461216d09c32291 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 04:31:13 -0700 Subject: [PATCH 077/100] Remove introductory text from license file The project is licensed under the GNU General Public License v3.0. In order for tools to be able to automatically identify the license type, it is essential for the license file to contain only the exact text of the license: https://choosealicense.com/licenses/gpl-3.0/# --- LICENSE.txt | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index fdb6383..f288702 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,17 +1,3 @@ -This file includes licensing information for Arduino GitHub Actions. - -Copyright (c) 2019 ARDUINO SA - -The software is released under the GNU General Public License, which covers the main body -of the [insert app name] code. The terms of this license can be found at: -https://www.gnu.org/licenses/gpl-3.0.en.html - -You can be released from the requirements of the above licenses by purchasing -a commercial license. Buying such a license is mandatory if you want to modify or -otherwise use the software for commercial activities involving the Arduino -software without disclosing the source code of your own applications. To purchase -a commercial license, send an email to license@arduino.cc - GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 From 62e80d31bed9f2270c06cfa93f84c895be1a7570 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 04:45:40 -0700 Subject: [PATCH 078/100] Add CI workflow to check Markdown files for problems On every push and pull request that affects relevant files, and periodically, check the repository's Markdown files for problems: - Use markdownlint to check for common problems and formatting. - Use markdown-link-check to check for broken links. The Arduino tooling Markdown style is defined by the `.markdownlint.yml` file. In the event the repository contains externally maintained Markdown files, markdownlint can be configured to ignore them via a `.markdownlintignore` file: https://github.com/igorshubovych/markdownlint-cli#ignoring-files markdown-link-check is configured via the `.markdown-link-check.json` file: https://github.com/tcort/markdown-link-check#config-file-format --- .github/workflows/check-markdown-task.yml | 112 +++ .markdown-link-check.json | 13 + .markdownlint.yml | 62 ++ .markdownlintignore | 4 + README.md | 1 + Taskfile.yml | 83 ++ package-lock.json | 1034 ++++++++++++++++++++- package.json | 4 +- 8 files changed, 1311 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/check-markdown-task.yml create mode 100644 .markdown-link-check.json create mode 100644 .markdownlint.yml create mode 100644 .markdownlintignore diff --git a/.github/workflows/check-markdown-task.yml b/.github/workflows/check-markdown-task.yml new file mode 100644 index 0000000..a2001a8 --- /dev/null +++ b/.github/workflows/check-markdown-task.yml @@ -0,0 +1,112 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-markdown-task.md +name: Check Markdown + +env: + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: 16.x + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-markdown-task.ya?ml" + - ".markdown-link-check.json" + - "package.json" + - "package-lock.json" + - "Taskfile.ya?ml" + - "**/.markdownlint*" + - "**.mdx?" + - "**.mkdn" + - "**.mdown" + - "**.markdown" + pull_request: + paths: + - ".github/workflows/check-markdown-task.ya?ml" + - ".markdown-link-check.json" + - "package.json" + - "package-lock.json" + - "Taskfile.ya?ml" + - "**/.markdownlint*" + - "**.mdx?" + - "**.mkdn" + - "**.mdown" + - "**.markdown" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage caused by external changes. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + lint: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Initialize markdownlint-cli problem matcher + uses: xt0rted/markdownlint-problem-matcher@v2 + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Lint + run: task markdown:lint + + links: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Check links + run: task --silent markdown:check-links diff --git a/.markdown-link-check.json b/.markdown-link-check.json new file mode 100644 index 0000000..c5e178d --- /dev/null +++ b/.markdown-link-check.json @@ -0,0 +1,13 @@ +{ + "httpHeaders": [ + { + "urls": ["https://docs.github.com/"], + "headers": { + "Accept-Encoding": "gzip, deflate, br" + } + } + ], + "retryOn429": true, + "retryCount": 3, + "aliveStatusCodes": [200, 206] +} diff --git a/.markdownlint.yml b/.markdownlint.yml new file mode 100644 index 0000000..65b6ef7 --- /dev/null +++ b/.markdownlint.yml @@ -0,0 +1,62 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-markdown/.markdownlint.yml +# See: https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md +# The code style defined in this file is the official standardized style to be used in all Arduino projects and should +# not be modified. +# Note: Rules disabled solely because they are redundant to Prettier are marked with a "Prettier" comment. + +default: false +MD001: false +MD002: false +MD003: false # Prettier +MD004: false # Prettier +MD005: false # Prettier +MD006: false # Prettier +MD007: false # Prettier +MD008: false # Prettier +MD009: + br_spaces: 0 + strict: true + list_item_empty_lines: false # Prettier +MD010: false # Prettier +MD011: true +MD012: false # Prettier +MD013: false +MD014: false +MD018: true +MD019: false # Prettier +MD020: true +MD021: false # Prettier +MD022: false # Prettier +MD023: false # Prettier +MD024: false +MD025: + level: 1 + front_matter_title: '^\s*"?title"?\s*[:=]' +MD026: false +MD027: false # Prettier +MD028: false +MD029: + style: one +MD030: + ul_single: 1 + ol_single: 1 + ul_multi: 1 + ol_multi: 1 +MD031: false # Prettier +MD032: false # Prettier +MD033: false +MD034: false +MD035: false # Prettier +MD036: false +MD037: true +MD038: true +MD039: true +MD040: false +MD041: false +MD042: true +MD043: false +MD044: false +MD045: true +MD046: + style: fenced +MD047: false # Prettier diff --git a/.markdownlintignore b/.markdownlintignore new file mode 100644 index 0000000..0022748 --- /dev/null +++ b/.markdownlintignore @@ -0,0 +1,4 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-markdown/.markdownlintignore +.licenses/ +__pycache__/ +node_modules/ diff --git a/README.md b/README.md index d8836ac..49739e0 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ [![Check Files status](https://github.com/arduino/compile-sketches/actions/workflows/check-files-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-files-task.yml) [![Check General Formatting status](https://github.com/arduino/compile-sketches/actions/workflows/check-general-formatting-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-general-formatting-task.yml) [![Check License status](https://github.com/arduino/compile-sketches/actions/workflows/check-license.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-license.ym +[![Check Markdown status](https://github.com/arduino/compile-sketches/actions/workflows/check-markdown-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-markdown-task.yml) [![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) [![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) [![Sync Labels status](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml) diff --git a/Taskfile.yml b/Taskfile.yml index 0756748..2704de1 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -11,6 +11,8 @@ tasks: - task: action:validate - task: general:check-formatting - task: general:check-spelling + - task: markdown:check-links + - task: markdown:lint - task: python:lint - task: python:test @@ -18,6 +20,7 @@ tasks: desc: Make automated corrections to the project's files deps: - task: general:correct-spelling + - task: markdown:fix - task: python:format # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-action-metadata-task/Taskfile.yml @@ -42,6 +45,11 @@ tasks: -s "{{.ACTION_METADATA_SCHEMA_PATH}}" \ -d "action.yml" + docs:generate: + desc: Create all generated documentation content + # This is an "umbrella" task used to call any documentation generation processes the project has. + # It can be left empty if there are none. + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-files-task/Taskfile.yml general:check-filenames: desc: Check for non-portable filenames @@ -171,6 +179,81 @@ tasks: cmds: - poetry run codespell --write-changes + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-markdown-task/Taskfile.yml + markdown:check-links: + desc: Check for broken links + deps: + - task: docs:generate + - task: npm:install-deps + cmds: + - | + if [[ "{{.OS}}" == "Windows_NT" ]]; then + # npx --call uses the native shell, which makes it too difficult to use npx for this application on Windows, + # so the Windows user is required to have markdown-link-check installed and in PATH. + if ! which markdown-link-check &>/dev/null; then + echo "markdown-link-check not found or not in PATH." + echo "Please install: https://github.com/tcort/markdown-link-check#readme" + exit 1 + fi + # Default behavior of the task on Windows is to exit the task when the first broken link causes a non-zero + # exit status, but it's better to check all links before exiting. + set +o errexit + STATUS=0 + # Using -regex instead of -name to avoid Task's behavior of globbing even when quoted on Windows + # The odd method for escaping . in the regex is required for windows compatibility because mvdan.cc/sh gives + # \ characters special treatment on Windows in an attempt to support them as path separators. + for file in $( + find . \ + -type d -name '.git' -prune -o \ + -type d -name '.licenses' -prune -o \ + -type d -name '__pycache__' -prune -o \ + -type d -name 'node_modules' -prune -o \ + -regex ".*[.]md" -print + ); do + markdown-link-check \ + --quiet \ + --config "./.markdown-link-check.json" \ + "$file" + STATUS=$(( $STATUS + $? )) + done + exit $STATUS + else + npx --package=markdown-link-check --call=' + STATUS=0 + for file in $( + find . \ + -type d -name '.git' -prune -o \ + -type d -name '.licenses' -prune -o \ + -type d -name '__pycache__' -prune -o \ + -type d -name 'node_modules' -prune -o \ + -regex ".*[.]md" -print + ); do + markdown-link-check \ + --quiet \ + --config "./.markdown-link-check.json" \ + "$file" + STATUS=$(( $STATUS + $? )) + done + exit $STATUS + ' + fi + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-markdown-task/Taskfile.yml + markdown:fix: + desc: Automatically correct linting violations in Markdown files where possible + deps: + - task: npm:install-deps + cmds: + - npx markdownlint-cli --fix "**/*.md" + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-markdown-task/Taskfile.yml + markdown:lint: + desc: Check for problems in Markdown files + deps: + - task: npm:install-deps + cmds: + - npx markdownlint-cli "**/*.md" + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/npm-task/Taskfile.yml npm:install-deps: desc: Install dependencies managed by npm diff --git a/package-lock.json b/package-lock.json index 635bfde..2563346 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,9 @@ "devDependencies": { "ajv-cli": "5.0.0", "ajv-formats": "2.1.1", - "github-label-sync": "2.3.1" + "github-label-sync": "2.3.1", + "markdown-link-check": "3.10.3", + "markdownlint-cli": "0.33.0" } }, "node_modules/@financial-times/origami-service-makefile": { @@ -156,6 +158,12 @@ "node": ">=0.8" } }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -198,6 +206,12 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -257,6 +271,44 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -308,6 +360,34 @@ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -320,6 +400,15 @@ "node": ">=0.10" } }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -374,6 +463,61 @@ "node": ">=0.4.0" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -384,6 +528,18 @@ "safer-buffer": "^2.1.0" } }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -486,6 +642,18 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -640,6 +808,34 @@ "node": ">=8" } }, + "node_modules/html-link-extractor": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-link-extractor/-/html-link-extractor-1.0.5.tgz", + "integrity": "sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==", + "dev": true, + "dependencies": { + "cheerio": "^1.0.0-rc.10" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -674,6 +870,27 @@ "node": ">=10.19.0" } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -690,6 +907,15 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/is": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", @@ -699,12 +925,51 @@ "node": "*" } }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-relative-url": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-4.0.0.tgz", + "integrity": "sha512-PkzoL1qKAYXNFct5IKdKRH/iBQou/oCC85QhXj6WKtUQBliZ4Yfd3Zk27RHu9KQG8r6zgvAA2AQKC9p+rqTszg==", + "dev": true, + "dependencies": { + "is-absolute-url": "^4.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, + "node_modules/isemail": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", + "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", + "dev": true, + "dependencies": { + "punycode": "2.x.x" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -775,6 +1040,12 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -799,6 +1070,33 @@ "json-buffer": "3.0.1" } }, + "node_modules/link-check": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/link-check/-/link-check-5.2.0.tgz", + "integrity": "sha512-xRbhYLaGDw7eRDTibTAcl6fXtmUQ13vkezQiTqshHHdGueQeumgxxmQMIOmJYsh2p8BF08t8thhDQ++EAOOq3w==", + "dev": true, + "dependencies": { + "is-relative-url": "^4.0.0", + "isemail": "^3.2.0", + "ms": "^2.1.3", + "needle": "^3.1.0" + } + }, + "node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "node_modules/lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -811,6 +1109,189 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdown-link-check": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/markdown-link-check/-/markdown-link-check-3.10.3.tgz", + "integrity": "sha512-uGdJiZOy1CVWlRe7CyBSJ0Gz80Xm4vt++xjX9sNFjB7qcAxLinaMmzFQ5xOwERaXC9mK770BhnqnsyJT1gTr9w==", + "dev": true, + "dependencies": { + "async": "^3.2.4", + "chalk": "^4.1.2", + "commander": "^6.2.0", + "link-check": "^5.2.0", + "lodash": "^4.17.21", + "markdown-link-extractor": "^3.1.0", + "needle": "^3.1.0", + "progress": "^2.0.3" + }, + "bin": { + "markdown-link-check": "markdown-link-check" + } + }, + "node_modules/markdown-link-extractor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/markdown-link-extractor/-/markdown-link-extractor-3.1.0.tgz", + "integrity": "sha512-r0NEbP1dsM+IqB62Ru9TXLP/HDaTdBNIeylYXumuBi6Xv4ufjE1/g3TnslYL8VNqNcGAGbMptQFHrrdfoZ/Sug==", + "dev": true, + "dependencies": { + "html-link-extractor": "^1.0.5", + "marked": "^4.1.0" + } + }, + "node_modules/markdownlint": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.27.0.tgz", + "integrity": "sha512-HtfVr/hzJJmE0C198F99JLaeada+646B5SaG2pVoEakLFI6iRGsvMqrnnrflq8hm1zQgwskEgqSnhDW11JBp0w==", + "dev": true, + "dependencies": { + "markdown-it": "13.0.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/markdownlint-cli": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.33.0.tgz", + "integrity": "sha512-zMK1oHpjYkhjO+94+ngARiBBrRDEUMzooDHBAHtmEIJ9oYddd9l3chCReY2mPlecwH7gflQp1ApilTo+o0zopQ==", + "dev": true, + "dependencies": { + "commander": "~9.4.1", + "get-stdin": "~9.0.0", + "glob": "~8.0.3", + "ignore": "~5.2.4", + "js-yaml": "^4.1.0", + "jsonc-parser": "~3.2.0", + "markdownlint": "~0.27.0", + "minimatch": "~5.1.2", + "run-con": "~1.2.11" + }, + "bin": { + "markdownlint": "markdownlint.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/markdownlint-cli/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/markdownlint-cli/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/markdownlint-cli/node_modules/commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/markdownlint-cli/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/markdownlint-cli/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/markdownlint-cli/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -865,6 +1346,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, "node_modules/node.extend": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", @@ -890,6 +1394,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -932,6 +1448,31 @@ "node": ">=12.20" } }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -947,6 +1488,15 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -1067,6 +1617,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/run-con": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.11.tgz", + "integrity": "sha512-NEMGsUT+cglWkzEr4IFK21P4Jca45HqiAbIIZIBdX5+UZTB24Mb/21iNGgz9xZa8tL6vbW7CXmq7MFN42+VjNQ==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~3.0.0", + "minimist": "^1.2.6", + "strip-json-comments": "~3.1.1" + }, + "bin": { + "run-con": "cli.js" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1093,6 +1658,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -1124,6 +1695,18 @@ "node": ">=0.10.0" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1167,6 +1750,12 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -1310,6 +1899,12 @@ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1349,6 +1944,12 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1396,6 +1997,35 @@ "supports-color": "^7.1.0" } }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1438,6 +2068,25 @@ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1447,6 +2096,15 @@ "assert-plus": "^1.0.0" } }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, "decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -1482,6 +2140,43 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1492,6 +2187,12 @@ "safer-buffer": "^2.1.0" } }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -1574,6 +2275,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true + }, "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -1689,6 +2396,27 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "html-link-extractor": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-link-extractor/-/html-link-extractor-1.0.5.tgz", + "integrity": "sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==", + "dev": true, + "requires": { + "cheerio": "^1.0.0-rc.10" + } + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -1716,6 +2444,21 @@ "resolve-alpn": "^1.2.0" } }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1732,18 +2475,48 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true + }, "is": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", "dev": true }, + "is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "dev": true + }, + "is-relative-url": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-4.0.0.tgz", + "integrity": "sha512-PkzoL1qKAYXNFct5IKdKRH/iBQou/oCC85QhXj6WKtUQBliZ4Yfd3Zk27RHu9KQG8r6zgvAA2AQKC9p+rqTszg==", + "dev": true, + "requires": { + "is-absolute-url": "^4.0.1" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, + "isemail": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", + "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", + "dev": true, + "requires": { + "punycode": "2.x.x" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -1805,6 +2578,12 @@ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -1826,12 +2605,184 @@ "json-buffer": "3.0.1" } }, + "link-check": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/link-check/-/link-check-5.2.0.tgz", + "integrity": "sha512-xRbhYLaGDw7eRDTibTAcl6fXtmUQ13vkezQiTqshHHdGueQeumgxxmQMIOmJYsh2p8BF08t8thhDQ++EAOOq3w==", + "dev": true, + "requires": { + "is-relative-url": "^4.0.0", + "isemail": "^3.2.0", + "ms": "^2.1.3", + "needle": "^3.1.0" + } + }, + "linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true }, + "markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true + } + } + }, + "markdown-link-check": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/markdown-link-check/-/markdown-link-check-3.10.3.tgz", + "integrity": "sha512-uGdJiZOy1CVWlRe7CyBSJ0Gz80Xm4vt++xjX9sNFjB7qcAxLinaMmzFQ5xOwERaXC9mK770BhnqnsyJT1gTr9w==", + "dev": true, + "requires": { + "async": "^3.2.4", + "chalk": "^4.1.2", + "commander": "^6.2.0", + "link-check": "^5.2.0", + "lodash": "^4.17.21", + "markdown-link-extractor": "^3.1.0", + "needle": "^3.1.0", + "progress": "^2.0.3" + } + }, + "markdown-link-extractor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/markdown-link-extractor/-/markdown-link-extractor-3.1.0.tgz", + "integrity": "sha512-r0NEbP1dsM+IqB62Ru9TXLP/HDaTdBNIeylYXumuBi6Xv4ufjE1/g3TnslYL8VNqNcGAGbMptQFHrrdfoZ/Sug==", + "dev": true, + "requires": { + "html-link-extractor": "^1.0.5", + "marked": "^4.1.0" + } + }, + "markdownlint": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.27.0.tgz", + "integrity": "sha512-HtfVr/hzJJmE0C198F99JLaeada+646B5SaG2pVoEakLFI6iRGsvMqrnnrflq8hm1zQgwskEgqSnhDW11JBp0w==", + "dev": true, + "requires": { + "markdown-it": "13.0.1" + } + }, + "markdownlint-cli": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.33.0.tgz", + "integrity": "sha512-zMK1oHpjYkhjO+94+ngARiBBrRDEUMzooDHBAHtmEIJ9oYddd9l3chCReY2mPlecwH7gflQp1ApilTo+o0zopQ==", + "dev": true, + "requires": { + "commander": "~9.4.1", + "get-stdin": "~9.0.0", + "glob": "~8.0.3", + "ignore": "~5.2.4", + "js-yaml": "^4.1.0", + "jsonc-parser": "~3.2.0", + "markdownlint": "~0.27.0", + "minimatch": "~5.1.2", + "run-con": "~1.2.11" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -1868,6 +2819,23 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + } + }, "node.extend": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", @@ -1884,6 +2852,15 @@ "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", "dev": true }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -1917,6 +2894,25 @@ "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -1929,6 +2925,12 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -2018,6 +3020,18 @@ "lowercase-keys": "^3.0.0" } }, + "run-con": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.11.tgz", + "integrity": "sha512-NEMGsUT+cglWkzEr4IFK21P4Jca45HqiAbIIZIBdX5+UZTB24Mb/21iNGgz9xZa8tL6vbW7CXmq7MFN42+VjNQ==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~3.0.0", + "minimist": "^1.2.6", + "strip-json-comments": "~3.1.1" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -2030,6 +3044,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -2053,6 +3073,12 @@ "tweetnacl": "~0.14.0" } }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2087,6 +3113,12 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/package.json b/package.json index 58eea90..eaad603 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,8 @@ "devDependencies": { "ajv-cli": "5.0.0", "ajv-formats": "2.1.1", - "github-label-sync": "2.3.1" + "github-label-sync": "2.3.1", + "markdown-link-check": "3.10.3", + "markdownlint-cli": "0.33.0" } } From f40204596c309aba0d26593fe93bb1c549de6149 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 04:53:37 -0700 Subject: [PATCH 079/100] Add infrastructure to check for problems with npm configuration files A task and GitHub Actions workflow are provided here for checking the project's npm package manager configuration. On every push and pull request that affects relevant files, and periodically: - Validate package.json against its JSON schema. - Check for forgotten package-lock.json syncs. --- .github/workflows/check-npm-task.yml | 103 +++++++++++++++++++++++++++ README.md | 1 + Taskfile.yml | 66 +++++++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 .github/workflows/check-npm-task.yml diff --git a/.github/workflows/check-npm-task.yml b/.github/workflows/check-npm-task.yml new file mode 100644 index 0000000..ba79f74 --- /dev/null +++ b/.github/workflows/check-npm-task.yml @@ -0,0 +1,103 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-npm-task.md +name: Check npm + +env: + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: 16.x + +# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-npm-task.ya?ml" + - "**/package.json" + - "**/package-lock.json" + - "Taskfile.ya?ml" + pull_request: + paths: + - ".github/workflows/check-npm-task.ya?ml" + - "**/package.json" + - "**/package-lock.json" + - "Taskfile.ya?ml" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage resulting from changes to the JSON schema. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +permissions: + contents: read + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + validate: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Validate package.json + run: task --silent npm:validate + + check-sync: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Install npm dependencies + run: task npm:install-deps + + - name: Check package-lock.json + run: git diff --color --exit-code package-lock.json diff --git a/README.md b/README.md index 49739e0..99caccd 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ [![Check General Formatting status](https://github.com/arduino/compile-sketches/actions/workflows/check-general-formatting-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-general-formatting-task.yml) [![Check License status](https://github.com/arduino/compile-sketches/actions/workflows/check-license.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-license.ym [![Check Markdown status](https://github.com/arduino/compile-sketches/actions/workflows/check-markdown-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-markdown-task.yml) +[![Check npm status](https://github.com/arduino/compile-sketches/actions/workflows/check-npm-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-npm-task.yml) [![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) [![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) [![Sync Labels status](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml) diff --git a/Taskfile.yml b/Taskfile.yml index 2704de1..14ca415 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -3,6 +3,8 @@ version: "3" vars: PYTHON_PROJECT_PATH: compilesketches + # Last version of ajv-cli with support for the JSON schema "Draft 4" specification + SCHEMA_DRAFT_4_AJV_CLI_VERSION: 3.3.0 tasks: check: @@ -261,6 +263,70 @@ tasks: cmds: - npm install + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-npm-task/Taskfile.yml + npm:validate: + desc: Validate npm configuration files against their JSON schema + vars: + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/package.json + SCHEMA_URL: https://json.schemastore.org/package.json + SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="package-json-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/ava.json + AVA_SCHEMA_URL: https://json.schemastore.org/ava.json + AVA_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="ava-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/eslintrc.json + ESLINTRC_SCHEMA_URL: https://json.schemastore.org/eslintrc.json + ESLINTRC_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="eslintrc-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/jscpd.json + JSCPD_SCHEMA_URL: https://json.schemastore.org/jscpd.json + JSCPD_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="jscpd-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/npm-badges.json + NPM_BADGES_SCHEMA_URL: https://json.schemastore.org/npm-badges.json + NPM_BADGES_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="npm-badges-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/prettierrc.json + PRETTIERRC_SCHEMA_URL: https://json.schemastore.org/prettierrc.json + PRETTIERRC_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="prettierrc-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/semantic-release.json + SEMANTIC_RELEASE_SCHEMA_URL: https://json.schemastore.org/semantic-release.json + SEMANTIC_RELEASE_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="semantic-release-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/stylelintrc.json + STYLELINTRC_SCHEMA_URL: https://json.schemastore.org/stylelintrc.json + STYLELINTRC_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="stylelintrc-schema-XXXXXXXXXX.json" + INSTANCE_PATH: "**/package.json" + PROJECT_FOLDER: + sh: pwd + WORKING_FOLDER: + sh: task utility:mktemp-folder TEMPLATE="dependabot-validate-XXXXXXXXXX" + cmds: + - wget --quiet --output-document="{{.SCHEMA_PATH}}" {{.SCHEMA_URL}} + - wget --quiet --output-document="{{.AVA_SCHEMA_PATH}}" {{.AVA_SCHEMA_URL}} + - wget --quiet --output-document="{{.ESLINTRC_SCHEMA_PATH}}" {{.ESLINTRC_SCHEMA_URL}} + - wget --quiet --output-document="{{.JSCPD_SCHEMA_PATH}}" {{.JSCPD_SCHEMA_URL}} + - wget --quiet --output-document="{{.NPM_BADGES_SCHEMA_PATH}}" {{.NPM_BADGES_SCHEMA_URL}} + - wget --quiet --output-document="{{.PRETTIERRC_SCHEMA_PATH}}" {{.PRETTIERRC_SCHEMA_URL}} + - wget --quiet --output-document="{{.SEMANTIC_RELEASE_SCHEMA_PATH}}" {{.SEMANTIC_RELEASE_SCHEMA_URL}} + - wget --quiet --output-document="{{.STYLELINTRC_SCHEMA_PATH}}" {{.STYLELINTRC_SCHEMA_URL}} + - | + cd "{{.WORKING_FOLDER}}" # Workaround for https://github.com/npm/cli/issues/3210 + npx ajv-cli@{{.SCHEMA_DRAFT_4_AJV_CLI_VERSION}} validate \ + --all-errors \ + -s "{{.SCHEMA_PATH}}" \ + -r "{{.AVA_SCHEMA_PATH}}" \ + -r "{{.ESLINTRC_SCHEMA_PATH}}" \ + -r "{{.JSCPD_SCHEMA_PATH}}" \ + -r "{{.NPM_BADGES_SCHEMA_PATH}}" \ + -r "{{.PRETTIERRC_SCHEMA_PATH}}" \ + -r "{{.SEMANTIC_RELEASE_SCHEMA_PATH}}" \ + -r "{{.STYLELINTRC_SCHEMA_PATH}}" \ + -d "{{.PROJECT_FOLDER}}/{{.INSTANCE_PATH}}" + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/poetry-task/Taskfile.yml poetry:install-deps: desc: Install dependencies managed by Poetry From 7a24ee5d20b688521ae8319ad5777f20bbbe521b Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 05:01:29 -0700 Subject: [PATCH 080/100] Add npm configuration validation task to umbrella "check" task --- Taskfile.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Taskfile.yml b/Taskfile.yml index 14ca415..1afc337 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -15,6 +15,7 @@ tasks: - task: general:check-spelling - task: markdown:check-links - task: markdown:lint + - task: npm:validate - task: python:lint - task: python:test From df6f43327cf4d36fe7731a5a61bf32457b721de5 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 05:05:09 -0700 Subject: [PATCH 081/100] Add infrastructure to check for Prettier formatting compliance A task and GitHub Actions workflow are provided here for formatting the project's files using the Prettier code formatter tool. On every push and pull request that affects relevant files, the GitHub Actions workflow will check whether the formatting of supported files is compliant with the Prettier style. --- .../check-prettier-formatting-task.yml | 257 ++++++++++++++++++ .prettierignore | 4 + README.md | 1 + Taskfile.yml | 9 + package-lock.json | 24 +- package.json | 3 +- 6 files changed, 296 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/check-prettier-formatting-task.yml create mode 100644 .prettierignore diff --git a/.github/workflows/check-prettier-formatting-task.yml b/.github/workflows/check-prettier-formatting-task.yml new file mode 100644 index 0000000..d999002 --- /dev/null +++ b/.github/workflows/check-prettier-formatting-task.yml @@ -0,0 +1,257 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-prettier-formatting-task.md +name: Check Prettier Formatting + +env: + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: 16.x + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-prettier-formatting-task.ya?ml" + - "Taskfile.ya?ml" + - "**/.prettierignore" + - "**/.prettierrc*" + # CSS + - "**.css" + - "**.wxss" + # PostCSS + - "**.pcss" + - "**.postcss" + # Less + - "**.less" + # SCSS + - "**.scss" + # GraphQL + - "**.graphqls?" + - "**.gql" + # handlebars + - "**.handlebars" + - "**.hbs" + # HTML + - "**.mjml" + - "**.html?" + - "**.html.hl" + - "**.st" + - "**.xht" + - "**.xhtml" + # Vue + - "**.vue" + # JavaScript + - "**.flow" + - "**._?jsb?" + - "**.bones" + - "**.cjs" + - "**.es6?" + - "**.frag" + - "**.gs" + - "**.jake" + - "**.jscad" + - "**.jsfl" + - "**.js[ms]" + - "**.[mn]js" + - "**.pac" + - "**.wxs" + - "**.[xs]s?js" + - "**.xsjslib" + # JSX + - "**.jsx" + # TypeScript + - "**.ts" + # TSX + - "**.tsx" + # JSON + - "**/.eslintrc" + - "**.json" + - "**.avsc" + - "**.geojson" + - "**.gltf" + - "**.har" + - "**.ice" + - "**.JSON-tmLanguage" + - "**.mcmeta" + - "**.tfstate" + - "**.topojson" + - "**.webapp" + - "**.webmanifest" + - "**.yyp?" + # JSONC + - "**/.babelrc" + - "**/.jscsrc" + - "**/.js[hl]intrc" + - "**.jsonc" + - "**.sublime-*" + # JSON5 + - "**.json5" + # Markdown + - "**.mdx?" + - "**.markdown" + - "**.mk?down" + - "**.mdwn" + - "**.mkdn?" + - "**.ronn" + - "**.workbook" + # YAML + - "**/.clang-format" + - "**/.clang-tidy" + - "**/.gemrc" + - "**/glide.lock" + - "**.ya?ml*" + - "**.mir" + - "**.reek" + - "**.rviz" + - "**.sublime-syntax" + - "**.syntax" + pull_request: + paths: + - ".github/workflows/check-prettier-formatting-task.ya?ml" + - "Taskfile.ya?ml" + - "**/.prettierignore" + - "**/.prettierrc*" + # CSS + - "**.css" + - "**.wxss" + # PostCSS + - "**.pcss" + - "**.postcss" + # Less + - "**.less" + # SCSS + - "**.scss" + # GraphQL + - "**.graphqls?" + - "**.gql" + # handlebars + - "**.handlebars" + - "**.hbs" + # HTML + - "**.mjml" + - "**.html?" + - "**.html.hl" + - "**.st" + - "**.xht" + - "**.xhtml" + # Vue + - "**.vue" + # JavaScript + - "**.flow" + - "**._?jsb?" + - "**.bones" + - "**.cjs" + - "**.es6?" + - "**.frag" + - "**.gs" + - "**.jake" + - "**.jscad" + - "**.jsfl" + - "**.js[ms]" + - "**.[mn]js" + - "**.pac" + - "**.wxs" + - "**.[xs]s?js" + - "**.xsjslib" + # JSX + - "**.jsx" + # TypeScript + - "**.ts" + # TSX + - "**.tsx" + # JSON + - "**/.eslintrc" + - "**.json" + - "**.avsc" + - "**.geojson" + - "**.gltf" + - "**.har" + - "**.ice" + - "**.JSON-tmLanguage" + - "**.mcmeta" + - "**.tfstate" + - "**.topojson" + - "**.webapp" + - "**.webmanifest" + - "**.yyp?" + # JSONC + - "**/.babelrc" + - "**/.jscsrc" + - "**/.js[hl]intrc" + - "**.jsonc" + - "**.sublime-*" + # JSON5 + - "**.json5" + # Markdown + - "**.mdx?" + - "**.markdown" + - "**.mk?down" + - "**.mdwn" + - "**.mkdn?" + - "**.ronn" + - "**.workbook" + # YAML + - "**/.clang-format" + - "**/.clang-tidy" + - "**/.gemrc" + - "**/glide.lock" + - "**.ya?ml*" + - "**.mir" + - "**.reek" + - "**.rviz" + - "**.sublime-syntax" + - "**.syntax" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 4 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Format with Prettier + run: task general:format-prettier + + - name: Check formatting + run: git diff --color --exit-code diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..bbb5e44 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +.licenses/ +.pytest_cache/ +__pycache__/ +node_modules/ diff --git a/README.md b/README.md index 99caccd..1e0a35b 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ [![Check License status](https://github.com/arduino/compile-sketches/actions/workflows/check-license.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-license.ym [![Check Markdown status](https://github.com/arduino/compile-sketches/actions/workflows/check-markdown-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-markdown-task.yml) [![Check npm status](https://github.com/arduino/compile-sketches/actions/workflows/check-npm-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-npm-task.yml) +[![Check Prettier Formatting status](https://github.com/arduino/compile-sketches/actions/workflows/check-prettier-formatting-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-prettier-formatting-task.yml) [![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) [![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) [![Sync Labels status](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml) diff --git a/Taskfile.yml b/Taskfile.yml index 1afc337..7d5c6d2 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -23,6 +23,7 @@ tasks: desc: Make automated corrections to the project's files deps: - task: general:correct-spelling + - task: general:format-prettier - task: markdown:fix - task: python:format @@ -182,6 +183,14 @@ tasks: cmds: - poetry run codespell --write-changes + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-prettier-formatting-task/Taskfile.yml + general:format-prettier: + desc: Format all supported files with Prettier + deps: + - task: npm:install-deps + cmds: + - npx prettier --write . + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-markdown-task/Taskfile.yml markdown:check-links: desc: Check for broken links diff --git a/package-lock.json b/package-lock.json index 2563346..84df16d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "ajv-formats": "2.1.1", "github-label-sync": "2.3.1", "markdown-link-check": "3.10.3", - "markdownlint-cli": "0.33.0" + "markdownlint-cli": "0.33.0", + "prettier": "2.8.6" } }, "node_modules/@financial-times/origami-service-makefile": { @@ -1488,6 +1489,21 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, + "node_modules/prettier": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz", + "integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -2925,6 +2941,12 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, + "prettier": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz", + "integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==", + "dev": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", diff --git a/package.json b/package.json index eaad603..3bec71f 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "ajv-formats": "2.1.1", "github-label-sync": "2.3.1", "markdown-link-check": "3.10.3", - "markdownlint-cli": "0.33.0" + "markdownlint-cli": "0.33.0", + "prettier": "2.8.6" } } From d48ac55d01fbf78b78ed0c47158117a9fd6a9091 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 05:07:00 -0700 Subject: [PATCH 082/100] Bring all files into Prettier formatting style compliance --- .github/workflows/test-integration.yml | 35 ++++++++----------- README.md | 18 +++++++--- action.yml | 48 +++++++++++++------------- 3 files changed, 53 insertions(+), 48 deletions(-) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index bd9fcfd..e7c0c8f 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -3,29 +3,29 @@ name: Run integration tests on: pull_request: paths: - - '.github/workflows/test-integration.yml' - - '.github/workflows/testdata/**' - - '.python-version' - - 'poetry.lock' - - 'pyproject.toml' - - 'action.yml' - - 'compilesketches/**' + - ".github/workflows/test-integration.yml" + - ".github/workflows/testdata/**" + - ".python-version" + - "poetry.lock" + - "pyproject.toml" + - "action.yml" + - "compilesketches/**" push: paths: - - '.github/workflows/test-integration.yml' - - '.github/workflows/testdata/**' - - '.python-version' - - 'poetry.lock' - - 'pyproject.toml' - - 'action.yml' - - 'compilesketches/**' + - ".github/workflows/test-integration.yml" + - ".github/workflows/testdata/**" + - ".python-version" + - "poetry.lock" + - "pyproject.toml" + - "action.yml" + - "compilesketches/**" env: SKETCHES_REPORTS_PATH: sketches-reports TESTDATA_PLATFORMS_PATH: .github/workflows/testdata/platforms TESTDATA_SKETCHES_PATH: .github/workflows/testdata/sketches - TESTDATA_REPORTS_PATH: .github/workflows/testdata/reports + TESTDATA_REPORTS_PATH: .github/workflows/testdata/reports jobs: default-inputs: @@ -48,7 +48,6 @@ jobs: # Use action from local path uses: ./extras/compile-sketches - all-inputs: runs-on: ubuntu-latest @@ -119,7 +118,6 @@ jobs: outputs: report-artifact-name: ${{ steps.report-artifact-name.outputs.report-artifact-name }} - multiple-steps: name: multiple-steps (${{ matrix.board.source-type }}) runs-on: ubuntu-latest @@ -239,7 +237,6 @@ jobs: sketch-paths: | - ${{ env.TESTDATA_SKETCHES_PATH }}/BareMinimum - # Targeted testing for ESP32 boards platform support. pyserial-dependency: runs-on: ubuntu-latest @@ -269,7 +266,6 @@ jobs: sketch-paths: | - ${{ env.TESTDATA_SKETCHES_PATH }}/BareMinimum - check-sketches-reports: needs: all-inputs runs-on: ubuntu-latest @@ -333,7 +329,6 @@ jobs: exit $EXIT_STATUS - expected-failed-compilation: runs-on: ubuntu-latest diff --git a/README.md b/README.md index 1e0a35b..fcc6bc0 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,7 @@ If the board is from one of the platforms provided by Arduino's [default package If a platform dependency from a non-Boards Manager source of the same name as another Boards Manager source platform dependency is defined, they will both be installed, with the non-Boards Manager dependency overwriting the Boards Manager platform installation. This permits testing against a non-release version of a platform while using Boards Manager to install the platform's tools dependencies. Example: + ```yaml platforms: | # Install the latest release of Arduino SAMD Boards and its toolchain via Boards Manager @@ -85,6 +86,7 @@ platforms: | ##### Boards Manager Keys: + - **`name`** - (**required**) platform name in the form of `VENDOR:ARCHITECTURE` (e.g., `arduino:avr`). - **`version`** - version of the platform to install. - **Default**: the latest version. @@ -94,14 +96,16 @@ Keys: ##### Local path Keys: + - **`source-path`** - (**required**) path to install as a platform. Relative paths are assumed to be relative to the root of the repository. - **`name`** - (**required**) platform name in the form of `VENDOR:ARCHITECTURE` (e.g., `arduino:avr`). ##### Repository Keys: + - **`source-url`** - (**required**) URL to clone the repository from. It must start with `git://` or end with `.git`. -- **`name`** - (**required**) platform name in the form of `VENDOR:ARCHITECTURE` (e.g., `arduino:avr`). +- **`name`** - (**required**) platform name in the form of `VENDOR:ARCHITECTURE` (e.g., `arduino:avr`). - **`version`** - [Git ref](https://git-scm.com/book/en/v2/Git-Internals-Git-References) of the repository to checkout. The special version name `latest` will cause the latest tag to be used. - **Default**: the repository is checked out to the tip of the default branch. - **`source-path`** - path to install as a platform. Paths are relative to the root of the repository. @@ -110,8 +114,9 @@ Keys: ##### Archive download Keys: -- **`source-url`** - (**required**) download URL for the archive (e.g., `https://github.com/arduino/ArduinoCore-avr/archive/master.zip`). -- **`name`** - (**required**) platform name in the form of `VENDOR:ARCHITECTURE` (e.g., `arduino:avr`). + +- **`source-url`** - (**required**) download URL for the archive (e.g., `https://github.com/arduino/ArduinoCore-avr/archive/master.zip`). +- **`name`** - (**required**) platform name in the form of `VENDOR:ARCHITECTURE` (e.g., `arduino:avr`). - **`source-path`** - path to install as a platform. Paths are relative to the root folder of the archive, or the root of the archive if it has no root folder. - **Default**: root folder of the archive. @@ -131,17 +136,20 @@ Libraries are installed under the Arduino user folder at `~/Arduino/libraries`. ##### Library Manager Keys: + - **`name`** - (**required**) name of the library, as defined in the `name` field of its [library.properties](https://arduino.github.io/arduino-cli/latest/library-specification/#libraryproperties-file-format) metadata file. - **`version`** - version of the library to install. - **Default**: the latest version. **Notes**: + - The library will be installed to a folder matching its name, but with any spaces replaced by `_`. - If the library's author defined dependencies, those libraries will be installed automatically. ##### Local path Keys: + - **`source-path`** - (**required**) path to install as a library. Relative paths are assumed to be relative to the root of the repository. - **`destination-name`** - folder name to install the library to. - **Default**: the folder will be named according to the source repository or subfolder name. @@ -149,6 +157,7 @@ Keys: ##### Repository Keys: + - **`source-url`** - (**required**) URL to clone the repository from. It must start with `git://` or end with `.git`. - **`version`** - [Git ref](https://git-scm.com/book/en/v2/Git-Internals-Git-References) of the repository to checkout. The special version name `latest` will cause the latest tag to be used. - **Default**: the tip of the default branch. @@ -160,6 +169,7 @@ Keys: ##### Archive download Keys: + - **`source-url`** - (**required**) download URL for the archive (e.g., `https://github.com/arduino-libraries/Servo/archive/master.zip`). - **`source-path`** - path to install as a library. Paths are relative to the root folder of the archive, or the root of the archive if it has no root folder. - **Default**: root folder of the archive. @@ -229,7 +239,7 @@ Set to `true` to cause the action to record the compiler warning count for each ```yaml - uses: arduino/compile-sketches@v1 with: - fqbn: 'arduino:avr:uno' + fqbn: "arduino:avr:uno" libraries: | - name: Servo - name: Stepper diff --git a/action.yml b/action.yml index 1ca43d2..735e0c8 100644 --- a/action.yml +++ b/action.yml @@ -1,49 +1,49 @@ -name: 'Compile Arduino Sketches' -description: 'Checks whether Arduino sketches will compile and produces a report of data from the compilations' +name: "Compile Arduino Sketches" +description: "Checks whether Arduino sketches will compile and produces a report of data from the compilations" inputs: cli-version: - description: 'Version of Arduino CLI to use when building' - default: 'latest' + description: "Version of Arduino CLI to use when building" + default: "latest" required: true fqbn: - description: 'Full qualified board name, with Boards Manager URL if needed' - default: 'arduino:avr:uno' + description: "Full qualified board name, with Boards Manager URL if needed" + default: "arduino:avr:uno" required: true libraries: - description: 'YAML-format list of library dependencies to install' - default: '- source-path: ./' + description: "YAML-format list of library dependencies to install" + default: "- source-path: ./" required: true platforms: - description: 'YAML-format list of platform dependencies to install' - default: '' + description: "YAML-format list of platform dependencies to install" + default: "" required: true sketch-paths: - description: 'YAML-format list of paths containing sketches to compile.' - default: '- examples' + description: "YAML-format list of paths containing sketches to compile." + default: "- examples" required: true cli-compile-flags: - description: 'YAML-format list of flags to add to the Arduino CLI sketch compilation command.' - default: '' + description: "YAML-format list of flags to add to the Arduino CLI sketch compilation command." + default: "" required: false verbose: - description: 'Set to true to show verbose output in the log' - default: 'false' + description: "Set to true to show verbose output in the log" + default: "false" required: true sketches-report-path: - description: 'Path in which to save a JSON formatted file containing data from the sketch compilations' - default: 'sketches-reports' + description: "Path in which to save a JSON formatted file containing data from the sketch compilations" + default: "sketches-reports" required: true github-token: - description: 'GitHub access token used to get information from the GitHub API. Only needed if you are using the deltas report feature in a private repository.' - default: '' + description: "GitHub access token used to get information from the GitHub API. Only needed if you are using the deltas report feature in a private repository." + default: "" required: true enable-deltas-report: - description: 'Set to true to cause the action to determine the change in memory usage and compiler warnings of the compiled sketches between the head and base refs of a PR and the immediate parent commit of a push' - default: 'false' + description: "Set to true to cause the action to determine the change in memory usage and compiler warnings of the compiled sketches between the head and base refs of a PR and the immediate parent commit of a push" + default: "false" required: true enable-warnings-report: - description: 'Set to true to cause the action to record the compiler warning count for each sketch compilation in the sketches report' - default: 'false' + description: "Set to true to cause the action to record the compiler warning count for each sketch compilation in the sketches report" + default: "false" required: true runs: From b5705ff82b0696f5dae5bdef1376dde87d3813a6 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 05:15:17 -0700 Subject: [PATCH 083/100] Add CI workflow to validate Taskfiles On every push or pull request that affects the repository's Taskfiles, and periodically, validate them against the JSON schema. --- .github/workflows/check-taskfiles.yml | 97 +++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 98 insertions(+) create mode 100644 .github/workflows/check-taskfiles.yml diff --git a/.github/workflows/check-taskfiles.yml b/.github/workflows/check-taskfiles.yml new file mode 100644 index 0000000..22edd45 --- /dev/null +++ b/.github/workflows/check-taskfiles.yml @@ -0,0 +1,97 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-taskfiles.md +name: Check Taskfiles + +env: + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: 16.x + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-taskfiles.ya?ml" + - "package.json" + - "package-lock.json" + - "**/Taskfile.ya?ml" + pull_request: + paths: + - ".github/workflows/check-taskfiles.ya?ml" + - "package.json" + - "package-lock.json" + - "**/Taskfile.ya?ml" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage resulting from changes to the JSON schema. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + validate: + name: Validate ${{ matrix.file }} + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + strategy: + fail-fast: false + + matrix: + file: + - ./**/Taskfile.yml + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Download JSON schema for Taskfiles + id: download-schema + uses: carlosperate/download-file-action@v2 + with: + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/taskfile.json + file-url: https://taskfile.dev/schema.json + location: ${{ runner.temp }}/taskfile-schema + + - name: Install JSON schema validator + run: npm install + + - name: Validate ${{ matrix.file }} + run: | + # See: https://github.com/ajv-validator/ajv-cli#readme + npx \ + --package=ajv-cli \ + --package=ajv-formats \ + ajv validate \ + --all-errors \ + --strict=false \ + -c ajv-formats \ + -s "${{ steps.download-schema.outputs.file-path }}" \ + -d "${{ matrix.file }}" diff --git a/README.md b/README.md index fcc6bc0..6e87919 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ [![Check npm status](https://github.com/arduino/compile-sketches/actions/workflows/check-npm-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-npm-task.yml) [![Check Prettier Formatting status](https://github.com/arduino/compile-sketches/actions/workflows/check-prettier-formatting-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-prettier-formatting-task.yml) [![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) +[![Check Taskfiles status](https://github.com/arduino/compile-sketches/actions/workflows/check-taskfiles.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-taskfiles.yml) [![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) [![Sync Labels status](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml) [![Test Python status](https://github.com/arduino/compile-sketches/actions/workflows/test-python-poetry-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/test-python-poetry-task.yml) From ee9a057b492110666e91ce8b0668ee0dc2959316 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 05:23:57 -0700 Subject: [PATCH 084/100] Add infrastructure for maintaining the table of contents A task and GitHub Actions workflow are provided here for for maintaining the the table of contents in the project's readme. The `markdown:toc` task automatically updates the table of contents to match the contents of the readme. On every push or pull request that affects the repository's Markdown files that contain a generated table of contents, the GitHub Actions workflow checks whether the table of contents matches the file structure. --- .github/workflows/check-toc-task.yml | 90 +++ README.md | 1 + Taskfile.yml | 17 + package-lock.json | 1024 ++++++++++++++++++++++++++ package.json | 1 + 5 files changed, 1133 insertions(+) create mode 100644 .github/workflows/check-toc-task.yml diff --git a/.github/workflows/check-toc-task.yml b/.github/workflows/check-toc-task.yml new file mode 100644 index 0000000..854f93e --- /dev/null +++ b/.github/workflows/check-toc-task.yml @@ -0,0 +1,90 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-toc-task.md +name: Check ToC + +env: + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: 16.x + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-toc-task.ya?ml" + - "package.json" + - "package-lock.json" + - "README.md" + pull_request: + paths: + - ".github/workflows/check-toc-task.ya?ml" + - "package.json" + - "package-lock.json" + - "README.md" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 3 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check: + name: ${{ matrix.file.name }} + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + strategy: + fail-fast: false + + matrix: + file: + - name: README.md + # Max ToC depth, for use with the markdown-toc --maxdepth flag. + maxdepth: 5 + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Rebuild ToC + run: | + task markdown:toc \ + FILE_PATH="${{ github.workspace }}/${{ matrix.file.name }}" \ + MAX_DEPTH=${{ matrix.file.maxdepth }} + + - name: Check ToC + run: git diff --color --exit-code diff --git a/README.md b/README.md index 6e87919..a227e6c 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ [![Check Prettier Formatting status](https://github.com/arduino/compile-sketches/actions/workflows/check-prettier-formatting-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-prettier-formatting-task.yml) [![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) [![Check Taskfiles status](https://github.com/arduino/compile-sketches/actions/workflows/check-taskfiles.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-taskfiles.yml) +[![Check ToC status](https://github.com/arduino/compile-sketches/actions/workflows/check-toc-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-toc-task.yml) [![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) [![Sync Labels status](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml) [![Test Python status](https://github.com/arduino/compile-sketches/actions/workflows/test-python-poetry-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/test-python-poetry-task.yml) diff --git a/Taskfile.yml b/Taskfile.yml index 7d5c6d2..9f0ccf4 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -25,6 +25,10 @@ tasks: - task: general:correct-spelling - task: general:format-prettier - task: markdown:fix + - task: markdown:toc + vars: + FILE_PATH: README.md + MAX_DEPTH: 5 - task: python:format # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-action-metadata-task/Taskfile.yml @@ -266,6 +270,19 @@ tasks: cmds: - npx markdownlint-cli "**/*.md" + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-toc-task/Taskfile.yml + markdown:toc: + desc: Update the table of contents + deps: + - task: npm:install-deps + cmds: + - | + npx markdown-toc \ + --bullets=- \ + --maxdepth={{.MAX_DEPTH}} \ + -i \ + "{{.FILE_PATH}}" + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/npm-task/Taskfile.yml npm:install-deps: desc: Install dependencies managed by npm diff --git a/package-lock.json b/package-lock.json index 84df16d..62f7a36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "ajv-formats": "2.1.1", "github-label-sync": "2.3.1", "markdown-link-check": "3.10.3", + "markdown-toc": "1.2.0", "markdownlint-cli": "0.33.0", "prettier": "2.8.6" } @@ -108,6 +109,18 @@ } } }, + "node_modules/ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -123,6 +136,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -171,6 +193,15 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/autolinker": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", + "integrity": "sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==", + "dev": true, + "dependencies": { + "gulp-header": "^1.7.1" + } + }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -223,6 +254,12 @@ "concat-map": "0.0.1" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, "node_modules/cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", @@ -310,6 +347,20 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", + "dev": true, + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -355,6 +406,30 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -464,6 +539,15 @@ "node": ">=0.4.0" } }, + "node_modules/diacritics-map": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", + "integrity": "sha512-3omnDTYrGigU0i4cJjvaKwD52B8aoqyX/NEIkukFFkogBemsIbhSa1O414fpTp5nuszJG6lvQ5vBvDVNCbSsaQ==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -554,12 +638,36 @@ "node": ">=4" } }, + "node_modules/expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dev": true, + "dependencies": { + "fill-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -599,6 +707,31 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "dependencies": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -743,6 +876,34 @@ "url": "https://github.com/sindresorhus/got?sponsor=1" } }, + "node_modules/gray-matter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", + "integrity": "sha512-vbmvP1Fe/fxuT2QuLVcqb2BfK7upGhhbLIt9/owWEvPYrZZEkelLcq2HqzxosV+PQ67dUFLaAeNpH7C4hhICAA==", + "dev": true, + "dependencies": { + "ansi-red": "^0.1.1", + "coffee-script": "^1.12.4", + "extend-shallow": "^2.0.1", + "js-yaml": "^3.8.1", + "toml": "^2.3.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-header": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", + "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", + "deprecated": "Removed event-stream from gulp-header", + "dev": true, + "dependencies": { + "concat-with-sourcemaps": "*", + "lodash.template": "^4.4.0", + "through2": "^2.0.0" + } + }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -938,6 +1099,54 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-relative-url": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-4.0.0.tgz", @@ -959,6 +1168,12 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, "node_modules/isemail": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", @@ -971,6 +1186,18 @@ "node": ">=4.0.0" } }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -1071,6 +1298,30 @@ "json-buffer": "3.0.1" } }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==", + "dev": true, + "dependencies": { + "set-getter": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/link-check": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/link-check/-/link-check-5.2.0.tgz", @@ -1092,12 +1343,52 @@ "uc.micro": "^1.0.1" } }, + "node_modules/list-item": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", + "integrity": "sha512-S3D0WZ4J6hyM8o5SNKWaMYB1ALSacPZ2nHGEuCjmHZ+dc03gFeNZoNDcqfcnO4vDhTZmNrqrpYZCdXsRh22bzw==", + "dev": true, + "dependencies": { + "expand-range": "^1.8.1", + "extend-shallow": "^2.0.1", + "is-number": "^2.1.0", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, "node_modules/lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -1144,6 +1435,15 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/markdown-link": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", + "integrity": "sha512-TurLymbyLyo+kAUUAV9ggR9EPcDjP/ctlv9QAFiqUH7c+t6FlsbivPo9OKTU8xdOx9oNd2drW/Fi5RRElQbUqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/markdown-link-check": { "version": "3.10.3", "resolved": "https://registry.npmjs.org/markdown-link-check/-/markdown-link-check-3.10.3.tgz", @@ -1173,6 +1473,32 @@ "marked": "^4.1.0" } }, + "node_modules/markdown-toc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.2", + "diacritics-map": "^0.1.0", + "gray-matter": "^2.1.0", + "lazy-cache": "^2.0.2", + "list-item": "^1.1.1", + "markdown-link": "^0.1.1", + "minimist": "^1.2.0", + "mixin-deep": "^1.1.3", + "object.pick": "^1.2.0", + "remarkable": "^1.7.1", + "repeat-string": "^1.6.1", + "strip-color": "^0.1.0" + }, + "bin": { + "markdown-toc": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/markdownlint": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.27.0.tgz", @@ -1287,6 +1613,12 @@ "node": ">= 12" } }, + "node_modules/math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", @@ -1347,6 +1679,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -1416,6 +1773,27 @@ "node": "*" } }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/octonode": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/octonode/-/octonode-0.10.2.tgz", @@ -1504,6 +1882,12 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -1549,6 +1933,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "dependencies": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/randombytes": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", @@ -1571,6 +1987,61 @@ "node": "*" } }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/remarkable": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", + "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", + "dev": true, + "dependencies": { + "argparse": "^1.0.10", + "autolinker": "~0.28.0" + }, + "bin": { + "remarkable": "bin/remarkable.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -1680,6 +2151,27 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "node_modules/set-getter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", + "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", + "dev": true, + "dependencies": { + "to-object-path": "^0.3.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -1711,6 +2203,30 @@ "node": ">=0.10.0" } }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/strip-color": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", + "integrity": "sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -1735,6 +2251,34 @@ "node": ">=8" } }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toml": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", + "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==", + "dev": true + }, "node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -1766,6 +2310,12 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -1781,6 +2331,12 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -1810,6 +2366,15 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } } }, "dependencies": { @@ -1876,6 +2441,15 @@ "ajv": "^8.0.0" } }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1885,6 +2459,12 @@ "color-convert": "^2.0.1" } }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1927,6 +2507,15 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "autolinker": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", + "integrity": "sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==", + "dev": true, + "requires": { + "gulp-header": "^1.7.1" + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -1976,6 +2565,12 @@ "concat-map": "0.0.1" } }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, "cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", @@ -2042,6 +2637,12 @@ "domutils": "^3.0.1" } }, + "coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "dev": true + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2078,6 +2679,27 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -2156,6 +2778,12 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, + "diacritics-map": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", + "integrity": "sha512-3omnDTYrGigU0i4cJjvaKwD52B8aoqyX/NEIkukFFkogBemsIbhSa1O414fpTp5nuszJG6lvQ5vBvDVNCbSsaQ==", + "dev": true + }, "dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -2215,12 +2843,30 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -2256,6 +2902,25 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -2361,6 +3026,30 @@ "responselike": "^3.0.0" } }, + "gray-matter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", + "integrity": "sha512-vbmvP1Fe/fxuT2QuLVcqb2BfK7upGhhbLIt9/owWEvPYrZZEkelLcq2HqzxosV+PQ67dUFLaAeNpH7C4hhICAA==", + "dev": true, + "requires": { + "ansi-red": "^0.1.1", + "coffee-script": "^1.12.4", + "extend-shallow": "^2.0.1", + "js-yaml": "^3.8.1", + "toml": "^2.3.2" + } + }, + "gulp-header": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", + "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", + "dev": true, + "requires": { + "concat-with-sourcemaps": "*", + "lodash.template": "^4.4.0", + "through2": "^2.0.0" + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -2509,6 +3198,44 @@ "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", "dev": true }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, "is-relative-url": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-4.0.0.tgz", @@ -2524,6 +3251,12 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, "isemail": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", @@ -2533,6 +3266,15 @@ "punycode": "2.x.x" } }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -2621,6 +3363,24 @@ "json-buffer": "3.0.1" } }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==", + "dev": true, + "requires": { + "set-getter": "^0.1.0" + } + }, "link-check": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/link-check/-/link-check-5.2.0.tgz", @@ -2642,12 +3402,49 @@ "uc.micro": "^1.0.1" } }, + "list-item": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", + "integrity": "sha512-S3D0WZ4J6hyM8o5SNKWaMYB1ALSacPZ2nHGEuCjmHZ+dc03gFeNZoNDcqfcnO4vDhTZmNrqrpYZCdXsRh22bzw==", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "extend-shallow": "^2.0.1", + "is-number": "^2.1.0", + "repeat-string": "^1.5.2" + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, "lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -2681,6 +3478,12 @@ } } }, + "markdown-link": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", + "integrity": "sha512-TurLymbyLyo+kAUUAV9ggR9EPcDjP/ctlv9QAFiqUH7c+t6FlsbivPo9OKTU8xdOx9oNd2drW/Fi5RRElQbUqA==", + "dev": true + }, "markdown-link-check": { "version": "3.10.3", "resolved": "https://registry.npmjs.org/markdown-link-check/-/markdown-link-check-3.10.3.tgz", @@ -2707,6 +3510,26 @@ "marked": "^4.1.0" } }, + "markdown-toc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "dev": true, + "requires": { + "concat-stream": "^1.5.2", + "diacritics-map": "^0.1.0", + "gray-matter": "^2.1.0", + "lazy-cache": "^2.0.2", + "list-item": "^1.1.1", + "markdown-link": "^0.1.1", + "minimist": "^1.2.0", + "mixin-deep": "^1.1.3", + "object.pick": "^1.2.0", + "remarkable": "^1.7.1", + "repeat-string": "^1.6.1", + "strip-color": "^0.1.0" + } + }, "markdownlint": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.27.0.tgz", @@ -2793,6 +3616,12 @@ "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", @@ -2835,6 +3664,27 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2883,6 +3733,23 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, "octonode": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/octonode/-/octonode-0.10.2.tgz", @@ -2947,6 +3814,12 @@ "integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==", "dev": true }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -2977,6 +3850,31 @@ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, "randombytes": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", @@ -2993,6 +3891,51 @@ "randombytes": "2.0.3" } }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "remarkable": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", + "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", + "dev": true, + "requires": { + "argparse": "^1.0.10", + "autolinker": "~0.28.0" + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -3072,6 +4015,21 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "set-getter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", + "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", + "dev": true, + "requires": { + "to-object-path": "^0.3.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -3095,6 +4053,29 @@ "tweetnacl": "~0.14.0" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "strip-color": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", + "integrity": "sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3110,6 +4091,31 @@ "has-flag": "^4.0.0" } }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "toml": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", + "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==", + "dev": true + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -3135,6 +4141,12 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -3150,6 +4162,12 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -3172,6 +4190,12 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true } } } diff --git a/package.json b/package.json index 3bec71f..6294816 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "ajv-formats": "2.1.1", "github-label-sync": "2.3.1", "markdown-link-check": "3.10.3", + "markdown-toc": "1.2.0", "markdownlint-cli": "0.33.0", "prettier": "2.8.6" } From 1c1267e8ef1227b53d977653ebe02b9196a1bdbd Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 05:36:41 -0700 Subject: [PATCH 085/100] Add infrastructure to validate GitHub Actions workflows A task and GitHub Actions workflow are provided here for validating the project's GitHub Actions workflows. On every push or pull request that affects the repository's GitHub Actions workflows, and periodically, the workflow will validate them against the JSON schema. --- .github/workflows/check-workflows-task.yml | 48 ++++++++++++++++++++++ README.md | 1 + Taskfile.yml | 29 +++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 .github/workflows/check-workflows-task.yml diff --git a/.github/workflows/check-workflows-task.yml b/.github/workflows/check-workflows-task.yml new file mode 100644 index 0000000..635ae04 --- /dev/null +++ b/.github/workflows/check-workflows-task.yml @@ -0,0 +1,48 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-workflows-task.md +name: Check Workflows + +env: + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: 16.x + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + push: + paths: + - ".github/workflows/*.ya?ml" + - "package.json" + - "package-lock.json" + - "Taskfile.ya?ml" + pull_request: + paths: + - ".github/workflows/*.ya?ml" + - "package.json" + - "package-lock.json" + - "Taskfile.ya?ml" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage resulting from changes to the JSON schema. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + validate: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Validate workflows + run: task --silent ci:validate diff --git a/README.md b/README.md index a227e6c..4000c7c 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ [![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) [![Check Taskfiles status](https://github.com/arduino/compile-sketches/actions/workflows/check-taskfiles.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-taskfiles.yml) [![Check ToC status](https://github.com/arduino/compile-sketches/actions/workflows/check-toc-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-toc-task.yml) +[![Check Workflows status](https://github.com/arduino/compile-sketches/actions/workflows/check-workflows-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-workflows-task.yml) [![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) [![Sync Labels status](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml) [![Test Python status](https://github.com/arduino/compile-sketches/actions/workflows/test-python-poetry-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/test-python-poetry-task.yml) diff --git a/Taskfile.yml b/Taskfile.yml index 9f0ccf4..922c172 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -11,6 +11,7 @@ tasks: desc: Check for problems with the project deps: - task: action:validate + - task: ci:validate - task: general:check-formatting - task: general:check-spelling - task: markdown:check-links @@ -53,6 +54,34 @@ tasks: -s "{{.ACTION_METADATA_SCHEMA_PATH}}" \ -d "action.yml" + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-workflows-task/Taskfile.yml + ci:validate: + desc: Validate GitHub Actions workflows against their JSON schema + vars: + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/github-workflow.json + WORKFLOW_SCHEMA_URL: https://json.schemastore.org/github-workflow + WORKFLOW_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="workflow-schema-XXXXXXXXXX.json" + WORKFLOWS_DATA_PATH: "./.github/workflows/*.{yml,yaml}" + deps: + - task: npm:install-deps + cmds: + - | + wget \ + --quiet \ + --output-document="{{.WORKFLOW_SCHEMA_PATH}}" \ + {{.WORKFLOW_SCHEMA_URL}} + - | + npx \ + --package=ajv-cli \ + --package=ajv-formats \ + ajv validate \ + --all-errors \ + --strict=false \ + -c ajv-formats \ + -s "{{.WORKFLOW_SCHEMA_PATH}}" \ + -d "{{.WORKFLOWS_DATA_PATH}}" + docs:generate: desc: Create all generated documentation content # This is an "umbrella" task used to call any documentation generation processes the project has. From 262ae70b184f0ea6fe79bd6759ac1250ccf3d3be Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 05:49:09 -0700 Subject: [PATCH 086/100] Update Poetry lockfile --- poetry.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2b612ec..bbb6eb2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. [[package]] name = "attrs" @@ -933,5 +933,5 @@ files = [ [metadata] lock-version = "2.0" -python-versions = "~3.11" +python-versions = "3.11.2" content-hash = "90bcf233ee68f28be781628ee2739f788d357c921b75a07c5a71cec0359b3490" From ed4618284b2a6e1bc878b0bc2fd4aaa5077ca876 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 05:50:46 -0700 Subject: [PATCH 087/100] Add infrastructure to lint YAML files A task and GitHub Actions workflow are provided here for linting the project's YAML files. On every push and pull request that affects relevant files, the worflow will run yamllint to check the YAML files of the repository for issues. The .yamllint.yml file is used to configure yamllint: https://yamllint.readthedocs.io/en/stable/configuration.html --- .github/workflows/check-yaml-task.yml | 115 ++++++++++++++++++++++++++ .yamllint.yml | 76 +++++++++++++++++ README.md | 1 + Taskfile.yml | 11 +++ poetry.lock | 35 +++++++- pyproject.toml | 1 + 6 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/check-yaml-task.yml create mode 100644 .yamllint.yml diff --git a/.github/workflows/check-yaml-task.yml b/.github/workflows/check-yaml-task.yml new file mode 100644 index 0000000..6d0dc56 --- /dev/null +++ b/.github/workflows/check-yaml-task.yml @@ -0,0 +1,115 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-yaml-task.md +name: Check YAML + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".python-version" + - ".yamllint*" + - "poetry.lock" + - "pyproject.toml" + # Source: https://github.com/ikatyang/linguist-languages/blob/master/data/YAML.json (used by Prettier) + - "**/.clang-format" + - "**/.clang-tidy" + - "**/.gemrc" + - "**/glide.lock" + - "**.ya?ml*" + - "**.mir" + - "**.reek" + - "**.rviz" + - "**.sublime-syntax" + - "**.syntax" + pull_request: + paths: + - ".python-version" + - ".yamllint*" + - "poetry.lock" + - "pyproject.toml" + # Source: https://github.com/ikatyang/linguist-languages/blob/master/data/YAML.json (used by Prettier) + - "**/.clang-format" + - "**/.clang-tidy" + - "**/.gemrc" + - "**/glide.lock" + - "**.ya?ml*" + - "**.mir" + - "**.reek" + - "**.rviz" + - "**.sublime-syntax" + - "**.syntax" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 9 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check: + name: ${{ matrix.configuration.name }} + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + strategy: + fail-fast: false + + matrix: + configuration: + - name: Generate problem matcher output + # yamllint's "github" output type produces annotated diffs, but is not useful to humans reading the log. + format: github + # The other matrix job is used to set the result, so this job is configured to always pass. + continue-on-error: true + - name: Check formatting + # yamllint's "colored" output type is most suitable for humans reading the log. + format: colored + continue-on-error: false + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Python + uses: actions/setup-python@v4 + with: + python-version-file: .python-version + + - name: Install Poetry + run: | + pipx install \ + --python "$(which python)" \ + poetry + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Check YAML + continue-on-error: ${{ matrix.configuration.continue-on-error }} + run: task yaml:lint YAMLLINT_FORMAT=${{ matrix.configuration.format }} diff --git a/.yamllint.yml b/.yamllint.yml new file mode 100644 index 0000000..67630dc --- /dev/null +++ b/.yamllint.yml @@ -0,0 +1,76 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-yaml/.yamllint.yml +# See: https://yamllint.readthedocs.io/en/stable/configuration.html +# The code style defined in this file is the official standardized style to be used in all Arduino tooling projects and +# should not be modified. +# Note: Rules disabled solely because they are redundant to Prettier are marked with a "Prettier" comment. + +rules: + braces: + level: error + forbid: non-empty + min-spaces-inside: -1 # Prettier + max-spaces-inside: -1 # Prettier + min-spaces-inside-empty: -1 # Prettier + max-spaces-inside-empty: -1 # Prettier + brackets: + level: error + forbid: non-empty + min-spaces-inside: -1 # Prettier + max-spaces-inside: -1 # Prettier + min-spaces-inside-empty: -1 # Prettier + max-spaces-inside-empty: -1 # Prettier + colons: disable # Prettier + commas: disable # Prettier + comments: disable # Prettier + comments-indentation: disable # Prettier + document-end: disable # Prettier + document-start: disable + empty-lines: disable # Prettier + empty-values: disable + hyphens: disable # Prettier + indentation: disable # Prettier + key-duplicates: disable # Prettier + key-ordering: disable + line-length: + level: warning + max: 120 + allow-non-breakable-words: true + allow-non-breakable-inline-mappings: true + new-line-at-end-of-file: disable # Prettier + new-lines: disable # Prettier + octal-values: + level: warning + forbid-implicit-octal: true + forbid-explicit-octal: false + quoted-strings: disable + trailing-spaces: disable # Prettier + truthy: + level: error + allowed-values: + - "true" + - "false" + - "on" # Used by GitHub Actions as a workflow key. + check-keys: true + +yaml-files: + # Source: https://github.com/ikatyang/linguist-languages/blob/master/data/YAML.json (used by Prettier) + - ".clang-format" + - ".clang-tidy" + - ".gemrc" + - ".yamllint" + - "glide.lock" + - "*.yml" + - "*.mir" + - "*.reek" + - "*.rviz" + - "*.sublime-syntax" + - "*.syntax" + - "*.yaml" + - "*.yaml-tmlanguage" + - "*.yaml.sed" + - "*.yml.mysql" + +ignore: | + /.git/ + __pycache__/ + node_modules/ diff --git a/README.md b/README.md index 4000c7c..c91cfa9 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ [![Check Taskfiles status](https://github.com/arduino/compile-sketches/actions/workflows/check-taskfiles.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-taskfiles.yml) [![Check ToC status](https://github.com/arduino/compile-sketches/actions/workflows/check-toc-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-toc-task.yml) [![Check Workflows status](https://github.com/arduino/compile-sketches/actions/workflows/check-workflows-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-workflows-task.yml) +[![Check YAML status](https://github.com/arduino/compile-sketches/actions/workflows/check-yaml-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-yaml-task.yml) [![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) [![Sync Labels status](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml) [![Test Python status](https://github.com/arduino/compile-sketches/actions/workflows/test-python-poetry-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/test-python-poetry-task.yml) diff --git a/Taskfile.yml b/Taskfile.yml index 922c172..3ee780b 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -19,6 +19,7 @@ tasks: - task: npm:validate - task: python:lint - task: python:test + - task: yaml:lint fix: desc: Make automated corrections to the project's files @@ -474,3 +475,13 @@ tasks: else echo "{{.RAW_PATH}}" fi + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-yaml-task/Taskfile.yml + yaml:lint: + desc: Check for problems with YAML files + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev + cmds: + - poetry run yamllint --format {{default "colored" .YAMLLINT_FORMAT}} . diff --git a/poetry.lock b/poetry.lock index bbb6eb2..c6577dd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -817,6 +817,23 @@ files = [ {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, ] +[[package]] +name = "setuptools" +version = "67.6.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-67.6.0-py3-none-any.whl", hash = "sha256:b78aaa36f6b90a074c1fa651168723acbf45d14cb1196b6f02c0fd07f17623b2"}, + {file = "setuptools-67.6.0.tar.gz", hash = "sha256:2ee892cd5f29f3373097f5a814697e397cf3ce313616df0af11231e2ad118077"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "smmap" version = "5.0.0" @@ -931,7 +948,23 @@ files = [ {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, ] +[[package]] +name = "yamllint" +version = "1.30.0" +description = "A linter for YAML files." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yamllint-1.30.0.tar.gz", hash = "sha256:4f58f323aedda16189a489d183ecc25c66d7a9cc0fe88f61b650fef167b13190"}, +] + +[package.dependencies] +pathspec = ">=0.5.3" +pyyaml = "*" +setuptools = "*" + [metadata] lock-version = "2.0" python-versions = "3.11.2" -content-hash = "90bcf233ee68f28be781628ee2739f788d357c921b75a07c5a71cec0359b3490" +content-hash = "f6d4dd084ff2e5f98adb604b0fd1d6ffeb5b7977666a8a2adecdc5540c4e0e78" diff --git a/pyproject.toml b/pyproject.toml index dd24ab2..21b1a7b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,6 +22,7 @@ pytest = "7.2.2" pytest-mock = "3.10.0" flake8 = "6.0.0" pep8-naming = "0.13.3" +yamllint = "1.30.0" [tool.poetry.group.external] # Provided only for use by boards platforms From 401d68bef7bd2bd3a0f62fe6b5c9d409ecfe3caa Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 06:08:50 -0700 Subject: [PATCH 088/100] Reduce excessive line lengths in YAML files where possible The project uses a standardized target line length of 120 for YAML files. In some cases it is not feasible to meet that target, but other lines were unnecessarily long. --- .github/workflows/test-integration.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index e7c0c8f..5b5e337 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -300,8 +300,12 @@ jobs: jq \ --null-input \ --exit-status \ - --slurpfile generated "$reportPath" \ - --slurpfile golden "${{ env.TESTDATA_REPORTS_PATH }}/${{ needs.all-inputs.outputs.report-artifact-name }}/$(basename "$reportPath")" \ + --slurpfile \ + generated \ + "$reportPath" \ + --slurpfile \ + golden \ + "${{ env.TESTDATA_REPORTS_PATH }}/${{ needs.all-inputs.outputs.report-artifact-name }}/$(basename "$reportPath")" \ '($generated|.[0].boards) == ($golden|.[0].boards)' ) && ( # Check the commit_hash value From 0096b9e75d9aa424097663a778d48f4f6735cf5e Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 18:52:05 -0700 Subject: [PATCH 089/100] Reduce excessive line lengths in YAML files where possible The project uses a standardized target line length of 120 for YAML files. In some cases it is not feasible to meet that target, but other lines were unnecessarily long. --- action.yml | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/action.yml b/action.yml index 735e0c8..4a261ee 100644 --- a/action.yml +++ b/action.yml @@ -1,48 +1,64 @@ name: "Compile Arduino Sketches" -description: "Checks whether Arduino sketches will compile and produces a report of data from the compilations" +description: >- + Checks whether Arduino sketches will compile and produces a report of data from the compilations inputs: cli-version: - description: "Version of Arduino CLI to use when building" + description: >- + Version of Arduino CLI to use when building default: "latest" required: true fqbn: - description: "Full qualified board name, with Boards Manager URL if needed" + description: >- + Full qualified board name, with Boards Manager URL if needed default: "arduino:avr:uno" required: true libraries: - description: "YAML-format list of library dependencies to install" + description: >- + YAML-format list of library dependencies to install default: "- source-path: ./" required: true platforms: - description: "YAML-format list of platform dependencies to install" + description: >- + YAML-format list of platform dependencies to install default: "" required: true sketch-paths: - description: "YAML-format list of paths containing sketches to compile." + description: >- + YAML-format list of paths containing sketches to compile. default: "- examples" required: true cli-compile-flags: - description: "YAML-format list of flags to add to the Arduino CLI sketch compilation command." + description: >- + YAML-format list of flags to add to the Arduino CLI sketch compilation command. default: "" required: false verbose: - description: "Set to true to show verbose output in the log" + description: >- + Set to true to show verbose output in the log default: "false" required: true sketches-report-path: - description: "Path in which to save a JSON formatted file containing data from the sketch compilations" + description: >- + Path in which to save a JSON formatted file containing data from the sketch compilations default: "sketches-reports" required: true github-token: - description: "GitHub access token used to get information from the GitHub API. Only needed if you are using the deltas report feature in a private repository." + description: >- + GitHub access token used to get information from the GitHub API. + + Only needed if you are using the deltas report feature in a private repository. default: "" required: true enable-deltas-report: - description: "Set to true to cause the action to determine the change in memory usage and compiler warnings of the compiled sketches between the head and base refs of a PR and the immediate parent commit of a push" + description: >- + Set to true to cause the action to determine the change in memory usage and compiler warnings of the compiled + sketches between the head and base refs of a PR and the immediate parent commit of a push default: "false" required: true enable-warnings-report: - description: "Set to true to cause the action to record the compiler warning count for each sketch compilation in the sketches report" + description: >- + Set to true to cause the action to record the compiler warning count for each sketch compilation in the sketches + report default: "false" required: true From 9086e7c5aacd464d487e745c55f432d1b5a7eeda Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 19:38:36 -0700 Subject: [PATCH 090/100] Fix badge markup in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c91cfa9..55689b0 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Check Action Metadata status](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml) [![Check Files status](https://github.com/arduino/compile-sketches/actions/workflows/check-files-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-files-task.yml) [![Check General Formatting status](https://github.com/arduino/compile-sketches/actions/workflows/check-general-formatting-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-general-formatting-task.yml) -[![Check License status](https://github.com/arduino/compile-sketches/actions/workflows/check-license.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-license.ym +[![Check License status](https://github.com/arduino/compile-sketches/actions/workflows/check-license.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-license.yml) [![Check Markdown status](https://github.com/arduino/compile-sketches/actions/workflows/check-markdown-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-markdown-task.yml) [![Check npm status](https://github.com/arduino/compile-sketches/actions/workflows/check-npm-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-npm-task.yml) [![Check Prettier Formatting status](https://github.com/arduino/compile-sketches/actions/workflows/check-prettier-formatting-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-prettier-formatting-task.yml) From 1c8eb8387ee88998abc3f041fa44f42f7958d313 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 25 Mar 2023 19:38:57 -0700 Subject: [PATCH 091/100] Use correct syntax for empty YAML sequence Unlike the other inputs (`platforms`, `sketch-paths`) that take a "sequence" (AKA array, list) type YAML document as input, because a sketch may have no library dependencies it is valid and common to pass an empty sequence via the `libraries` input. Due to the need to maintain backwards compatibility with the original short-sighted design of the action API, which didn't consider the action being used with any project type other than libraries, it is necessary for the user to do this in their workflow rather than simply omitting the `libraries` input. Previously the documentation and tests used "-" for this purpose. That is supported, but is not an empty sequence, but rather a sequence consisting of a single null element. The only way to specify an empty sequence in YAML is `[]`. --- .github/workflows/test-integration.yml | 4 ++-- README.md | 2 +- compilesketches/tests/test_compilesketches.py | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 5b5e337..9602dcc 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -72,7 +72,7 @@ jobs: libraries: | # The official Servo library is not compatible with ESP8266, but that platform has a bundled Servo lib # so there are no library dependencies - - + [] steps: - name: Checkout @@ -348,7 +348,7 @@ jobs: fqbn: arduino:avr:uno github-token: ${{ secrets.GITHUB_TOKEN }} libraries: | - - + [] sketch-paths: | - ${{ env.TESTDATA_SKETCHES_PATH }}/Error diff --git a/README.md b/README.md index 55689b0..f9d2c5c 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ Keys: [YAML](https://en.wikipedia.org/wiki/YAML)-format list of library dependencies to install. **Default**: `"- source-path: ./"` -This causes the repository to be installed as a library. If there are no library dependencies and you want to override the default, set the `libraries` input to an empty list (`- libraries: '-'`). +This causes the repository to be installed as a library. If there are no library dependencies and you want to override the default, set the `libraries` input to an empty list (`- libraries: '[]'`). Libraries are installed under the Arduino user folder at `~/Arduino/libraries`. diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index 21f51df..47ef73f 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -1070,6 +1070,7 @@ def __init__(self): [], ), ("-", [], [], [], []), + ("[]", [], [], [], []), ( "- " + compilesketches.CompileSketches.dependency_name_key + ": foo", [{compilesketches.CompileSketches.dependency_name_key: "foo"}], From 78f615124bf9cfcb1f08837ac5ae6156bb9824a5 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 26 Mar 2023 21:52:23 -0700 Subject: [PATCH 092/100] Fix release branch regex for the project's release branch format The project uses the standard GitHub Actions convention of providing a major version ref. A branch with the format `v` is used for that purpose. These release branches may contain a subset of the history of the default branch. Although most often this would mirror the history on the `main` branch, in some cases it might be beneficial to cherry-pick the commits ready for release to the release branch, excluding other commits that are not yet ready for release. The status of the GitHub Actions workflows should be evaluated before making a release. However, this is not so simple as checking the status of the commit at the tip of the release branch. The reason is that, for the sake of efficiency, the workflows are configured to run only when the processes are relevant to the trigger event (e.g., no need to run unit tests for a change to the readme). In the case of the default branch, you can simply set the workflow runs filter to that branch and then check the result of the latest run of each workflow of interest. However, that was not possible to do with the release branch since it might be that the workflow was never run in that branch. The status of the latest run of the workflow in the default branch might not match the status for the release branch if the release branch does not contain the full history. For this reason, it will be helpful to trigger all relevant workflows on the creation of a release branch. This will ensure that each of those workflows will always have at least one run in the release branch. Subsequent commits pushed to the branch can run based on their usual trigger filters and the status of the latest run of each workflow in the branch will provide an accurate indication of the state of that branch. Branches are created for purposes other than releases, most notably feature branches to stage work for a pull request. Because the collection of workflows in a Tooling project are often very comprehensive, it would not be convenient or efficient to run them on the creation of every feature branch. Unfortunately, GitHub Actions does not support filters on the `create` event of branch creation like it does for the `push` and `pull_request` events. There is support for a `branches` filter of the `push` event, but that filter is an AND to the `paths` filter and this application requires an OR. For this reason, the workflows must be triggered by the creation of any branch. The unwanted job runs are prevented by adding a `run-determination` job with the branch filter handled by Bash commands. The other jobs of the workflow use this `run-determination` job as a dependency, only running when it indicates they should via a job output. Because this minimal `run-determination` job runs very quickly, it is roughly equivalent to the workflow having been skipped entirely for non-release branch creations. This approach has been in use for some time already in the versioned "Deploy Website" workflows. Previously the regular expression used to identify release branches used the `..x` format that is standard in non-action tooling projects, but wrong for this project. --- .github/workflows/check-action-metadata-task.yml | 2 +- .github/workflows/check-files-task.yml | 2 +- .github/workflows/check-general-formatting-task.yml | 2 +- .github/workflows/check-license.yml | 2 +- .github/workflows/check-markdown-task.yml | 2 +- .github/workflows/check-npm-task.yml | 2 +- .github/workflows/check-prettier-formatting-task.yml | 2 +- .github/workflows/check-python-task.yml | 2 +- .github/workflows/check-taskfiles.yml | 2 +- .github/workflows/check-toc-task.yml | 2 +- .github/workflows/check-yaml-task.yml | 2 +- .github/workflows/spell-check-task.yml | 2 +- .github/workflows/test-python-poetry-task.yml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/check-action-metadata-task.yml b/.github/workflows/check-action-metadata-task.yml index 8eca242..9042a6c 100644 --- a/.github/workflows/check-action-metadata-task.yml +++ b/.github/workflows/check-action-metadata-task.yml @@ -37,7 +37,7 @@ jobs: - name: Determine if the rest of the workflow should run id: determination run: | - RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. if [[ "${{ github.event_name }}" != "create" || diff --git a/.github/workflows/check-files-task.yml b/.github/workflows/check-files-task.yml index bb5690e..f037d2b 100644 --- a/.github/workflows/check-files-task.yml +++ b/.github/workflows/check-files-task.yml @@ -21,7 +21,7 @@ jobs: - name: Determine if the rest of the workflow should run id: determination run: | - RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. if [[ "${{ github.event_name }}" != "create" || diff --git a/.github/workflows/check-general-formatting-task.yml b/.github/workflows/check-general-formatting-task.yml index 7a19a41..f94b8eb 100644 --- a/.github/workflows/check-general-formatting-task.yml +++ b/.github/workflows/check-general-formatting-task.yml @@ -21,7 +21,7 @@ jobs: - name: Determine if the rest of the workflow should run id: determination run: | - RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. if [[ "${{ github.event_name }}" != "create" || diff --git a/.github/workflows/check-license.yml b/.github/workflows/check-license.yml index 4492bcc..4930f43 100644 --- a/.github/workflows/check-license.yml +++ b/.github/workflows/check-license.yml @@ -41,7 +41,7 @@ jobs: - name: Determine if the rest of the workflow should run id: determination run: | - RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. if [[ "${{ github.event_name }}" != "create" || diff --git a/.github/workflows/check-markdown-task.yml b/.github/workflows/check-markdown-task.yml index a2001a8..e7fc928 100644 --- a/.github/workflows/check-markdown-task.yml +++ b/.github/workflows/check-markdown-task.yml @@ -47,7 +47,7 @@ jobs: - name: Determine if the rest of the workflow should run id: determination run: | - RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. if [[ "${{ github.event_name }}" != "create" || diff --git a/.github/workflows/check-npm-task.yml b/.github/workflows/check-npm-task.yml index ba79f74..a688e2d 100644 --- a/.github/workflows/check-npm-task.yml +++ b/.github/workflows/check-npm-task.yml @@ -38,7 +38,7 @@ jobs: - name: Determine if the rest of the workflow should run id: determination run: | - RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. if [[ "${{ github.event_name }}" != "create" || diff --git a/.github/workflows/check-prettier-formatting-task.yml b/.github/workflows/check-prettier-formatting-task.yml index d999002..6144295 100644 --- a/.github/workflows/check-prettier-formatting-task.yml +++ b/.github/workflows/check-prettier-formatting-task.yml @@ -215,7 +215,7 @@ jobs: - name: Determine if the rest of the workflow should run id: determination run: | - RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. if [[ "${{ github.event_name }}" != "create" || diff --git a/.github/workflows/check-python-task.yml b/.github/workflows/check-python-task.yml index 17a5e72..4d50695 100644 --- a/.github/workflows/check-python-task.yml +++ b/.github/workflows/check-python-task.yml @@ -41,7 +41,7 @@ jobs: - name: Determine if the rest of the workflow should run id: determination run: | - RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. if [[ "${{ github.event_name }}" != "create" || diff --git a/.github/workflows/check-taskfiles.yml b/.github/workflows/check-taskfiles.yml index 22edd45..ad96a93 100644 --- a/.github/workflows/check-taskfiles.yml +++ b/.github/workflows/check-taskfiles.yml @@ -35,7 +35,7 @@ jobs: - name: Determine if the rest of the workflow should run id: determination run: | - RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. if [[ "${{ github.event_name }}" != "create" || diff --git a/.github/workflows/check-toc-task.yml b/.github/workflows/check-toc-task.yml index 854f93e..f5a45f0 100644 --- a/.github/workflows/check-toc-task.yml +++ b/.github/workflows/check-toc-task.yml @@ -35,7 +35,7 @@ jobs: - name: Determine if the rest of the workflow should run id: determination run: | - RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. if [[ "${{ github.event_name }}" != "create" || diff --git a/.github/workflows/check-yaml-task.yml b/.github/workflows/check-yaml-task.yml index 6d0dc56..e44625a 100644 --- a/.github/workflows/check-yaml-task.yml +++ b/.github/workflows/check-yaml-task.yml @@ -53,7 +53,7 @@ jobs: - name: Determine if the rest of the workflow should run id: determination run: | - RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. if [[ "${{ github.event_name }}" != "create" || diff --git a/.github/workflows/spell-check-task.yml b/.github/workflows/spell-check-task.yml index 20a3958..27c24c2 100644 --- a/.github/workflows/spell-check-task.yml +++ b/.github/workflows/spell-check-task.yml @@ -21,7 +21,7 @@ jobs: - name: Determine if the rest of the workflow should run id: determination run: | - RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. if [[ "${{ github.event_name }}" != "create" || diff --git a/.github/workflows/test-python-poetry-task.yml b/.github/workflows/test-python-poetry-task.yml index 3feb0ea..9d09176 100644 --- a/.github/workflows/test-python-poetry-task.yml +++ b/.github/workflows/test-python-poetry-task.yml @@ -43,7 +43,7 @@ jobs: - name: Determine if the rest of the workflow should run id: determination run: | - RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. if [[ "${{ github.event_name }}" != "create" || From ee5bec1345e3ce6b5e6e392638a7d8b2af02560b Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 26 Mar 2023 21:59:05 -0700 Subject: [PATCH 093/100] Run integration test workflow on release branch creation The project uses the standard GitHub Actions convention of providing a major version ref. A branch is used for that purpose. These release branches may contain a subset of the history of the default branch. Although most often this would mirror the history on the `main` branch, in some cases it might be beneficial to cherry-pick the commits ready for release to the release branch, excluding other commits that are not yet ready for release. The status of the GitHub Actions workflows should be evaluated before making a release. However, this is not so simple as checking the status of the commit at the tip of the release branch. The reason is that, for the sake of efficiency, the workflows are configured to run only when the processes are relevant to the trigger event (e.g., no need to run unit tests for a change to the readme). In the case of the default branch, you can simply set the workflow runs filter to that branch and then check the result of the latest run of each workflow of interest. However, that was not possible to do with the release branch since it might be that the workflow was never run in that branch. The status of the latest run of the workflow in the default branch might not match the status for the release branch if the release branch does not contain the full history. For this reason, it will be helpful to trigger all relevant workflows on the creation of a release branch. This will ensure that each of those workflows will always have at least one run in the release branch. Subsequent commits pushed to the branch can run based on their usual trigger filters and the status of the latest run of each workflow in the branch will provide an accurate indication of the state of that branch. Branches are created for purposes other than releases, most notably feature branches to stage work for a pull request. Because the collection of workflows in a Tooling project are often very comprehensive, it would not be convenient or efficient to run them on the creation of every feature branch. Unfortunately, GitHub Actions does not support filters on the `create` event of branch creation like it does for the `push` and `pull_request` events. There is support for a `branches` filter of the `push` event, but that filter is an AND to the `paths` filter and this application requires an OR. For this reason, the workflows must be triggered by the creation of any branch. The unwanted job runs are prevented by adding a `run-determination` job with the branch filter handled by Bash commands. The other jobs of the workflow use this `run-determination` job as a dependency, only running when it indicates they should via a job output. Because this minimal `run-determination` job runs very quickly, it is roughly equivalent to the workflow having been skipped entirely for non-release branch creations. --- .github/workflows/test-integration.yml | 42 +++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 9602dcc..490bda1 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -1,6 +1,8 @@ name: Run integration tests on: + create: + pull_request: paths: - ".github/workflows/test-integration.yml" @@ -28,7 +30,32 @@ env: TESTDATA_REPORTS_PATH: .github/workflows/testdata/reports jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + default-inputs: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' runs-on: ubuntu-latest steps: @@ -49,6 +76,8 @@ jobs: uses: ./extras/compile-sketches all-inputs: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' runs-on: ubuntu-latest strategy: @@ -120,6 +149,8 @@ jobs: multiple-steps: name: multiple-steps (${{ matrix.board.source-type }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' runs-on: ubuntu-latest strategy: @@ -209,6 +240,8 @@ jobs: - examples/Sweep python-package-dependency: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' runs-on: ubuntu-latest steps: @@ -239,6 +272,8 @@ jobs: # Targeted testing for ESP32 boards platform support. pyserial-dependency: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' runs-on: ubuntu-latest steps: @@ -267,7 +302,10 @@ jobs: - ${{ env.TESTDATA_SKETCHES_PATH }}/BareMinimum check-sketches-reports: - needs: all-inputs + needs: + - run-determination + - all-inputs + if: needs.run-determination.outputs.result == 'true' runs-on: ubuntu-latest steps: @@ -334,6 +372,8 @@ jobs: exit $EXIT_STATUS expected-failed-compilation: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' runs-on: ubuntu-latest steps: From ff0a1195155f2df0c2afb6ad56f64f8c56d6d951 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 26 Mar 2023 22:00:19 -0700 Subject: [PATCH 094/100] Run integration test workflow periodically to catch external breakage The project infrastructure may be broken by changes to the external dependencies (e.g., GitHub Actions runner changes, runner machine OS/environment updates, action releases, tool releases). If this breakage is not caught and fixed quickly by the maintainer, it may cause confusion to the contributors whose contributions trigger a spurious workflow run failure. Monitoring for breakage can be done by periodically triggering a workflow run. --- .github/workflows/test-integration.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 490bda1..7e8264f 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -23,6 +23,10 @@ on: - "action.yml" - "compilesketches/**" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 12 * * THU" + env: SKETCHES_REPORTS_PATH: sketches-reports TESTDATA_PLATFORMS_PATH: .github/workflows/testdata/platforms From e6e67e5782002aeceefd53399468452ffca841c1 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 26 Mar 2023 22:03:48 -0700 Subject: [PATCH 095/100] Add manual triggers to integration test workflow These allow the maintainer to trigger a workflow run after a relevant external change. --- .github/workflows/test-integration.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 7e8264f..f32ee5a 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -23,10 +23,14 @@ on: - "action.yml" - "compilesketches/**" + repository_dispatch: + schedule: # Run periodically to catch breakage caused by external changes. - cron: "0 12 * * THU" + workflow_dispatch: + env: SKETCHES_REPORTS_PATH: sketches-reports TESTDATA_PLATFORMS_PATH: .github/workflows/testdata/platforms From b75a3ed81bbd920ff0e47d40cd0a22a3d65e345c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 00:06:52 +0000 Subject: [PATCH 096/100] Bump prettier from 2.8.6 to 2.8.7 Bumps [prettier](https://github.com/prettier/prettier) from 2.8.6 to 2.8.7. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/2.8.6...2.8.7) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62f7a36..2fa5b17 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "markdown-link-check": "3.10.3", "markdown-toc": "1.2.0", "markdownlint-cli": "0.33.0", - "prettier": "2.8.6" + "prettier": "2.8.7" } }, "node_modules/@financial-times/origami-service-makefile": { @@ -1868,9 +1868,9 @@ "dev": true }, "node_modules/prettier": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz", - "integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -3809,9 +3809,9 @@ "dev": true }, "prettier": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz", - "integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true }, "process-nextick-args": { diff --git a/package.json b/package.json index 6294816..15151ff 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,6 @@ "markdown-link-check": "3.10.3", "markdown-toc": "1.2.0", "markdownlint-cli": "0.33.0", - "prettier": "2.8.6" + "prettier": "2.8.7" } } From d96f2430f3ea18f9362556babdfab6837a60e174 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Mar 2023 00:07:38 +0000 Subject: [PATCH 097/100] Bump black from 23.1.0 to 23.3.0 Bumps [black](https://github.com/psf/black) from 23.1.0 to 23.3.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/23.1.0...23.3.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- poetry.lock | 58 +++++++++++++++++++++++++------------------------- pyproject.toml | 2 +- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/poetry.lock b/poetry.lock index c6577dd..6896d59 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. +# This file is automatically @generated by Poetry and should not be changed by hand. [[package]] name = "attrs" @@ -21,37 +21,37 @@ tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy [[package]] name = "black" -version = "23.1.0" +version = "23.3.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "black-23.1.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221"}, - {file = "black-23.1.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26"}, - {file = "black-23.1.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b"}, - {file = "black-23.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104"}, - {file = "black-23.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074"}, - {file = "black-23.1.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27"}, - {file = "black-23.1.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648"}, - {file = "black-23.1.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958"}, - {file = "black-23.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a"}, - {file = "black-23.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481"}, - {file = "black-23.1.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad"}, - {file = "black-23.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8"}, - {file = "black-23.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24"}, - {file = "black-23.1.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6"}, - {file = "black-23.1.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd"}, - {file = "black-23.1.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580"}, - {file = "black-23.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468"}, - {file = "black-23.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753"}, - {file = "black-23.1.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651"}, - {file = "black-23.1.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06"}, - {file = "black-23.1.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739"}, - {file = "black-23.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9"}, - {file = "black-23.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555"}, - {file = "black-23.1.0-py3-none-any.whl", hash = "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32"}, - {file = "black-23.1.0.tar.gz", hash = "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, + {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, + {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, + {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, + {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, + {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, + {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, + {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, + {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, + {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, + {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, + {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, + {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, + {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, ] [package.dependencies] @@ -966,5 +966,5 @@ setuptools = "*" [metadata] lock-version = "2.0" -python-versions = "3.11.2" -content-hash = "f6d4dd084ff2e5f98adb604b0fd1d6ffeb5b7977666a8a2adecdc5540c4e0e78" +python-versions = "~3.11" +content-hash = "bfd334ddbc73ec3c8af3038aeafa4719c5159c687591f9d145f32bf75dfe51e6" diff --git a/pyproject.toml b/pyproject.toml index 21b1a7b..3c06cd0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ PyYAML = "6.0" semver = "2.13.0" [tool.poetry.group.dev.dependencies] -black = "23.1.0" +black = "23.3.0" codespell = "2.2.4" coverage = "7.2.2" pytest = "7.2.2" From e96af16e25b61a2a6815d944322110dd9c369add Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 26 Mar 2023 00:50:01 -0700 Subject: [PATCH 098/100] Use unique memory maximum value in test input Previously the same value was used for both memory types in this test, which might result in false negatives. --- compilesketches/tests/test_compilesketches.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index 47ef73f..c170cd5 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -2621,7 +2621,7 @@ def test_get_sizes_summary_report(): }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", - compilesketches.CompileSketches.ReportKeys.maximum: 111, + compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.current: { compilesketches.CompileSketches.ReportKeys.absolute: 33, compilesketches.CompileSketches.ReportKeys.relative: 3.342, From f7b700d4c412e9bc2c2f6013307dbfd31d9256a8 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 26 Mar 2023 00:51:25 -0700 Subject: [PATCH 099/100] Always add size summary report to sketches report In addition to per-sketch, per-board memory usage data, the sketches report contains a per-board summary of the results from all the compilations for that board. Previously, when deltas data was not available, this summary section was arbitrarily omitted entirely from the sketches report. However, there is still board-universal information even without deltas: - Memory types - Maximums for each memory type It is useful to have that information available on a per-board level so a summary report should always be added to the sketches report. --- compilesketches/compilesketches.py | 130 +++++++----------- compilesketches/tests/test_compilesketches.py | 11 +- 2 files changed, 57 insertions(+), 84 deletions(-) diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index e1dee5f..d102ee5 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -1300,55 +1300,52 @@ def get_sizes_summary_report(self, sketch_report_list): sizes_summary_report = [] for sketch_report in sketch_report_list: for size_report in sketch_report[self.ReportKeys.sizes]: - if self.ReportKeys.delta in size_report: - # Determine the sizes_summary_report index for this memory type - size_summary_report_index_list = [ - index - for index, size_summary in enumerate(sizes_summary_report) - if size_summary.get(self.ReportKeys.name) == size_report[self.ReportKeys.name] - ] - if not size_summary_report_index_list: - # There is no existing entry in the summary list for this memory type, so create one - sizes_summary_report.append( - { - self.ReportKeys.name: size_report[self.ReportKeys.name], - self.ReportKeys.maximum: size_report[self.ReportKeys.maximum], - self.ReportKeys.delta: { - self.ReportKeys.absolute: { - self.ReportKeys.minimum: size_report[self.ReportKeys.delta][ - self.ReportKeys.absolute - ], - self.ReportKeys.maximum: size_report[self.ReportKeys.delta][ - self.ReportKeys.absolute - ], - }, - self.ReportKeys.relative: { - self.ReportKeys.minimum: size_report[self.ReportKeys.delta][ - self.ReportKeys.relative - ], - self.ReportKeys.maximum: size_report[self.ReportKeys.delta][ - self.ReportKeys.relative - ], - }, - }, - } - ) - else: - size_summary_report_index = size_summary_report_index_list[0] + # Determine the sizes_summary_report index for this memory type + size_summary_report_index_list = [ + index + for index, size_summary in enumerate(sizes_summary_report) + if size_summary.get(self.ReportKeys.name) == size_report[self.ReportKeys.name] + ] + if not size_summary_report_index_list: + # There is no existing entry in the summary list for this memory type, so create one + sizes_summary_report.append({self.ReportKeys.name: size_report[self.ReportKeys.name]}) + size_summary_report_index = len(sizes_summary_report) - 1 + else: + size_summary_report_index = size_summary_report_index_list[0] - if ( - sizes_summary_report[size_summary_report_index][self.ReportKeys.maximum] - == self.not_applicable_indicator - ): - sizes_summary_report[size_summary_report_index][self.ReportKeys.maximum] = size_report[ - self.ReportKeys.maximum - ] + if ( + self.ReportKeys.maximum not in sizes_summary_report[size_summary_report_index] + or sizes_summary_report[size_summary_report_index][self.ReportKeys.maximum] + == self.not_applicable_indicator + ): + sizes_summary_report[size_summary_report_index][self.ReportKeys.maximum] = size_report[ + self.ReportKeys.maximum + ] + if self.ReportKeys.delta in size_report: + if ( + self.ReportKeys.delta not in sizes_summary_report[size_summary_report_index] + or sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ + self.ReportKeys.absolute + ][self.ReportKeys.minimum] + == self.not_applicable_indicator + ): + sizes_summary_report[size_summary_report_index][self.ReportKeys.delta] = { + self.ReportKeys.absolute: { + self.ReportKeys.minimum: size_report[self.ReportKeys.delta][self.ReportKeys.absolute], + self.ReportKeys.maximum: size_report[self.ReportKeys.delta][self.ReportKeys.absolute], + }, + self.ReportKeys.relative: { + self.ReportKeys.minimum: size_report[self.ReportKeys.delta][self.ReportKeys.relative], + self.ReportKeys.maximum: size_report[self.ReportKeys.delta][self.ReportKeys.relative], + }, + } + elif size_report[self.ReportKeys.delta][self.ReportKeys.absolute] != self.not_applicable_indicator: if ( - sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ + size_report[self.ReportKeys.delta][self.ReportKeys.absolute] + < sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ self.ReportKeys.absolute ][self.ReportKeys.minimum] - == self.not_applicable_indicator ): sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ self.ReportKeys.absolute @@ -1358,6 +1355,12 @@ def get_sizes_summary_report(self, sketch_report_list): self.ReportKeys.relative ][self.ReportKeys.minimum] = size_report[self.ReportKeys.delta][self.ReportKeys.relative] + if ( + size_report[self.ReportKeys.delta][self.ReportKeys.absolute] + > sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ + self.ReportKeys.absolute + ][self.ReportKeys.maximum] + ): sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ self.ReportKeys.absolute ][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][self.ReportKeys.absolute] @@ -1366,45 +1369,6 @@ def get_sizes_summary_report(self, sketch_report_list): self.ReportKeys.relative ][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][self.ReportKeys.relative] - elif size_report[self.ReportKeys.delta][self.ReportKeys.absolute] != ( - self.not_applicable_indicator - ): - if ( - size_report[self.ReportKeys.delta][self.ReportKeys.absolute] - < sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute - ][self.ReportKeys.minimum] - ): - sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute - ][self.ReportKeys.minimum] = size_report[self.ReportKeys.delta][ - self.ReportKeys.absolute - ] - - sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.relative - ][self.ReportKeys.minimum] = size_report[self.ReportKeys.delta][ - self.ReportKeys.relative - ] - - if ( - size_report[self.ReportKeys.delta][self.ReportKeys.absolute] - > sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute - ][self.ReportKeys.maximum] - ): - sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute - ][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][ - self.ReportKeys.absolute - ] - - sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.relative - ][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][ - self.ReportKeys.relative - ] - return sizes_summary_report def get_warnings_summary_report(self, sketch_report_list): diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index c170cd5..876ff94 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -2631,7 +2631,16 @@ def test_get_sizes_summary_report(): }, ] - expected_sizes_summary_report = [] + expected_sizes_summary_report = [ + { + compilesketches.CompileSketches.ReportKeys.name: "Foo memory type", + compilesketches.CompileSketches.ReportKeys.maximum: 111, + }, + { + compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", + compilesketches.CompileSketches.ReportKeys.maximum: 222, + }, + ] assert compile_sketches.get_sizes_summary_report(sketch_report_list=sketch_report_list) == ( expected_sizes_summary_report From 935f8a9b8b785f8daec8b27e12fb3186be7eb3e1 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 26 Mar 2023 03:30:39 -0700 Subject: [PATCH 100/100] Increase test coverage of `get_sizes_from_output` function --- compilesketches/tests/test_compilesketches.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index 876ff94..8604ecb 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -1803,6 +1803,28 @@ def checkout(self): " ^~~~~\n" "Sketch uses {flash} bytes (4%) of program storage space. Maximum is {maximum_flash} bytes.\n", 12636, + 25272, + 50.0, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + ), + ( + True, + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp: In function 'void _initISR(Tc*, uint8_t, uint32_t, IRQn_Ty" + "pe, uint8_t, uint8_t)':\n" + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp:120:56: warning: unused parameter 'id' [-Wunused-parameter]" + "\n" + " static void _initISR(Tc *tc, uint8_t channel, uint32_t id, IRQn_Type irqn, uint8_t gcmForTimer, uint8_t intEnab" + " leBit)\n" + " ^~\n" + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp: In function 'void finISR(timer16_Sequence_t)':\n" + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp:174:39: warning: unused parameter 'timer' [-Wunused-paramet" + "er]\n" + " static void finISR(timer16_Sequence_t timer)\n" + " ^~~~~\n" + "Sketch uses {flash} bytes (4%) of program storage space.\n", + 12636, get_compilesketches_object().not_applicable_indicator, get_compilesketches_object().not_applicable_indicator, get_compilesketches_object().not_applicable_indicator,