Updating r4 from main@v4.3.0

This commit is contained in:
Patrick Lehmann
2025-04-18 12:47:20 +02:00
committed by GitHub
20 changed files with 253 additions and 146 deletions

View File

@@ -32,7 +32,7 @@ on:
python_version: python_version:
description: 'Python version.' description: 'Python version.'
required: false required: false
default: '3.12' default: '3.13'
type: string type: string
directory: directory:
description: 'Source code directory to check.' description: 'Source code directory to check.'

View File

@@ -93,10 +93,33 @@ on:
required: false required: false
default: '' default: ''
type: string type: string
codecov:
description: 'Publish merged coverage and unittest reports to Codecov.'
required: false
default: false
type: boolean
codacy:
description: 'Publish merged coverage report to Codacy.'
required: false
default: false
type: boolean
dorny:
description: 'Publish merged unittest report via Dorny Test-Reporter.'
required: false
default: false
type: boolean
cleanup:
description: 'Cleanup artifacts afterwards.'
required: false
default: true
type: boolean
secrets: secrets:
PYPI_TOKEN: PYPI_TOKEN:
description: "Token for pushing releases to PyPI." description: "Token for pushing releases to PyPI."
required: false required: false
CODECOV_TOKEN:
description: "Token for pushing coverage and unittest results to Codecov."
required: false
CODACY_PROJECT_TOKEN: CODACY_PROJECT_TOKEN:
description: "Token for pushing coverage results to Codacy." description: "Token for pushing coverage results to Codacy."
required: false required: false
@@ -127,10 +150,10 @@ jobs:
package_name: ${{ inputs.package_name }} package_name: ${{ inputs.package_name }}
python_version: ${{ inputs.apptest_python_version }} python_version: ${{ inputs.apptest_python_version }}
python_version_list: ${{ inputs.apptest_python_version_list }} python_version_list: ${{ inputs.apptest_python_version_list }}
system_list: ${{ inputs.apptest_system_list }} system_list: ${{ inputs.apptest_system_list }}
include_list: ${{ inputs.apptest_include_list }} include_list: ${{ inputs.apptest_include_list }}
exclude_list: ${{ inputs.apptest_exclude_list }} exclude_list: ${{ inputs.apptest_exclude_list }}
disable_list: ${{ inputs.apptest_disable_list }} disable_list: ${{ inputs.apptest_disable_list }}
UnitTesting: UnitTesting:
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r4 uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r4
@@ -167,7 +190,7 @@ jobs:
- UnitTestingParams - UnitTestingParams
with: with:
python_version: ${{ needs.UnitTestingParams.outputs.python_version }} python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
directory: ${{ inputs.package_namespace }}/${{ inputs.package_name }} directory: ${{ inputs.package_namespace }}/${{ inputs.package_name }}
# fail_below: 70 # fail_below: 70
Package: Package:
@@ -177,7 +200,7 @@ jobs:
- UnitTesting - UnitTesting
with: with:
python_version: ${{ needs.UnitTestingParams.outputs.python_version }} python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }} artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
# AppTesting: # AppTesting:
# uses: pyTooling/Actions/.github/workflows/ApplicationTesting.yml@r4 # uses: pyTooling/Actions/.github/workflows/ApplicationTesting.yml@r4
@@ -193,24 +216,41 @@ jobs:
PublishCoverageResults: PublishCoverageResults:
uses: pyTooling/Actions/.github/workflows/PublishCoverageResults.yml@r4 uses: pyTooling/Actions/.github/workflows/PublishCoverageResults.yml@r4
needs: needs:
- ConfigParams
- UnitTestingParams - UnitTestingParams
- UnitTesting - UnitTesting
with: with:
# coverage_sqlite_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }} # coverage_sqlite_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}
# coverage_xml_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_xml }} # coverage_xml_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_xml }}
coverage_json_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }} # coverage_report_xml_directory: ${{ needs.ConfigParams.outputs.coverage_report_xml_directory }}
coverage_html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }} # coverage_report_xml_filename: ${{ needs.ConfigParams.outputs.coverage_report_xml_filename }}
coverage_json_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}
coverage_report_json_directory: ${{ needs.ConfigParams.outputs.coverage_report_json_directory }}
coverage_report_json_filename: ${{ needs.ConfigParams.outputs.coverage_report_json_filename }}
coverage_html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}
coverage_report_html_directory: ${{ needs.ConfigParams.outputs.coverage_report_html_directory }}
codecov: ${{ inputs.codecov }}
codacy: ${{ inputs.codacy }}
secrets: secrets:
codacy_token: ${{ secrets.CODACY_PROJECT_TOKEN }} CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
CODACY_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
PublishTestResults: PublishTestResults:
uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@r4 uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@r4
needs: needs:
- ConfigParams
- UnitTestingParams - UnitTestingParams
- UnitTesting - UnitTesting
with: with:
additional_merge_args: '-d "--pytest=rewrite-dunder-init;reduce-depth:pytest.tests.unit"' additional_merge_args: '-d "--pytest=rewrite-dunder-init;reduce-depth:pytest.tests.unit"'
merged_junit_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }} testsuite-summary-name: ${{ inputs.package_name }}
merged_junit_filename: ${{ needs.ConfigParams.outputs.unittest_merged_report_xml_filename }}
merged_junit_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}
dorny: ${{ inputs.dorny }}
codecov: ${{ inputs.codecov }}
secrets:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
# VerifyDocs: # VerifyDocs:
# uses: pyTooling/Actions/.github/workflows/VerifyDocs.yml@r4 # uses: pyTooling/Actions/.github/workflows/VerifyDocs.yml@r4
@@ -228,12 +268,12 @@ jobs:
- PublishCoverageResults - PublishCoverageResults
# - VerifyDocs # - VerifyDocs
with: with:
python_version: ${{ needs.UnitTestingParams.outputs.python_version }} python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
coverage_report_json_directory: ${{ needs.ConfigParams.outputs.coverage_report_json_directory }} coverage_report_json_directory: ${{ needs.ConfigParams.outputs.coverage_report_json_directory }}
unittest_xml_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}-ubuntu-native-3.12 unittest_xml_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}
coverage_json_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }} coverage_json_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}
html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }} html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }}
latex_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }} latex_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }}
IntermediateCleanUp: IntermediateCleanUp:
uses: pyTooling/Actions/.github/workflows/IntermediateCleanUp.yml@r4 uses: pyTooling/Actions/.github/workflows/IntermediateCleanUp.yml@r4
@@ -242,9 +282,10 @@ jobs:
- PublishCoverageResults - PublishCoverageResults
- PublishTestResults - PublishTestResults
- Documentation - Documentation
if: ${{ inputs.cleanup }}
with: with:
sqlite_coverage_artifacts_prefix: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}- sqlite_coverage_artifacts_prefix: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}-
xml_unittest_artifacts_prefix: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}- xml_unittest_artifacts_prefix: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}-
# PDFDocumentation: # PDFDocumentation:
# uses: pyTooling/Actions/.github/workflows/LaTeXDocumentation.yml@r4 # uses: pyTooling/Actions/.github/workflows/LaTeXDocumentation.yml@r4
@@ -265,9 +306,9 @@ jobs:
- PublishCoverageResults - PublishCoverageResults
- StaticTypeCheck - StaticTypeCheck
with: with:
doc: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }} doc: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }}
coverage: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }} coverage: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}
typing: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }} typing: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }}
ReleasePage: ReleasePage:
uses: pyTooling/Actions/.github/workflows/Release.yml@r4 uses: pyTooling/Actions/.github/workflows/Release.yml@r4
@@ -303,6 +344,7 @@ jobs:
- PublishToGitHubPages - PublishToGitHubPages
# - PublishOnPyPI # - PublishOnPyPI
- IntermediateCleanUp - IntermediateCleanUp
if: ${{ inputs.cleanup }}
with: with:
package: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }} package: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
remaining: | remaining: |

