-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
86 changed files
with
6,143 additions
and
377 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
root = true | ||
|
||
[*] | ||
charset = utf-8 | ||
# end_of_line = lf | ||
insert_final_newline = true | ||
trim_trailing_whitespace = true | ||
indent_style = tab | ||
indent_size = 2 | ||
tab_width = 2 | ||
|
||
|
||
[*.py] | ||
indent_style = tab | ||
indent_size = 2 | ||
|
||
[*.{yml,yaml}] | ||
indent_style = space | ||
indent_size = 2 | ||
|
||
[*.{json,ini}] | ||
indent_style = tab | ||
indent_size = 2 | ||
|
||
[*.md] | ||
trim_trailing_whitespace = false | ||
|
||
[*.rst] | ||
indent_style = space | ||
indent_size = 3 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,255 @@ | ||
# ==================================================================================================================== # | ||
# Authors: # | ||
# Patrick Lehmann # | ||
# Unai Martinez-Corral # | ||
# # | ||
# ==================================================================================================================== # | ||
# 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: Application Testing | ||
|
||
on: | ||
workflow_call: | ||
inputs: | ||
jobs: | ||
description: 'JSON list with environment fields, telling the system and Python versions to run tests with.' | ||
required: true | ||
type: string | ||
wheel: | ||
description: "Wheel package as input artifact." | ||
required: false | ||
default: '' | ||
type: string | ||
requirements: | ||
description: 'Python dependencies to be installed through pip.' | ||
required: false | ||
default: '-r tests/requirements.txt' | ||
type: string | ||
pacboy: | ||
description: 'MSYS2 dependencies to be installed through pacboy (pacman).' | ||
required: false | ||
default: "" | ||
type: string | ||
mingw_requirements: | ||
description: 'Override Python dependencies to be installed through pip on MSYS2 (MINGW64) only.' | ||
required: false | ||
default: '' | ||
type: string | ||
root_directory: | ||
description: 'Working directory for running tests.' | ||
required: false | ||
default: '' | ||
type: string | ||
tests_directory: | ||
description: 'Path to the directory containing tests (relative to root_directory).' | ||
required: false | ||
default: 'tests' | ||
type: string | ||
apptest_directory: | ||
description: 'Path to the directory containing application tests (relative to tests_directory).' | ||
required: false | ||
default: 'app' | ||
type: string | ||
apptest_xml_artifact: | ||
description: "Generate application test report with junitxml and upload results as an artifact." | ||
required: false | ||
default: '' | ||
type: string | ||
|
||
jobs: | ||
ApplicationTesting: | ||
name: ${{ matrix.sysicon }} ${{ matrix.pyicon }} Application Tests using Python ${{ matrix.python }} | ||
runs-on: ${{ matrix.runs-on }} | ||
|
||
strategy: | ||
fail-fast: false | ||
matrix: | ||
include: ${{ fromJson(inputs.jobs) }} | ||
|
||
defaults: | ||
run: | ||
shell: ${{ matrix.shell }} | ||
|
||
steps: | ||
- name: ⏬ Checkout repository | ||
uses: actions/checkout@v4 | ||
|
||
- name: 📥 Download artifacts '${{ inputs.wheel }}' from 'Package' job | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: ${{ inputs.wheel }} | ||
path: install | ||
|
||
- name: Compute pacman/pacboy packages | ||
id: pacboy | ||
if: matrix.system == 'msys2' | ||
shell: python | ||
run: | | ||
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 = "${{ inputs.requirements }}" | ||
if requirements.startswith("-r"): | ||
requirementsFile = Path(requirements[2:].lstrip()) | ||
dependencies = loadRequirementsFile(requirementsFile) | ||
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", | ||
} | ||
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") | ||
- name: '🟦 Setup MSYS2 for ${{ matrix.runtime }}' | ||
if: matrix.system == 'msys2' | ||
uses: msys2/setup-msys2@v2 | ||
with: | ||
msystem: ${{ matrix.runtime }} | ||
update: true | ||
pacboy: >- | ||
${{ steps.pacboy.outputs.pacboy_packages }} | ||
${{ inputs.pacboy }} | ||
- name: 🐍 Setup Python ${{ matrix.python }} | ||
if: matrix.system != 'msys2' | ||
uses: actions/setup-python@v5 | ||
with: | ||
python-version: ${{ matrix.python }} | ||
|
||
- name: 🔧 Install wheel and pip dependencies (native) | ||
if: matrix.system != 'msys2' | ||
run: | | ||
python -m pip install --disable-pip-version-check -U wheel | ||
python -m pip install --disable-pip-version-check ${{ inputs.requirements }} | ||
- name: 🔧 Install pip dependencies (MSYS2) | ||
if: matrix.system == 'msys2' | ||
run: | | ||
if [ -n '${{ inputs.mingw_requirements }}' ]; then | ||
python -m pip install --disable-pip-version-check ${{ inputs.mingw_requirements }} | ||
else | ||
python -m pip install --disable-pip-version-check ${{ inputs.requirements }} | ||
fi | ||
- name: 🔧 Install wheel from artifact | ||
run: | | ||
ls -l install | ||
python -m pip install --disable-pip-version-check -U install/*.whl | ||
- name: ☑ Run application tests (Ubuntu/macOS) | ||
if: matrix.system != 'windows' | ||
run: | | ||
export ENVIRONMENT_NAME="${{ matrix.envname }}" | ||
cd "${{ inputs.root_directory || '.' }}" | ||
[ -n '${{ inputs.apptest_xml_artifact }}' ] && PYTEST_ARGS='--junitxml=report/unit/TestReportSummary.xml' || unset PYTEST_ARGS | ||
if [ -n '${{ inputs.coverage_config }}' ]; then | ||
echo "coverage run --data-file=.coverage --rcfile=pyproject.toml -m pytest -raP $PYTEST_ARGS --color=yes ${{ inputs.tests_directory || '.' }}/${{ inputs.apptest_directory }}" | ||
coverage run --data-file=.coverage --rcfile=pyproject.toml -m pytest -raP $PYTEST_ARGS --color=yes ${{ inputs.tests_directory || '.' }}/${{ inputs.apptest_directory }} | ||
else | ||
echo "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 | ||
- name: ☑ Run application tests (Windows) | ||
if: matrix.system == 'windows' | ||
run: | | ||
$env:ENVIRONMENT_NAME = "${{ matrix.envname }}" | ||
cd "${{ inputs.root_directory || '.' }}" | ||
$PYTEST_ARGS = if ("${{ inputs.apptest_xml_artifact }}") { "--junitxml=report/unit/TestReportSummary.xml" } else { "" } | ||
if ("${{ inputs.coverage_config }}") { | ||
Write-Host "coverage run --data-file=.coverage --rcfile=pyproject.toml -m pytest -raP --color=yes ${{ inputs.tests_directory || '.' }}/${{ inputs.apptest_directory }}" | ||
coverage run --data-file=.coverage --rcfile=pyproject.toml -m pytest -raP $PYTEST_ARGS --color=yes ${{ inputs.tests_directory || '.' }}/${{ inputs.apptest_directory }} | ||
} else { | ||
Write-Host "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 }} | ||
} | ||
- name: 📤 Upload 'TestReportSummary.xml' artifact | ||
if: inputs.apptest_xml_artifact != '' | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: ${{ inputs.apptest_xml_artifact }}-${{ matrix.system }}-${{ matrix.runtime }}-${{ matrix.python }} | ||
path: report/unit/TestReportSummary.xml | ||
if-no-files-found: error | ||
retention-days: 1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.