From 15c9a231360b3af5f16b419958e78849d915bc45 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sat, 13 Sep 2025 18:35:32 +0200 Subject: [PATCH] Improve mypy execution and less dependencies and manual/hard-coded Bash commands. --- .github/workflows/CompletePipeline.yml | 7 +- .github/workflows/ExtractConfiguration.yml | 9 ++ .github/workflows/LaTeXDocumentation.yml | 2 +- .github/workflows/PrepareJob.yml | 3 + .github/workflows/StaticTypeCheck.yml | 6 +- .github/workflows/_Checking_JobTemplates.yml | 7 +- .github/workflows/_Checking_Nightly.yml | 1 + doc/JobTemplate/Quality/StaticTypeCheck.rst | 129 +++++++------------ 8 files changed, 65 insertions(+), 99 deletions(-) diff --git a/.github/workflows/CompletePipeline.yml b/.github/workflows/CompletePipeline.yml index 4b74d53..3fd44f4 100644 --- a/.github/workflows/CompletePipeline.yml +++ b/.github/workflows/CompletePipeline.yml @@ -196,11 +196,8 @@ jobs: - UnitTestingParams with: python_version: ${{ needs.UnitTestingParams.outputs.python_version }} - commands: | - ${{ needs.ConfigParams.outputs.mypy_prepare_command }} - mypy --html-report report/typing -p ${{ needs.ConfigParams.outputs.package_fullname }} - html_report: 'report/typing' - html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }} + html_report: ${{ needs.ConfigParams.outputs.typing_report_html_directory }} + html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }} DocCoverage: uses: pyTooling/Actions/.github/workflows/CheckDocumentation.yml@dev diff --git a/.github/workflows/ExtractConfiguration.yml b/.github/workflows/ExtractConfiguration.yml index 281a84e..35cb764 100644 --- a/.github/workflows/ExtractConfiguration.yml +++ b/.github/workflows/ExtractConfiguration.yml @@ -98,6 +98,10 @@ on: coverage_report_json: description: "" value: ${{ jobs.Extract.outputs.coverage_report_json }} + typing_report_html_directory: + description: "" + value: ${{ jobs.Extract.outputs.typing_report_html_directory }} + jobs: Extract: @@ -120,6 +124,7 @@ jobs: coverage_report_json_directory: ${{ steps.getVariables.outputs.coverage_report_json_directory }} coverage_report_json_filename: ${{ steps.getVariables.outputs.coverage_report_json_filename }} coverage_report_json: ${{ steps.getVariables.outputs.coverage_report_json }} + typing_report_html_directory: ${{ steps.getVariables.outputs.typing_report_html_directory }} steps: - name: ⏬ Checkout repository @@ -194,6 +199,7 @@ jobs: coverageXMLFile = Path("./coverage.xml") coverageJSONFile = Path("./coverage.json") coverageRC = "${{ inputs.coverage_config }}".strip() + typingHTMLDirectory = Path("htmlmypy") # Read output paths from 'pyproject.toml' file if coverageRC == "pyproject.toml": @@ -207,6 +213,7 @@ jobs: coverageHTMLDirectory = Path(pyProjectSettings["tool"]["coverage"]["html"]["directory"]) coverageXMLFile = Path(pyProjectSettings["tool"]["coverage"]["xml"]["output"]) coverageJSONFile= Path(pyProjectSettings["tool"]["coverage"]["json"]["output"]) + typingHTMLDirectory = Path(pyProjectSettings["tool"]["mypy"]["html_report"]) else: print(f"File '{pyProjectFile}' not found.") print(f"::error title=FileNotFoundError::File '{pyProjectFile}' not found.") @@ -245,6 +252,7 @@ jobs: coverage_report_json_directory={coverageJSONFile.parent.as_posix()} coverage_report_json_filename={coverageJSONFile.name} coverage_report_json={coverageJSONFile.as_posix()} + typing_report_html_directory={typingHTMLDirectory.as_posix()} """)) print(dedent(f"""\ @@ -254,4 +262,5 @@ jobs: coverage html: {coverageHTMLDirectory} coverage xml: {coverageXMLFile} coverage json: {coverageJSONFile} + typing html: {typingHTMLDirectory} """)) diff --git a/.github/workflows/LaTeXDocumentation.yml b/.github/workflows/LaTeXDocumentation.yml index d4bc70c..e524fcc 100644 --- a/.github/workflows/LaTeXDocumentation.yml +++ b/.github/workflows/LaTeXDocumentation.yml @@ -57,7 +57,7 @@ jobs: PDFDocumentation: name: 📓 Converting LaTeX Documentation to PDF runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}" - continue-on-error: ${{ inputs.can-fail }} + continue-on-error: ${{ inputs.can-fail == 'true' }} steps: - name: 📥 Download artifacts '${{ inputs.latex_artifact }}' from 'SphinxDocumentation' job uses: pyTooling/download-artifact@v5 diff --git a/.github/workflows/PrepareJob.yml b/.github/workflows/PrepareJob.yml index 7a3f4bd..84b334e 100644 --- a/.github/workflows/PrepareJob.yml +++ b/.github/workflows/PrepareJob.yml @@ -255,6 +255,9 @@ jobs: version=${version} EOF +# TODO: why not is_release_commit? +# TODO: how to support version branches and hotfix releases on version branches? + - name: 🔁 Find merged PullRequest from second parent of current SHA (${{ github.sha }}) id: FindPullRequest if: steps.Classify.outputs.is_merge_commit == 'true' diff --git a/.github/workflows/StaticTypeCheck.yml b/.github/workflows/StaticTypeCheck.yml index 167d9fd..ecf1371 100644 --- a/.github/workflows/StaticTypeCheck.yml +++ b/.github/workflows/StaticTypeCheck.yml @@ -40,14 +40,10 @@ on: required: false default: '-r tests/requirements.txt' type: string - commands: - description: 'Commands to run the static type checks.' - required: true - type: string html_report: description: 'Directory to upload as an artifact.' required: false - default: 'htmlmypy' + default: 'report/typing' type: string junit_report: description: 'junit file to upload as an artifact.' diff --git a/.github/workflows/_Checking_JobTemplates.yml b/.github/workflows/_Checking_JobTemplates.yml index 5d2e228..b6d95e4 100644 --- a/.github/workflows/_Checking_JobTemplates.yml +++ b/.github/workflows/_Checking_JobTemplates.yml @@ -84,11 +84,8 @@ jobs: - UnitTestingParams with: python_version: ${{ needs.UnitTestingParams.outputs.python_version }} - commands: | - ${{ needs.ConfigParams.outputs.mypy_prepare_command }} - mypy --html-report report/typing -p ${{ needs.ConfigParams.outputs.package_fullname }} - html_report: 'report/typing' - html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }} + html_report: ${{ needs.ConfigParams.outputs.typing_report_html_directory }} + html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }} DocCoverage: uses: pyTooling/Actions/.github/workflows/CheckDocumentation.yml@dev diff --git a/.github/workflows/_Checking_Nightly.yml b/.github/workflows/_Checking_Nightly.yml index 6144085..12c9fd1 100644 --- a/.github/workflows/_Checking_Nightly.yml +++ b/.github/workflows/_Checking_Nightly.yml @@ -55,6 +55,7 @@ jobs: version=4.2.0 tool=myTool prog=program + tag: 4.2.0 title: "Nightly Test Release" description: | This *nightly* release contains all latest and important artifacts created by %tool%'s CI pipeline. diff --git a/doc/JobTemplate/Quality/StaticTypeCheck.rst b/doc/JobTemplate/Quality/StaticTypeCheck.rst index ab2fe7e..caa6dba 100644 --- a/doc/JobTemplate/Quality/StaticTypeCheck.rst +++ b/doc/JobTemplate/Quality/StaticTypeCheck.rst @@ -40,92 +40,69 @@ results can be converted to a HTML report and uploaded as an artifact. Instantiation ************* +Simple Example +============== + +This example runs mypy for the Python package ``myPackage`` according to the configuration stored in +:file:`pyproject.toml`. It prints a report into the job's log. In addition is generates a report in HTML format into the +directory ``report/typing``. + .. grid:: 2 .. grid-item:: :columns: 6 - .. card:: Simple Example + .. code-block:: yaml - This example runs mypy for the Python package ``myPackage``. It renders a report into the job's log. In - addition is generates a report in HTML format into the directory ``htmlmypy``. - - .. code-block:: yaml - - jobs: - StaticTypeCheck: - uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r5 - with: - commands: | - mypy --html-report htmlmypy -p myPackage - report: 'htmlmypy' - artifact: TypeChecking + jobs: + StaticTypeCheck: + uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r5 + with: + html_report: 'htmlmpyp' + artifact: 'TypeChecking' .. grid-item:: :columns: 6 - .. card:: Complex Example + .. code-block:: toml - .. code-block:: yaml + [tool.mypy] + packages = ["myPackage"] + strict = true + pretty = true - jobs: - StaticTypeCheck: - uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r5 - needs: - - Params - with: - python_version: ${{ needs.Params.outputs.python_version }} - commands: | - touch myFramework/__init__.py - mypy --html-report htmlmypy -p myFramework.Extension - report: 'htmlmypy' - artifact: ${{ fromJson(needs.Params.outputs.artifact_names).statictyping_html }} - -.. card:: Complex Example - - .. code-block:: yaml - - jobs: - StaticTypeCheck: - uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r5 - needs: - - ConfigParams - - Params - with: - python_version: ${{ needs.Params.outputs.python_version }} - commands: | - ${{ needs.ConfigParams.outputs.mypy_prepare_command }} - mypy --html-report htmlmypy -p ${{ needs.ConfigParams.outputs.package_fullname }} - report: 'htmlmypy' - artifact: ${{ fromJson(needs.Params.outputs.artifact_names).statictyping_html }} - -Commands -******** - -Example ``commands``: - -1. Regular package - - .. code-block:: yaml - - commands: mypy --html-report htmlmypy -p ToolName + html_report = "htmlmpyp" -2. Parent namespace package +Complex Example +=============== - .. code-block:: yaml +To ease the handling of mypy parameters stored in :file:`pyproject.toml`, the :ref:`JOBTMPL/ExtractConfiguration` is +used to extract the set configuration parameters for later usage. Similarly, :ref:`JOBTMPL/Parameters` is used to +precompute the artifact's name. - commands: | - touch Parent/__init__.py - mypy --html-report htmlmypy -p ToolName +.. code-block:: yaml -3. Child namespace package + jobs: + ConfigParams: + uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r5 + with: + package_name: myPackage - .. code-block:: yaml + Params: + uses: pyTooling/Actions/.github/workflows/Parameters.yml@r5 + with: + package_name: myPackage - commands: | - cd Parent - mypy --html-report ../htmlmypy -p ToolName + StaticTypeCheck: + uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r5 + needs: + - ConfigParams + - Params + with: + python_version: ${{ needs.Params.outputs.python_version }} + report: ${{ needs.ConfigParams.outputs.typing_report_html_directory }} + artifact: ${{ fromJson(needs.Params.outputs.artifact_names).statictyping_html }} .. _JOBTMPL/StaticTypeCheck/Parameters: @@ -144,9 +121,7 @@ Parameter Summary +---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+ | :ref:`JOBTMPL/StaticTypeCheck/Input/requirements` | no | string | ``'-r tests/requirements.txt'`` | +---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+ -| :ref:`JOBTMPL/StaticTypeCheck/Input/commands` | yes | string | — — — — | -+---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+ -| :ref:`JOBTMPL/StaticTypeCheck/Input/html_report` | no | string | ``'htmlmypy'`` | +| :ref:`JOBTMPL/StaticTypeCheck/Input/html_report` | no | string | ``'report/typing'`` | +---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+ | :ref:`JOBTMPL/StaticTypeCheck/Input/junit_report` | no | string | ``'StaticTypingSummary.xml'`` | +---------------------------------------------------------------------+----------+----------+-------------------------------------------------------------------+ @@ -193,18 +168,6 @@ requirements :Description: Python dependencies to be installed through *pip*. -.. _JOBTMPL/StaticTypeCheck/Input/commands: - -commands -======== - -:Type: string -:Required: yes -:Default Value: — — — — -:Possible Values: tbd -:Description: tbd - - .. _JOBTMPL/StaticTypeCheck/Input/html_report: html_report @@ -212,7 +175,7 @@ html_report :Type: string :Required: no -:Default Value: ``'htmlmypy'`` +:Default Value: ``'report/typing'`` :Possible Values: Any valid directory or subdirectory path. :Description: The directory containing the generated HTML report.