View File

@@ -32,7 +32,7 @@ on:
python_version: python_version:
description: 'Python version.' description: 'Python version.'
required: false required: false
default: '3.12' default: '3.13'
type: string type: string
package_namespace: package_namespace:
description: 'Name of the tool''s namespace.' description: 'Name of the tool''s namespace.'
@@ -68,6 +68,15 @@ on:
unittest_report_xml: unittest_report_xml:
description: "" description: ""
value: ${{ jobs.Extract.outputs.unittest_report_xml }} value: ${{ jobs.Extract.outputs.unittest_report_xml }}
unittest_merged_report_xml_directory:
description: ""
value: ${{ jobs.Extract.outputs.unittest_merged_report_xml_directory }}
unittest_merged_report_xml_filename:
description: ""
value: ${{ jobs.Extract.outputs.unittest_merged_report_xml_filename }}
unittest_merged_report_xml:
description: ""
value: ${{ jobs.Extract.outputs.unittest_merged_report_xml }}
coverage_report_html_directory: coverage_report_html_directory:
description: "" description: ""
value: ${{ jobs.Extract.outputs.coverage_report_html_directory }} value: ${{ jobs.Extract.outputs.coverage_report_html_directory }}
@@ -95,19 +104,22 @@ jobs:
name: 📓 Extract configurations from pyproject.toml name: 📓 Extract configurations from pyproject.toml
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}" runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
outputs: outputs:
package_fullname: ${{ steps.getPackageName.outputs.package_fullname }} package_fullname: ${{ steps.getPackageName.outputs.package_fullname }}
package_directory: ${{ steps.getPackageName.outputs.package_directory }} package_directory: ${{ steps.getPackageName.outputs.package_directory }}
mypy_prepare_command: ${{ steps.getPackageName.outputs.mypy_prepare_command }} mypy_prepare_command: ${{ steps.getPackageName.outputs.mypy_prepare_command }}
unittest_report_xml_directory: ${{ steps.getVariables.outputs.unittest_report_xml_directory }} unittest_report_xml_directory: ${{ steps.getVariables.outputs.unittest_report_xml_directory }}
unittest_report_xml_filename: ${{ steps.getVariables.outputs.unittest_report_xml_filename }} unittest_report_xml_filename: ${{ steps.getVariables.outputs.unittest_report_xml_filename }}
unittest_report_xml: ${{ steps.getVariables.outputs.unittest_report_xml }} unittest_report_xml: ${{ steps.getVariables.outputs.unittest_report_xml }}
coverage_report_html_directory: ${{ steps.getVariables.outputs.coverage_report_html_directory }} unittest_merged_report_xml_directory: ${{ steps.getVariables.outputs.unittest_merged_report_xml_directory }}
coverage_report_xml_directory: ${{ steps.getVariables.outputs.coverage_report_xml_directory }} unittest_merged_report_xml_filename: ${{ steps.getVariables.outputs.unittest_merged_report_xml_filename }}
coverage_report_xml_filename: ${{ steps.getVariables.outputs.coverage_report_xml_filename }} unittest_merged_report_xml: ${{ steps.getVariables.outputs.unittest_merged_report_xml }}
coverage_report_xml: ${{ steps.getVariables.outputs.coverage_report_xml }} coverage_report_html_directory: ${{ steps.getVariables.outputs.coverage_report_html_directory }}
coverage_report_json_directory: ${{ steps.getVariables.outputs.coverage_report_json_directory }} coverage_report_xml_directory: ${{ steps.getVariables.outputs.coverage_report_xml_directory }}
coverage_report_json_filename: ${{ steps.getVariables.outputs.coverage_report_json_filename }} coverage_report_xml_filename: ${{ steps.getVariables.outputs.coverage_report_xml_filename }}
coverage_report_json: ${{ steps.getVariables.outputs.coverage_report_json }} coverage_report_xml: ${{ steps.getVariables.outputs.coverage_report_xml }}
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 }}
steps: steps:
- name: ⏬ Checkout repository - name: ⏬ Checkout repository
@@ -178,6 +190,7 @@ jobs:
pyProjectSettings = tomli_load(file) pyProjectSettings = tomli_load(file)
unittestXMLFile = Path(pyProjectSettings["tool"]["pytest"]["junit_xml"]) unittestXMLFile = Path(pyProjectSettings["tool"]["pytest"]["junit_xml"])
mergedUnittestXMLFile = Path(pyProjectSettings["tool"]["pyedaa-reports"]["junit_xml"])
coverageHTMLDirectory = Path(pyProjectSettings["tool"]["coverage"]["html"]["directory"]) coverageHTMLDirectory = Path(pyProjectSettings["tool"]["coverage"]["html"]["directory"])
coverageXMLFile = Path(pyProjectSettings["tool"]["coverage"]["xml"]["output"]) coverageXMLFile = Path(pyProjectSettings["tool"]["coverage"]["xml"]["output"])
coverageJSONFile= Path(pyProjectSettings["tool"]["coverage"]["json"]["output"]) coverageJSONFile= Path(pyProjectSettings["tool"]["coverage"]["json"]["output"])
@@ -209,6 +222,9 @@ jobs:
unittest_report_xml_directory={unittestXMLFile.parent.as_posix()} unittest_report_xml_directory={unittestXMLFile.parent.as_posix()}
unittest_report_xml_filename={unittestXMLFile.name} unittest_report_xml_filename={unittestXMLFile.name}
unittest_report_xml={unittestXMLFile.as_posix()} unittest_report_xml={unittestXMLFile.as_posix()}
unittest_merged_report_xml_directory={mergedUnittestXMLFile.parent.as_posix()}
unittest_merged_report_xml_filename={mergedUnittestXMLFile.name}
unittest_merged_report_xml={mergedUnittestXMLFile.as_posix()}
coverage_report_html_directory={coverageHTMLDirectory.as_posix()} coverage_report_html_directory={coverageHTMLDirectory.as_posix()}
coverage_report_xml_directory={coverageXMLFile.parent.as_posix()} coverage_report_xml_directory={coverageXMLFile.parent.as_posix()}
coverage_report_xml_filename={coverageXMLFile.name} coverage_report_xml_filename={coverageXMLFile.name}
@@ -218,4 +234,4 @@ jobs:
coverage_report_json={coverageJSONFile.as_posix()} coverage_report_json={coverageJSONFile.as_posix()}
""")) """))
print(f"DEBUG:\n unittest xml: {unittestXMLFile}\n coverage html: {coverageHTMLDirectory}\n coverage xml: {coverageXMLFile}\n coverage json: {coverageJSONFile}") print(f"DEBUG:\n unittest xml: {unittestXMLFile}\n merged unittest xml: {mergedUnittestXMLFile}\n coverage html: {coverageHTMLDirectory}\n coverage xml: {coverageXMLFile}\n coverage json: {coverageJSONFile}")

