diff --git a/.github/workflows/libraries_report-size-deltas.yml b/.github/workflows/libraries_report-size-deltas.yml deleted file mode 100644 index 4e3494a..0000000 --- a/.github/workflows/libraries_report-size-deltas.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: libraries/report-size-deltas workflow - -on: - pull_request: - paths: - - '.github/workflows/libraries_report-size-deltas.yml' - - 'reportsizedeltas/**' - - push: - paths: - - '.github/workflows/libraries_report-size-deltas.yml' - - 'reportsizedeltas/**' - -jobs: - test: - runs-on: ubuntu-latest - permissions: {} - - env: - PYTHON_PROJECT_PATH: ${GITHUB_WORKSPACE}/reportsizedeltas - PYTHON_PROJECT_TESTS_PATH: ${GITHUB_WORKSPACE}/reportsizedeltas/tests - COVERAGE_DATA_FILENAME: coverage.xml - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11.6' - - - name: Install Poetry - run: pip install poetry - - - name: Install dependencies - run: | - poetry install \ - --no-root - - - name: Run Python unit tests and record code coverage data - run: | - export PYTHONPATH="${{ env.PYTHON_PROJECT_PATH }}" - poetry run \ - coverage run \ - --source="${{ env.PYTHON_PROJECT_PATH }}" \ - --module pytest \ - "${{ env.PYTHON_PROJECT_TESTS_PATH }}" - # Generate coverage data file for consumption by `codecov/codecov-action`. - poetry run \ - coverage xml \ - -o "${{ github.workspace }}/${{ env.COVERAGE_DATA_FILENAME }}" - - - name: Display code coverage report - run: | - poetry run \ - coverage report - - # A token is used to avoid intermittent spurious job failures caused by rate limiting. - - name: Set up Codecov upload token - run: | - if [[ "${{ github.repository }}" == "arduino/report-size-deltas" ]]; then - # In order to avoid uploads of data from forks, only use the token for runs in the parent repo. - # Token is intentionally exposed. - # See: https://community.codecov.com/t/upload-issues-unable-to-locate-build-via-github-actions-api/3954 - CODECOV_TOKEN="3889efcb-4ed3-4d07-980a-99a3896bd9b8" - else - # codecov/codecov-action does unauthenticated upload if empty string is passed via the `token` input. - CODECOV_TOKEN="" - fi - echo "CODECOV_TOKEN=$CODECOV_TOKEN" >> "$GITHUB_ENV" - - - name: Upload coverage report to Codecov - uses: codecov/codecov-action@v3 - with: - file: ${{ env.COVERAGE_DATA_FILENAME }} - fail_ci_if_error: true - token: ${{ env.CODECOV_TOKEN }} diff --git a/.github/workflows/test-python-poetry-task.yml b/.github/workflows/test-python-poetry-task.yml new file mode 100644 index 0000000..9a3dc4f --- /dev/null +++ b/.github/workflows/test-python-poetry-task.yml @@ -0,0 +1,130 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/test-python-poetry-task.md +name: Test Python + +env: + # See: https://github.com/actions/setup-python/tree/main#available-versions-of-python + PYTHON_VERSION: "3.11.6" + +# 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" + - "reportsizedeltas/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" + - "reportsizedeltas/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 }} + permissions: {} + 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 + + test: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + env: + COVERAGE_DATA_FILENAME: coverage.xml + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Python + uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + + - name: Install Poetry + run: pip install 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@v3 + 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 }}" + + # A token is used to avoid intermittent spurious job failures caused by rate limiting. + - name: Set up Codecov upload token + run: | + if [[ "${{ github.repository }}" == "arduino/compile-sketches" ]]; then + # In order to avoid uploads of data from forks, only use the token for runs in the parent repo. + # Token is intentionally exposed. + # See: https://community.codecov.com/t/upload-issues-unable-to-locate-build-via-github-actions-api/3954 + CODECOV_TOKEN="3889efcb-4ed3-4d07-980a-99a3896bd9b8" + else + # codecov/codecov-action does unauthenticated upload if empty string is passed via the `token` input. + CODECOV_TOKEN="" + fi + echo "CODECOV_TOKEN=$CODECOV_TOKEN" >> "$GITHUB_ENV" + + - name: Upload coverage report to Codecov + uses: codecov/codecov-action@v3 + with: + fail_ci_if_error: true + file: ${{ env.COVERAGE_DATA_FILENAME }} + token: ${{ env.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 2ccbe46..6484186 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /node_modules/ +__pycache__/ +.coverage diff --git a/README.md b/README.md index 5e3b679..8e5afd0 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ [![Check Poetry status](https://github.com/arduino/report-size-deltas/actions/workflows/check-poetry-task.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/check-poetry-task.yml) [![Check Python status](https://github.com/arduino/report-size-deltas/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/check-python-task.yml) [![Check Taskfiles status](https://github.com/arduino/report-size-deltas/actions/workflows/check-taskfiles.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/check-taskfiles.yml) -[![Tests](https://github.com/arduino/report-size-deltas/workflows/libraries/report-size-deltas%20workflow/badge.svg)](https://github.com/arduino/report-size-deltas/actions?workflow=libraries/report-size-deltas+workflow) [![Integration Tests](https://github.com/arduino/report-size-deltas/actions/workflows/test-integration.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/test-integration.yml) [![Spell Check status](https://github.com/arduino/report-size-deltas/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/spell-check-task.yml) [![Sync Labels status](https://github.com/arduino/report-size-deltas/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/sync-labels-npm.yml) +[![Test Python status](https://github.com/arduino/report-size-deltas/actions/workflows/test-python-poetry-task.yml/badge.svg)](https://github.com/arduino/report-size-deltas/actions/workflows/test-python-poetry-task.yml) [![codecov](https://codecov.io/gh/arduino/report-size-deltas/branch/master/graph/badge.svg)](https://codecov.io/gh/arduino/report-size-deltas) This action comments on the pull request with a report on the resulting change in memory usage of the [Arduino](https://www.arduino.cc/) sketches compiled by the [`arduino/compile-sketches`](https://github.com/arduino/compile-sketches) action. This should be run from a [scheduled workflow](https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#onschedule). diff --git a/Taskfile.yml b/Taskfile.yml index d236fff..29450d1 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -2,6 +2,7 @@ version: "3" vars: + PYTHON_PROJECT_PATH: reportsizedeltas # Last version of ajv-cli with support for the JSON schema "Draft 4" specification SCHEMA_DRAFT_4_AJV_CLI_VERSION: 3.3.0 @@ -14,6 +15,7 @@ tasks: - task: npm:validate - task: poetry:validate - task: python:lint + - task: python:test fix: desc: Make automated corrections to the project's files @@ -139,6 +141,15 @@ tasks: check \ --lock + python:coverage-report: + desc: Show code coverage report + deps: + - task: poetry:install-deps + 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 @@ -155,6 +166,20 @@ 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 + 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/reportsizedeltas/tests/pytest.ini b/reportsizedeltas/tests/pytest.ini index bd720b4..b8beed3 100644 --- a/reportsizedeltas/tests/pytest.ini +++ b/reportsizedeltas/tests/pytest.ini @@ -1,8 +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 -markers = - slow: marks tests as slow (deselect with '-m "not slow"') +# --capture=no - disable per-test capture +# --tb=long sets the length of the traceback in case of failures +addopts = --capture=no --tb=long --verbose