mirror of
https://github.com/pyTooling/Actions.git
synced 2026-02-14 20:16:56 +08:00
Compare commits
99 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
99f30dab53 | ||
|
|
e7e95b446d | ||
|
|
df0889b86b | ||
|
|
87978fd1f6 | ||
|
|
3e95c89362 | ||
|
|
f737b07992 | ||
|
|
77a6b4c00a | ||
|
|
ef5c852097 | ||
|
|
bec076bd66 | ||
|
|
c924651632 | ||
|
|
b9b9b0b1d4 | ||
|
|
1cef082753 | ||
|
|
c3a999c754 | ||
|
|
9760023567 | ||
|
|
fbbb39046a | ||
|
|
1d0c8b36e8 | ||
|
|
c9d0e8e9c6 | ||
|
|
00269cf507 | ||
|
|
a15499a807 | ||
|
|
13076012dd | ||
|
|
b2ac6bc0d9 | ||
|
|
e88aa7b973 | ||
|
|
855d432978 | ||
|
|
1c42072471 | ||
|
|
bf6ba9ba19 | ||
|
|
93cdeb9cba | ||
|
|
72a8705e6c | ||
|
|
ea96cce0d1 | ||
|
|
59ce0fa84a | ||
|
|
c8362d99cc | ||
|
|
0e9d878f0e | ||
|
|
74afc5a42a | ||
|
|
5d67896606 | ||
|
|
4b058faf3e | ||
|
|
474a8024d1 | ||
|
|
5dc19a5d65 | ||
|
|
188feb556b | ||
|
|
d58db55086 | ||
|
|
ee9a3fbdcd | ||
|
|
8dfc484c42 | ||
|
|
960b7089e7 | ||
|
|
706ef39595 | ||
|
|
04881fc4ca | ||
|
|
e444e57112 | ||
|
|
cea83bc2ae | ||
|
|
440553e7fb | ||
|
|
26461822b5 | ||
|
|
7a341dbe8f | ||
|
|
33b99a3b4e | ||
|
|
5e0aa52e5d | ||
|
|
2862238ee5 | ||
|
|
ebd20f5aea | ||
|
|
2004711d48 | ||
|
|
02d386a9e1 | ||
|
|
e0af5055a8 | ||
|
|
cc1dade947 | ||
|
|
b87d11502b | ||
|
|
fa96ee9197 | ||
|
|
2e5a79e0c2 | ||
|
|
0495bfb18c | ||
|
|
f62d5d93ea | ||
|
|
13c1a56f92 | ||
|
|
da3cdbe96a | ||
|
|
5fe793e3fa | ||
|
|
c38ff2af3c | ||
|
|
98f0fffaf6 | ||
|
|
0fef6f8a4d | ||
|
|
92ce834303 | ||
|
|
607637b278 | ||
|
|
dfc9221529 | ||
|
|
d4afc820ab | ||
|
|
ae13aa2dff | ||
|
|
7879c05ab7 | ||
|
|
df4815f666 | ||
|
|
8b7a8009a6 | ||
|
|
6b4af68fa4 | ||
|
|
0db1821658 | ||
|
|
6d84311338 | ||
|
|
4406abe788 | ||
|
|
db99e35dec | ||
|
|
6cfc6e0f8f | ||
|
|
5adddda1a1 | ||
|
|
91289c4257 | ||
|
|
527e94b245 | ||
|
|
f11c335674 | ||
|
|
5bed864443 | ||
|
|
37ec436eb4 | ||
|
|
6a7a4212c3 | ||
|
|
f5b6f17d4e | ||
|
|
883238547a | ||
|
|
7cd852db58 | ||
|
|
ce0d30fe3f | ||
|
|
34dacf7bcf | ||
|
|
48090e113d | ||
|
|
e082d77e7a | ||
|
|
181035b0ba | ||
|
|
643f95bbb6 | ||
|
|
424b75ca96 | ||
|
|
f0610331b9 |
9
.btd.yml
9
.btd.yml
@@ -1,9 +0,0 @@
|
|||||||
input: doc
|
|
||||||
output: _build
|
|
||||||
requirements: requirements.txt
|
|
||||||
target: gh-pages
|
|
||||||
formats: [ html ]
|
|
||||||
images:
|
|
||||||
base: btdi/sphinx:pytooling
|
|
||||||
latex: btdi/latex
|
|
||||||
theme: https://codeload.GitHub.com/buildthedocs/sphinx.theme/tar.gz/v1
|
|
||||||
20
.github/pull_request_template.md
vendored
20
.github/pull_request_template.md
vendored
@@ -1,16 +1,30 @@
|
|||||||
# New Features
|
# New Features
|
||||||
|
|
||||||
|
* tbd
|
||||||
* tbd
|
* tbd
|
||||||
|
|
||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
|
* tbd
|
||||||
* tbd
|
* tbd
|
||||||
|
|
||||||
# Bug Fixes
|
# Bug Fixes
|
||||||
|
|
||||||
|
* tbd
|
||||||
* tbd
|
* tbd
|
||||||
|
|
||||||
----------
|
# Documentation
|
||||||
# Related PRs:
|
|
||||||
|
|
||||||
* tbd
|
* tbd
|
||||||
|
* tbd
|
||||||
|
|
||||||
|
# Unit Tests
|
||||||
|
|
||||||
|
* tbd
|
||||||
|
* tbd
|
||||||
|
|
||||||
|
----------
|
||||||
|
# Related Issues and Pull-Requests
|
||||||
|
|
||||||
|
* tbd
|
||||||
|
* tbd
|
||||||
|
|||||||
38
.github/workflows/ApplicationTesting.yml
vendored
38
.github/workflows/ApplicationTesting.yml
vendored
@@ -124,26 +124,34 @@ jobs:
|
|||||||
requirements = "${{ inputs.requirements }}"
|
requirements = "${{ inputs.requirements }}"
|
||||||
if requirements.startswith("-r"):
|
if requirements.startswith("-r"):
|
||||||
requirementsFile = Path(requirements[2:].lstrip())
|
requirementsFile = Path(requirements[2:].lstrip())
|
||||||
dependencies = loadRequirementsFile(requirementsFile)
|
try:
|
||||||
|
dependencies = loadRequirementsFile(requirementsFile)
|
||||||
|
except FileNotFoundError as ex:
|
||||||
|
print(f"::error title=FileNotFoundError::{ex}")
|
||||||
|
exit(1)
|
||||||
else:
|
else:
|
||||||
dependencies = [req.strip() for req in requirements.split(" ")]
|
dependencies = [req.strip() for req in requirements.split(" ")]
|
||||||
|
|
||||||
packages = {
|
packages = {
|
||||||
"coverage": "python-coverage:p",
|
"coverage": "python-coverage:p",
|
||||||
"igraph": "igraph:p",
|
"docstr_coverage": "python-pyyaml:p",
|
||||||
"jinja2": "python-markupsafe:p",
|
"igraph": "igraph:p",
|
||||||
"lxml": "python-lxml:p",
|
"jinja2": "python-markupsafe:p",
|
||||||
"numpy": "python-numpy:p",
|
"lxml": "python-lxml:p",
|
||||||
"markupsafe": "python-markupsafe:p",
|
"numpy": "python-numpy:p",
|
||||||
"pip": "python-pip:p",
|
"markupsafe": "python-markupsafe:p",
|
||||||
"ruamel.yaml": "python-ruamel-yaml:p python-ruamel.yaml.clib:p",
|
"pip": "python-pip:p",
|
||||||
"sphinx": "python-markupsafe:p",
|
"pyyaml": "python-pyyaml:p",
|
||||||
"tomli": "python-tomli:p",
|
"ruamel.yaml": "python-ruamel-yaml:p python-ruamel.yaml.clib:p",
|
||||||
"wheel": "python-wheel:p",
|
"sphinx": "python-markupsafe:p",
|
||||||
|
"tomli": "python-tomli:p",
|
||||||
|
"wheel": "python-wheel:p",
|
||||||
|
"pyEDAA.ProjectModel": "python-ruamel-yaml:p python-ruamel.yaml.clib:p python-lxml:p",
|
||||||
|
"pyEDAA.Reports": "python-ruamel-yaml:p python-ruamel.yaml.clib:p python-lxml:p",
|
||||||
}
|
}
|
||||||
subPackages = {
|
subPackages = {
|
||||||
"pytooling": {
|
"pytooling": {
|
||||||
"yaml": "python-ruamel-yaml:p python-ruamel.yaml.clib:p",
|
"yaml": "python-ruamel-yaml:p python-ruamel.yaml.clib:p",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,7 +223,7 @@ jobs:
|
|||||||
ls -l install
|
ls -l install
|
||||||
python -m pip install --disable-pip-version-check -U install/*.whl
|
python -m pip install --disable-pip-version-check -U install/*.whl
|
||||||
|
|
||||||
- name: ☑ Run application tests (Ubuntu/macOS)
|
- name: ✅ Run application tests (Ubuntu/macOS)
|
||||||
if: matrix.system != 'windows'
|
if: matrix.system != 'windows'
|
||||||
run: |
|
run: |
|
||||||
export ENVIRONMENT_NAME="${{ matrix.envname }}"
|
export ENVIRONMENT_NAME="${{ matrix.envname }}"
|
||||||
@@ -230,7 +238,7 @@ jobs:
|
|||||||
python -m pytest -raP $PYTEST_ARGS --color=yes ${{ inputs.tests_directory || '.' }}/${{ inputs.apptest_directory }}
|
python -m pytest -raP $PYTEST_ARGS --color=yes ${{ inputs.tests_directory || '.' }}/${{ inputs.apptest_directory }}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: ☑ Run application tests (Windows)
|
- name: ✅ Run application tests (Windows)
|
||||||
if: matrix.system == 'windows'
|
if: matrix.system == 'windows'
|
||||||
run: |
|
run: |
|
||||||
$env:ENVIRONMENT_NAME = "${{ matrix.envname }}"
|
$env:ENVIRONMENT_NAME = "${{ matrix.envname }}"
|
||||||
|
|||||||
7
.github/workflows/ArtifactCleanUp.yml
vendored
7
.github/workflows/ArtifactCleanUp.yml
vendored
@@ -25,6 +25,11 @@ name: ArtifactCleanUp
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
package:
|
package:
|
||||||
description: 'Artifacts to be removed on not tagged runs.'
|
description: 'Artifacts to be removed on not tagged runs.'
|
||||||
required: true
|
required: true
|
||||||
@@ -38,7 +43,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
ArtifactCleanUp:
|
ArtifactCleanUp:
|
||||||
name: 🗑️ Artifact Cleanup
|
name: 🗑️ Artifact Cleanup
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 🗑️ Delete package Artifacts
|
- name: 🗑️ Delete package Artifacts
|
||||||
|
|||||||
5
.github/workflows/BuildTheDocs.yml
vendored
5
.github/workflows/BuildTheDocs.yml
vendored
@@ -34,9 +34,12 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
BuildTheDocs:
|
BuildTheDocs:
|
||||||
name: 📓 Run BuildTheDocs
|
name: 📓 Run BuildTheDocs
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- name: '❗ Deprecation message'
|
||||||
|
run: echo "::warning title=Deprecated::'BuildTheDocs.yml' is not maintained anymore. Please switch to 'SphinxDocumentation.yml', 'LaTeXDocumentation.yml' and 'ExtractConfiguration.yml'."
|
||||||
|
|
||||||
- name: ⏬ Checkout repository
|
- name: ⏬ Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
|||||||
21
.github/workflows/CheckDocumentation.yml
vendored
21
.github/workflows/CheckDocumentation.yml
vendored
@@ -24,6 +24,11 @@ name: Check Documentation
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
python_version:
|
python_version:
|
||||||
description: 'Python version.'
|
description: 'Python version.'
|
||||||
required: false
|
required: false
|
||||||
@@ -33,16 +38,16 @@ on:
|
|||||||
description: 'Source code directory to check.'
|
description: 'Source code directory to check.'
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
# fail_below:
|
fail_under:
|
||||||
# description: 'Minimum required documentation coverage level'
|
description: 'Minimum required documentation coverage level'
|
||||||
# required: false
|
required: false
|
||||||
# default: 75
|
default: 80
|
||||||
# type: string
|
type: string
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
DocCoverage:
|
DocCoverage:
|
||||||
name: 👀 Check documentation coverage
|
name: 👀 Check documentation coverage
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
steps:
|
steps:
|
||||||
- name: ⏬ Checkout repository
|
- name: ⏬ Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -59,9 +64,9 @@ jobs:
|
|||||||
- name: Run 'interrogate' Documentation Coverage Check
|
- name: Run 'interrogate' Documentation Coverage Check
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
run: |
|
run: |
|
||||||
interrogate -c pyproject.toml
|
interrogate -c pyproject.toml --fail-under=${{ inputs.fail_under }} && echo "::error title=interrogate::Insufficient documentation quality (goal: ${{ inputs.fail_under }})"
|
||||||
|
|
||||||
- name: Run 'docstr_coverage' Documentation Coverage Check
|
- name: Run 'docstr_coverage' Documentation Coverage Check
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
run: |
|
run: |
|
||||||
docstr_coverage -v ${{ inputs.directory }}
|
docstr-coverage -v 2 --fail-under=${{ inputs.fail_under }} ${{ inputs.directory }} && echo "::error title=docstr-coverage::Insufficient documentation quality (goal: ${{ inputs.fail_under }})"
|
||||||
|
|||||||
16
.github/workflows/CoverageCollection.yml
vendored
16
.github/workflows/CoverageCollection.yml
vendored
@@ -25,6 +25,11 @@ name: Coverage Collection
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
python_version:
|
python_version:
|
||||||
description: 'Python version.'
|
description: 'Python version.'
|
||||||
required: false
|
required: false
|
||||||
@@ -63,9 +68,12 @@ jobs:
|
|||||||
|
|
||||||
Coverage:
|
Coverage:
|
||||||
name: 📈 Collect Coverage Data using Python ${{ inputs.python_version }}
|
name: 📈 Collect Coverage Data using Python ${{ inputs.python_version }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- name: '❗ Deprecation message'
|
||||||
|
run: echo "::warning title=Deprecated::'CoverageCollection.yml' is not maintained anymore. Please switch to 'UnitTesting.yml', 'PublishCoverageResults.yml' and 'PublishTestResults.yml'."
|
||||||
|
|
||||||
- name: ⏬ Checkout repository
|
- name: ⏬ Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
@@ -102,7 +110,9 @@ jobs:
|
|||||||
htmlDirectory = pyProjectSettings["tool"]["coverage"]["html"]["directory"]
|
htmlDirectory = pyProjectSettings["tool"]["coverage"]["html"]["directory"]
|
||||||
xmlFile = pyProjectSettings["tool"]["coverage"]["xml"]["output"]
|
xmlFile = pyProjectSettings["tool"]["coverage"]["xml"]["output"]
|
||||||
else:
|
else:
|
||||||
print(f"File '{pyProjectFile}' not found and no ' .coveragerc' file specified.")
|
print(f"File '{pyProjectFile}' not found.")
|
||||||
|
print(f"::error title=FileNotFoundError::File '{pyProjectFile}' not found.")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
# Read output paths from '.coveragerc' file
|
# Read output paths from '.coveragerc' file
|
||||||
elif len(coverageRC) > 0:
|
elif len(coverageRC) > 0:
|
||||||
@@ -115,6 +125,8 @@ jobs:
|
|||||||
xmlFile = coverageRCSettings["xml"]["output"]
|
xmlFile = coverageRCSettings["xml"]["output"]
|
||||||
else:
|
else:
|
||||||
print(f"File '{coverageRCFile}' not found.")
|
print(f"File '{coverageRCFile}' not found.")
|
||||||
|
print(f"::error title=FileNotFoundError::File '{coverageRCFile}' not found.")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
# Write jobs to special file
|
# Write jobs to special file
|
||||||
github_output = Path(getenv("GITHUB_OUTPUT"))
|
github_output = Path(getenv("GITHUB_OUTPUT"))
|
||||||
|
|||||||
144
.github/workflows/ExtractConfiguration.yml
vendored
Normal file
144
.github/workflows/ExtractConfiguration.yml
vendored
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
# ==================================================================================================================== #
|
||||||
|
# Authors: #
|
||||||
|
# Patrick Lehmann #
|
||||||
|
# #
|
||||||
|
# ==================================================================================================================== #
|
||||||
|
# Copyright 2020-2024 The pyTooling Authors #
|
||||||
|
# #
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); #
|
||||||
|
# you may not use this file except in compliance with the License. #
|
||||||
|
# You may obtain a copy of the License at #
|
||||||
|
# #
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 #
|
||||||
|
# #
|
||||||
|
# Unless required by applicable law or agreed to in writing, software #
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, #
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
|
||||||
|
# See the License for the specific language governing permissions and #
|
||||||
|
# limitations under the License. #
|
||||||
|
# #
|
||||||
|
# SPDX-License-Identifier: Apache-2.0 #
|
||||||
|
# ==================================================================================================================== #
|
||||||
|
name: Extract Configuration
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
|
python_version:
|
||||||
|
description: 'Python version.'
|
||||||
|
required: false
|
||||||
|
default: '3.12'
|
||||||
|
type: string
|
||||||
|
coverage_config:
|
||||||
|
description: 'Path to the .coveragerc file. Use pyproject.toml by default.'
|
||||||
|
required: false
|
||||||
|
default: 'pyproject.toml'
|
||||||
|
type: string
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
coverage_report_html_directory:
|
||||||
|
description: ""
|
||||||
|
value: ${{ jobs.Extract.outputs.coverage_report_html_directory }}
|
||||||
|
coverage_report_xml_directory:
|
||||||
|
description: ""
|
||||||
|
value: ${{ jobs.Extract.outputs.coverage_report_xml_directory }}
|
||||||
|
coverage_report_xml:
|
||||||
|
description: ""
|
||||||
|
value: ${{ jobs.Extract.outputs.coverage_report_xml }}
|
||||||
|
coverage_report_json_directory:
|
||||||
|
description: ""
|
||||||
|
value: ${{ jobs.Extract.outputs.coverage_report_json_directory }}
|
||||||
|
coverage_report_json:
|
||||||
|
description: ""
|
||||||
|
value: ${{ jobs.Extract.outputs.coverage_report_json }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Extract:
|
||||||
|
name: 📓 Extract configurations from pyproject.toml
|
||||||
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
|
outputs:
|
||||||
|
coverage_report_html_directory: ${{ steps.getVariables.outputs.coverage_report_html_directory }}
|
||||||
|
coverage_report_xml_directory: ${{ steps.getVariables.outputs.coverage_report_xml_directory }}
|
||||||
|
coverage_report_xml: ${{ steps.getVariables.outputs.coverage_report_xml }}
|
||||||
|
coverage_report_json_directory: ${{ steps.getVariables.outputs.coverage_report_json_directory }}
|
||||||
|
coverage_report_json: ${{ steps.getVariables.outputs.coverage_report_json }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: ⏬ Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: 🐍 Setup Python ${{ inputs.python_version }}
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: ${{ inputs.python_version }}
|
||||||
|
|
||||||
|
- name: 🔧 Install wheel,tomli and pip dependencies (native)
|
||||||
|
run: |
|
||||||
|
python -m pip install --disable-pip-version-check -U wheel 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_directory={xmlFile.parent.as_posix()}
|
||||||
|
coverage_report_xml={xmlFile.as_posix()}
|
||||||
|
coverage_report_json_directory={jsonFile.parent.as_posix()}
|
||||||
|
coverage_report_json={jsonFile.as_posix()}
|
||||||
|
"""))
|
||||||
|
|
||||||
|
print(f"DEBUG:\n html={htmlDirectory}\n xml={xmlFile}\n json={jsonFile}")
|
||||||
9
.github/workflows/IntermediateCleanUp.yml
vendored
9
.github/workflows/IntermediateCleanUp.yml
vendored
@@ -24,6 +24,11 @@ name: Intermediate Cleanup
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
sqlite_coverage_artifacts_prefix:
|
sqlite_coverage_artifacts_prefix:
|
||||||
description: 'Prefix for SQLite coverage artifacts'
|
description: 'Prefix for SQLite coverage artifacts'
|
||||||
required: false
|
required: false
|
||||||
@@ -36,7 +41,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
IntermediateCleanUp:
|
IntermediateCleanUp:
|
||||||
name: 🗑️ Intermediate Artifact Cleanup
|
name: 🗑️ Intermediate Artifact Cleanup
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
steps:
|
steps:
|
||||||
- name: 🗑️ Delete SQLite coverage artifacts from matrix jobs
|
- name: 🗑️ Delete SQLite coverage artifacts from matrix jobs
|
||||||
uses: geekyeggo/delete-artifact@v5
|
uses: geekyeggo/delete-artifact@v5
|
||||||
@@ -45,7 +50,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: ${{ inputs.sqlite_coverage_artifacts_prefix }}*
|
name: ${{ inputs.sqlite_coverage_artifacts_prefix }}*
|
||||||
|
|
||||||
- name: 🗑️ Delete XML coverage artifacts from matrix jobs
|
- name: 🗑️ Delete JUnit XML artifacts from matrix jobs
|
||||||
uses: geekyeggo/delete-artifact@v5
|
uses: geekyeggo/delete-artifact@v5
|
||||||
if: inputs.xml_unittest_artifacts_prefix != ''
|
if: inputs.xml_unittest_artifacts_prefix != ''
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|||||||
7
.github/workflows/LaTeXDocumentation.yml
vendored
7
.github/workflows/LaTeXDocumentation.yml
vendored
@@ -24,6 +24,11 @@ name: LaTeX Documentation
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
document:
|
document:
|
||||||
description: 'LaTeX root document without *.tex extension.'
|
description: 'LaTeX root document without *.tex extension.'
|
||||||
required: true
|
required: true
|
||||||
@@ -42,7 +47,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
PDFDocumentation:
|
PDFDocumentation:
|
||||||
name: 📓 Converting LaTeX Documentation to PDF
|
name: 📓 Converting LaTeX Documentation to PDF
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
steps:
|
steps:
|
||||||
- name: 📥 Download artifacts '${{ inputs.latex_artifact }}' from 'SphinxDocumentation' job
|
- name: 📥 Download artifacts '${{ inputs.latex_artifact }}' from 'SphinxDocumentation' job
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
|
|||||||
7
.github/workflows/Package.yml
vendored
7
.github/workflows/Package.yml
vendored
@@ -25,6 +25,11 @@ name: Package
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
python_version:
|
python_version:
|
||||||
description: 'Python version.'
|
description: 'Python version.'
|
||||||
required: false
|
required: false
|
||||||
@@ -44,7 +49,7 @@ jobs:
|
|||||||
|
|
||||||
Package:
|
Package:
|
||||||
name: 📦 Package in Source and Wheel Format
|
name: 📦 Package in Source and Wheel Format
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: ⏬ Checkout repository
|
- name: ⏬ Checkout repository
|
||||||
|
|||||||
97
.github/workflows/Parameters.yml
vendored
97
.github/workflows/Parameters.yml
vendored
@@ -25,6 +25,11 @@ name: Parameters
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
name:
|
name:
|
||||||
description: 'Name of the tool.'
|
description: 'Name of the tool.'
|
||||||
required: true
|
required: true
|
||||||
@@ -32,17 +37,17 @@ 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
|
||||||
python_version_list:
|
python_version_list:
|
||||||
description: 'Space separated list of Python versions to run tests with.'
|
description: 'Space separated list of Python versions to run tests with.'
|
||||||
required: false
|
required: false
|
||||||
default: '3.8 3.9 3.10 3.11 3.12'
|
default: '3.9 3.10 3.11 3.12 3.13'
|
||||||
type: string
|
type: string
|
||||||
system_list:
|
system_list:
|
||||||
description: 'Space separated list of systems to run tests on.'
|
description: 'Space separated list of systems to run tests on.'
|
||||||
required: false
|
required: false
|
||||||
default: 'ubuntu windows macos mingw64 ucrt64'
|
default: 'ubuntu windows macos macos-arm mingw64 ucrt64'
|
||||||
type: string
|
type: string
|
||||||
include_list:
|
include_list:
|
||||||
description: 'Space separated list of system:python items to be included into the list of test.'
|
description: 'Space separated list of system:python items to be included into the list of test.'
|
||||||
@@ -59,6 +64,26 @@ on:
|
|||||||
required: false
|
required: false
|
||||||
default: ''
|
default: ''
|
||||||
type: string
|
type: string
|
||||||
|
ubuntu_image:
|
||||||
|
description: 'The used GitHub Action image for Ubuntu based jobs.'
|
||||||
|
required: false
|
||||||
|
default: 'ubuntu-24.04'
|
||||||
|
type: string
|
||||||
|
windows_image:
|
||||||
|
description: 'The used GitHub Action image for Windows based jobs.'
|
||||||
|
required: false
|
||||||
|
default: 'windows-latest'
|
||||||
|
type: string
|
||||||
|
macos_intel_image:
|
||||||
|
description: 'The used GitHub Action image for macOS (Intel x86-64) based jobs.'
|
||||||
|
required: false
|
||||||
|
default: 'macos-13'
|
||||||
|
type: string
|
||||||
|
macos_arm_image:
|
||||||
|
description: 'The used GitHub Action image for macOS (ARM aarch64) based jobs.'
|
||||||
|
required: false
|
||||||
|
default: 'macos-latest'
|
||||||
|
type: string
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
python_version:
|
python_version:
|
||||||
@@ -76,7 +101,8 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
Parameters:
|
Parameters:
|
||||||
runs-on: ubuntu-latest
|
name: ✎ Generate pipeline parameters
|
||||||
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
outputs:
|
outputs:
|
||||||
python_version: ${{ steps.params.outputs.python_version }}
|
python_version: ${{ steps.params.outputs.python_version }}
|
||||||
python_jobs: ${{ steps.params.outputs.python_jobs }}
|
python_jobs: ${{ steps.params.outputs.python_jobs }}
|
||||||
@@ -91,8 +117,8 @@ jobs:
|
|||||||
from json import dumps as json_dumps
|
from json import dumps as json_dumps
|
||||||
from os import getenv
|
from os import getenv
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from pprint import pprint
|
|
||||||
from textwrap import dedent
|
from textwrap import dedent
|
||||||
|
from typing import Iterable
|
||||||
|
|
||||||
name = "${{ inputs.name }}".strip()
|
name = "${{ inputs.name }}".strip()
|
||||||
python_version = "${{ inputs.python_version }}".strip()
|
python_version = "${{ inputs.python_version }}".strip()
|
||||||
@@ -103,8 +129,8 @@ jobs:
|
|||||||
disable_list = "${{ inputs.disable_list }}".strip()
|
disable_list = "${{ inputs.disable_list }}".strip()
|
||||||
|
|
||||||
currentMSYS2Version = "3.11"
|
currentMSYS2Version = "3.11"
|
||||||
currentAlphaVersion = "3.13"
|
currentAlphaVersion = "3.14"
|
||||||
currentAlphaRelease = "3.13.0-alpha.1"
|
currentAlphaRelease = "3.14.0-alpha.1"
|
||||||
|
|
||||||
if systems == "":
|
if systems == "":
|
||||||
print("::error title=Parameter::system_list is empty.")
|
print("::error title=Parameter::system_list is empty.")
|
||||||
@@ -131,26 +157,26 @@ jobs:
|
|||||||
else:
|
else:
|
||||||
disabled = [disable.strip() for disable in disable_list.split(" ")]
|
disabled = [disable.strip() for disable in disable_list.split(" ")]
|
||||||
|
|
||||||
if "3.7" in versions:
|
if "3.8" in versions:
|
||||||
print("::warning title=Deprecated::Support for Python 3.7 ended in 2023.06.27.")
|
print("::warning title=Deprecated::Support for Python 3.8 ended in 2024.10.")
|
||||||
if "msys2" in systems:
|
if "msys2" in systems:
|
||||||
print("::warning title=Deprecated::System 'msys2' will be replaced by 'mingw64'.")
|
print("::warning title=Deprecated::System 'msys2' will be replaced by 'mingw64'.")
|
||||||
if currentAlphaVersion in versions:
|
if currentAlphaVersion in versions:
|
||||||
print(f"::notice title=Experimental::Python {currentAlphaVersion} ({currentAlphaRelease}) is a pre-release.")
|
print(f"::notice title=Experimental::Python {currentAlphaVersion} ({currentAlphaRelease}) is a pre-release.")
|
||||||
for disable in disabled:
|
for disable in disabled:
|
||||||
print(f"::warning title=Disabled Python Job::System '{disable}' temporary disabled.")
|
print(f"::warning title=Disabled Python Job::System '{disable}' temporarily disabled.")
|
||||||
|
|
||||||
# see https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json
|
# see https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json
|
||||||
data = {
|
data = {
|
||||||
# Python and PyPy versions supported by "setup-python" action
|
# Python and PyPy versions supported by "setup-python" action
|
||||||
"python": {
|
"python": {
|
||||||
"3.7": { "icon": "⚫", "until": "2023.06.27" },
|
"3.8": { "icon": "⚫", "until": "2024.10" },
|
||||||
"3.8": { "icon": "🔴", "until": "2024.10" },
|
"3.9": { "icon": "🔴", "until": "2025.10" },
|
||||||
"3.9": { "icon": "🟠", "until": "2025.10" },
|
"3.10": { "icon": "🟠", "until": "2026.10" },
|
||||||
"3.10": { "icon": "🟡", "until": "2026.10" },
|
"3.11": { "icon": "🟡", "until": "2027.10" },
|
||||||
"3.11": { "icon": "🟢", "until": "2027.10" },
|
|
||||||
"3.12": { "icon": "🟢", "until": "2028.10" },
|
"3.12": { "icon": "🟢", "until": "2028.10" },
|
||||||
# "3.13": { "icon": "🟣", "until": "2028.10" },
|
"3.13": { "icon": "🟢", "until": "2029.10" },
|
||||||
|
"3.14": { "icon": "🟣", "until": "2030.10" },
|
||||||
"pypy-3.7": { "icon": "⟲⚫", "until": "????.??" },
|
"pypy-3.7": { "icon": "⟲⚫", "until": "????.??" },
|
||||||
"pypy-3.8": { "icon": "⟲🔴", "until": "????.??" },
|
"pypy-3.8": { "icon": "⟲🔴", "until": "????.??" },
|
||||||
"pypy-3.9": { "icon": "⟲🟠", "until": "????.??" },
|
"pypy-3.9": { "icon": "⟲🟠", "until": "????.??" },
|
||||||
@@ -158,9 +184,10 @@ jobs:
|
|||||||
},
|
},
|
||||||
# Runner systems (runner images) supported by GitHub Actions
|
# Runner systems (runner images) supported by GitHub Actions
|
||||||
"sys": {
|
"sys": {
|
||||||
"ubuntu": { "icon": "🐧", "runs-on": "ubuntu-latest", "shell": "bash", "name": "Linux (x86-64)", "minPy": (3, 7)},
|
"ubuntu": { "icon": "🐧", "runs-on": "${{ inputs.ubuntu_image }}", "shell": "bash", "name": "Linux (x86-64)" },
|
||||||
"windows": { "icon": "🪟", "runs-on": "windows-latest", "shell": "pwsh", "name": "Windows (x86-64)", "minPy": (3, 7)},
|
"windows": { "icon": "🪟", "runs-on": "${{ inputs.windows_image }}", "shell": "pwsh", "name": "Windows (x86-64)" },
|
||||||
"macos": { "icon": "🍎", "runs-on": "macos-latest", "shell": "bash", "name": "MacOS (x86-64)", "minPy": (3, 10)},
|
"macos": { "icon": "🍎", "runs-on": "${{ inputs.macos_intel_image }}", "shell": "bash", "name": "macOS (x86-64)" },
|
||||||
|
"macos-arm": { "icon": "🍏", "runs-on": "${{ inputs.macos_arm_image }}", "shell": "bash", "name": "macOS (aarch64)" },
|
||||||
},
|
},
|
||||||
# Runtimes provided by MSYS2
|
# Runtimes provided by MSYS2
|
||||||
"runtime": {
|
"runtime": {
|
||||||
@@ -183,9 +210,23 @@ jobs:
|
|||||||
for disable in disabled:
|
for disable in disabled:
|
||||||
print(f"- {disable}")
|
print(f"- {disable}")
|
||||||
|
|
||||||
def toVersion(value):
|
def match(combination: str, pattern: str) -> bool:
|
||||||
major, minor = value.split(".")
|
system, version = combination.split(":")
|
||||||
return int(major[-1]), int(minor)
|
sys, ver = pattern.split(":")
|
||||||
|
|
||||||
|
if sys == "*":
|
||||||
|
return (ver == "*") or (version == ver)
|
||||||
|
elif system == sys:
|
||||||
|
return (ver == "*") or (version == ver)
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def notIn(combination: str, patterns: Iterable[str]) -> bool:
|
||||||
|
for pattern in patterns:
|
||||||
|
if match(combination, pattern):
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
combinations = [
|
combinations = [
|
||||||
(system, version)
|
(system, version)
|
||||||
@@ -193,22 +234,20 @@ jobs:
|
|||||||
if system in data["sys"]
|
if system in data["sys"]
|
||||||
for version in versions
|
for version in versions
|
||||||
if version in data["python"]
|
if version in data["python"]
|
||||||
and toVersion(version) >= data["sys"][system]["minPy"]
|
and notIn(f"{system}:{version}", excludes)
|
||||||
and f"{system}:{version}" not in excludes
|
and notIn(f"{system}:{version}", disabled)
|
||||||
and f"{system}:{version}" not in disabled
|
|
||||||
] + [
|
] + [
|
||||||
(system, currentMSYS2Version)
|
(system, currentMSYS2Version)
|
||||||
for system in systems
|
for system in systems
|
||||||
if system in data["runtime"]
|
if system in data["runtime"]
|
||||||
and f"{system}:{currentMSYS2Version}" not in excludes
|
and notIn(f"{system}:{currentMSYS2Version}", excludes)
|
||||||
and f"{system}:{currentMSYS2Version}" not in disabled
|
and notIn(f"{system}:{currentMSYS2Version}", disabled)
|
||||||
] + [
|
] + [
|
||||||
(system, version)
|
(system, version)
|
||||||
for system, version in includes
|
for system, version in includes
|
||||||
if system in data["sys"]
|
if system in data["sys"]
|
||||||
and version in data["python"]
|
and version in data["python"]
|
||||||
and toVersion(version) >= data["sys"][system]["minPy"]
|
and notIn(f"{system}:{version}", disabled)
|
||||||
and f"{system}:{version}" not in disabled
|
|
||||||
]
|
]
|
||||||
print(f"Combinations ({len(combinations)}):")
|
print(f"Combinations ({len(combinations)}):")
|
||||||
for system, version in combinations:
|
for system, version in combinations:
|
||||||
|
|||||||
284
.github/workflows/Pipeline-NamespacePackage.yml
vendored
Normal file
284
.github/workflows/Pipeline-NamespacePackage.yml
vendored
Normal file
@@ -0,0 +1,284 @@
|
|||||||
|
name: Namespace Package
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
package_namespace:
|
||||||
|
description: 'Name of the tool.'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
package_name:
|
||||||
|
description: 'Name of the tool.'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
unittest_python_version:
|
||||||
|
description: 'Python version.'
|
||||||
|
required: false
|
||||||
|
default: '3.13'
|
||||||
|
type: string
|
||||||
|
unittest_python_version_list:
|
||||||
|
description: 'Space separated list of Python versions to run tests with.'
|
||||||
|
required: false
|
||||||
|
default: '3.9 3.10 3.11 3.12 3.13'
|
||||||
|
type: string
|
||||||
|
unittest_system_list:
|
||||||
|
description: 'Space separated list of systems to run tests on.'
|
||||||
|
required: false
|
||||||
|
default: 'ubuntu windows macos macos-arm mingw64 ucrt64'
|
||||||
|
type: string
|
||||||
|
unittest_include_list:
|
||||||
|
description: 'Space separated list of system:python items to be included into the list of test.'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
|
unittest_exclude_list:
|
||||||
|
description: 'Space separated list of system:python items to be excluded from the list of test.'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
|
unittest_disable_list:
|
||||||
|
description: 'Space separated list of system:python items to be disabled from the list of test.'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
|
apptest_python_version:
|
||||||
|
description: 'Python version.'
|
||||||
|
required: false
|
||||||
|
default: '3.13'
|
||||||
|
type: string
|
||||||
|
apptest_python_version_list:
|
||||||
|
description: 'Space separated list of Python versions to run tests with.'
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
type: string
|
||||||
|
apptest_system_list:
|
||||||
|
description: 'Space separated list of systems to run tests on.'
|
||||||
|
required: false
|
||||||
|
default: 'ubuntu windows macos macos-arm ucrt64'
|
||||||
|
type: string
|
||||||
|
apptest_include_list:
|
||||||
|
description: 'Space separated list of system:python items to be included into the list of test.'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
|
apptest_exclude_list:
|
||||||
|
description: 'Space separated list of system:python items to be excluded from the list of test.'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
|
apptest_disable_list:
|
||||||
|
description: 'Space separated list of system:python items to be disabled from the list of test.'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
UnitTestingParams:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r2
|
||||||
|
with:
|
||||||
|
name: "${{ inputs.package_namespace }}.${{ inputs.package_name }}"
|
||||||
|
python_version: ${{ inputs.unittest_python_version }}
|
||||||
|
python_version_list: ${{ inputs.unittest_python_version_list }}
|
||||||
|
system_list: ${{ inputs.unittest_system_list }}
|
||||||
|
include_list: ${{ inputs.unittest_include_list }}
|
||||||
|
exclude_list: ${{ inputs.unittest_exclude_list }}
|
||||||
|
disable_list: ${{ inputs.unittest_disable_list }}
|
||||||
|
|
||||||
|
AppTestingParams:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r2
|
||||||
|
with:
|
||||||
|
name: "${{ inputs.package_namespace }}.${{ inputs.package_name }}"
|
||||||
|
python_version: ${{ inputs.apptest_python_version }}
|
||||||
|
python_version_list: ${{ inputs.apptest_python_version_list }}
|
||||||
|
system_list: ${{ inputs.apptest_system_list }}
|
||||||
|
include_list: ${{ inputs.apptest_include_list }}
|
||||||
|
exclude_list: ${{ inputs.apptest_exclude_list }}
|
||||||
|
disable_list: ${{ inputs.apptest_disable_list }}
|
||||||
|
|
||||||
|
UnitTesting:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r2
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
with:
|
||||||
|
jobs: ${{ needs.UnitTestingParams.outputs.python_jobs }}
|
||||||
|
requirements: "-r tests/unit/requirements.txt"
|
||||||
|
# pacboy: "msys/git python-lxml:p"
|
||||||
|
unittest_xml_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}
|
||||||
|
coverage_sqlite_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}
|
||||||
|
|
||||||
|
StaticTypeCheck:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r2
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
with:
|
||||||
|
python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
||||||
|
commands: |
|
||||||
|
touch ${{ inputs.package_namespace }}/__init__.py
|
||||||
|
mypy --html-report htmlmypy -p ${{ inputs.package_namespace }}.${{ inputs.name }}
|
||||||
|
html_report: 'htmlmypy'
|
||||||
|
html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }}
|
||||||
|
|
||||||
|
DocCoverage:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/CheckDocumentation.yml@r2
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
with:
|
||||||
|
python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
||||||
|
directory: ${{ inputs.package_namespace }}/${{ inputs.package_name }}
|
||||||
|
# fail_below: 70
|
||||||
|
|
||||||
|
ConfigParams:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r2
|
||||||
|
needs:
|
||||||
|
- DocCoverage
|
||||||
|
|
||||||
|
Package:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/Package.yml@r2
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
- UnitTesting
|
||||||
|
with:
|
||||||
|
python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
||||||
|
artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
|
||||||
|
|
||||||
|
# AppTesting:
|
||||||
|
# uses: pyTooling/Actions/.github/workflows/ApplicationTesting.yml@r2
|
||||||
|
# needs:
|
||||||
|
# - AppTestingParams
|
||||||
|
# - UnitTestingParams
|
||||||
|
# - Package
|
||||||
|
# with:
|
||||||
|
# jobs: ${{ needs.AppTestingParams.outputs.python_jobs }}
|
||||||
|
# wheel: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
|
||||||
|
# apptest_xml_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).apptesting_xml }}
|
||||||
|
|
||||||
|
PublishCoverageResults:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/PublishCoverageResults.yml@r2
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
- UnitTesting
|
||||||
|
with:
|
||||||
|
# coverage_sqlite_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}
|
||||||
|
# coverage_xml_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_xml }}
|
||||||
|
coverage_json_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}
|
||||||
|
coverage_html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}
|
||||||
|
secrets:
|
||||||
|
codacy_token: ${{ secrets.CODACY_PROJECT_TOKEN }}
|
||||||
|
|
||||||
|
PublishTestResults:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@r2
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
- UnitTesting
|
||||||
|
with:
|
||||||
|
merged_junit_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}
|
||||||
|
|
||||||
|
# VerifyDocs:
|
||||||
|
# uses: pyTooling/Actions/.github/workflows/VerifyDocs.yml@r2
|
||||||
|
# needs:
|
||||||
|
# - UnitTestingParams
|
||||||
|
# with:
|
||||||
|
# python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
||||||
|
|
||||||
|
Documentation:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/SphinxDocumentation.yml@r2
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
- ConfigParams
|
||||||
|
- PublishTestResults
|
||||||
|
- PublishCoverageResults
|
||||||
|
# - VerifyDocs
|
||||||
|
with:
|
||||||
|
python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
||||||
|
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
|
||||||
|
coverage_json_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}
|
||||||
|
html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }}
|
||||||
|
latex_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }}
|
||||||
|
|
||||||
|
IntermediateCleanUp:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/IntermediateCleanUp.yml@r2
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
- PublishCoverageResults
|
||||||
|
- PublishTestResults
|
||||||
|
- Documentation
|
||||||
|
with:
|
||||||
|
sqlite_coverage_artifacts_prefix: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}-
|
||||||
|
xml_unittest_artifacts_prefix: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}-
|
||||||
|
|
||||||
|
# PDFDocumentation:
|
||||||
|
# uses: pyTooling/Actions/.github/workflows/LaTeXDocumentation.yml@r2
|
||||||
|
# needs:
|
||||||
|
# - UnitTestingParams
|
||||||
|
# - Documentation
|
||||||
|
# with:
|
||||||
|
# document: pyEDAA.ProjectModel
|
||||||
|
# latex_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }}
|
||||||
|
# pdf_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_pdf }}
|
||||||
|
|
||||||
|
PublishToGitHubPages:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/PublishToGitHubPages.yml@r2
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
- Documentation
|
||||||
|
# - PDFDocumentation
|
||||||
|
- PublishCoverageResults
|
||||||
|
- StaticTypeCheck
|
||||||
|
with:
|
||||||
|
doc: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }}
|
||||||
|
coverage: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}
|
||||||
|
typing: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }}
|
||||||
|
|
||||||
|
ReleasePage:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/Release.yml@r2
|
||||||
|
if: startsWith(github.ref, 'refs/tags')
|
||||||
|
needs:
|
||||||
|
- Package
|
||||||
|
# - AppTesting
|
||||||
|
- PublishToGitHubPages
|
||||||
|
|
||||||
|
PublishOnPyPI:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/PublishOnPyPI.yml@r2
|
||||||
|
if: startsWith(github.ref, 'refs/tags')
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
- ReleasePage
|
||||||
|
with:
|
||||||
|
python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
||||||
|
requirements: -r dist/requirements.txt
|
||||||
|
artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
|
||||||
|
secrets:
|
||||||
|
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
||||||
|
|
||||||
|
ArtifactCleanUp:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/ArtifactCleanUp.yml@r2
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
- UnitTesting
|
||||||
|
- StaticTypeCheck
|
||||||
|
- Documentation
|
||||||
|
# - PDFDocumentation
|
||||||
|
- PublishTestResults
|
||||||
|
- PublishCoverageResults
|
||||||
|
- PublishToGitHubPages
|
||||||
|
# - PublishOnPyPI
|
||||||
|
- IntermediateCleanUp
|
||||||
|
with:
|
||||||
|
package: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
|
||||||
|
remaining: |
|
||||||
|
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_html }}-*
|
||||||
|
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_xml }}-*
|
||||||
|
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}-*
|
||||||
|
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}-*
|
||||||
|
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}
|
||||||
|
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_html }}
|
||||||
|
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}
|
||||||
|
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_xml }}
|
||||||
|
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}
|
||||||
|
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}
|
||||||
|
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).statictyping_html }}
|
||||||
|
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }}
|
||||||
|
${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }}
|
||||||
|
# ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).apptesting_xml }}-*
|
||||||
|
# ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_pdf }}
|
||||||
19
.github/workflows/PublishCoverageResults.yml
vendored
19
.github/workflows/PublishCoverageResults.yml
vendored
@@ -24,6 +24,11 @@ name: Publish Code Coverage Results
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
coverage_config:
|
coverage_config:
|
||||||
description: 'Path to the .coveragerc file. Use pyproject.toml by default.'
|
description: 'Path to the .coveragerc file. Use pyproject.toml by default.'
|
||||||
required: false
|
required: false
|
||||||
@@ -57,7 +62,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
PublishCoverageResults:
|
PublishCoverageResults:
|
||||||
name: 📊 Publish Code Coverage Results
|
name: 📊 Publish Code Coverage Results
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
if: always()
|
if: always()
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -71,7 +76,7 @@ jobs:
|
|||||||
|
|
||||||
- name: 🔧 Install coverage and tomli
|
- name: 🔧 Install coverage and tomli
|
||||||
run: |
|
run: |
|
||||||
python -m pip install --disable-pip-version-check -U coverage[toml] tomli
|
python -m pip install -U --disable-pip-version-check --break-system-packages coverage[toml] tomli
|
||||||
|
|
||||||
- name: 🔁 Extract configurations from pyproject.toml
|
- name: 🔁 Extract configurations from pyproject.toml
|
||||||
id: getVariables
|
id: getVariables
|
||||||
@@ -102,7 +107,9 @@ jobs:
|
|||||||
xmlFile = Path(pyProjectSettings["tool"]["coverage"]["xml"]["output"])
|
xmlFile = Path(pyProjectSettings["tool"]["coverage"]["xml"]["output"])
|
||||||
jsonFile = Path(pyProjectSettings["tool"]["coverage"]["json"]["output"])
|
jsonFile = Path(pyProjectSettings["tool"]["coverage"]["json"]["output"])
|
||||||
else:
|
else:
|
||||||
print(f"File '{pyProjectFile}' not found and no '.coveragerc' file specified.")
|
print(f"File '{pyProjectFile}' not found.")
|
||||||
|
print(f"::error title=FileNotFoundError::File '{pyProjectFile}' not found.")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
# Read output paths from '.coveragerc' file
|
# Read output paths from '.coveragerc' file
|
||||||
elif len(coverageRC) > 0:
|
elif len(coverageRC) > 0:
|
||||||
@@ -116,6 +123,8 @@ jobs:
|
|||||||
jsonFile = Path(coverageRCSettings["json"]["output"])
|
jsonFile = Path(coverageRCSettings["json"]["output"])
|
||||||
else:
|
else:
|
||||||
print(f"File '{coverageRCFile}' not found.")
|
print(f"File '{coverageRCFile}' not found.")
|
||||||
|
print(f"::error title=FileNotFoundError::File '{coverageRCFile}' not found.")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
# Write jobs to special file
|
# Write jobs to special file
|
||||||
github_output = Path(getenv("GITHUB_OUTPUT"))
|
github_output = Path(getenv("GITHUB_OUTPUT"))
|
||||||
@@ -131,8 +140,10 @@ jobs:
|
|||||||
|
|
||||||
- name: Rename .coverage files and collect them all to coverage/
|
- name: Rename .coverage files and collect them all to coverage/
|
||||||
run: |
|
run: |
|
||||||
|
ls -lAh artifacts/
|
||||||
|
ls -lAh artifacts/*/.coverage
|
||||||
mkdir -p coverage
|
mkdir -p coverage
|
||||||
find . -type f -path "*artifacts*SQLite*.coverage" -exec sh -c 'cp -v $0 "coverage/$(basename $0).$(basename $(dirname $0))"' {} ';'
|
find artifacts/ -type f -path "*SQLite*.coverage" -exec sh -c 'cp -v $0 "coverage/$(basename $0).$(basename $(dirname $0))"' {} ';'
|
||||||
tree -a coverage
|
tree -a coverage
|
||||||
|
|
||||||
- name: Combine SQLite files (using Coverage.py)
|
- name: Combine SQLite files (using Coverage.py)
|
||||||
|
|||||||
7
.github/workflows/PublishOnPyPI.yml
vendored
7
.github/workflows/PublishOnPyPI.yml
vendored
@@ -25,6 +25,11 @@ name: Publish on PyPI
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
python_version:
|
python_version:
|
||||||
description: 'Python version.'
|
description: 'Python version.'
|
||||||
required: false
|
required: false
|
||||||
@@ -48,7 +53,7 @@ jobs:
|
|||||||
|
|
||||||
PublishOnPyPI:
|
PublishOnPyPI:
|
||||||
name: 🚀 Publish to PyPI
|
name: 🚀 Publish to PyPI
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 📥 Download artifacts '${{ inputs.artifact }}' from 'Package' job
|
- name: 📥 Download artifacts '${{ inputs.artifact }}' from 'Package' job
|
||||||
|
|||||||
46
.github/workflows/PublishTestResults.yml
vendored
46
.github/workflows/PublishTestResults.yml
vendored
@@ -25,16 +25,31 @@ name: Publish Unit Test Results
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
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
|
||||||
default: ''
|
default: ''
|
||||||
type: string
|
type: string
|
||||||
|
additional_merge_args:
|
||||||
|
description: 'Additional merging arguments.'
|
||||||
|
required: false
|
||||||
|
default: '"--pytest=rewrite-dunder-init;reduce-depth:pytest.tests.unit"'
|
||||||
|
type: string
|
||||||
|
report_title:
|
||||||
|
description: 'Title of the summary report in the pipeline''s sidebar'
|
||||||
|
required: false
|
||||||
|
default: 'Unit Test Results'
|
||||||
|
type: string
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
PublishTestResults:
|
PublishTestResults:
|
||||||
name: 📊 Publish Test Results
|
name: 📊 Publish Test Results
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
if: always()
|
if: always()
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -46,37 +61,28 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
path: artifacts
|
path: artifacts
|
||||||
|
|
||||||
- name: 🔧 Install junitparser
|
- name: 🔧 Install pyEDAA.Reports (JUunit Parser and Merger)
|
||||||
run: |
|
run: |
|
||||||
python -m pip install --disable-pip-version-check -U junitparser
|
python -m pip install --disable-pip-version-check --break-system-packages -U pyEDAA.Reports
|
||||||
|
|
||||||
- name: Move JUnit files and collect them all to junit/
|
- name: Move JUnit files and collect them all to junit/
|
||||||
run: |
|
run: |
|
||||||
mkdir -p junit
|
mkdir -p junit
|
||||||
find . -type f -path "*artifacts*UnitTestReportSummary*.xml" -exec sh -c 'cp -v $0 "junit/$(basename $(dirname $0)).$(basename $0)"' {} ';'
|
ls -lAh artifacts/*/*.xml
|
||||||
|
find artifacts/ -type f -path "*TestReportSummary*.xml" -exec sh -c 'cp -v $0 "junit/$(basename $(dirname $0)).$(basename $0)"' {} ';'
|
||||||
tree -a junit
|
tree -a junit
|
||||||
|
|
||||||
- name: 🔁 Merge JUnit Unit Test Summaries
|
- name: 🔁 Merge JUnit Unit Test Summaries
|
||||||
shell: python
|
|
||||||
run: |
|
run: |
|
||||||
from pathlib import Path
|
pyedaa-reports -v unittest "--merge=pyTest-JUnit:junit/*.xml" ${{ inputs.additional_merge_args }} "--output=pyTest-JUnit:Unittesting.xml"
|
||||||
from junitparser import JUnitXml
|
echo "cat Unittesting.xml"
|
||||||
|
cat Unittesting.xml
|
||||||
junitDirectory = Path("junit")
|
|
||||||
junitXml = None
|
|
||||||
for file in junitDirectory.iterdir():
|
|
||||||
if junitXml is None:
|
|
||||||
junitXml = JUnitXml.fromfile(file)
|
|
||||||
else:
|
|
||||||
junitXml += JUnitXml.fromfile(file)
|
|
||||||
|
|
||||||
junitXml.write(junitDirectory / "merged.xml")
|
|
||||||
|
|
||||||
- name: 📊 Publish Unit Test Results
|
- name: 📊 Publish Unit Test Results
|
||||||
uses: dorny/test-reporter@v1
|
uses: dorny/test-reporter@v1
|
||||||
with:
|
with:
|
||||||
name: Unit Test Results
|
name: ${{ inputs.report_title }}
|
||||||
path: junit/merged.xml
|
path: Unittesting.xml
|
||||||
reporter: java-junit
|
reporter: java-junit
|
||||||
|
|
||||||
- name: 📤 Upload merged 'JUnit Test Summary' artifact
|
- name: 📤 Upload merged 'JUnit Test Summary' artifact
|
||||||
@@ -84,6 +90,6 @@ jobs:
|
|||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ inputs.merged_junit_artifact }}
|
name: ${{ inputs.merged_junit_artifact }}
|
||||||
path: junit/merged.xml
|
path: Unittesting.xml
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: 1
|
retention-days: 1
|
||||||
|
|||||||
7
.github/workflows/PublishToGitHubPages.yml
vendored
7
.github/workflows/PublishToGitHubPages.yml
vendored
@@ -25,6 +25,11 @@ name: Publish to GitHub Pages
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
doc:
|
doc:
|
||||||
description: 'Name of the documentation artifact.'
|
description: 'Name of the documentation artifact.'
|
||||||
required: true
|
required: true
|
||||||
@@ -44,7 +49,7 @@ jobs:
|
|||||||
|
|
||||||
PublishToGitHubPages:
|
PublishToGitHubPages:
|
||||||
name: 📚 Publish to GH-Pages
|
name: 📚 Publish to GH-Pages
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: ⏬ Checkout repository
|
- name: ⏬ Checkout repository
|
||||||
|
|||||||
33
.github/workflows/Release.yml
vendored
33
.github/workflows/Release.yml
vendored
@@ -24,12 +24,17 @@ name: Release
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
Release:
|
Release:
|
||||||
name: 📝 Create 'Release Page' on GitHub
|
name: 📝 Create 'Release Page' on GitHub
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 🔁 Extract Git tag from GITHUB_REF
|
- name: 🔁 Extract Git tag from GITHUB_REF
|
||||||
@@ -55,12 +60,34 @@ jobs:
|
|||||||
**Automated Release created on: ${{ steps.getVariables.outputs.datetime }}**
|
**Automated Release created on: ${{ steps.getVariables.outputs.datetime }}**
|
||||||
|
|
||||||
# New Features
|
# New Features
|
||||||
|
|
||||||
|
* tbd
|
||||||
* tbd
|
* tbd
|
||||||
|
|
||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
|
* tbd
|
||||||
* tbd
|
* tbd
|
||||||
|
|
||||||
# Bug Fixes
|
# Bug Fixes
|
||||||
|
|
||||||
* tbd
|
* tbd
|
||||||
draft: false
|
* tbd
|
||||||
|
|
||||||
|
# Documentation
|
||||||
|
|
||||||
|
* tbd
|
||||||
|
* tbd
|
||||||
|
|
||||||
|
# Unit Tests
|
||||||
|
|
||||||
|
* tbd
|
||||||
|
* tbd
|
||||||
|
|
||||||
|
----------
|
||||||
|
# Related Issues and Pull-Requests
|
||||||
|
|
||||||
|
* tbd
|
||||||
|
* tbd
|
||||||
|
draft: true
|
||||||
prerelease: false
|
prerelease: false
|
||||||
|
|||||||
137
.github/workflows/SphinxDocumentation.yml
vendored
137
.github/workflows/SphinxDocumentation.yml
vendored
@@ -24,6 +24,11 @@ name: Documentation
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
python_version:
|
python_version:
|
||||||
description: 'Python version.'
|
description: 'Python version.'
|
||||||
required: false
|
required: false
|
||||||
@@ -34,16 +39,15 @@ on:
|
|||||||
required: false
|
required: false
|
||||||
default: '-r doc/requirements.txt'
|
default: '-r doc/requirements.txt'
|
||||||
type: string
|
type: string
|
||||||
coverage_config:
|
|
||||||
description: 'Path to the .coveragerc file. Use pyproject.toml by default.'
|
|
||||||
required: false
|
|
||||||
default: 'pyproject.toml'
|
|
||||||
type: string
|
|
||||||
doc_directory:
|
doc_directory:
|
||||||
description: 'Path to the directory containing documentation (Sphinx working directory).'
|
description: 'Path to the directory containing documentation (Sphinx working directory).'
|
||||||
required: false
|
required: false
|
||||||
default: 'doc'
|
default: 'doc'
|
||||||
type: string
|
type: string
|
||||||
|
coverage_report_json_directory:
|
||||||
|
description: ''
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
coverage_json_artifact:
|
coverage_json_artifact:
|
||||||
description: 'Name of the coverage JSON artifact.'
|
description: 'Name of the coverage JSON artifact.'
|
||||||
required: false
|
required: false
|
||||||
@@ -71,9 +75,9 @@ on:
|
|||||||
type: string
|
type: string
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
Sphinx:
|
Sphinx-HTML:
|
||||||
name: 📓 Documentation generation using Sphinx and Python ${{ inputs.python_version }}
|
name: 📓 HTML Documentation using Sphinx and Python ${{ inputs.python_version }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: ⏬ Checkout repository
|
- name: ⏬ Checkout repository
|
||||||
@@ -89,67 +93,9 @@ jobs:
|
|||||||
|
|
||||||
- name: 🔧 Install wheel,tomli and pip dependencies (native)
|
- name: 🔧 Install wheel,tomli and pip dependencies (native)
|
||||||
run: |
|
run: |
|
||||||
python -m pip install --disable-pip-version-check -U wheel tomli
|
python -m pip install --disable-pip-version-check -U wheel
|
||||||
python -m pip install --disable-pip-version-check ${{ inputs.requirements }}
|
python -m pip install --disable-pip-version-check ${{ inputs.requirements }}
|
||||||
|
|
||||||
- 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 and no '.coveragerc' file specified.")
|
|
||||||
|
|
||||||
# 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.")
|
|
||||||
|
|
||||||
# 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_directory={xmlFile.parent.as_posix()}
|
|
||||||
coverage_report_xml={xmlFile.as_posix()}
|
|
||||||
coverage_report_json_directory={jsonFile.parent.as_posix()}
|
|
||||||
coverage_report_json={jsonFile.as_posix()}
|
|
||||||
"""))
|
|
||||||
|
|
||||||
print(f"DEBUG:\n html={htmlDirectory}\n xml={xmlFile}\n json={jsonFile}")
|
|
||||||
|
|
||||||
- name: 📥 Download artifacts '${{ inputs.unittest_xml_artifact }}' from 'Unittesting' job
|
- name: 📥 Download artifacts '${{ inputs.unittest_xml_artifact }}' from 'Unittesting' job
|
||||||
if: inputs.unittest_xml_artifact != ''
|
if: inputs.unittest_xml_artifact != ''
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
@@ -162,7 +108,7 @@ jobs:
|
|||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ inputs.coverage_json_artifact }}
|
name: ${{ inputs.coverage_json_artifact }}
|
||||||
path: ${{ steps.getVariables.outputs.coverage_report_json_directory }}
|
path: ${{ inputs.coverage_report_json_directory }}
|
||||||
|
|
||||||
- name: ☑ Generate HTML documentation
|
- name: ☑ Generate HTML documentation
|
||||||
if: inputs.html_artifact != ''
|
if: inputs.html_artifact != ''
|
||||||
@@ -172,16 +118,6 @@ jobs:
|
|||||||
cd "${{ inputs.doc_directory || '.' }}"
|
cd "${{ inputs.doc_directory || '.' }}"
|
||||||
sphinx-build -v -n -b html -d _build/doctrees -j $(nproc) -w _build/html.log . _build/html
|
sphinx-build -v -n -b html -d _build/doctrees -j $(nproc) -w _build/html.log . _build/html
|
||||||
|
|
||||||
- name: ☑ Generate LaTeX documentation
|
|
||||||
if: inputs.latex_artifact != ''
|
|
||||||
# continue-on-error: true
|
|
||||||
run: |
|
|
||||||
export PYTHONPATH=$(pwd)
|
|
||||||
|
|
||||||
cd "${{ inputs.doc_directory || '.' }}"
|
|
||||||
sphinx-build -v -n -b latex -d _build/doctrees -j $(nproc) -w _build/latex.log . _build/latex
|
|
||||||
# --builder html --doctree-dir _build/doctrees --verbose --fresh-env --write-all --nitpicky --warning-file _build/html.log . _build/html
|
|
||||||
|
|
||||||
- name: 📤 Upload 'HTML Documentation' artifact
|
- name: 📤 Upload 'HTML Documentation' artifact
|
||||||
if: inputs.html_artifact != ''
|
if: inputs.html_artifact != ''
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
@@ -192,6 +128,51 @@ jobs:
|
|||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: 1
|
retention-days: 1
|
||||||
|
|
||||||
|
Sphinx-LaTeX:
|
||||||
|
name: 📓 LaTeX Documentation using Sphinx and Python ${{ inputs.python_version }}
|
||||||
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: ⏬ Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: 🔧 Install graphviz
|
||||||
|
run: sudo apt-get install -y --no-install-recommends graphviz
|
||||||
|
|
||||||
|
- name: 🐍 Setup Python ${{ inputs.python_version }}
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: ${{ inputs.python_version }}
|
||||||
|
|
||||||
|
- name: 🔧 Install wheel,tomli and pip dependencies (native)
|
||||||
|
run: |
|
||||||
|
python -m pip install --disable-pip-version-check -U wheel
|
||||||
|
python -m pip install --disable-pip-version-check ${{ inputs.requirements }}
|
||||||
|
|
||||||
|
- name: 📥 Download artifacts '${{ inputs.unittest_xml_artifact }}' from 'Unittesting' job
|
||||||
|
if: inputs.unittest_xml_artifact != ''
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: ${{ inputs.unittest_xml_artifact }}
|
||||||
|
path: ${{ inputs.unittest_xml_directory }}
|
||||||
|
|
||||||
|
- name: 📥 Download artifacts '${{ inputs.coverage_json_artifact }}' from 'PublishCoverageResults' job
|
||||||
|
if: inputs.coverage_json_artifact != ''
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: ${{ inputs.coverage_json_artifact }}
|
||||||
|
path: ${{ inputs.coverage_report_json_directory }}
|
||||||
|
|
||||||
|
- name: ☑ Generate LaTeX documentation
|
||||||
|
if: inputs.latex_artifact != ''
|
||||||
|
# continue-on-error: true
|
||||||
|
run: |
|
||||||
|
export PYTHONPATH=$(pwd)
|
||||||
|
|
||||||
|
cd "${{ inputs.doc_directory || '.' }}"
|
||||||
|
sphinx-build -v -n -b latex -d _build/doctrees -j $(nproc) -w _build/latex.log . _build/latex
|
||||||
|
# --builder html --doctree-dir _build/doctrees --verbose --fresh-env --write-all --nitpicky --warning-file _build/html.log . _build/html
|
||||||
|
|
||||||
- name: 📤 Upload 'LaTeX Documentation' artifact
|
- name: 📤 Upload 'LaTeX Documentation' artifact
|
||||||
if: inputs.latex_artifact != ''
|
if: inputs.latex_artifact != ''
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|||||||
7
.github/workflows/StaticTypeCheck.yml
vendored
7
.github/workflows/StaticTypeCheck.yml
vendored
@@ -25,6 +25,11 @@ name: Static Type Check
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
python_version:
|
python_version:
|
||||||
description: 'Python version.'
|
description: 'Python version.'
|
||||||
required: false
|
required: false
|
||||||
@@ -63,7 +68,7 @@ jobs:
|
|||||||
|
|
||||||
StaticTypeCheck:
|
StaticTypeCheck:
|
||||||
name: 👀 Check Static Typing using Python ${{ inputs.python_version }}
|
name: 👀 Check Static Typing using Python ${{ inputs.python_version }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: ⏬ Checkout repository
|
- name: ⏬ Checkout repository
|
||||||
|
|||||||
6
.github/workflows/TestReleaser.yml
vendored
6
.github/workflows/TestReleaser.yml
vendored
@@ -41,7 +41,7 @@ jobs:
|
|||||||
|
|
||||||
|
|
||||||
Image:
|
Image:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
env:
|
env:
|
||||||
DOCKER_BUILDKIT: 1
|
DOCKER_BUILDKIT: 1
|
||||||
steps:
|
steps:
|
||||||
@@ -60,7 +60,7 @@ jobs:
|
|||||||
|
|
||||||
|
|
||||||
Composite:
|
Composite:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
@@ -120,7 +120,7 @@ jobs:
|
|||||||
needs:
|
needs:
|
||||||
- Image
|
- Image
|
||||||
- Composite
|
- Composite
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
|||||||
144
.github/workflows/UnitTesting.yml
vendored
144
.github/workflows/UnitTesting.yml
vendored
@@ -29,21 +29,56 @@ on:
|
|||||||
description: 'JSON list with environment fields, telling the system and Python versions to run tests with.'
|
description: 'JSON list with environment fields, telling the system and Python versions to run tests with.'
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
|
apt:
|
||||||
|
description: 'Ubuntu dependencies to be installed through apt.'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
|
brew:
|
||||||
|
description: 'macOS dependencies to be installed through brew.'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
|
pacboy:
|
||||||
|
description: 'MSYS2 dependencies to be installed through pacboy (pacman).'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
requirements:
|
requirements:
|
||||||
description: 'Python dependencies to be installed through pip.'
|
description: 'Python dependencies to be installed through pip.'
|
||||||
required: false
|
required: false
|
||||||
default: '-r tests/requirements.txt'
|
default: '-r tests/requirements.txt'
|
||||||
type: string
|
type: string
|
||||||
pacboy:
|
|
||||||
description: 'MSYS2 dependencies to be installed through pacboy (pacman).'
|
|
||||||
required: false
|
|
||||||
default: ""
|
|
||||||
type: string
|
|
||||||
mingw_requirements:
|
mingw_requirements:
|
||||||
description: 'Override Python dependencies to be installed through pip on MSYS2 (MINGW64) only.'
|
description: 'Override Python dependencies to be installed through pip on MSYS2 (MINGW64) only.'
|
||||||
required: false
|
required: false
|
||||||
default: ''
|
default: ''
|
||||||
type: string
|
type: string
|
||||||
|
macos_before_script:
|
||||||
|
description: 'Scripts to execute before pytest on macOS (Intel).'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
|
macos_arm_before_script:
|
||||||
|
description: 'Scripts to execute before pytest on macOS (ARM).'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
|
ubuntu_before_script:
|
||||||
|
description: 'Scripts to execute before pytest on Ubuntu.'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
|
mingw64_before_script:
|
||||||
|
description: 'Scripts to execute before pytest on Windows within MSYS2 MinGW64.'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
|
ucrt64_before_script:
|
||||||
|
description: 'Scripts to execute before pytest on Windows within MSYS2 UCRT64.'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
root_directory:
|
root_directory:
|
||||||
description: 'Working directory for running tests.'
|
description: 'Working directory for running tests.'
|
||||||
required: false
|
required: false
|
||||||
@@ -113,6 +148,19 @@ jobs:
|
|||||||
- name: ⏬ Checkout repository
|
- name: ⏬ Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# Package Manager steps
|
||||||
|
- name: 🔧 Install homebrew dependencies on macOS
|
||||||
|
if: ( matrix.system == 'macos' || matrix.system == 'macos-arm' ) && inputs.brew != ''
|
||||||
|
run: brew install ${{ inputs.brew }}
|
||||||
|
|
||||||
|
- name: 🔧 Install apt dependencies on Ubuntu
|
||||||
|
if: matrix.system == 'ubuntu' && inputs.apt != ''
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y --no-install-recommends ${{ inputs.apt }}
|
||||||
|
|
||||||
|
# Compute Dependencies for MSYS2 steps
|
||||||
|
|
||||||
- name: 🔧 Install dependencies (system Python for Python shell)
|
- name: 🔧 Install dependencies (system Python for Python shell)
|
||||||
if: matrix.system == 'msys2'
|
if: matrix.system == 'msys2'
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
@@ -149,28 +197,35 @@ jobs:
|
|||||||
requirements = "${{ inputs.requirements }}"
|
requirements = "${{ inputs.requirements }}"
|
||||||
if requirements.startswith("-r"):
|
if requirements.startswith("-r"):
|
||||||
requirementsFile = Path(requirements[2:].lstrip())
|
requirementsFile = Path(requirements[2:].lstrip())
|
||||||
dependencies = loadRequirementsFile(requirementsFile)
|
try:
|
||||||
|
dependencies = loadRequirementsFile(requirementsFile)
|
||||||
|
except FileNotFoundError as ex:
|
||||||
|
print(f"::error title=FileNotFoundError::{ex}")
|
||||||
|
exit(1)
|
||||||
else:
|
else:
|
||||||
dependencies = [req.strip() for req in requirements.split(" ")]
|
dependencies = [req.strip() for req in requirements.split(" ")]
|
||||||
|
|
||||||
packages = {
|
packages = {
|
||||||
"coverage": "python-coverage:p",
|
"coverage": "python-coverage:p",
|
||||||
"igraph": "igraph:p",
|
"docstr_coverage": "python-pyaml:p",
|
||||||
"jinja2": "python-markupsafe:p",
|
"igraph": "igraph:p",
|
||||||
"lxml": "python-lxml:p",
|
"jinja2": "python-markupsafe:p",
|
||||||
"numpy": "python-numpy:p",
|
"lxml": "python-lxml:p",
|
||||||
"markupsafe": "python-markupsafe:p",
|
"numpy": "python-numpy:p",
|
||||||
"pip": "python-pip:p",
|
"markupsafe": "python-markupsafe:p",
|
||||||
"ruamel.yaml": "python-ruamel-yaml:p python-ruamel.yaml.clib:p",
|
"pip": "python-pip:p",
|
||||||
"sphinx": "python-markupsafe:p",
|
"pyyaml": "python-pyyaml:p",
|
||||||
"tomli": "python-tomli:p",
|
"ruamel.yaml": "python-ruamel-yaml:p",
|
||||||
"wheel": "python-wheel:p",
|
# "ruamel.yaml": "python-ruamel-yaml:p python-ruamel.yaml.clib:p",
|
||||||
"pyEDAA.ProjectModel": "python-ruamel-yaml:p python-ruamel.yaml.clib:p python-lxml:p",
|
"sphinx": "python-markupsafe:p",
|
||||||
"pyEDAA.Reports": "python-ruamel-yaml:p python-ruamel.yaml.clib:p python-lxml:p",
|
"tomli": "python-tomli:p",
|
||||||
|
"wheel": "python-wheel:p",
|
||||||
|
"pyedaa.projectmodel": "python-ruamel-yaml:p python-ruamel.yaml.clib:p python-lxml:p",
|
||||||
|
"pyedaa.reports": "python-ruamel-yaml:p python-ruamel.yaml.clib:p python-lxml:p",
|
||||||
}
|
}
|
||||||
subPackages = {
|
subPackages = {
|
||||||
"pytooling": {
|
"pytooling": {
|
||||||
"yaml": "python-ruamel-yaml:p python-ruamel.yaml.clib:p",
|
"yaml": "python-ruamel-yaml:p python-ruamel.yaml.clib:p",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,6 +261,8 @@ jobs:
|
|||||||
with github_output.open("a+") as f:
|
with github_output.open("a+") as f:
|
||||||
f.write(f"pacboy_packages={' '.join(pacboyPackages)}\n")
|
f.write(f"pacboy_packages={' '.join(pacboyPackages)}\n")
|
||||||
|
|
||||||
|
# Python setup
|
||||||
|
|
||||||
- name: '🟦 Setup MSYS2 for ${{ matrix.runtime }}'
|
- name: '🟦 Setup MSYS2 for ${{ matrix.runtime }}'
|
||||||
if: matrix.system == 'msys2'
|
if: matrix.system == 'msys2'
|
||||||
uses: msys2/setup-msys2@v2
|
uses: msys2/setup-msys2@v2
|
||||||
@@ -222,6 +279,8 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python }}
|
python-version: ${{ matrix.python }}
|
||||||
|
|
||||||
|
# Python Dependency steps
|
||||||
|
|
||||||
- name: 🔧 Install wheel,tomli and pip dependencies (native)
|
- name: 🔧 Install wheel,tomli and pip dependencies (native)
|
||||||
if: matrix.system != 'msys2'
|
if: matrix.system != 'msys2'
|
||||||
run: |
|
run: |
|
||||||
@@ -237,6 +296,32 @@ jobs:
|
|||||||
python -m pip install --disable-pip-version-check ${{ inputs.requirements }}
|
python -m pip install --disable-pip-version-check ${{ inputs.requirements }}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Before scripts
|
||||||
|
|
||||||
|
- name: 🍎 macOS (Intel) before scripts
|
||||||
|
if: matrix.system == 'macos' && inputs.macos_before_script != ''
|
||||||
|
run: ${{ inputs.macos_before_script }}
|
||||||
|
|
||||||
|
- name: 🍏 macOS (ARM) before scripts
|
||||||
|
if: matrix.system == 'macos-arm' && inputs.macos_arm_before_script != ''
|
||||||
|
run: ${{ inputs.macos_arm_before_script }}
|
||||||
|
|
||||||
|
- name: 🐧 Ubuntu before scripts
|
||||||
|
if: matrix.system == 'ubuntu' && inputs.ubuntu_before_script != ''
|
||||||
|
run: ${{ inputs.ubuntu_before_script }}
|
||||||
|
|
||||||
|
# Windows before script
|
||||||
|
|
||||||
|
- name: 🪟🟦 MinGW64 before scripts
|
||||||
|
if: matrix.system == 'msys2' && matrix.runtime == 'MINGW64' && inputs.mingw64_before_script != ''
|
||||||
|
run: ${{ inputs.mingw64_before_script }}
|
||||||
|
|
||||||
|
- name: 🪟🟨 UCRT64 before scripts
|
||||||
|
if: matrix.system == 'msys2' && matrix.runtime == 'UCRT64' && inputs.ucrt64_before_script != ''
|
||||||
|
run: ${{ inputs.ucrt64_before_script }}
|
||||||
|
|
||||||
|
# Read pyproject.toml
|
||||||
|
|
||||||
- name: 🔁 Extract configurations from pyproject.toml
|
- name: 🔁 Extract configurations from pyproject.toml
|
||||||
id: getVariables
|
id: getVariables
|
||||||
shell: python
|
shell: python
|
||||||
@@ -266,7 +351,9 @@ jobs:
|
|||||||
xmlFile = Path(pyProjectSettings["tool"]["coverage"]["xml"]["output"])
|
xmlFile = Path(pyProjectSettings["tool"]["coverage"]["xml"]["output"])
|
||||||
jsonFile = Path(pyProjectSettings["tool"]["coverage"]["json"]["output"])
|
jsonFile = Path(pyProjectSettings["tool"]["coverage"]["json"]["output"])
|
||||||
else:
|
else:
|
||||||
print(f"File '{pyProjectFile}' not found and no '.coveragerc' file specified.")
|
print(f"File '{pyProjectFile}' not found.")
|
||||||
|
print(f"::error title=FileNotFoundError::File '{pyProjectFile}' not found.")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
# Read output paths from '.coveragerc' file
|
# Read output paths from '.coveragerc' file
|
||||||
elif len(coverageRC) > 0:
|
elif len(coverageRC) > 0:
|
||||||
@@ -280,6 +367,8 @@ jobs:
|
|||||||
jsonFile = Path(coverageRCSettings["json"]["output"])
|
jsonFile = Path(coverageRCSettings["json"]["output"])
|
||||||
else:
|
else:
|
||||||
print(f"File '{coverageRCFile}' not found.")
|
print(f"File '{coverageRCFile}' not found.")
|
||||||
|
print(f"::error title=FileNotFoundError::File '{coverageRCFile}' not found.")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
# Write jobs to special file
|
# Write jobs to special file
|
||||||
github_output = Path(getenv("GITHUB_OUTPUT"))
|
github_output = Path(getenv("GITHUB_OUTPUT"))
|
||||||
@@ -294,7 +383,9 @@ jobs:
|
|||||||
|
|
||||||
print(f"DEBUG:\n html={htmlDirectory}\n xml={xmlFile}\n json={jsonFile}")
|
print(f"DEBUG:\n html={htmlDirectory}\n xml={xmlFile}\n json={jsonFile}")
|
||||||
|
|
||||||
- name: ☑ Run unit tests (Ubuntu/macOS)
|
# Run pytests
|
||||||
|
|
||||||
|
- name: ✅ Run unit tests (Ubuntu/macOS)
|
||||||
if: matrix.system != 'windows'
|
if: matrix.system != 'windows'
|
||||||
run: |
|
run: |
|
||||||
export ENVIRONMENT_NAME="${{ matrix.envname }}"
|
export ENVIRONMENT_NAME="${{ matrix.envname }}"
|
||||||
@@ -310,7 +401,7 @@ jobs:
|
|||||||
python -m pytest -raP $PYTEST_ARGS --color=yes ${{ inputs.tests_directory || '.' }}/${{ inputs.unittest_directory }}
|
python -m pytest -raP $PYTEST_ARGS --color=yes ${{ inputs.tests_directory || '.' }}/${{ inputs.unittest_directory }}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: ☑ Run unit tests (Windows)
|
- name: ✅ Run unit tests (Windows)
|
||||||
if: matrix.system == 'windows'
|
if: matrix.system == 'windows'
|
||||||
run: |
|
run: |
|
||||||
$env:ENVIRONMENT_NAME = "${{ matrix.envname }}"
|
$env:ENVIRONMENT_NAME = "${{ matrix.envname }}"
|
||||||
@@ -328,20 +419,26 @@ jobs:
|
|||||||
|
|
||||||
- name: Convert coverage to XML format (Cobertura)
|
- name: Convert coverage to XML format (Cobertura)
|
||||||
if: inputs.coverage_xml_artifact != ''
|
if: inputs.coverage_xml_artifact != ''
|
||||||
|
continue-on-error: true
|
||||||
run: coverage xml --data-file=.coverage
|
run: coverage xml --data-file=.coverage
|
||||||
|
|
||||||
- name: Convert coverage to JSON format
|
- name: Convert coverage to JSON format
|
||||||
if: inputs.coverage_json_artifact != ''
|
if: inputs.coverage_json_artifact != ''
|
||||||
|
continue-on-error: true
|
||||||
run: coverage json --data-file=.coverage
|
run: coverage json --data-file=.coverage
|
||||||
|
|
||||||
- name: Convert coverage to HTML format
|
- name: Convert coverage to HTML format
|
||||||
if: inputs.coverage_html_artifact != ''
|
if: inputs.coverage_html_artifact != ''
|
||||||
|
continue-on-error: true
|
||||||
run: |
|
run: |
|
||||||
coverage html --data-file=.coverage -d ${{ steps.getVariables.outputs.coverage_report_html_directory }}
|
coverage html --data-file=.coverage -d ${{ steps.getVariables.outputs.coverage_report_html_directory }}
|
||||||
rm ${{ steps.getVariables.outputs.coverage_report_html_directory }}/.gitignore
|
rm ${{ steps.getVariables.outputs.coverage_report_html_directory }}/.gitignore
|
||||||
|
|
||||||
|
# Upload artifacts
|
||||||
|
|
||||||
- name: 📤 Upload 'TestReportSummary.xml' artifact
|
- name: 📤 Upload 'TestReportSummary.xml' artifact
|
||||||
if: inputs.unittest_xml_artifact != ''
|
if: inputs.unittest_xml_artifact != ''
|
||||||
|
continue-on-error: true
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ inputs.unittest_xml_artifact }}-${{ matrix.system }}-${{ matrix.runtime }}-${{ matrix.python }}
|
name: ${{ inputs.unittest_xml_artifact }}-${{ matrix.system }}-${{ matrix.runtime }}-${{ matrix.python }}
|
||||||
@@ -366,6 +463,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: ${{ inputs.coverage_sqlite_artifact }}-${{ matrix.system }}-${{ matrix.runtime }}-${{ matrix.python }}
|
name: ${{ inputs.coverage_sqlite_artifact }}-${{ matrix.system }}-${{ matrix.runtime }}-${{ matrix.python }}
|
||||||
path: .coverage
|
path: .coverage
|
||||||
|
include-hidden-files: true
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: 1
|
retention-days: 1
|
||||||
|
|
||||||
|
|||||||
9
.github/workflows/VerifyDocs.yml
vendored
9
.github/workflows/VerifyDocs.yml
vendored
@@ -25,6 +25,11 @@ name: Verify examples
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
|
ubuntu_image_version:
|
||||||
|
description: 'Ubuntu image version.'
|
||||||
|
required: false
|
||||||
|
default: '24.04'
|
||||||
|
type: string
|
||||||
python_version:
|
python_version:
|
||||||
description: 'Python version.'
|
description: 'Python version.'
|
||||||
required: false
|
required: false
|
||||||
@@ -35,7 +40,7 @@ jobs:
|
|||||||
|
|
||||||
VerifyDocs:
|
VerifyDocs:
|
||||||
name: 👍 Verify example snippets using Python ${{ inputs.python_version }}
|
name: 👍 Verify example snippets using Python ${{ inputs.python_version }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: ⏬ Checkout repository
|
- name: ⏬ Checkout repository
|
||||||
@@ -72,7 +77,7 @@ jobs:
|
|||||||
- name: Print example.py
|
- name: Print example.py
|
||||||
run: cat tests/docs/example.py
|
run: cat tests/docs/example.py
|
||||||
|
|
||||||
- name: ☑ Run example snippet
|
- name: ✅ Run example snippet
|
||||||
working-directory: tests/docs
|
working-directory: tests/docs
|
||||||
run: |
|
run: |
|
||||||
python3 example.py
|
python3 example.py
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
Params:
|
Params:
|
||||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r1
|
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r2
|
||||||
with:
|
with:
|
||||||
name: Example
|
name: Example
|
||||||
python_version_list: "3.10 3.11"
|
python_version_list: "3.12 3.13"
|
||||||
system_list: "ubuntu windows"
|
system_list: "ubuntu windows"
|
||||||
|
|
||||||
Testing:
|
Testing:
|
||||||
@@ -36,7 +36,7 @@ jobs:
|
|||||||
name: Package generation
|
name: Package generation
|
||||||
needs:
|
needs:
|
||||||
- Params
|
- Params
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- name: Package creation
|
- name: Package creation
|
||||||
run: echo "Package" >> package.txt
|
run: echo "Package" >> package.txt
|
||||||
@@ -50,7 +50,7 @@ jobs:
|
|||||||
retention-days: 1
|
retention-days: 1
|
||||||
|
|
||||||
ArtifactCleanUp:
|
ArtifactCleanUp:
|
||||||
uses: pyTooling/Actions/.github/workflows/ArtifactCleanUp.yml@r1
|
uses: pyTooling/Actions/.github/workflows/ArtifactCleanUp.yml@r2
|
||||||
needs:
|
needs:
|
||||||
- Params
|
- Params
|
||||||
- Testing
|
- Testing
|
||||||
|
|||||||
149
.github/workflows/_Checking_Parameters.yml
vendored
149
.github/workflows/_Checking_Parameters.yml
vendored
@@ -6,54 +6,54 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
Params_Default:
|
Params_Default:
|
||||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r1
|
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r2
|
||||||
with:
|
with:
|
||||||
name: Example
|
name: Example
|
||||||
|
|
||||||
Params_PythonVersions:
|
Params_PythonVersions:
|
||||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r1
|
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r2
|
||||||
with:
|
with:
|
||||||
name: Example
|
name: Example
|
||||||
python_version_list: "3.9 3.10 pypy-3.8 pypy-3.9"
|
python_version_list: "3.11 3.12 pypy-3.9 pypy-3.10"
|
||||||
|
|
||||||
Params_Systems:
|
Params_Systems:
|
||||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r1
|
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r2
|
||||||
with:
|
with:
|
||||||
name: Example
|
name: Example
|
||||||
system_list: "windows mingw32 mingw64"
|
system_list: "windows mingw32 mingw64"
|
||||||
|
|
||||||
Params_Include:
|
Params_Include:
|
||||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r1
|
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r2
|
||||||
with:
|
with:
|
||||||
name: Example
|
name: Example
|
||||||
python_version_list: "3.10"
|
python_version_list: "3.11"
|
||||||
system_list: "ubuntu windows macos"
|
system_list: "ubuntu windows macos macos-arm"
|
||||||
include_list: "ubuntu:3.11 ubuntu:3.12"
|
include_list: "ubuntu:3.12 ubuntu:3.13"
|
||||||
|
|
||||||
Params_Exclude:
|
Params_Exclude:
|
||||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r1
|
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r2
|
||||||
with:
|
with:
|
||||||
name: Example
|
name: Example
|
||||||
python_version_list: "3.10"
|
python_version_list: "3.12"
|
||||||
system_list: "ubuntu windows macos"
|
system_list: "ubuntu windows macos macos-arm"
|
||||||
exclude_list: "windows:3.10 windows:3.11"
|
exclude_list: "windows:3.12 windows:3.13"
|
||||||
|
|
||||||
Params_Disable:
|
Params_Disable:
|
||||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r1
|
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r2
|
||||||
with:
|
with:
|
||||||
name: Example
|
name: Example
|
||||||
python_version_list: "3.10"
|
python_version_list: "3.12"
|
||||||
system_list: "ubuntu windows macos"
|
system_list: "ubuntu windows macos macos-arm"
|
||||||
disable_list: "windows:3.10 windows:3.11"
|
disable_list: "windows:3.12 windows:3.13"
|
||||||
|
|
||||||
Params_All:
|
Params_All:
|
||||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r1
|
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r2
|
||||||
with:
|
with:
|
||||||
name: Example
|
name: Example
|
||||||
python_version_list: "3.10 3.11"
|
python_version_list: "3.12 3.13"
|
||||||
system_list: "ubuntu windows macos"
|
system_list: "ubuntu windows macos macos-arm"
|
||||||
include_list: "windows:3.8 windows:3.9 windows:3.12"
|
include_list: "windows:3.10 windows:3.11 windows:3.13"
|
||||||
exclude_list: "macos:3.10 macos:3.11"
|
exclude_list: "macos:3.12 macos:3.13"
|
||||||
|
|
||||||
Params_Check:
|
Params_Check:
|
||||||
needs:
|
needs:
|
||||||
@@ -64,14 +64,14 @@ jobs:
|
|||||||
- Params_Exclude
|
- Params_Exclude
|
||||||
- Params_Disable
|
- Params_Disable
|
||||||
- Params_All
|
- Params_All
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
shell: python
|
shell: python
|
||||||
steps:
|
steps:
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: pip install pyTooling
|
run: pip install --disable-pip-version-check --break-system-packages pyTooling
|
||||||
# Params_Default
|
# Params_Default
|
||||||
- name: Checking results from 'Params_Default'
|
- name: Checking results from 'Params_Default'
|
||||||
run: |
|
run: |
|
||||||
@@ -80,9 +80,9 @@ jobs:
|
|||||||
|
|
||||||
from pyTooling.Common import zipdicts
|
from pyTooling.Common import zipdicts
|
||||||
|
|
||||||
expectedPythonVersion = "3.12"
|
expectedPythonVersion = "3.13"
|
||||||
expectedPythons = ["3.8", "3.9", "3.10", "3.11", "3.12"]
|
expectedPythons = ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
||||||
expectedSystems = ["ubuntu", "windows", "macos"]
|
expectedSystems = ["ubuntu", "windows", "macos", "macos-arm"]
|
||||||
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons] + ["mingw64:3.11", "ucrt64:3.11"]
|
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons] + ["mingw64:3.11", "ucrt64:3.11"]
|
||||||
expectedName = "Example"
|
expectedName = "Example"
|
||||||
expectedArtifacts = {
|
expectedArtifacts = {
|
||||||
@@ -112,8 +112,15 @@ jobs:
|
|||||||
errors += 1
|
errors += 1
|
||||||
if len(actualPythonJobs) != len(expectedJobs):
|
if len(actualPythonJobs) != len(expectedJobs):
|
||||||
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
||||||
|
print("Actual jobs:")
|
||||||
for job in actualPythonJobs:
|
for job in actualPythonJobs:
|
||||||
print(f" {job['system']}:{job['python']}")
|
if job['system'] == "msys2":
|
||||||
|
print(f" {job['runtime'].lower()}:{job['python']}")
|
||||||
|
else:
|
||||||
|
print(f" {job['system']}:{job['python']}")
|
||||||
|
print("Expected jobs:")
|
||||||
|
for job in expectedJobs:
|
||||||
|
print(f" {job}")
|
||||||
errors += 1
|
errors += 1
|
||||||
if len(actualArtifactNames) != len(expectedArtifacts):
|
if len(actualArtifactNames) != len(expectedArtifacts):
|
||||||
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
||||||
@@ -136,9 +143,9 @@ jobs:
|
|||||||
|
|
||||||
from pyTooling.Common import zipdicts
|
from pyTooling.Common import zipdicts
|
||||||
|
|
||||||
expectedPythonVersion = "3.12"
|
expectedPythonVersion = "3.13"
|
||||||
expectedPythons = ["3.9", "3.10", "pypy-3.8", "pypy-3.9"]
|
expectedPythons = ["3.11", "3.12", "pypy-3.9", "pypy-3.10"]
|
||||||
expectedSystems = ["ubuntu", "windows", "macos"]
|
expectedSystems = ["ubuntu", "windows", "macos", "macos-arm"]
|
||||||
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons] + ["mingw64:3.11", "ucrt64:3.11"]
|
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons] + ["mingw64:3.11", "ucrt64:3.11"]
|
||||||
expectedName = "Example"
|
expectedName = "Example"
|
||||||
expectedArtifacts = {
|
expectedArtifacts = {
|
||||||
@@ -168,8 +175,15 @@ jobs:
|
|||||||
errors += 1
|
errors += 1
|
||||||
if len(actualPythonJobs) != len(expectedJobs):
|
if len(actualPythonJobs) != len(expectedJobs):
|
||||||
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
||||||
|
print("Actual jobs:")
|
||||||
for job in actualPythonJobs:
|
for job in actualPythonJobs:
|
||||||
print(f" {job['system']}:{job['python']}")
|
if job['system'] == "msys2":
|
||||||
|
print(f" {job['runtime'].lower()}:{job['python']}")
|
||||||
|
else:
|
||||||
|
print(f" {job['system']}:{job['python']}")
|
||||||
|
print("Expected jobs:")
|
||||||
|
for job in expectedJobs:
|
||||||
|
print(f" {job}")
|
||||||
errors += 1
|
errors += 1
|
||||||
if len(actualArtifactNames) != len(expectedArtifacts):
|
if len(actualArtifactNames) != len(expectedArtifacts):
|
||||||
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
||||||
@@ -192,8 +206,8 @@ jobs:
|
|||||||
|
|
||||||
from pyTooling.Common import zipdicts
|
from pyTooling.Common import zipdicts
|
||||||
|
|
||||||
expectedPythonVersion = "3.12"
|
expectedPythonVersion = "3.13"
|
||||||
expectedPythons = ["3.8", "3.9", "3.10", "3.11", "3.12"]
|
expectedPythons = ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
||||||
expectedSystems = ["windows"]
|
expectedSystems = ["windows"]
|
||||||
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons] + ["mingw32:3.11", "mingw64:3.11"]
|
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons] + ["mingw32:3.11", "mingw64:3.11"]
|
||||||
expectedName = "Example"
|
expectedName = "Example"
|
||||||
@@ -224,8 +238,15 @@ jobs:
|
|||||||
errors += 1
|
errors += 1
|
||||||
if len(actualPythonJobs) != len(expectedJobs):
|
if len(actualPythonJobs) != len(expectedJobs):
|
||||||
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
||||||
|
print("Actual jobs:")
|
||||||
for job in actualPythonJobs:
|
for job in actualPythonJobs:
|
||||||
print(f" {job['system']}:{job['python']}")
|
if job['system'] == "msys2":
|
||||||
|
print(f" {job['runtime'].lower()}:{job['python']}")
|
||||||
|
else:
|
||||||
|
print(f" {job['system']}:{job['python']}")
|
||||||
|
print("Expected jobs:")
|
||||||
|
for job in expectedJobs:
|
||||||
|
print(f" {job}")
|
||||||
errors += 1
|
errors += 1
|
||||||
if len(actualArtifactNames) != len(expectedArtifacts):
|
if len(actualArtifactNames) != len(expectedArtifacts):
|
||||||
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
||||||
@@ -248,9 +269,9 @@ jobs:
|
|||||||
|
|
||||||
from pyTooling.Common import zipdicts
|
from pyTooling.Common import zipdicts
|
||||||
|
|
||||||
expectedPythonVersion = "3.12"
|
expectedPythonVersion = "3.13"
|
||||||
expectedPythons = ["3.10"]
|
expectedPythons = ["3.12"]
|
||||||
expectedSystems = ["ubuntu", "windows", "macos"]
|
expectedSystems = ["ubuntu", "windows", "macos", "macos-arm"]
|
||||||
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons] + ["ubuntu:3.11", "ubuntu:3.12"]
|
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons] + ["ubuntu:3.11", "ubuntu:3.12"]
|
||||||
expectedName = "Example"
|
expectedName = "Example"
|
||||||
expectedArtifacts = {
|
expectedArtifacts = {
|
||||||
@@ -280,8 +301,15 @@ jobs:
|
|||||||
errors += 1
|
errors += 1
|
||||||
if len(actualPythonJobs) != len(expectedJobs):
|
if len(actualPythonJobs) != len(expectedJobs):
|
||||||
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
||||||
|
print("Actual jobs:")
|
||||||
for job in actualPythonJobs:
|
for job in actualPythonJobs:
|
||||||
print(f" {job['system']}:{job['python']}")
|
if job['system'] == "msys2":
|
||||||
|
print(f" {job['runtime'].lower()}:{job['python']}")
|
||||||
|
else:
|
||||||
|
print(f" {job['system']}:{job['python']}")
|
||||||
|
print("Expected jobs:")
|
||||||
|
for job in expectedJobs:
|
||||||
|
print(f" {job}")
|
||||||
errors += 1
|
errors += 1
|
||||||
if len(actualArtifactNames) != len(expectedArtifacts):
|
if len(actualArtifactNames) != len(expectedArtifacts):
|
||||||
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
||||||
@@ -304,9 +332,9 @@ jobs:
|
|||||||
|
|
||||||
from pyTooling.Common import zipdicts
|
from pyTooling.Common import zipdicts
|
||||||
|
|
||||||
expectedPythonVersion = "3.12"
|
expectedPythonVersion = "3.13"
|
||||||
expectedPythons = ["3.10"]
|
expectedPythons = ["3.12"]
|
||||||
expectedSystems = ["ubuntu", "macos"]
|
expectedSystems = ["ubuntu", "macos", "macos-arm"]
|
||||||
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons]
|
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons]
|
||||||
expectedName = "Example"
|
expectedName = "Example"
|
||||||
expectedArtifacts = {
|
expectedArtifacts = {
|
||||||
@@ -336,8 +364,15 @@ jobs:
|
|||||||
errors += 1
|
errors += 1
|
||||||
if len(actualPythonJobs) != len(expectedJobs):
|
if len(actualPythonJobs) != len(expectedJobs):
|
||||||
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
||||||
|
print("Actual jobs:")
|
||||||
for job in actualPythonJobs:
|
for job in actualPythonJobs:
|
||||||
print(f" {job['system']}:{job['python']}")
|
if job['system'] == "msys2":
|
||||||
|
print(f" {job['runtime'].lower()}:{job['python']}")
|
||||||
|
else:
|
||||||
|
print(f" {job['system']}:{job['python']}")
|
||||||
|
print("Expected jobs:")
|
||||||
|
for job in expectedJobs:
|
||||||
|
print(f" {job}")
|
||||||
errors += 1
|
errors += 1
|
||||||
if len(actualArtifactNames) != len(expectedArtifacts):
|
if len(actualArtifactNames) != len(expectedArtifacts):
|
||||||
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
||||||
@@ -360,9 +395,9 @@ jobs:
|
|||||||
|
|
||||||
from pyTooling.Common import zipdicts
|
from pyTooling.Common import zipdicts
|
||||||
|
|
||||||
expectedPythonVersion = "3.12"
|
expectedPythonVersion = "3.13"
|
||||||
expectedPythons = ["3.10"]
|
expectedPythons = ["3.12"]
|
||||||
expectedSystems = ["ubuntu", "macos"]
|
expectedSystems = ["ubuntu", "macos", "macos-arm"]
|
||||||
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons]
|
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons]
|
||||||
expectedName = "Example"
|
expectedName = "Example"
|
||||||
expectedArtifacts = {
|
expectedArtifacts = {
|
||||||
@@ -392,8 +427,15 @@ jobs:
|
|||||||
errors += 1
|
errors += 1
|
||||||
if len(actualPythonJobs) != len(expectedJobs):
|
if len(actualPythonJobs) != len(expectedJobs):
|
||||||
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
||||||
|
print("Actual jobs:")
|
||||||
for job in actualPythonJobs:
|
for job in actualPythonJobs:
|
||||||
print(f" {job['system']}:{job['python']}")
|
if job['system'] == "msys2":
|
||||||
|
print(f" {job['runtime'].lower()}:{job['python']}")
|
||||||
|
else:
|
||||||
|
print(f" {job['system']}:{job['python']}")
|
||||||
|
print("Expected jobs:")
|
||||||
|
for job in expectedJobs:
|
||||||
|
print(f" {job}")
|
||||||
errors += 1
|
errors += 1
|
||||||
if len(actualArtifactNames) != len(expectedArtifacts):
|
if len(actualArtifactNames) != len(expectedArtifacts):
|
||||||
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
||||||
@@ -416,10 +458,10 @@ jobs:
|
|||||||
|
|
||||||
from pyTooling.Common import zipdicts
|
from pyTooling.Common import zipdicts
|
||||||
|
|
||||||
expectedPythonVersion = "3.12"
|
expectedPythonVersion = "3.13"
|
||||||
expectedPythons = ["3.10", "3.11"]
|
expectedPythons = ["3.12", "3.13"]
|
||||||
expectedSystems = ["ubuntu", "windows"]
|
expectedSystems = ["ubuntu", "windows"]
|
||||||
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons] + ["windows:3.8", "windows:3.9", "windows:3.12"]
|
expectedJobs = [f"{system}:{python}" for system in expectedSystems for python in expectedPythons] + ["windows:3.10", "windows:3.11", "windows:3.13"]
|
||||||
expectedName = "Example"
|
expectedName = "Example"
|
||||||
expectedArtifacts = {
|
expectedArtifacts = {
|
||||||
"unittesting_xml": f"{expectedName}-UnitTestReportSummary-XML",
|
"unittesting_xml": f"{expectedName}-UnitTestReportSummary-XML",
|
||||||
@@ -448,8 +490,15 @@ jobs:
|
|||||||
errors += 1
|
errors += 1
|
||||||
if len(actualPythonJobs) != len(expectedJobs):
|
if len(actualPythonJobs) != len(expectedJobs):
|
||||||
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
print(f"Number of 'python_jobs' does not match: {len(actualPythonJobs)} != {len(expectedJobs)}.")
|
||||||
|
print("Actual jobs:")
|
||||||
for job in actualPythonJobs:
|
for job in actualPythonJobs:
|
||||||
print(f" {job['system']}:{job['python']}")
|
if job['system'] == "msys2":
|
||||||
|
print(f" {job['runtime'].lower()}:{job['python']}")
|
||||||
|
else:
|
||||||
|
print(f" {job['system']}:{job['python']}")
|
||||||
|
print("Expected jobs:")
|
||||||
|
for job in expectedJobs:
|
||||||
|
print(f" {job}")
|
||||||
errors += 1
|
errors += 1
|
||||||
if len(actualArtifactNames) != len(expectedArtifacts):
|
if len(actualArtifactNames) != len(expectedArtifacts):
|
||||||
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
print(f"Number of 'artifact_names' does not match: {len(actualArtifactNames)} != {len(expectedArtifacts)}.")
|
||||||
|
|||||||
116
.github/workflows/_Checking_Pipeline.yml
vendored
116
.github/workflows/_Checking_Pipeline.yml
vendored
@@ -6,21 +6,21 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
UnitTestingParams:
|
UnitTestingParams:
|
||||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r1
|
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r2
|
||||||
with:
|
with:
|
||||||
name: pyDummy
|
name: pyDummy
|
||||||
python_version_list: "3.8 3.9 3.10 3.11 3.12 pypy-3.8 pypy-3.9 pypy-3.10"
|
python_version_list: "3.9 3.10 3.11 3.12 3.13 pypy-3.9 pypy-3.10"
|
||||||
disable_list: "windows:pypy-3.10"
|
# disable_list: "windows:pypy-3.10"
|
||||||
|
|
||||||
PlatformTestingParams:
|
PlatformTestingParams:
|
||||||
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r1
|
uses: pyTooling/Actions/.github/workflows/Parameters.yml@r2
|
||||||
with:
|
with:
|
||||||
name: Platform
|
name: Platform
|
||||||
python_version_list: ""
|
python_version_list: ""
|
||||||
system_list: "ubuntu windows macos mingw32 mingw64 clang64 ucrt64"
|
system_list: "ubuntu windows macos mingw32 mingw64 clang64 ucrt64"
|
||||||
|
|
||||||
UnitTesting:
|
UnitTesting:
|
||||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r1
|
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r2
|
||||||
needs:
|
needs:
|
||||||
- UnitTestingParams
|
- UnitTestingParams
|
||||||
with:
|
with:
|
||||||
@@ -33,7 +33,7 @@ jobs:
|
|||||||
# coverage_html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}
|
# coverage_html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_html }}
|
||||||
|
|
||||||
PlatformTesting:
|
PlatformTesting:
|
||||||
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r1
|
uses: pyTooling/Actions/.github/workflows/UnitTesting.yml@r2
|
||||||
needs:
|
needs:
|
||||||
- PlatformTestingParams
|
- PlatformTestingParams
|
||||||
with:
|
with:
|
||||||
@@ -48,7 +48,7 @@ jobs:
|
|||||||
coverage_html_artifact: ${{ fromJson(needs.PlatformTestingParams.outputs.artifact_names).codecoverage_html }}
|
coverage_html_artifact: ${{ fromJson(needs.PlatformTestingParams.outputs.artifact_names).codecoverage_html }}
|
||||||
|
|
||||||
# Coverage:
|
# Coverage:
|
||||||
# uses: pyTooling/Actions/.github/workflows/CoverageCollection.yml@r1
|
# uses: pyTooling/Actions/.github/workflows/CoverageCollection.yml@r2
|
||||||
# needs:
|
# needs:
|
||||||
# - UnitTestingParams
|
# - UnitTestingParams
|
||||||
# with:
|
# with:
|
||||||
@@ -58,7 +58,7 @@ jobs:
|
|||||||
# codacy_token: ${{ secrets.CODACY_PROJECT_TOKEN }}
|
# codacy_token: ${{ secrets.CODACY_PROJECT_TOKEN }}
|
||||||
|
|
||||||
StaticTypeCheck:
|
StaticTypeCheck:
|
||||||
uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r1
|
uses: pyTooling/Actions/.github/workflows/StaticTypeCheck.yml@r2
|
||||||
needs:
|
needs:
|
||||||
- UnitTestingParams
|
- UnitTestingParams
|
||||||
with:
|
with:
|
||||||
@@ -68,8 +68,33 @@ jobs:
|
|||||||
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:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/CheckDocumentation.yml@r1
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
with:
|
||||||
|
python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
||||||
|
directory: sphinx_reports
|
||||||
|
# fail_below: 70
|
||||||
|
|
||||||
|
ConfigParams:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/ExtractConfiguration.yml@r2
|
||||||
|
needs:
|
||||||
|
- DocCoverage
|
||||||
|
|
||||||
|
Package:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/Package.yml@r2
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
- UnitTesting
|
||||||
|
# - Coverage
|
||||||
|
- PlatformTesting
|
||||||
|
with:
|
||||||
|
python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
||||||
|
artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
|
||||||
|
|
||||||
PublishCoverageResults:
|
PublishCoverageResults:
|
||||||
uses: pyTooling/Actions/.github/workflows/PublishCoverageResults.yml@r1
|
uses: pyTooling/Actions/.github/workflows/PublishCoverageResults.yml@r2
|
||||||
needs:
|
needs:
|
||||||
- UnitTestingParams
|
- UnitTestingParams
|
||||||
- UnitTesting
|
- UnitTesting
|
||||||
@@ -84,42 +109,63 @@ jobs:
|
|||||||
codacy_token: ${{ secrets.CODACY_PROJECT_TOKEN }}
|
codacy_token: ${{ secrets.CODACY_PROJECT_TOKEN }}
|
||||||
|
|
||||||
PublishTestResults:
|
PublishTestResults:
|
||||||
uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@r1
|
uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@r2
|
||||||
needs:
|
needs:
|
||||||
- UnitTesting
|
- UnitTesting
|
||||||
- PlatformTesting
|
- PlatformTesting
|
||||||
|
|
||||||
Package:
|
|
||||||
uses: pyTooling/Actions/.github/workflows/Package.yml@r1
|
|
||||||
needs:
|
|
||||||
- UnitTestingParams
|
|
||||||
- UnitTesting
|
|
||||||
# - Coverage
|
|
||||||
- PlatformTesting
|
|
||||||
with:
|
with:
|
||||||
python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
additional_merge_args: '-d "--pytest=rewrite-dunder-init;reduce-depth:pytest.tests.unit;reduce-depth:pytest.tests.platform"'
|
||||||
artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
|
|
||||||
|
|
||||||
# VerifyDocs:
|
# VerifyDocs:
|
||||||
# uses: pyTooling/Actions/.github/workflows/VerifyDocs.yml@r1
|
# uses: pyTooling/Actions/.github/workflows/VerifyDocs.yml@r2
|
||||||
# needs:
|
# needs:
|
||||||
# - UnitTestingParams
|
# - UnitTestingParams
|
||||||
# with:
|
# with:
|
||||||
# python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
# python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
||||||
|
|
||||||
BuildTheDocs:
|
Documentation:
|
||||||
uses: pyTooling/Actions/.github/workflows/BuildTheDocs.yml@r1
|
uses: pyTooling/Actions/.github/workflows/SphinxDocumentation.yml@r2
|
||||||
needs:
|
needs:
|
||||||
- UnitTestingParams
|
- UnitTestingParams
|
||||||
|
- ConfigParams
|
||||||
|
- PublishTestResults
|
||||||
|
- PublishCoverageResults
|
||||||
# - VerifyDocs
|
# - VerifyDocs
|
||||||
with:
|
with:
|
||||||
artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }}
|
python_version: ${{ needs.UnitTestingParams.outputs.python_version }}
|
||||||
|
coverage_report_json_directory: ${{ needs.ConfigParams.outputs.coverage_report_json_directory }}
|
||||||
|
# unittest_xml_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}
|
||||||
|
# coverage_json_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_json }}
|
||||||
|
html_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_html }}
|
||||||
|
latex_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }}
|
||||||
|
|
||||||
PublishToGitHubPages:
|
IntermediateCleanUp:
|
||||||
uses: pyTooling/Actions/.github/workflows/PublishToGitHubPages.yml@r1
|
uses: pyTooling/Actions/.github/workflows/IntermediateCleanUp.yml@r1
|
||||||
needs:
|
needs:
|
||||||
- UnitTestingParams
|
- UnitTestingParams
|
||||||
- BuildTheDocs
|
- PublishCoverageResults
|
||||||
|
- PublishTestResults
|
||||||
|
- Documentation
|
||||||
|
with:
|
||||||
|
sqlite_coverage_artifacts_prefix: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).codecoverage_sqlite }}-
|
||||||
|
xml_unittest_artifacts_prefix: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).unittesting_xml }}-
|
||||||
|
|
||||||
|
PDFDocumentation:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/LaTeXDocumentation.yml@r2
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
- Documentation
|
||||||
|
with:
|
||||||
|
document: actions
|
||||||
|
latex_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_latex }}
|
||||||
|
pdf_artifact: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).documentation_pdf }}
|
||||||
|
|
||||||
|
PublishToGitHubPages:
|
||||||
|
uses: pyTooling/Actions/.github/workflows/PublishToGitHubPages.yml@r2
|
||||||
|
needs:
|
||||||
|
- UnitTestingParams
|
||||||
|
- Documentation
|
||||||
|
# - PDFDocumentation
|
||||||
# - Coverage
|
# - Coverage
|
||||||
- PublishCoverageResults
|
- PublishCoverageResults
|
||||||
- StaticTypeCheck
|
- StaticTypeCheck
|
||||||
@@ -129,7 +175,7 @@ jobs:
|
|||||||
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@r1
|
uses: pyTooling/Actions/.github/workflows/Release.yml@r2
|
||||||
if: startsWith(github.ref, 'refs/tags')
|
if: startsWith(github.ref, 'refs/tags')
|
||||||
needs:
|
needs:
|
||||||
- UnitTesting
|
- UnitTesting
|
||||||
@@ -140,7 +186,7 @@ jobs:
|
|||||||
- PublishToGitHubPages
|
- PublishToGitHubPages
|
||||||
|
|
||||||
PublishOnPyPI:
|
PublishOnPyPI:
|
||||||
uses: pyTooling/Actions/.github/workflows/PublishOnPyPI.yml@r1
|
uses: pyTooling/Actions/.github/workflows/PublishOnPyPI.yml@r2
|
||||||
if: startsWith(github.ref, 'refs/tags')
|
if: startsWith(github.ref, 'refs/tags')
|
||||||
needs:
|
needs:
|
||||||
- UnitTestingParams
|
- UnitTestingParams
|
||||||
@@ -154,18 +200,20 @@ jobs:
|
|||||||
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
||||||
|
|
||||||
ArtifactCleanUp:
|
ArtifactCleanUp:
|
||||||
uses: pyTooling/Actions/.github/workflows/ArtifactCleanUp.yml@r1
|
uses: pyTooling/Actions/.github/workflows/ArtifactCleanUp.yml@r2
|
||||||
needs:
|
needs:
|
||||||
- UnitTestingParams
|
- UnitTestingParams
|
||||||
- PlatformTestingParams
|
- PlatformTestingParams
|
||||||
- UnitTesting
|
- UnitTesting
|
||||||
- PlatformTesting
|
|
||||||
# - Coverage
|
# - Coverage
|
||||||
- StaticTypeCheck
|
- StaticTypeCheck
|
||||||
# - BuildTheDocs
|
- PlatformTesting
|
||||||
- PublishToGitHubPages
|
- Documentation
|
||||||
- PublishCoverageResults
|
# - PDFDocumentation
|
||||||
- PublishTestResults
|
- PublishTestResults
|
||||||
|
- PublishCoverageResults
|
||||||
|
- PublishToGitHubPages
|
||||||
|
- IntermediateCleanUp
|
||||||
with:
|
with:
|
||||||
package: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
|
package: ${{ fromJson(needs.UnitTestingParams.outputs.artifact_names).package_all }}
|
||||||
remaining: |
|
remaining: |
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -13,6 +13,7 @@ coverage.xml
|
|||||||
|
|
||||||
# pytest
|
# pytest
|
||||||
/report/unit
|
/report/unit
|
||||||
|
/tests/*.github
|
||||||
|
|
||||||
# setuptools
|
# setuptools
|
||||||
/build/**/*.*
|
/build/**/*.*
|
||||||
|
|||||||
2
.idea/Actions.iml
generated
2
.idea/Actions.iml
generated
@@ -2,7 +2,7 @@
|
|||||||
<module type="PYTHON_MODULE" version="4">
|
<module type="PYTHON_MODULE" version="4">
|
||||||
<component name="NewModuleRootManager">
|
<component name="NewModuleRootManager">
|
||||||
<content url="file://$MODULE_DIR$" />
|
<content url="file://$MODULE_DIR$" />
|
||||||
<orderEntry type="inheritedJdk" />
|
<orderEntry type="jdk" jdkName="Python 3.13" jdkType="Python SDK" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
||||||
2
dist/requirements.txt
vendored
Normal file
2
dist/requirements.txt
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
wheel ~= 0.45
|
||||||
|
twine ~= 5.1
|
||||||
@@ -81,7 +81,7 @@ The following block shows a minimal YAML workflow file:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
mwe:
|
mwe:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
# Clone repository
|
# Clone repository
|
||||||
@@ -171,7 +171,7 @@ For prototyping purposes, the following job might be useful:
|
|||||||
|
|
||||||
Release:
|
Release:
|
||||||
name: '📦 Release'
|
name: '📦 Release'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
needs:
|
needs:
|
||||||
- ...
|
- ...
|
||||||
if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/master' || contains(github.ref, 'refs/tags/'>`__)
|
if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/master' || contains(github.ref, 'refs/tags/'>`__)
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ Documentation Only (Sphinx)
|
|||||||
needs:
|
needs:
|
||||||
- BuildTheDocs
|
- BuildTheDocs
|
||||||
- PublishToGitHubPages
|
- PublishToGitHubPages
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 🗑️ Delete artifacts
|
- name: 🗑️ Delete artifacts
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ Complex Example
|
|||||||
|
|
||||||
The following instantiation example creates 3 jobs from the same template, but with differing input parameters. The
|
The following instantiation example creates 3 jobs from the same template, but with differing input parameters. The
|
||||||
first job `UnitTestingParams` might be used to create a job matrix of unit tests. It creates the cross of default
|
first job `UnitTestingParams` might be used to create a job matrix of unit tests. It creates the cross of default
|
||||||
systems (Windows, Ubuntu, MacOS, MinGW64, UCRT64) and the given list of Python versions including some mypy versions. In
|
systems (Windows, Ubuntu, macOS, MinGW64, UCRT64) and the given list of Python versions including some mypy versions. In
|
||||||
addition a list of excludes (marked as :deletion:`deletions`) and includes (marked as :addition:`additions`) is handed
|
addition a list of excludes (marked as :deletion:`deletions`) and includes (marked as :addition:`additions`) is handed
|
||||||
over resulting in the following combinations:
|
over resulting in the following combinations:
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ over resulting in the following combinations:
|
|||||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||||
| Ubuntu 🐧 | ubuntu:3.8 | ubuntu:3.9 | ubuntu:3.10 | ubuntu:3.11 | :addition:`ubuntu:3.12` | | | ubuntu:pypy-3.9 | ubuntu:pypy-3.10 |
|
| Ubuntu 🐧 | ubuntu:3.8 | ubuntu:3.9 | ubuntu:3.10 | ubuntu:3.11 | :addition:`ubuntu:3.12` | | | ubuntu:pypy-3.9 | ubuntu:pypy-3.10 |
|
||||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||||
| MacOS 🍎 | macos:3.8 | macos:3.9 | macos:3.10 | macos:3.11 | :addition:`macos:3.12` | | | macos:pypy-3.9 | macos:pypy-3.10 |
|
| macOS 🍎 | macos:3.8 | macos:3.9 | macos:3.10 | macos:3.11 | :addition:`macos:3.12` | | | macos:pypy-3.9 | macos:pypy-3.10 |
|
||||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||||
| MSYS 🟪 | | | | | | | | | |
|
| MSYS 🟪 | | | | | | | | | |
|
||||||
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
+------------+-------------+-------------+--------------+--------------+-------------------------+------------+-------------+------------------------------+-------------------------------+
|
||||||
@@ -138,7 +138,7 @@ python_version_list
|
|||||||
| Parameter Name | Required | Type | Default |
|
| Parameter Name | Required | Type | Default |
|
||||||
+======================+==========+==========+============================+
|
+======================+==========+==========+============================+
|
||||||
| python_version_list | optional | string | ``3.8 3.9 3.10 3.11 3.12`` |
|
| python_version_list | optional | string | ``3.8 3.9 3.10 3.11 3.12`` |
|
||||||
+----------------------+----------+----------+-------------------------- -+
|
+----------------------+----------+----------+----------------------------+
|
||||||
|
|
||||||
Space separated list of CPython versions and/or mypy version to run tests with.
|
Space separated list of CPython versions and/or mypy version to run tests with.
|
||||||
|
|
||||||
@@ -197,7 +197,7 @@ Space separated list of systems to run tests on.
|
|||||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||||
| 🐧 | Ubuntu | Ubuntu 22.04 (LTS) (latest) | |
|
| 🐧 | Ubuntu | Ubuntu 22.04 (LTS) (latest) | |
|
||||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||||
| 🍎 | MacOS | macOS Monterey 12 (latest) | While this marked latest, macOS Ventura 13 is already provided. |
|
| 🍎 | macOS | macOS Monterey 12 (latest) | While this marked latest, macOS Ventura 13 is already provided. |
|
||||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||||
| 🟪 | MSYS | | |
|
| 🟪 | MSYS | | |
|
||||||
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
+------+-----------+------------------------------+-----------------------------------------------------------------+
|
||||||
|
|||||||
@@ -12,13 +12,36 @@ This job creates a Release Page on GitHub.
|
|||||||
**Automated Release created on: ${{ steps.getVariables.outputs.datetime }}**
|
**Automated Release created on: ${{ steps.getVariables.outputs.datetime }}**
|
||||||
|
|
||||||
# New Features
|
# New Features
|
||||||
|
|
||||||
|
* tbd
|
||||||
* tbd
|
* tbd
|
||||||
|
|
||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
|
* tbd
|
||||||
* tbd
|
* tbd
|
||||||
|
|
||||||
# Bug Fixes
|
# Bug Fixes
|
||||||
|
|
||||||
* tbd
|
* tbd
|
||||||
|
* tbd
|
||||||
|
|
||||||
|
# Documentation
|
||||||
|
|
||||||
|
* tbd
|
||||||
|
* tbd
|
||||||
|
|
||||||
|
# Unit Tests
|
||||||
|
|
||||||
|
* tbd
|
||||||
|
* tbd
|
||||||
|
|
||||||
|
----------
|
||||||
|
# Related Issues and Pull-Requests
|
||||||
|
|
||||||
|
* tbd
|
||||||
|
* tbd
|
||||||
|
|
||||||
|
|
||||||
**Behavior:**
|
**Behavior:**
|
||||||
|
|
||||||
|
|||||||
115
doc/_static/css/override.css
vendored
Normal file
115
doc/_static/css/override.css
vendored
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/* theme overrides */
|
||||||
|
.rst-content h1,
|
||||||
|
.rst-content h2 {
|
||||||
|
margin-top: 24px;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content h3,
|
||||||
|
.rst-content h4,
|
||||||
|
.rst-content h5,
|
||||||
|
.rst-content h6 {
|
||||||
|
margin-top: 12px;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content p {
|
||||||
|
margin-bottom: 6px
|
||||||
|
}
|
||||||
|
|
||||||
|
/* general overrides */
|
||||||
|
html {
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
font-size: 95%;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
|
||||||
|
footer p {
|
||||||
|
margin-bottom: 0px /* 12px */;
|
||||||
|
font-size: 95%
|
||||||
|
}
|
||||||
|
|
||||||
|
section > p,
|
||||||
|
.section p,
|
||||||
|
.simple li {
|
||||||
|
text-align: justify
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content .topic-title {
|
||||||
|
font-size: larger;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-top: 18px;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content p.rubric {
|
||||||
|
text-decoration: underline;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-top: 18px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* wyrm overrides */
|
||||||
|
.wy-menu-vertical header,
|
||||||
|
.wy-menu-vertical p.caption {
|
||||||
|
color: #9b9b9b /* #55a5d9 */;
|
||||||
|
padding: 0 0.809em /* 0 1.618em */;
|
||||||
|
margin: 6px 0 0 0 /* 12px 0 0 */;
|
||||||
|
border-top: 1px solid #9b9b9b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-side-nav-search {
|
||||||
|
margin-bottom: 0 /* .809em */;
|
||||||
|
background-color: #333333 /* #2980b9 */;
|
||||||
|
/* BTD: */
|
||||||
|
/*color: #fcfcfc*/
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-side-nav-search input[type=text] {
|
||||||
|
border-radius: 0px /* 50px */;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-side-nav-search .wy-dropdown > a, .wy-side-nav-search > a {
|
||||||
|
/* BTD: */
|
||||||
|
/*color: #fcfcfc;*/
|
||||||
|
margin-bottom: 0.404em /* .809em */;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-side-nav-search > div.version {
|
||||||
|
margin: 0 0 6px 0;
|
||||||
|
/* BTD: */
|
||||||
|
/*margin-top: -.4045em;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-nav .wy-menu-vertical a:hover {
|
||||||
|
background-color: #333333 /* #2980b9 */;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-nav-content {
|
||||||
|
max-width: 1600px /* 800px */ ;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-nav-top {
|
||||||
|
background: #333333 /* #2980b9 */;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sphinx Design */
|
||||||
|
.sd-tab-set {
|
||||||
|
margin: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
.sd-tab-set > label {
|
||||||
|
padding-top: .5em;
|
||||||
|
padding-right: 1em;
|
||||||
|
padding-bottom: .5em;
|
||||||
|
padding-left: 1em
|
||||||
|
}
|
||||||
|
|
||||||
|
.sd-container-fluid {
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
119
doc/conf.py
119
doc/conf.py
@@ -14,7 +14,7 @@ ROOT = Path(__file__).resolve().parent
|
|||||||
sys_path.insert(0, abspath("."))
|
sys_path.insert(0, abspath("."))
|
||||||
sys_path.insert(0, abspath(".."))
|
sys_path.insert(0, abspath(".."))
|
||||||
sys_path.insert(0, abspath("../pyDummy"))
|
sys_path.insert(0, abspath("../pyDummy"))
|
||||||
sys_path.insert(0, abspath("_extensions"))
|
# sys_path.insert(0, abspath("_extensions"))
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -23,9 +23,11 @@ sys_path.insert(0, abspath("_extensions"))
|
|||||||
# The version info for the project you're documenting, acts as replacement for
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
# |version| and |release|, also used in various other places throughout the
|
# |version| and |release|, also used in various other places throughout the
|
||||||
# built documents.
|
# built documents.
|
||||||
project = "Actions"
|
githubNamespace = "pyTooling"
|
||||||
|
githubProject = "Actions"
|
||||||
|
project = "pyDummy"
|
||||||
|
|
||||||
packageInformationFile = Path(f"../pyDummy/__init__.py")
|
packageInformationFile = Path(f"../{project}/__init__.py")
|
||||||
versionInformation = extractVersionInformation(packageInformationFile)
|
versionInformation = extractVersionInformation(packageInformationFile)
|
||||||
|
|
||||||
author = versionInformation.Author
|
author = versionInformation.Author
|
||||||
@@ -60,10 +62,10 @@ pygments_style = "manni"
|
|||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# Restructured Text settings
|
# Restructured Text settings
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
prologPath = "prolog.inc"
|
prologPath = Path("prolog.inc")
|
||||||
try:
|
try:
|
||||||
with open(prologPath, "r") as prologFile:
|
with prologPath.open("r", encoding="utf-8") as fileHandle:
|
||||||
rst_prolog = prologFile.read()
|
rst_prolog = fileHandle.read()
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
print(f"[ERROR:] While reading '{prologPath}'.")
|
print(f"[ERROR:] While reading '{prologPath}'.")
|
||||||
print(ex)
|
print(ex)
|
||||||
@@ -73,30 +75,15 @@ except Exception as ex:
|
|||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# Options for HTML output
|
# Options for HTML output
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
html_context = {}
|
html_theme = "sphinx_rtd_theme"
|
||||||
ctx = ROOT / "context.json"
|
html_theme_options = {
|
||||||
if ctx.is_file():
|
"logo_only": True,
|
||||||
html_context.update(loads(ctx.open('r').read()))
|
"vcs_pageview_mode": 'blob',
|
||||||
|
"navigation_depth": 5,
|
||||||
if (ROOT / "_theme").is_dir():
|
}
|
||||||
html_theme_path = ["."]
|
html_css_files = [
|
||||||
html_theme = "_theme"
|
'css/override.css',
|
||||||
html_theme_options = {
|
]
|
||||||
"logo_only": True,
|
|
||||||
"home_breadcrumbs": False,
|
|
||||||
"vcs_pageview_mode": 'blob',
|
|
||||||
# "body_max_width": None
|
|
||||||
# "navigation_depth": 5,
|
|
||||||
}
|
|
||||||
elif find_spec("sphinx_rtd_theme") is not None:
|
|
||||||
html_theme = "sphinx_rtd_theme"
|
|
||||||
html_theme_options = {
|
|
||||||
"logo_only": True,
|
|
||||||
"vcs_pageview_mode": 'blob',
|
|
||||||
# "navigation_depth": 5,
|
|
||||||
}
|
|
||||||
else:
|
|
||||||
html_theme = "alabaster"
|
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
# relative to this directory. They are copied after the builtin static files,
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
@@ -107,7 +94,7 @@ html_logo = str(Path(html_static_path[0]) / "logo.png")
|
|||||||
html_favicon = str(Path(html_static_path[0]) / "icon.png")
|
html_favicon = str(Path(html_static_path[0]) / "icon.png")
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
# Output file base name for HTML help builder.
|
||||||
htmlhelp_basename = "ActionsDoc"
|
htmlhelp_basename = f"{githubProject}Doc"
|
||||||
|
|
||||||
# If not None, a 'Last updated on:' timestamp is inserted at every page
|
# If not None, a 'Last updated on:' timestamp is inserted at every page
|
||||||
# bottom, using the given strftime format.
|
# bottom, using the given strftime format.
|
||||||
@@ -160,10 +147,10 @@ latex_elements = {
|
|||||||
# author, documentclass [howto, manual, or own class]).
|
# author, documentclass [howto, manual, or own class]).
|
||||||
latex_documents = [
|
latex_documents = [
|
||||||
( master_doc,
|
( master_doc,
|
||||||
"Actions.tex",
|
f"{githubProject}.tex",
|
||||||
"The pyTooling Actions Documentation",
|
f"The {githubProject} Documentation",
|
||||||
"Patrick Lehmann",
|
f"Patrick Lehmann",
|
||||||
"manual"
|
f"manual"
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -174,7 +161,6 @@ latex_documents = [
|
|||||||
extensions = [
|
extensions = [
|
||||||
# Standard Sphinx extensions
|
# Standard Sphinx extensions
|
||||||
"sphinx.ext.autodoc",
|
"sphinx.ext.autodoc",
|
||||||
"sphinx.ext.coverage",
|
|
||||||
"sphinx.ext.extlinks",
|
"sphinx.ext.extlinks",
|
||||||
"sphinx.ext.intersphinx",
|
"sphinx.ext.intersphinx",
|
||||||
"sphinx.ext.inheritance_diagram",
|
"sphinx.ext.inheritance_diagram",
|
||||||
@@ -186,10 +172,12 @@ extensions = [
|
|||||||
# SphinxContrib extensions
|
# SphinxContrib extensions
|
||||||
"sphinxcontrib.mermaid",
|
"sphinxcontrib.mermaid",
|
||||||
# Other extensions
|
# Other extensions
|
||||||
"sphinx_fontawesome",
|
"sphinx_design",
|
||||||
|
"sphinx_copybutton",
|
||||||
"sphinx_autodoc_typehints",
|
"sphinx_autodoc_typehints",
|
||||||
"sphinx_inline_tabs",
|
|
||||||
"autoapi.sphinx",
|
"autoapi.sphinx",
|
||||||
|
"sphinx_reports",
|
||||||
|
# User defined extensions
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@@ -221,11 +209,11 @@ autodoc_typehints = "both"
|
|||||||
# Sphinx.Ext.ExtLinks
|
# Sphinx.Ext.ExtLinks
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
extlinks = {
|
extlinks = {
|
||||||
"gh": ("https://GitHub.com/%s", "gh:%s"),
|
"gh": (f"https://GitHub.com/%s", "gh:%s"),
|
||||||
"ghissue": ("https://GitHub.com/pyTooling/Actions/issues/%s", "issue #%s"),
|
"ghissue": (f"https://GitHub.com/{githubNamespace}/{githubProject}/issues/%s", "issue #%s"),
|
||||||
"ghpull": ("https://GitHub.com/pyTooling/Actions/pull/%s", "pull request #%s"),
|
"ghpull": (f"https://GitHub.com/{githubNamespace}/{githubProject}/pull/%s", "pull request #%s"),
|
||||||
"ghsrc": ("https://GitHub.com/pyTooling/Actions/blob/main/%s", None),
|
"ghsrc": (f"https://GitHub.com/{githubNamespace}/{githubProject}/blob/main/%s", None),
|
||||||
"wiki": ("https://en.wikipedia.org/wiki/%s", None),
|
"wiki": (f"https://en.wikipedia.org/wiki/%s", None),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -265,18 +253,53 @@ todo_link_only = True
|
|||||||
|
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# Sphinx.Ext.Coverage
|
# sphinx-reports
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
coverage_show_missing_items = True
|
# report_unittest_testsuites = {
|
||||||
|
# "src": {
|
||||||
|
# "name": f"{project}",
|
||||||
|
# "xml_report": "../report/unit/unittest.xml",
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# report_codecov_packages = {
|
||||||
|
# "src": {
|
||||||
|
# "name": f"{project}",
|
||||||
|
# "json_report": "../report/coverage/coverage.json",
|
||||||
|
# "fail_below": 80,
|
||||||
|
# "levels": "default"
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# report_doccov_packages = {
|
||||||
|
# "src": {
|
||||||
|
# "name": f"{project}",
|
||||||
|
# "directory": f"../{project}",
|
||||||
|
# "fail_below": 80,
|
||||||
|
# "levels": "default"
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# Sphinx_Design
|
||||||
|
# ==============================================================================
|
||||||
|
# sd_fontawesome_latex = True
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# AutoAPI.Sphinx
|
# AutoAPI.Sphinx
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
autoapi_modules = {
|
autoapi_modules = {
|
||||||
"pyDummy": {
|
f"{project}": {
|
||||||
"template": "module",
|
"template": "package",
|
||||||
"output": "pyDummy",
|
"output": project,
|
||||||
"override": True
|
"override": True
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for directory in [mod for mod in Path(f"../{project}").iterdir() if mod.is_dir() and mod.name != "__pycache__"]:
|
||||||
|
print(f"Adding module rule for '{project}.{directory.name}'")
|
||||||
|
autoapi_modules[f"{project}.{directory.name}"] = {
|
||||||
|
"template": "module",
|
||||||
|
"output": project,
|
||||||
|
"override": True
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ Code Coverage Report
|
|||||||
|
|
||||||
Code coverage report generated with `pytest <https://github.com/pytest-dev/pytest>`__ and `Coverage.py <https://github.com/nedbat/coveragepy/tree/master>`__.
|
Code coverage report generated with `pytest <https://github.com/pytest-dev/pytest>`__ and `Coverage.py <https://github.com/nedbat/coveragepy/tree/master>`__.
|
||||||
|
|
||||||
.. report:code-coverage::
|
.. #report:code-coverage::
|
||||||
:packageid: src
|
:packageid: src
|
||||||
|
|||||||
@@ -100,6 +100,9 @@ References
|
|||||||
|
|
||||||
- `hdl/containers#48 <https://github.com/hdl/containers/issues/48>`__
|
- `hdl/containers#48 <https://github.com/hdl/containers/issues/48>`__
|
||||||
|
|
||||||
|
|
||||||
|
.. _CONTRIBUTORS:
|
||||||
|
|
||||||
Contributors
|
Contributors
|
||||||
************
|
************
|
||||||
|
|
||||||
@@ -108,6 +111,8 @@ Contributors
|
|||||||
* `and more... <https://GitHub.com/pyTooling/Actions/graphs/contributors>`__
|
* `and more... <https://GitHub.com/pyTooling/Actions/graphs/contributors>`__
|
||||||
|
|
||||||
|
|
||||||
|
.. _LICENSE:
|
||||||
|
|
||||||
License
|
License
|
||||||
*******
|
*******
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
-r ../requirements.txt
|
-r ../requirements.txt
|
||||||
|
|
||||||
pyTooling ~= 6.1
|
pyTooling ~= 8.0
|
||||||
|
|
||||||
# Enforce latest version on ReadTheDocs
|
# Enforce latest version on ReadTheDocs
|
||||||
sphinx ~= 7.3
|
sphinx ~= 8.1
|
||||||
docutils ~= 0.18.0
|
docutils ~= 0.21
|
||||||
|
docutils_stubs ~= 0.0.22
|
||||||
|
|
||||||
|
# ReadTheDocs Theme
|
||||||
|
sphinx_rtd_theme ~= 3.0
|
||||||
|
|
||||||
# Sphinx Extenstions
|
# Sphinx Extenstions
|
||||||
#sphinx.ext.coverage
|
#sphinx.ext.coverage
|
||||||
@@ -14,7 +18,10 @@ sphinxcontrib-mermaid>=0.9.2
|
|||||||
#sphinxcontrib-textstyle>=0.2.1
|
#sphinxcontrib-textstyle>=0.2.1
|
||||||
#sphinxcontrib-spelling>=2.2.0
|
#sphinxcontrib-spelling>=2.2.0
|
||||||
autoapi >= 2.0.1
|
autoapi >= 2.0.1
|
||||||
sphinx_fontawesome >= 0.0.6
|
sphinx_design ~= 0.6.1
|
||||||
sphinx-inline-tabs >= 2023.4.21
|
sphinx-copybutton >= 0.5.2
|
||||||
sphinx_autodoc_typehints ~= 2.1
|
sphinx_autodoc_typehints ~= 2.5
|
||||||
# changelog>=0.3.5
|
# changelog>=0.3.5
|
||||||
|
sphinx_reports ~= 0.7
|
||||||
|
|
||||||
|
# BuildTheDocs Extensions (mostly patched Sphinx extensions)
|
||||||
|
|||||||
@@ -7,11 +7,11 @@
|
|||||||
.. |SHIELD:svg:pyTooling-github| image:: https://img.shields.io/badge/pyTooling-Actions-63bf7f.svg?longCache=true&style=flat-square&longCache=true&logo=GitHub
|
.. |SHIELD:svg:pyTooling-github| image:: https://img.shields.io/badge/pyTooling-Actions-63bf7f.svg?longCache=true&style=flat-square&longCache=true&logo=GitHub
|
||||||
:alt: Sourcecode on GitHub
|
:alt: Sourcecode on GitHub
|
||||||
:height: 22
|
:height: 22
|
||||||
:target: https://GitHub.com/pyTooling/pyTooling
|
:target: https://GitHub.com/pyTooling/Actions
|
||||||
.. |SHIELD:png:pyTooling-github| image:: https://raster.shields.io/badge/pyTooling-Actions-63bf7f.svg?longCache=true&style=flat-square&longCache=true&logo=GitHub
|
.. |SHIELD:png:pyTooling-github| image:: https://raster.shields.io/badge/pyTooling-Actions-63bf7f.svg?longCache=true&style=flat-square&longCache=true&logo=GitHub
|
||||||
:alt: Sourcecode on GitHub
|
:alt: Sourcecode on GitHub
|
||||||
:height: 22
|
:height: 22
|
||||||
:target: https://GitHub.com/pyTooling/pyTooling
|
:target: https://GitHub.com/pyTooling/Actions
|
||||||
|
|
||||||
.. # Sourcecode license
|
.. # Sourcecode license
|
||||||
.. |SHIELD:svg:pyTooling-src-license| image:: https://img.shields.io/pypi/l/pyTooling?longCache=true&style=flat-square&logo=Apache&label=code
|
.. |SHIELD:svg:pyTooling-src-license| image:: https://img.shields.io/pypi/l/pyTooling?longCache=true&style=flat-square&logo=Apache&label=code
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ Unittest Summary Report
|
|||||||
|
|
||||||
Unittest report generated with `pytest <https://github.com/pytest-dev/pytest>`__.
|
Unittest report generated with `pytest <https://github.com/pytest-dev/pytest>`__.
|
||||||
|
|
||||||
.. report:unittest-summary::
|
.. #report:unittest-summary::
|
||||||
:reportid: src
|
:reportid: src
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
[build-system]
|
[build-system]
|
||||||
requires = [
|
requires = [
|
||||||
"setuptools ~= 69.5",
|
"setuptools ~= 75.3",
|
||||||
"wheel ~= 0.40.0",
|
"wheel ~= 0.45",
|
||||||
"pyTooling ~= 6.1"
|
"pyTooling ~= 8.0"
|
||||||
]
|
]
|
||||||
build-backend = "setuptools.build_meta"
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
@@ -21,6 +21,7 @@ namespace_packages = true
|
|||||||
html_report = "report/typing"
|
html_report = "report/typing"
|
||||||
|
|
||||||
[tool.pytest.ini_options]
|
[tool.pytest.ini_options]
|
||||||
|
addopts = "--tb=native"
|
||||||
# Don't set 'python_classes = *' otherwise, pytest doesn't search for classes
|
# Don't set 'python_classes = *' otherwise, pytest doesn't search for classes
|
||||||
# derived from unittest.Testcase
|
# derived from unittest.Testcase
|
||||||
python_files = "*"
|
python_files = "*"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM python:3.9-slim-bullseye
|
FROM python:3.12-slim-bookworm
|
||||||
COPY releaser.py /releaser.py
|
COPY releaser.py /releaser.py
|
||||||
RUN pip install PyGithub --progress-bar off \
|
RUN pip install PyGithub --progress-bar off \
|
||||||
&& apt update -qq \
|
&& apt update -qq \
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
mwe:
|
mwe:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
# Clone repository
|
# Clone repository
|
||||||
@@ -156,7 +156,7 @@ For prototyping purposes, the following job might be useful:
|
|||||||
```yml
|
```yml
|
||||||
Release:
|
Release:
|
||||||
name: '📦 Release'
|
name: '📦 Release'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
needs:
|
needs:
|
||||||
- ...
|
- ...
|
||||||
if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/master' || contains(github.ref, 'refs/tags/'))
|
if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/master' || contains(github.ref, 'refs/tags/'))
|
||||||
|
|||||||
@@ -45,7 +45,9 @@ runs:
|
|||||||
steps:
|
steps:
|
||||||
|
|
||||||
- shell: bash
|
- shell: bash
|
||||||
run: pip install --disable-pip-version-check PyGithub --progress-bar off
|
run: |
|
||||||
|
[ "$(source /etc/os-release && echo $VERSION_ID)" == "24.04" ] && UBUNTU_2404_ARGS='--break-system-packages' || unset UBUNTU_2404_ARGS
|
||||||
|
pip install --disable-pip-version-check --progress-bar off $UBUNTU_2404_ARGS PyGithub
|
||||||
|
|
||||||
- shell: bash
|
- shell: bash
|
||||||
run: '''${{ github.action_path }}/../releaser.py'''
|
run: '''${{ github.action_path }}/../releaser.py'''
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
pyTooling ~= 6.1
|
pyTooling ~= 8.0
|
||||||
|
|||||||
316
run.ps1
Normal file
316
run.ps1
Normal file
@@ -0,0 +1,316 @@
|
|||||||
|
[CmdletBinding()]
|
||||||
|
Param(
|
||||||
|
# Clean up all files and directories
|
||||||
|
[switch]$clean,
|
||||||
|
|
||||||
|
# Commands
|
||||||
|
[switch]$all,
|
||||||
|
[switch]$copyall,
|
||||||
|
|
||||||
|
[switch]$doc,
|
||||||
|
[switch]$livedoc,
|
||||||
|
[switch]$doccov,
|
||||||
|
|
||||||
|
[switch]$unit,
|
||||||
|
[switch]$liveunit,
|
||||||
|
[switch]$copyunit,
|
||||||
|
|
||||||
|
[switch]$cov,
|
||||||
|
[switch]$livecov,
|
||||||
|
[switch]$copycov,
|
||||||
|
|
||||||
|
[switch]$type,
|
||||||
|
[switch]$livetype,
|
||||||
|
[switch]$copytype,
|
||||||
|
|
||||||
|
[switch]$nooutput,
|
||||||
|
|
||||||
|
[switch]$build,
|
||||||
|
[switch]$install,
|
||||||
|
|
||||||
|
# Display this help"
|
||||||
|
[switch]$help
|
||||||
|
)
|
||||||
|
|
||||||
|
$PackageName = "Actions"
|
||||||
|
|
||||||
|
# set default values
|
||||||
|
$EnableDebug = [bool]$PSCmdlet.MyInvocation.BoundParameters["Debug"]
|
||||||
|
$EnableVerbose = [bool]$PSCmdlet.MyInvocation.BoundParameters["Verbose"] -or $EnableDebug
|
||||||
|
|
||||||
|
# Display help if no command was selected
|
||||||
|
$help = $help -or ( -not(
|
||||||
|
$all -or $copyall -or
|
||||||
|
$clean -or
|
||||||
|
$doc -or $livedoc -or $doccov -or
|
||||||
|
$unit -or $liveunit -or $copyunit -or
|
||||||
|
$cov -or $livecov -or $copycov -or
|
||||||
|
$type -or $livetype -or $copytype -or
|
||||||
|
$build -or $install
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
Write-Host "================================================================================" -ForegroundColor Magenta
|
||||||
|
Write-Host "$PackageName Documentation Compilation and Assembly Tool" -ForegroundColor Magenta
|
||||||
|
Write-Host "================================================================================" -ForegroundColor Magenta
|
||||||
|
|
||||||
|
if ($help)
|
||||||
|
{ Get-Help $MYINVOCATION.MyCommand.Path -Detailed
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($all)
|
||||||
|
{ $doc = $true
|
||||||
|
$unit = $true
|
||||||
|
# $copyunit = $true
|
||||||
|
$cov = $true
|
||||||
|
# $copycov = $true
|
||||||
|
$type = $true
|
||||||
|
$copytype = $true
|
||||||
|
}
|
||||||
|
if ($copyall)
|
||||||
|
{# $copyunit = $true
|
||||||
|
# $copycov = $true
|
||||||
|
$copytype = $true
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($clean)
|
||||||
|
{ Write-Host -ForegroundColor DarkYellow "[live][DOC] Cleaning documentation directories ..."
|
||||||
|
rm -Force .\doc\$PackageName\*
|
||||||
|
.\doc\make.bat clean
|
||||||
|
Write-Host -ForegroundColor DarkYellow "[live][BUILD] Cleaning build directories ..."
|
||||||
|
rm -Force .\build\bdist.win-amd64
|
||||||
|
rm -Force .\build\lib
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($build)
|
||||||
|
{ Write-Host -ForegroundColor Yellow "[live][BUILD] Cleaning build directories ..."
|
||||||
|
rm -Force .\build\bdist.win-amd64
|
||||||
|
rm -Force .\build\lib
|
||||||
|
Write-Host -ForegroundColor Yellow "[live][BUILD] Building $PackageName package as wheel ..."
|
||||||
|
py -3.12 -m build --wheel
|
||||||
|
|
||||||
|
Write-Host -ForegroundColor Yellow "[live][BUILD] Building wheel finished"
|
||||||
|
}
|
||||||
|
if ($install)
|
||||||
|
{ if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
|
||||||
|
{ Write-Host -ForegroundColor Yellow "[live][INSTALL] Installing $PackageName with administrator rights ..."
|
||||||
|
$proc = Start-Process pwsh.exe "-NoProfile -ExecutionPolicy Bypass -WorkingDirectory `"$PSScriptRoot`" -File `"$PSCommandPath`" `"-install`"" -Verb RunAs -Wait
|
||||||
|
|
||||||
|
# Write-Host -ForegroundColor Yellow "[live][INSTALL] Wait on administrator console ..."
|
||||||
|
# Wait-Process -Id $proc.Id
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ Write-Host -ForegroundColor Cyan "[ADMIN][UNINSTALL] Uninstalling $PackageName ..."
|
||||||
|
py -3.12 -m pip uninstall -y $PackageName
|
||||||
|
Write-Host -ForegroundColor Cyan "[ADMIN][INSTALL] Installing $PackageName from wheel ..."
|
||||||
|
py -3.12 -m pip install .\dist\$PackageName-6.7.0-py3-none-any.whl
|
||||||
|
|
||||||
|
Write-Host -ForegroundColor Cyan "[ADMIN][INSTALL] Closing window in 5 seconds ..."
|
||||||
|
Start-Sleep -Seconds 5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$jobs = @()
|
||||||
|
|
||||||
|
if ($livedoc)
|
||||||
|
{ Write-Host -ForegroundColor DarkYellow "[live][DOC] Building documentation using Sphinx ..."
|
||||||
|
|
||||||
|
.\doc\make.bat html --verbose
|
||||||
|
|
||||||
|
Write-Host -ForegroundColor DarkYellow "[live][DOC] Documentation finished"
|
||||||
|
}
|
||||||
|
elseif ($doc)
|
||||||
|
{ Write-Host -ForegroundColor DarkYellow "[Job1][DOC] Building documentation using Sphinx ..."
|
||||||
|
Write-Host -ForegroundColor DarkGreen "[SCRIPT] Starting Documentation job ..."
|
||||||
|
|
||||||
|
# Compile documentation
|
||||||
|
$compileDocFunc = {
|
||||||
|
.\doc\make.bat html --verbose
|
||||||
|
}
|
||||||
|
$docJob = Start-Job -Name "Documentation" -ScriptBlock $compileDocFunc
|
||||||
|
# $jobs += $docJob
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($doccov)
|
||||||
|
{
|
||||||
|
.\doc\make.bat coverage
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($liveunit)
|
||||||
|
{ Write-Host -ForegroundColor DarkYellow "[live][UNIT] Running Unit Tests using pytest ..."
|
||||||
|
|
||||||
|
$env:ENVIRONMENT_NAME = "Windows (x86-64)"
|
||||||
|
pytest -raP --color=yes --junitxml=report/unit/unittest.xml --template=html1/index.html --report=report/unit/html/index.html --split-report tests/unit
|
||||||
|
|
||||||
|
if ($copyunit)
|
||||||
|
{ cp -Recurse -Force .\report\unit\html\* .\doc\_build\html\unittests
|
||||||
|
Write-Host -ForegroundColor DarkBlue "[live][UNIT] Copyed unit testing report to 'unittests' directory in HTML directory"
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host -ForegroundColor DarkYellow "[live][UNIT] Unit Tests finished"
|
||||||
|
}
|
||||||
|
elseif ($unit)
|
||||||
|
{ Write-Host -ForegroundColor DarkYellow "[Job2][UNIT] Running Unit Tests using pytest ..."
|
||||||
|
Write-Host -ForegroundColor DarkGreen "[SCRIPT] Starting UnitTests jobs ..."
|
||||||
|
|
||||||
|
# Run unit tests
|
||||||
|
$runUnitFunc = {
|
||||||
|
$env:ENVIRONMENT_NAME = "Windows (x86-64)"
|
||||||
|
pytest -raP --color=yes --junitxml=report/unit/unittest.xml --template=html1/index.html --report=report/unit/html/index.html --split-report tests/unit
|
||||||
|
}
|
||||||
|
$unitJob = Start-Job -Name "UnitTests" -ScriptBlock $runUnitFunc
|
||||||
|
$jobs += $unitJob
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($livecov)
|
||||||
|
{ Write-Host -ForegroundColor DarkMagenta "[live][COV] Running Unit Tests with coverage ..."
|
||||||
|
|
||||||
|
$env:ENVIRONMENT_NAME = "Windows (x86-64)"
|
||||||
|
coverage run --data-file=.coverage --rcfile=pyproject.toml -m pytest -ra --tb=line --color=yes tests/unit
|
||||||
|
|
||||||
|
Write-Host -ForegroundColor DarkMagenta "[live][COV] Convert coverage report to HTML ..."
|
||||||
|
coverage html
|
||||||
|
|
||||||
|
Write-Host -ForegroundColor DarkMagenta "[live][COV] Convert coverage report to XML (Cobertura) ..."
|
||||||
|
coverage xml
|
||||||
|
|
||||||
|
Write-Host -ForegroundColor DarkMagenta "[live][COV] Convert coverage report to JSON ..."
|
||||||
|
coverage json
|
||||||
|
|
||||||
|
Write-Host -ForegroundColor DarkMagenta "[live][COV] Write coverage report to console ..."
|
||||||
|
coverage report
|
||||||
|
|
||||||
|
if ($copycov)
|
||||||
|
{ cp -Recurse -Force .\report\coverage\html\* .\doc\_build\html\coverage
|
||||||
|
Write-Host -ForegroundColor DarkMagenta "[live][COV] Copyed code coverage report to 'coverage' directory in HTML directory"
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host -ForegroundColor DarkMagenta "[live][COV] Coverage finished"
|
||||||
|
}
|
||||||
|
elseif ($cov)
|
||||||
|
{ Write-Host -ForegroundColor DarkMagenta "[live][COV] Running Unit Tests with coverage ..."
|
||||||
|
Write-Host -ForegroundColor DarkMagenta "[SCRIPT] Starting Coverage jobs ..."
|
||||||
|
|
||||||
|
# Collect coverage
|
||||||
|
$collectCovFunc = {
|
||||||
|
$env:ENVIRONMENT_NAME = "Windows (x86-64)"
|
||||||
|
coverage run --data-file=.coverage --rcfile=pyproject.toml -m pytest -ra --tb=line --color=yes tests/unit
|
||||||
|
|
||||||
|
Write-Host -ForegroundColor DarkMagenta "[Job3][COV] Convert coverage report to HTML ..."
|
||||||
|
coverage html
|
||||||
|
|
||||||
|
Write-Host -ForegroundColor DarkMagenta "[Job3][COV] Convert coverage report to XML (Cobertura) ..."
|
||||||
|
coverage xml
|
||||||
|
|
||||||
|
Write-Host -ForegroundColor DarkMagenta "[Job3][COV] Convert coverage report to JSON ..."
|
||||||
|
coverage json
|
||||||
|
}
|
||||||
|
$covJob = Start-Job -Name "Coverage" -ScriptBlock $collectCovFunc
|
||||||
|
$jobs += $covJob
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($livetype)
|
||||||
|
{ Write-Host -ForegroundColor DarkCyan "[live][TYPE] Running static type analysis using mypy ..."
|
||||||
|
|
||||||
|
$env:MYPY_FORCE_COLOR = 1
|
||||||
|
mypy.exe -p $PackageName
|
||||||
|
|
||||||
|
if ($copytype)
|
||||||
|
{ cp -Recurse -Force .\report\typing\* .\doc\_build\html\typing
|
||||||
|
Write-Host -ForegroundColor DarkCyan "[live][TYPE] Copyed typing report to 'typing' directory in HTML directory."
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host -ForegroundColor DarkCyan "[live][TYPE] Static type analysis finished"
|
||||||
|
}
|
||||||
|
elseif ($type)
|
||||||
|
{ Write-Host -ForegroundColor DarkCyan "[live][TYPE] Running static type analysis using mypy ..."
|
||||||
|
Write-Host -ForegroundColor DarkCyan "[SCRIPT] Starting Typing jobs ..."
|
||||||
|
|
||||||
|
# Analyze types
|
||||||
|
$analyzeTypesFunc = {
|
||||||
|
$env:MYPY_FORCE_COLOR = 1
|
||||||
|
mypy.exe -p $PackageName
|
||||||
|
}
|
||||||
|
$typeJob = Start-Job -Name "Typing" -ScriptBlock $analyzeTypesFunc
|
||||||
|
$jobs += $typeJob
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($doc)
|
||||||
|
{ Write-Host -ForegroundColor DarkGreen "[SCRIPT] Waiting on Documentation job ..."
|
||||||
|
Wait-Job -Job $docJob
|
||||||
|
Write-Host -ForegroundColor DarkYellow "[Job1][DOC] Documentation finished"
|
||||||
|
}
|
||||||
|
if ($jobs.Count -ne 0)
|
||||||
|
{
|
||||||
|
Write-Host -ForegroundColor DarkGreen ( "[SCRIPT] Waiting on {0} jobs ({1}) ..." -f $jobs.Count, (($jobs | %{ $_.Name }) -join ", "))
|
||||||
|
Wait-Job -Job $jobs
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (-not $liveunit -and $copyunit)
|
||||||
|
{
|
||||||
|
# if ($unit)
|
||||||
|
# { Wait-Job -Job $unitJob
|
||||||
|
# Write-Host -ForegroundColor DarkBlue "[Job2][UNIT] Unit tests finished"
|
||||||
|
# }
|
||||||
|
cp -Recurse -Force .\report\unit\html\* .\doc\_build\html\unittests
|
||||||
|
Write-Host -ForegroundColor DarkBlue "[post][UNIT] Copyed unit testing report to 'unittests' directory in HTML directory"
|
||||||
|
}
|
||||||
|
if (-not ($livecov -or $cov) -and $copycov)
|
||||||
|
{
|
||||||
|
# if ($cov)
|
||||||
|
# { Wait-Job -Job $unitJob
|
||||||
|
# Write-Host -ForegroundColor DarkMagenta "[Job3][UNIT] Coverage collection finished"
|
||||||
|
# }
|
||||||
|
cp -Recurse -Force .\report\coverage\html\* .\doc\_build\html\coverage
|
||||||
|
Write-Host -ForegroundColor DarkMagenta "[post][COV] Copyed code coverage report to 'coverage' directory in HTML directory"
|
||||||
|
}
|
||||||
|
if (-not $livetype -and $copytype)
|
||||||
|
{
|
||||||
|
# if ($type)
|
||||||
|
# { Wait-Job -Job $typeJob
|
||||||
|
# Write-Host -ForegroundColor DarkCyan "[Job4][UNIT] Static type analysis finished"
|
||||||
|
# }
|
||||||
|
cp -Recurse -Force .\report\typing\* .\doc\_build\html\typing
|
||||||
|
Write-Host -ForegroundColor DarkCyan "[post][TYPE] Copyed typing report to 'typing' directory in HTML directory."
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($type)
|
||||||
|
{ Write-Host -ForegroundColor DarkCyan "================================================================================"
|
||||||
|
if (-not $nooutput)
|
||||||
|
{ Receive-Job -Job $typeJob
|
||||||
|
}
|
||||||
|
Remove-Job -Job $typeJob
|
||||||
|
}
|
||||||
|
if ($doc)
|
||||||
|
{ Write-Host -ForegroundColor DarkYellow "================================================================================"
|
||||||
|
if (-not $nooutput)
|
||||||
|
{ Receive-Job -Job $docJob
|
||||||
|
}
|
||||||
|
Remove-Job -Job $docJob
|
||||||
|
}
|
||||||
|
if ($unit)
|
||||||
|
{ Write-Host -ForegroundColor DarkBlue "================================================================================"
|
||||||
|
if (-not $nooutput)
|
||||||
|
{ Receive-Job -Job $unitJob
|
||||||
|
}
|
||||||
|
Remove-Job -Job $unitJob
|
||||||
|
}
|
||||||
|
if ($cov)
|
||||||
|
{ Write-Host -ForegroundColor DarkMagenta "================================================================================"
|
||||||
|
if (-not $nooutput)
|
||||||
|
{ Receive-Job -Job $covJob
|
||||||
|
}
|
||||||
|
Remove-Job -Job $covJob
|
||||||
|
|
||||||
|
if ($copycov)
|
||||||
|
{ cp -Recurse -Force .\report\coverage\html\* .\doc\_build\html\coverage
|
||||||
|
Write-Host -ForegroundColor DarkMagenta "[post][COV] Copyed code coverage report to 'coverage' directory in HTML directory"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Write-Host -ForegroundColor DarkGreen "================================================================================"
|
||||||
|
Write-Host -ForegroundColor DarkGreen "[SCRIPT] Finished"
|
||||||
91
tests/pacman_packages.py
Normal file
91
tests/pacman_packages.py
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
from os import getenv
|
||||||
|
from pathlib import Path
|
||||||
|
from re import compile
|
||||||
|
from sys import version
|
||||||
|
|
||||||
|
print(f"Python: {version}")
|
||||||
|
|
||||||
|
|
||||||
|
def loadRequirementsFile(requirementsFile: Path):
|
||||||
|
requirements = []
|
||||||
|
with requirementsFile.open("r") as file:
|
||||||
|
for line in file.readlines():
|
||||||
|
line = line.strip()
|
||||||
|
if line.startswith("#") or line.startswith("https") or line == "":
|
||||||
|
continue
|
||||||
|
elif line.startswith("-r"):
|
||||||
|
# Remove the first word/argument (-r)
|
||||||
|
requirements += loadRequirementsFile(requirementsFile.parent / line[2:].lstrip())
|
||||||
|
else:
|
||||||
|
requirements.append(line)
|
||||||
|
|
||||||
|
return requirements
|
||||||
|
|
||||||
|
|
||||||
|
requirements = "-r ../tests/requirements.txt"
|
||||||
|
if requirements.startswith("-r"):
|
||||||
|
requirementsFile = Path(requirements[2:].lstrip())
|
||||||
|
try:
|
||||||
|
dependencies = loadRequirementsFile(requirementsFile)
|
||||||
|
except FileNotFoundError as ex:
|
||||||
|
print(f"::error title=FileNotFound::{ex}")
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
dependencies = [req.strip() for req in requirements.split(" ")]
|
||||||
|
|
||||||
|
packages = {
|
||||||
|
"coverage": "python-coverage:p",
|
||||||
|
"igraph": "igraph:p",
|
||||||
|
"jinja2": "python-markupsafe:p",
|
||||||
|
"lxml": "python-lxml:p",
|
||||||
|
"numpy": "python-numpy:p",
|
||||||
|
"markupsafe": "python-markupsafe:p",
|
||||||
|
"pip": "python-pip:p",
|
||||||
|
"ruamel.yaml": "python-ruamel-yaml:p python-ruamel.yaml.clib:p",
|
||||||
|
"sphinx": "python-markupsafe:p",
|
||||||
|
"tomli": "python-tomli:p",
|
||||||
|
"wheel": "python-wheel:p",
|
||||||
|
"pyEDAA.ProjectModel": "python-ruamel-yaml:p python-ruamel.yaml.clib:p python-lxml:p",
|
||||||
|
"pyEDAA.Reports": "python-ruamel-yaml:p python-ruamel.yaml.clib:p python-lxml:p",
|
||||||
|
}
|
||||||
|
subPackages = {
|
||||||
|
"pytooling": {
|
||||||
|
"yaml": "python-ruamel-yaml:p python-ruamel.yaml.clib:p",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
regExp = compile(
|
||||||
|
r"(?P<PackageName>[\w_\-\.]+)(?:\[(?P<SubPackages>(?:\w+)(?:\s*,\s*\w+)*)\])?(?:\s*(?P<Comperator>[<>~=]+)\s*)(?P<Version>\d+(?:\.\d+)*)(?:-(?P<VersionExtension>\w+))?")
|
||||||
|
|
||||||
|
pacboyPackages = set(("python-pip:p", "python-wheel:p", "python-tomli:p"))
|
||||||
|
print(f"Processing dependencies ({len(dependencies)}):")
|
||||||
|
for dependency in dependencies:
|
||||||
|
print(f" {dependency}")
|
||||||
|
|
||||||
|
match = regExp.match(dependency.lower())
|
||||||
|
if not match:
|
||||||
|
print(f" Wrong format: {dependency}")
|
||||||
|
print(f"::error title=Identifying Pacboy Packages::Unrecognized dependency format '{dependency}'")
|
||||||
|
continue
|
||||||
|
|
||||||
|
package = match["PackageName"]
|
||||||
|
if package in packages:
|
||||||
|
rewrite = packages[package]
|
||||||
|
print(f" Found rewrite rule for '{package}': {rewrite}")
|
||||||
|
pacboyPackages.add(rewrite)
|
||||||
|
|
||||||
|
if match["SubPackages"] and package in subPackages:
|
||||||
|
for subPackage in match["SubPackages"].split(","):
|
||||||
|
if subPackage in subPackages[package]:
|
||||||
|
rewrite = subPackages[package][subPackage]
|
||||||
|
print(f" Found rewrite rule for '{package}[..., {subPackage}, ...]': {rewrite}")
|
||||||
|
pacboyPackages.add(rewrite)
|
||||||
|
|
||||||
|
# Write jobs to special file
|
||||||
|
github_output = Path(getenv("GITHUB_OUTPUT"))
|
||||||
|
print(f"GITHUB_OUTPUT: {github_output}")
|
||||||
|
with github_output.open("a+") as f:
|
||||||
|
f.write(f"pacboy_packages={' '.join(pacboyPackages)}\n")
|
||||||
|
|
||||||
|
print(f"GITHUB_OUTPUT:")
|
||||||
|
print(f"pacboy_packages={' '.join(pacboyPackages)}\n")
|
||||||
@@ -28,12 +28,12 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0 #
|
# SPDX-License-Identifier: Apache-2.0 #
|
||||||
# ==================================================================================================================== #
|
# ==================================================================================================================== #
|
||||||
#
|
#
|
||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
|
|
||||||
from pytest import mark
|
from pytest import mark
|
||||||
from pyTooling.Common import CurrentPlatform
|
from pyTooling.Platform import CurrentPlatform
|
||||||
|
|
||||||
from pyDummy import Application
|
from pyDummy import Application
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__": # pragma: no cover
|
if __name__ == "__main__": # pragma: no cover
|
||||||
|
|||||||
216
tests/python_jobs.py
Normal file
216
tests/python_jobs.py
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
from json import dumps as json_dumps
|
||||||
|
from os import getenv
|
||||||
|
from pathlib import Path
|
||||||
|
from textwrap import dedent
|
||||||
|
from typing import Iterable
|
||||||
|
|
||||||
|
name = "example".strip()
|
||||||
|
python_version = "3.12".strip()
|
||||||
|
systems = "ubuntu windows macos-arm mingw64 ucrt64".strip()
|
||||||
|
versions = "3.8 3.9 3.10 3.11 3.12".strip()
|
||||||
|
include_list = "".strip()
|
||||||
|
exclude_list = "".strip()
|
||||||
|
disable_list = "".strip()
|
||||||
|
|
||||||
|
currentMSYS2Version = "3.11"
|
||||||
|
currentAlphaVersion = "3.13"
|
||||||
|
currentAlphaRelease = "3.13.0-alpha.1"
|
||||||
|
|
||||||
|
if systems == "":
|
||||||
|
print("::error title=Parameter::system_list is empty.")
|
||||||
|
else:
|
||||||
|
systems = [sys.strip() for sys in systems.split(" ")]
|
||||||
|
|
||||||
|
if versions == "":
|
||||||
|
versions = [python_version]
|
||||||
|
else:
|
||||||
|
versions = [ver.strip() for ver in versions.split(" ")]
|
||||||
|
|
||||||
|
if include_list == "":
|
||||||
|
includes = []
|
||||||
|
else:
|
||||||
|
includes = [tuple(include.strip().split(":")) for include in include_list.split(" ")]
|
||||||
|
|
||||||
|
if exclude_list == "":
|
||||||
|
excludes = []
|
||||||
|
else:
|
||||||
|
excludes = [exclude.strip() for exclude in exclude_list.split(" ")]
|
||||||
|
|
||||||
|
if disable_list == "":
|
||||||
|
disabled = []
|
||||||
|
else:
|
||||||
|
disabled = [disable.strip() for disable in disable_list.split(" ")]
|
||||||
|
|
||||||
|
if "3.7" in versions:
|
||||||
|
print("::warning title=Deprecated::Support for Python 3.7 ended in 2023.06.27.")
|
||||||
|
if "msys2" in systems:
|
||||||
|
print("::warning title=Deprecated::System 'msys2' will be replaced by 'mingw64'.")
|
||||||
|
if currentAlphaVersion in versions:
|
||||||
|
print(f"::notice title=Experimental::Python {currentAlphaVersion} ({currentAlphaRelease}) is a pre-release.")
|
||||||
|
for disable in disabled:
|
||||||
|
print(f"::warning title=Disabled Python Job::System '{disable}' temporarily disabled.")
|
||||||
|
|
||||||
|
# see https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json
|
||||||
|
data = {
|
||||||
|
# Python and PyPy versions supported by "setup-python" action
|
||||||
|
"python": {
|
||||||
|
"3.7": {"icon": "⚫", "until": "2023.06.27"},
|
||||||
|
"3.8": {"icon": "🔴", "until": "2024.10"},
|
||||||
|
"3.9": {"icon": "🟠", "until": "2025.10"},
|
||||||
|
"3.10": {"icon": "🟡", "until": "2026.10"},
|
||||||
|
"3.11": {"icon": "🟢", "until": "2027.10"},
|
||||||
|
"3.12": {"icon": "🟢", "until": "2028.10"},
|
||||||
|
# "3.13": { "icon": "🟣", "until": "2028.10" },
|
||||||
|
"pypy-3.7": {"icon": "⟲⚫", "until": "????.??"},
|
||||||
|
"pypy-3.8": {"icon": "⟲🔴", "until": "????.??"},
|
||||||
|
"pypy-3.9": {"icon": "⟲🟠", "until": "????.??"},
|
||||||
|
"pypy-3.10": {"icon": "⟲🟡", "until": "????.??"},
|
||||||
|
},
|
||||||
|
# Runner systems (runner images) supported by GitHub Actions
|
||||||
|
"sys": {
|
||||||
|
"ubuntu": {"icon": "🐧", "runs-on": "ubuntu-24.04", "shell": "bash", "name": "Linux (x86-64)"},
|
||||||
|
"windows": {"icon": "🪟", "runs-on": "windows-latest", "shell": "pwsh", "name": "Windows (x86-64)"},
|
||||||
|
"macos": {"icon": "🍎", "runs-on": "macos-latest-large", "shell": "bash", "name": "macOS (x86-64)"},
|
||||||
|
"macos-arm": {"icon": "🍏", "runs-on": "macos-latest", "shell": "bash", "name": "macOS (aarch64)"},
|
||||||
|
},
|
||||||
|
# Runtimes provided by MSYS2
|
||||||
|
"runtime": {
|
||||||
|
"msys": {"icon": "🪟🟪", "name": "Windows+MSYS2 (x86-64) - MSYS"},
|
||||||
|
"mingw32": {"icon": "🪟⬛", "name": "Windows+MSYS2 (x86-64) - MinGW32"},
|
||||||
|
"mingw64": {"icon": "🪟🟦", "name": "Windows+MSYS2 (x86-64) - MinGW64"},
|
||||||
|
"clang32": {"icon": "🪟🟫", "name": "Windows+MSYS2 (x86-64) - Clang32"},
|
||||||
|
"clang64": {"icon": "🪟🟧", "name": "Windows+MSYS2 (x86-64) - Clang64"},
|
||||||
|
"ucrt64": {"icon": "🪟🟨", "name": "Windows+MSYS2 (x86-64) - UCRT64"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print(f"includes ({len(includes)}):")
|
||||||
|
for system, version in includes:
|
||||||
|
print(f"- {system}:{version}")
|
||||||
|
print(f"excludes ({len(excludes)}):")
|
||||||
|
for exclude in excludes:
|
||||||
|
print(f"- {exclude}")
|
||||||
|
print(f"disabled ({len(disabled)}):")
|
||||||
|
for disable in disabled:
|
||||||
|
print(f"- {disable}")
|
||||||
|
|
||||||
|
|
||||||
|
def match(combination: str, pattern: str) -> bool:
|
||||||
|
system, version = combination.split(":")
|
||||||
|
sys, ver = pattern.split(":")
|
||||||
|
|
||||||
|
if sys == "*":
|
||||||
|
return (ver == "*") or (version == ver)
|
||||||
|
elif system == sys:
|
||||||
|
return (ver == "*") or (version == ver)
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def notIn(combination: str, patterns: Iterable[str]) -> bool:
|
||||||
|
for pattern in patterns:
|
||||||
|
if match(combination, pattern):
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
combinations = [
|
||||||
|
(system, version)
|
||||||
|
for system in systems
|
||||||
|
if system in data["sys"]
|
||||||
|
for version in versions
|
||||||
|
if version in data["python"]
|
||||||
|
and notIn(f"{system}:{version}", excludes)
|
||||||
|
and notIn(f"{system}:{version}", disabled)
|
||||||
|
] + [
|
||||||
|
(system, currentMSYS2Version)
|
||||||
|
for system in systems
|
||||||
|
if system in data["runtime"]
|
||||||
|
and notIn(f"{system}:{currentMSYS2Version}", excludes)
|
||||||
|
and notIn(f"{system}:{currentMSYS2Version}", disabled)
|
||||||
|
] + [
|
||||||
|
(system, version)
|
||||||
|
for system, version in includes
|
||||||
|
if system in data["sys"]
|
||||||
|
and version in data["python"]
|
||||||
|
and notIn(f"{system}:{version}", disabled)
|
||||||
|
]
|
||||||
|
print(f"Combinations ({len(combinations)}):")
|
||||||
|
for system, version in combinations:
|
||||||
|
print(f"- {system}:{version}")
|
||||||
|
|
||||||
|
jobs = [
|
||||||
|
{
|
||||||
|
"sysicon": data["sys"][system]["icon"],
|
||||||
|
"system": system,
|
||||||
|
"runs-on": data["sys"][system]["runs-on"],
|
||||||
|
"runtime": "native",
|
||||||
|
"shell": data["sys"][system]["shell"],
|
||||||
|
"pyicon": data["python"][version]["icon"],
|
||||||
|
"python": currentAlphaRelease if version == currentAlphaVersion else version,
|
||||||
|
"envname": data["sys"][system]["name"],
|
||||||
|
}
|
||||||
|
for system, version in combinations if system in data["sys"]
|
||||||
|
] + [
|
||||||
|
{
|
||||||
|
"sysicon": data["runtime"][runtime]["icon"],
|
||||||
|
"system": "msys2",
|
||||||
|
"runs-on": "windows-latest",
|
||||||
|
"runtime": runtime.upper(),
|
||||||
|
"shell": "msys2 {0}",
|
||||||
|
"pyicon": data["python"][currentMSYS2Version]["icon"],
|
||||||
|
"python": version,
|
||||||
|
"envname": data["runtime"][runtime]["name"],
|
||||||
|
}
|
||||||
|
for runtime, version in combinations if runtime not in data["sys"]
|
||||||
|
]
|
||||||
|
|
||||||
|
artifact_names = {
|
||||||
|
"unittesting_xml": f"{name}-UnitTestReportSummary-XML",
|
||||||
|
"unittesting_html": f"{name}-UnitTestReportSummary-HTML",
|
||||||
|
"perftesting_xml": f"{name}-PerformanceTestReportSummary-XML",
|
||||||
|
"benchtesting_xml": f"{name}-BenchmarkTestReportSummary-XML",
|
||||||
|
"apptesting_xml": f"{name}-ApplicationTestReportSummary-XML",
|
||||||
|
"codecoverage_sqlite": f"{name}-CodeCoverage-SQLite",
|
||||||
|
"codecoverage_xml": f"{name}-CodeCoverage-XML",
|
||||||
|
"codecoverage_json": f"{name}-CodeCoverage-JSON",
|
||||||
|
"codecoverage_html": f"{name}-CodeCoverage-HTML",
|
||||||
|
"statictyping_html": f"{name}-StaticTyping-HTML",
|
||||||
|
"package_all": f"{name}-Packages",
|
||||||
|
"documentation_html": f"{name}-Documentation-HTML",
|
||||||
|
"documentation_latex": f"{name}-Documentation-LaTeX",
|
||||||
|
"documentation_pdf": f"{name}-Documentation-PDF",
|
||||||
|
}
|
||||||
|
|
||||||
|
# Deprecated structure
|
||||||
|
params = {
|
||||||
|
"python_version": python_version,
|
||||||
|
"artifacts": {
|
||||||
|
"unittesting": f"{artifact_names['unittesting_xml']}",
|
||||||
|
"coverage": f"{artifact_names['codecoverage_html']}",
|
||||||
|
"typing": f"{artifact_names['statictyping_html']}",
|
||||||
|
"package": f"{artifact_names['package_all']}",
|
||||||
|
"doc": f"{artifact_names['documentation_html']}",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print("Parameters:")
|
||||||
|
print(f" python_version: {python_version}")
|
||||||
|
print(f" python_jobs ({len(jobs)}):\n" +
|
||||||
|
"".join(
|
||||||
|
[f" {{ " + ", ".join([f"\"{key}\": \"{value}\"" for key, value in job.items()]) + f" }},\n" for job in jobs])
|
||||||
|
)
|
||||||
|
print(f" artifact_names ({len(artifact_names)}):")
|
||||||
|
for id, name in artifact_names.items():
|
||||||
|
print(f" {id:>20}: {name}")
|
||||||
|
|
||||||
|
# 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"""\
|
||||||
|
python_version={python_version}
|
||||||
|
python_jobs={json_dumps(jobs)}
|
||||||
|
artifact_names={json_dumps(artifact_names)}
|
||||||
|
params={json_dumps(params)}
|
||||||
|
"""))
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
-r ../requirements.txt
|
-r ../requirements.txt
|
||||||
|
|
||||||
# Coverage collection
|
# Coverage collection
|
||||||
Coverage ~= 7.5
|
Coverage ~= 7.6
|
||||||
|
|
||||||
# Test Runner
|
# Test Runner
|
||||||
pytest ~= 8.1
|
pytest ~= 8.3
|
||||||
pytest-cov ~= 5.0
|
pytest-cov ~= 6.0
|
||||||
|
|
||||||
# Static Type Checking
|
# Static Type Checking
|
||||||
mypy ~= 1.10
|
mypy ~= 1.13
|
||||||
typing_extensions ~= 4.11
|
typing_extensions ~= 4.12
|
||||||
lxml ~= 5.1
|
lxml ~= 5.3
|
||||||
|
|||||||
Reference in New Issue
Block a user