View File

@@ -33,7 +33,7 @@ on:
python_version: python_version:
description: 'Python version.' description: 'Python version.'
required: false required: false
default: '3.12' default: '3.13'
type: string type: string
requirements: requirements:
description: 'Python dependencies to be installed through pip; if empty, use pyproject.toml through build.' description: 'Python dependencies to be installed through pip; if empty, use pyproject.toml through build.'

View File

@@ -48,19 +48,57 @@ on:
required: false required: false
default: '' default: ''
type: string type: string
coverage_report_xml_directory:
description: 'Directory containing the XML coverage report file.'
required: false
default: 'report/coverage'
type: string
coverage_report_xml_filename:
description: 'Filename of the XML coverage report file.'
required: false
default: 'coverage.xml'
type: string
coverage_json_artifact: coverage_json_artifact:
description: 'Name of the JSON coverage artifact.' description: 'Name of the JSON coverage artifact.'
required: false required: false
default: '' default: ''
type: string type: string
coverage_report_json_directory:
description: 'Directory containing the JSON coverage report file.'
required: false
default: 'report/coverage'
type: string
coverage_report_json_filename:
description: 'Filename of the JSON coverage report file.'
required: false
default: 'coverage.json'
type: string
coverage_html_artifact: coverage_html_artifact:
description: 'Name of the HTML coverage artifact.' description: 'Name of the HTML coverage artifact.'
required: false required: false
default: '' default: ''
type: string type: string
coverage_report_html_directory:
description: 'HTML root directory of the generated coverage report.'
required: false
default: 'report/coverage/html'
type: string
codecov:
description: 'Publish merged coverage report to Codecov.'
required: false
default: false
type: boolean
codacy:
description: 'Publish merged coverage report to Codacy.'
required: false
default: false
type: boolean
secrets: secrets:
codacy_token: CODECOV_TOKEN:
description: 'Token to push result to codacy.' description: 'Token to push result to Codecov.'
required: true
CODACY_TOKEN:
description: 'Token to push result to Codacy.'
required: true required: true
jobs: jobs:
@@ -90,66 +128,6 @@ jobs:
run: | run: |
python -m pip install -U --disable-pip-version-check --break-system-packages coverage[toml] tomli python -m pip install -U --disable-pip-version-check --break-system-packages coverage[toml] tomli
- name: 🔁 Extract configurations from pyproject.toml
id: getVariables
shell: python
run: |
from os import getenv
from pathlib import Path
from sys import version
from textwrap import dedent
print(f"Python: {version}")
from tomli import load as tomli_load
htmlDirectory = Path("htmlcov")
xmlFile = Path("./coverage.xml")
jsonFile = Path("./coverage.json")
coverageRC = "${{ inputs.coverage_config }}".strip()
# Read output paths from 'pyproject.toml' file
if coverageRC == "pyproject.toml":
pyProjectFile = Path("pyproject.toml")
if pyProjectFile.exists():
with pyProjectFile.open("rb") as file:
pyProjectSettings = tomli_load(file)
htmlDirectory = Path(pyProjectSettings["tool"]["coverage"]["html"]["directory"])
xmlFile = Path(pyProjectSettings["tool"]["coverage"]["xml"]["output"])
jsonFile = Path(pyProjectSettings["tool"]["coverage"]["json"]["output"])
else:
print(f"File '{pyProjectFile}' not found.")
print(f"::error title=FileNotFoundError::File '{pyProjectFile}' not found.")
exit(1)
# Read output paths from '.coveragerc' file
elif len(coverageRC) > 0:
coverageRCFile = Path(coverageRC)
if coverageRCFile.exists():
with coverageRCFile.open("rb") as file:
coverageRCSettings = tomli_load(file)
htmlDirectory = Path(coverageRCSettings["html"]["directory"])
xmlFile = Path(coverageRCSettings["xml"]["output"])
jsonFile = Path(coverageRCSettings["json"]["output"])
else:
print(f"File '{coverageRCFile}' not found.")
print(f"::error title=FileNotFoundError::File '{coverageRCFile}' not found.")
exit(1)
# Write jobs to special file
github_output = Path(getenv("GITHUB_OUTPUT"))
print(f"GITHUB_OUTPUT: {github_output}")
with github_output.open("a+", encoding="utf-8") as f:
f.write(dedent(f"""\
coverage_report_html_directory={htmlDirectory.as_posix()}
coverage_report_xml={xmlFile}
coverage_report_json={jsonFile}
"""))
print(f"DEBUG:\n html={htmlDirectory}\n xml={xmlFile}\n json={jsonFile}")
- name: Rename .coverage files and move them all into 'coverage/' - name: Rename .coverage files and move them all into 'coverage/'
run: | run: |
mkdir -p coverage mkdir -p coverage
@@ -163,7 +141,7 @@ jobs:
run: coverage report --rcfile=pyproject.toml --data-file=.coverage run: coverage report --rcfile=pyproject.toml --data-file=.coverage
- name: Convert to XML format (Cobertura) - name: Convert to XML format (Cobertura)
if: inputs.coverage_xml_artifact != '' if: inputs.coverage_xml_artifact != '' || inputs.codecov || inputs.codacy
run: coverage xml --data-file=.coverage run: coverage xml --data-file=.coverage
- name: Convert to JSON format - name: Convert to JSON format
@@ -193,7 +171,8 @@ jobs:
continue-on-error: true continue-on-error: true
with: with:
name: ${{ inputs.coverage_xml_artifact }} name: ${{ inputs.coverage_xml_artifact }}
path: ${{ steps.getVariables.outputs.coverage_report_xml }} working-directory: ${{ inputs.coverage_report_xml_directory }}
path: ${{ inputs.coverage_report_xml_filename }}
if-no-files-found: error if-no-files-found: error
retention-days: 1 retention-days: 1
@@ -203,7 +182,8 @@ jobs:
continue-on-error: true continue-on-error: true
with: with:
name: ${{ inputs.coverage_json_artifact }} name: ${{ inputs.coverage_json_artifact }}
path: ${{ steps.getVariables.outputs.coverage_report_json }} working-directory: ${{ inputs.coverage_report_json_directory }}
path: ${{ inputs.coverage_report_json_filename }}
if-no-files-found: error if-no-files-found: error
retention-days: 1 retention-days: 1
@@ -213,24 +193,27 @@ jobs:
continue-on-error: true continue-on-error: true
with: with:
name: ${{ inputs.coverage_html_artifact }} name: ${{ inputs.coverage_html_artifact }}
working-directory: ${{ steps.getVariables.outputs.coverage_report_html_directory }} working-directory: ${{ inputs.coverage_report_html_directory }}
path: '*' path: '*'
if-no-files-found: error if-no-files-found: error
retention-days: 1 retention-days: 1
- name: 📊 Publish code coverage at CodeCov - name: 📊 Publish code coverage at CodeCov
uses: codecov/codecov-action@v5 uses: codecov/codecov-action@v5
if: inputs.CodeCov == true if: inputs.codecov
continue-on-error: true continue-on-error: true
with: with:
files: ${{ steps.getVariables.outputs.coverage_report_xml }} token: ${{ secrets.CODECOV_TOKEN }}
disable_search: true
files: ${{ inputs.coverage_report_xml_directory }}/${{ inputs.coverage_report_xml_filename }}
flags: unittests flags: unittests
env_vars: PYTHON env_vars: PYTHON
fail_ci_if_error: true
- name: 📉 Publish code coverage at Codacy - name: 📉 Publish code coverage at Codacy
uses: codacy/codacy-coverage-reporter-action@v1 uses: codacy/codacy-coverage-reporter-action@v1
if: inputs.Codacy == true if: inputs.codacy
continue-on-error: true continue-on-error: true
with: with:
project-token: ${{ secrets.codacy_token }} project-token: ${{ secrets.CODACY_TOKEN }}
coverage-reports: ${{ steps.getVariables.outputs.coverage_report_xml }} coverage-reports: ${{ inputs.coverage_report_xml_directory }}/${{ inputs.coverage_report_xml_filename }}

View File

@@ -33,7 +33,7 @@ on:
python_version: python_version:
description: 'Python version.' description: 'Python version.'
required: false required: false
default: '3.12' default: '3.13'
type: string type: string
requirements: requirements:
description: 'Python dependencies to be installed through pip.' description: 'Python dependencies to be installed through pip.'

View File

@@ -34,6 +34,11 @@ on:
required: false required: false
default: '*-UnitTestReportSummary-XML-*' default: '*-UnitTestReportSummary-XML-*'
type: string type: string
merged_junit_filename:
description: 'Filename of the merged JUnit Test Summary.'
required: false
default: 'Unittesting.xml'
type: string
merged_junit_artifact: merged_junit_artifact:
description: 'Name of the merged JUnit Test Summary artifact.' description: 'Name of the merged JUnit Test Summary artifact.'
required: false required: false
@@ -44,6 +49,11 @@ on:
required: false required: false
default: '"--pytest=rewrite-dunder-init;reduce-depth:pytest.tests.unit"' default: '"--pytest=rewrite-dunder-init;reduce-depth:pytest.tests.unit"'
type: string type: string
testsuite-summary-name:
description: 'Set TestsuiteSummary name.'
required: false
default: ''
type: string
publish: publish:
description: 'Publish test report summary via Dorny Test-Reporter' description: 'Publish test report summary via Dorny Test-Reporter'
required: false required: false
@@ -54,6 +64,20 @@ on:
required: false required: false
default: 'Unit Test Results' default: 'Unit Test Results'
type: string type: string
dorny:
description: 'Publish merged unittest results via Dorny Test-Reporter.'
required: false
default: true
type: boolean
codecov:
description: 'Publish merged unittest results to Codecov.'
required: false
default: true
type: boolean
secrets:
CODECOV_TOKEN:
description: 'Token to push result to Codecov.'
required: true
jobs: jobs:
PublishTestResults: PublishTestResults:
@@ -69,7 +93,7 @@ jobs:
uses: pyTooling/download-artifact@v4 uses: pyTooling/download-artifact@v4
with: with:
pattern: ${{ inputs.unittest_artifacts_pattern }} pattern: ${{ inputs.unittest_artifacts_pattern }}
path: artifacts path: artifacts
- name: 🔎 Inspect extracted artifact (tarball) - name: 🔎 Inspect extracted artifact (tarball)
run: | run: |
@@ -87,23 +111,33 @@ jobs:
- name: 🔁 Merge JUnit Unit Test Summaries - name: 🔁 Merge JUnit Unit Test Summaries
run: | run: |
pyedaa-reports -v unittest "--merge=pyTest-JUnit:junit/*.xml" ${{ inputs.additional_merge_args }} "--output=pyTest-JUnit:Unittesting.xml" pyedaa-reports -v unittest "--name=${{ inputs.testsuite-summary-name }}" "--merge=pyTest-JUnit:junit/*.xml" ${{ inputs.additional_merge_args }} "--output=pyTest-JUnit:${{ inputs.merged_junit_filename }}"
printf "%s\n" "cat Unittesting.xml" printf "%s\n" "cat ${{ inputs.merged_junit_filename }}"
cat Unittesting.xml cat ${{ inputs.merged_junit_filename }}
- name: 📊 Publish Unit Test Results - name: 📊 Publish Unit Test Results
uses: dorny/test-reporter@v1 uses: dorny/test-reporter@v2
if: inputs.publish && inputs.report_title != '' if: (inputs.dorny || inputs.publish) && inputs.report_title != ''
with: with:
name: ${{ inputs.report_title }} name: ${{ inputs.report_title }}
path: Unittesting.xml path: ${{ inputs.merged_junit_filename }}
reporter: java-junit reporter: java-junit
- name: 📊 Publish unittest results at CodeCov
uses: codecov/test-results-action@v1
if: inputs.codecov
with:
token: ${{ secrets.CODECOV_TOKEN }}
disable_search: true
files: ${{ inputs.merged_junit_filename }}
fail_ci_if_error: true
- name: 📤 Upload merged 'JUnit Test Summary' artifact - name: 📤 Upload merged 'JUnit Test Summary' artifact
uses: pyTooling/upload-artifact@v4 uses: pyTooling/upload-artifact@v4
if: inputs.merged_junit_artifact != '' if: inputs.merged_junit_artifact != ''
with: with:
name: ${{ inputs.merged_junit_artifact }} name: ${{ inputs.merged_junit_artifact }}
path: Unittesting.xml path: ${{ inputs.merged_junit_filename }}
if-no-files-found: error if-no-files-found: error
retention-days: 1 retention-days: 1
investigate: true

View File

@@ -44,9 +44,9 @@ jobs:
RELEASE_VERSION=${GIT_TAG#v} RELEASE_VERSION=${GIT_TAG#v}
RELEASE_DATETIME="$(date --utc '+%d.%m.%Y - %H:%M:%S')" RELEASE_DATETIME="$(date --utc '+%d.%m.%Y - %H:%M:%S')"
# write to step outputs # write to step outputs
echo "gitTag=${GIT_TAG}" >> $GITHUB_OUTPUT printf "%s\n" "gitTag=${GIT_TAG}" >> $GITHUB_OUTPUT
echo "version=${RELEASE_VERSION}" >> $GITHUB_OUTPUT printf "%s\n" "version=${RELEASE_VERSION}" >> $GITHUB_OUTPUT
echo "datetime=${RELEASE_DATETIME}" >> $GITHUB_OUTPUT printf "%s\n" "datetime=${RELEASE_DATETIME}" >> $GITHUB_OUTPUT
- name: 📑 Create Release Page - name: 📑 Create Release Page
uses: actions/create-release@v1 uses: actions/create-release@v1

View File

@@ -32,7 +32,7 @@ on:
python_version: python_version:
description: 'Python version.' description: 'Python version.'
required: false required: false
default: '3.12' default: '3.13'
type: string type: string
requirements: requirements:
description: 'Python dependencies to be installed through pip.' description: 'Python dependencies to be installed through pip.'
@@ -105,6 +105,7 @@ jobs:
with: with:
name: ${{ inputs.unittest_xml_artifact }} name: ${{ inputs.unittest_xml_artifact }}
path: ${{ inputs.unittest_xml_directory }} path: ${{ inputs.unittest_xml_directory }}
investigate: true
- name: 📥 Download artifacts '${{ inputs.coverage_json_artifact }}' from 'PublishCoverageResults' job - name: 📥 Download artifacts '${{ inputs.coverage_json_artifact }}' from 'PublishCoverageResults' job
uses: pyTooling/download-artifact@v4 uses: pyTooling/download-artifact@v4
@@ -112,6 +113,7 @@ jobs:
with: with:
name: ${{ inputs.coverage_json_artifact }} name: ${{ inputs.coverage_json_artifact }}
path: ${{ inputs.coverage_report_json_directory }} path: ${{ inputs.coverage_report_json_directory }}
investigate: true
- name: ☑ Generate HTML documentation - name: ☑ Generate HTML documentation
if: inputs.html_artifact != '' if: inputs.html_artifact != ''
@@ -162,6 +164,7 @@ jobs:
with: with:
name: ${{ inputs.unittest_xml_artifact }} name: ${{ inputs.unittest_xml_artifact }}
path: ${{ inputs.unittest_xml_directory }} path: ${{ inputs.unittest_xml_directory }}
investigate: true
- name: 📥 Download artifacts '${{ inputs.coverage_json_artifact }}' from 'PublishCoverageResults' job - name: 📥 Download artifacts '${{ inputs.coverage_json_artifact }}' from 'PublishCoverageResults' job
uses: pyTooling/download-artifact@v4 uses: pyTooling/download-artifact@v4
@@ -169,6 +172,7 @@ jobs:
with: with:
name: ${{ inputs.coverage_json_artifact }} name: ${{ inputs.coverage_json_artifact }}
path: ${{ inputs.coverage_report_json_directory }} path: ${{ inputs.coverage_report_json_directory }}
investigate: true
- name: ☑ Generate LaTeX documentation - name: ☑ Generate LaTeX documentation
if: inputs.latex_artifact != '' if: inputs.latex_artifact != ''

View File

@@ -33,7 +33,7 @@ on:
python_version: python_version:
description: 'Python version.' description: 'Python version.'
required: false required: false
default: '3.12' default: '3.13'
type: string type: string
requirements: requirements:
description: 'Python dependencies to be installed through pip.' description: 'Python dependencies to be installed through pip.'

View File

@@ -358,6 +358,7 @@ jobs:
- name: ✅ Run unit tests (Windows) - name: ✅ Run unit tests (Windows)
if: matrix.system == 'windows' if: matrix.system == 'windows'
continue-on-error: true
run: | run: |
$env:ENVIRONMENT_NAME = "${{ matrix.envname }}" $env:ENVIRONMENT_NAME = "${{ matrix.envname }}"
$env:PYTHONPATH = (Get-Location).ToString() $env:PYTHONPATH = (Get-Location).ToString()

View File

@@ -33,7 +33,7 @@ on:
python_version: python_version:
description: 'Python version.' description: 'Python version.'
required: false required: false
default: '3.12' default: '3.13'
type: string type: string
jobs: jobs:

View File

@@ -30,7 +30,7 @@ jobs:
- ConfigParams - ConfigParams
- UnitTestingParams - UnitTestingParams
with: with:
jobs: ${{ needs.UnitTestingParams.outputs.python_jobs }} jobs: ${{ needs.UnitTestingParams.outputs.python_jobs }}
unittest_report_xml_directory: ${{ needs.ConfigParams.outputs.unittest_report_xml_directory }} unittest_report_xml_directory: ${{ needs.ConfigParams.outputs.unittest_report_xml_directory }}
unittest_report_xml_filename: ${{ needs.ConfigParams.outputs.unittest_report_xml_filename }} unittest_report_xml_filename: ${{ needs.ConfigParams.outputs.unittest_report_xml_filename }}
coverage_report_html_directory: ${{ needs.ConfigParams.outputs.coverage_report_html_directory }} coverage_report_html_directory: ${{ needs.ConfigParams.outputs.coverage_report_html_directory }}
@@ -47,9 +47,9 @@ jobs:
- ConfigParams - ConfigParams
- PlatformTestingParams - PlatformTestingParams
with: with:
jobs: ${{ needs.PlatformTestingParams.outputs.python_jobs }} jobs: ${{ needs.PlatformTestingParams.outputs.python_jobs }}
# tests_directory: "" # tests_directory: ""
unittest_directory: platform unittest_directory: platform
unittest_report_xml_directory: ${{ needs.ConfigParams.outputs.unittest_report_xml_directory }} unittest_report_xml_directory: ${{ needs.ConfigParams.outputs.unittest_report_xml_directory }}
unittest_report_xml_filename: ${{ needs.ConfigParams.outputs.unittest_report_xml_filename }} unittest_report_xml_filename: ${{ needs.ConfigParams.outputs.unittest_report_xml_filename }}
coverage_report_html_directory: ${{ needs.ConfigParams.outputs.coverage_report_html_directory }} coverage_report_html_directory: ${{ needs.ConfigParams.outputs.coverage_report_html_directory }}
@@ -70,7 +70,7 @@ jobs:
commands: | commands: |
${{ needs.ConfigParams.outputs.mypy_prepare_command }} ${{ needs.ConfigParams.outputs.mypy_prepare_command }}
mypy --html-report htmlmypy -p ${{ needs.ConfigParams.outputs.package_fullname }} mypy --html-report htmlmypy -p ${{ needs.ConfigParams.outputs.package_fullname }}
html_report: 'htmlmypy' html_report: 'htmlmypy'
html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }} html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }}
DocCoverage: DocCoverage:
@@ -80,7 +80,7 @@ jobs:
- UnitTestingParams - UnitTestingParams
with: with:
python_version: ${{ needs.UnitTestingParams.outputs.python_version }} python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
directory: ${{ needs.ConfigParams.outputs.package_directors }} directory : ${{ needs.ConfigParams.outputs.package_directors }}
# fail_below: 70 # fail_below: 70
Package: Package:
@@ -91,31 +91,46 @@ jobs:
- PlatformTesting - PlatformTesting
with: with:
python_version: ${{ needs.UnitTestingParams.outputs.python_version }} python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }} artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
PublishCoverageResults: PublishCoverageResults:
uses: pyTooling/Actions/.github/workflows/PublishCoverageResults.yml@r4 uses: pyTooling/Actions/.github/workflows/PublishCoverageResults.yml@r4
needs: needs:
- ConfigParams
- UnitTestingParams - UnitTestingParams
- UnitTesting - UnitTesting
- PlatformTesting - PlatformTesting
with: with:
coverage_sqlite_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }} coverage_sqlite_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}
coverage_xml_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_xml }} coverage_xml_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_xml }}
coverage_json_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }} coverage_report_xml_directory: ${{ needs.ConfigParams.outputs.coverage_report_xml_directory }}
coverage_html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }} coverage_report_xml_filename: ${{ needs.ConfigParams.outputs.coverage_report_xml_filename }}
coverage_json_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}
coverage_report_json_directory: ${{ needs.ConfigParams.outputs.coverage_report_json_directory }}
coverage_report_json_filename: ${{ needs.ConfigParams.outputs.coverage_report_json_filename }}
coverage_html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}
coverage_report_html_directory: ${{ needs.ConfigParams.outputs.coverage_report_html_directory }}
codecov: true
codacy: true
secrets: secrets:
codacy_token: ${{ secrets.CODACY_PROJECT_TOKEN }} CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
CODACY_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
PublishTestResults: PublishTestResults:
uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@r4 uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@r4
needs: needs:
- ConfigParams
- UnitTestingParams - UnitTestingParams
- UnitTesting - UnitTesting
- PlatformTesting - PlatformTesting
with: with:
additional_merge_args: '-d "--pytest=rewrite-dunder-init;reduce-depth:pytest.tests.unit;reduce-depth:pytest.tests.platform"' additional_merge_args: '-d "--pytest=rewrite-dunder-init;reduce-depth:pytest.tests.unit;reduce-depth:pytest.tests.platform"'
merged_junit_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }} testsuite-summary-name: ${{ needs.ConfigParams.outputs.package_fullname }}
merged_junit_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}
codecov: true
dorny: true
secrets:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
# VerifyDocs: # VerifyDocs:
# uses: pyTooling/Actions/.github/workflows/VerifyDocs.yml@r4 # uses: pyTooling/Actions/.github/workflows/VerifyDocs.yml@r4

View File

@@ -10,6 +10,10 @@ jobs:
with: with:
package_namespace: pyExamples package_namespace: pyExamples
package_name: Extensions package_name: Extensions
codecov: true
codacy: true
dorny: true
secrets: secrets:
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}

View File

@@ -9,6 +9,11 @@ jobs:
uses: pyTooling/Actions/.github/workflows/CompletePipeline.yml@r4 uses: pyTooling/Actions/.github/workflows/CompletePipeline.yml@r4
with: with:
package_name: pyDummy package_name: pyDummy
codecov: true
codacy: true
dorny: true
cleanup: false
secrets: secrets:
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}

View File

@@ -1,6 +1,6 @@
-r ../requirements.txt -r ../requirements.txt
pyTooling ~= 8.2 pyTooling ~= 8.4
# Enforce latest version on ReadTheDocs # Enforce latest version on ReadTheDocs
sphinx ~= 8.2 sphinx ~= 8.2

View File

@@ -1,8 +1,8 @@
[build-system] [build-system]
requires = [ requires = [
"setuptools ~= 75.8", "setuptools ~= 78.1",
"wheel ~= 0.45", "wheel ~= 0.45",
"pyTooling ~= 8.2" "pyTooling ~= 8.4"
] ]
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"
@@ -21,7 +21,10 @@ namespace_packages = true
html_report = "report/typing" html_report = "report/typing"
[tool.pytest] [tool.pytest]
junit_xml = "report/unit/TestReportSummary.xml" junit_xml = "report/unit/UnittestReportSummary.xml"
[tool.pyedaa-reports]
junit_xml = "report/unit/unittest.xml"
[tool.pytest.ini_options] [tool.pytest.ini_options]
addopts = "--tb=native" addopts = "--tb=native"

View File

@@ -5,7 +5,7 @@
# Unai Martinez-Corral # # Unai Martinez-Corral #
# # # #
# ==================================================================================================================== # # ==================================================================================================================== #
# Copyright 2020-2024 The pyTooling Authors # # Copyright 2020-2025 The pyTooling Authors #
# # # #
# Licensed under the Apache License, Version 2.0 (the "License"); # # Licensed under the Apache License, Version 2.0 (the "License"); #
# you may not use this file except in compliance with the License. # # you may not use this file except in compliance with the License. #

View File

@@ -1 +1 @@
pyTooling ~= 8.2 pyTooling ~= 8.4

View File

@@ -1,13 +1,13 @@
-r ../requirements.txt -r ../requirements.txt
# Coverage collection # Coverage collection
Coverage ~= 7.6 Coverage ~= 7.8
# Test Runner # Test Runner
pytest ~= 8.3 pytest ~= 8.3
pytest-cov ~= 6.0 pytest-cov ~= 6.1
# Static Type Checking # Static Type Checking
mypy ~= 1.15 mypy ~= 1.15
typing_extensions ~= 4.12 typing_extensions ~= 4.13
lxml ~= 5.3 lxml ~= 5.3