From c78c1c85039fbca6bbccca959fbcf8f3e5972462 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Sat, 29 Oct 2022 22:40:27 +0200 Subject: [PATCH] Added Sphinx based documentation. (cherry picked from commit f9f5dd5117a14ba31a3a9113a1de2c12c624dffb) --- .btd.yml | 9 + .editorconfig | 30 +++ .gitignore | 37 ++++ Actions/__init__.py | 37 ++++ doc/Action/Releaser.rst | 3 + doc/Action/With-post-step.rst | 3 + doc/Action/index.rst | 4 + doc/Dependency.rst | 12 ++ doc/Introduction.rst | 3 + doc/JobTemplate/ArtifactCleanUp.rst | 39 ++++ doc/JobTemplate/BuildTheDocs.rst | 39 ++++ doc/JobTemplate/CoverageCollection.rst | 45 ++++ doc/JobTemplate/Package.rst | 41 ++++ doc/JobTemplate/Parameters.rst | 139 +++++++++++++ doc/JobTemplate/PublishOnPyPI.rst | 86 ++++++++ doc/JobTemplate/PublishTestResults.rst | 39 ++++ doc/JobTemplate/PublishToGitHubPages.rst | 39 ++++ doc/JobTemplate/Release.rst | 41 ++++ doc/JobTemplate/StaticTypeCheck.rst | 65 ++++++ doc/JobTemplate/UnitTesting.rst | 43 ++++ doc/JobTemplate/VerifyDocs.rst | 41 ++++ doc/JobTemplate/index.rst | 4 + doc/License.rst | 136 ++++++++++++ doc/Makefile | 20 ++ doc/TODO.rst | 4 + doc/_static/icon.png | Bin 0 -> 43849 bytes doc/_static/logo.png | Bin 0 -> 62739 bytes doc/conf.py | 253 +++++++++++++++++++++++ doc/index.rst | 120 +++++++++++ doc/make.bat | 36 ++++ doc/prolog.inc | 59 ++++++ doc/requirements.txt | 23 +++ doc/shields.inc | 74 +++++++ requirements.txt | 0 34 files changed, 1524 insertions(+) create mode 100644 .btd.yml create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 Actions/__init__.py create mode 100644 doc/Action/Releaser.rst create mode 100644 doc/Action/With-post-step.rst create mode 100644 doc/Action/index.rst create mode 100644 doc/Dependency.rst create mode 100644 doc/Introduction.rst create mode 100644 doc/JobTemplate/ArtifactCleanUp.rst create mode 100644 doc/JobTemplate/BuildTheDocs.rst create mode 100644 doc/JobTemplate/CoverageCollection.rst create mode 100644 doc/JobTemplate/Package.rst create mode 100644 doc/JobTemplate/Parameters.rst create mode 100644 doc/JobTemplate/PublishOnPyPI.rst create mode 100644 doc/JobTemplate/PublishTestResults.rst create mode 100644 doc/JobTemplate/PublishToGitHubPages.rst create mode 100644 doc/JobTemplate/Release.rst create mode 100644 doc/JobTemplate/StaticTypeCheck.rst create mode 100644 doc/JobTemplate/UnitTesting.rst create mode 100644 doc/JobTemplate/VerifyDocs.rst create mode 100644 doc/JobTemplate/index.rst create mode 100644 doc/License.rst create mode 100644 doc/Makefile create mode 100644 doc/TODO.rst create mode 100644 doc/_static/icon.png create mode 100644 doc/_static/logo.png create mode 100644 doc/conf.py create mode 100644 doc/index.rst create mode 100644 doc/make.bat create mode 100644 doc/prolog.inc create mode 100644 doc/requirements.txt create mode 100644 doc/shields.inc create mode 100644 requirements.txt diff --git a/.btd.yml b/.btd.yml new file mode 100644 index 0000000..296c029 --- /dev/null +++ b/.btd.yml @@ -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 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3c7043c --- /dev/null +++ b/.editorconfig @@ -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 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b4feb0e --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +# Python cache and object files +__pycache__/ +*.py[cod] + +# Coverage.py +.coverage +.cov +coverage.xml +/report/coverage + +# mypy +/report/typing + +# pytest +/report/unit + +# setuptools +/build/**/*.* +/dist/**/*.* +/*.egg-info + +# Dependencies +!requirements.txt + +# Sphinx +doc/_build/ +doc/pyTooling/**/*.* +!doc/pyTooling/index.rst + +# BuildTheDocs +doc/_theme/**/*.* + +# IntelliJ project files +/.idea/workspace.xml + +# Git files +!.git* diff --git a/Actions/__init__.py b/Actions/__init__.py new file mode 100644 index 0000000..c79a865 --- /dev/null +++ b/Actions/__init__.py @@ -0,0 +1,37 @@ +# ==================================================================================================================== # +# _____ _ _ ____ # +# _ __ _ |_ _|__ ___ | (_)_ __ __ _ / ___|___ _ __ ___ _ __ ___ ___ _ __ # +# | '_ \| | | || |/ _ \ / _ \| | | '_ \ / _` || | / _ \| '_ ` _ \| '_ ` _ \ / _ \| '_ \ # +# | |_) | |_| || | (_) | (_) | | | | | | (_| || |__| (_) | | | | | | | | | | | (_) | | | | # +# | .__/ \__, ||_|\___/ \___/|_|_|_| |_|\__, (_)____\___/|_| |_| |_|_| |_| |_|\___/|_| |_| # +# |_| |___/ |___/ # +# ==================================================================================================================== # +# Authors: # +# Patrick Lehmann # +# # +# License: # +# ==================================================================================================================== # +# Copyright 2017-2022 Patrick Lehmann - Bötzingen, Germany # +# # +# 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 # +# ==================================================================================================================== # +# +"""Placeholder""" +__author__ = "Patrick Lehmann" +__email__ = "Paebbels@gmail.com" +__copyright__ = "2017-2022, Patrick Lehmann" +__license__ = "Apache License, Version 2.0" +__version__ = "0.4.4" +__keywords__ = [] diff --git a/doc/Action/Releaser.rst b/doc/Action/Releaser.rst new file mode 100644 index 0000000..d410da6 --- /dev/null +++ b/doc/Action/Releaser.rst @@ -0,0 +1,3 @@ +Releaser +######## + diff --git a/doc/Action/With-post-step.rst b/doc/Action/With-post-step.rst new file mode 100644 index 0000000..5e4154b --- /dev/null +++ b/doc/Action/With-post-step.rst @@ -0,0 +1,3 @@ +with-post-step +############## + diff --git a/doc/Action/index.rst b/doc/Action/index.rst new file mode 100644 index 0000000..be86e43 --- /dev/null +++ b/doc/Action/index.rst @@ -0,0 +1,4 @@ +Overview +######## + + diff --git a/doc/Dependency.rst b/doc/Dependency.rst new file mode 100644 index 0000000..4cf2f5d --- /dev/null +++ b/doc/Dependency.rst @@ -0,0 +1,12 @@ +Dependencies +############ + +* Parameters + + * *None* + +* PublishOnPyPI + + * actions/download-artifact + * actions/setup-python + * geekyeggo/delete-artifact diff --git a/doc/Introduction.rst b/doc/Introduction.rst new file mode 100644 index 0000000..97e99dd --- /dev/null +++ b/doc/Introduction.rst @@ -0,0 +1,3 @@ +Introduction +############ + diff --git a/doc/JobTemplate/ArtifactCleanUp.rst b/doc/JobTemplate/ArtifactCleanUp.rst new file mode 100644 index 0000000..77d65b0 --- /dev/null +++ b/doc/JobTemplate/ArtifactCleanUp.rst @@ -0,0 +1,39 @@ +ArtifactCleanUp +############### + +Instantiation +************* + +Simple Example +============== + +.. code-block:: yaml + + TBD + +Complex Example +=============== + + + +.. code-block:: yaml + + TBD + +Template Parameters +******************* + +TBD 1 +===== + +TBD + +TBD 1 +===== + +TBD + +Template Results +**************** + +*None* diff --git a/doc/JobTemplate/BuildTheDocs.rst b/doc/JobTemplate/BuildTheDocs.rst new file mode 100644 index 0000000..20318b4 --- /dev/null +++ b/doc/JobTemplate/BuildTheDocs.rst @@ -0,0 +1,39 @@ +BuildTheDocs +############ + +Instantiation +************* + +Simple Example +============== + +.. code-block:: yaml + + TBD + +Complex Example +=============== + + + +.. code-block:: yaml + + TBD + +Template Parameters +******************* + +TBD 1 +===== + +TBD + +TBD 1 +===== + +TBD + +Template Results +**************** + +*None* diff --git a/doc/JobTemplate/CoverageCollection.rst b/doc/JobTemplate/CoverageCollection.rst new file mode 100644 index 0000000..8b505c9 --- /dev/null +++ b/doc/JobTemplate/CoverageCollection.rst @@ -0,0 +1,45 @@ +CoverageCollection +################## + +collect code coverage data (incl. branch coverage) + with `pytest`/`pytest-cov`/`coverage.py` using a single version of Python (latest). It generates HTML and Cobertura + (XML)reports, upload the HTML report as an artifact, and upload the test results to Codecov and Codacy. Configuration + options to `pytest` and `coverage.py` should be given via section `[tool.pytest.ini_options]` and `[tool.coverage.*]` + in a `pyproject.toml` file. + +Instantiation +************* + +Simple Example +============== + +.. code-block:: yaml + + TBD + +Complex Example +=============== + + + +.. code-block:: yaml + + TBD + +Template Parameters +******************* + +TBD 1 +===== + +TBD + +TBD 1 +===== + +TBD + +Template Results +**************** + +*None* diff --git a/doc/JobTemplate/Package.rst b/doc/JobTemplate/Package.rst new file mode 100644 index 0000000..3e676aa --- /dev/null +++ b/doc/JobTemplate/Package.rst @@ -0,0 +1,41 @@ +Package +####### + +generate source and wheel packages, and upload them as an artifact. + +Instantiation +************* + +Simple Example +============== + +.. code-block:: yaml + + TBD + +Complex Example +=============== + + + +.. code-block:: yaml + + TBD + +Template Parameters +******************* + +TBD 1 +===== + +TBD + +TBD 1 +===== + +TBD + +Template Results +**************** + +*None* diff --git a/doc/JobTemplate/Parameters.rst b/doc/JobTemplate/Parameters.rst new file mode 100644 index 0000000..5636838 --- /dev/null +++ b/doc/JobTemplate/Parameters.rst @@ -0,0 +1,139 @@ +Parameters +########## + +The `Parameters` job template is a workaround for the limitations of GitHub Actions to handle global variables in +GitHub Actions workflows (see [actions/runner#480](https://github.com/actions/runner/issues/480)). + +It generates output parameters with artifact names and a job matrix to be used in later running jobs. + +Instantiation +************* + +Simple Example +============== + +The following instantiation example creates a job `Params` derived from job template `Parameters` version `r0`. It only +requires a `name` parameter to create the artifact names. + +.. code-block:: yaml + + name: Pipeline + + on: + push: + workflow_dispatch: + + jobs: + Params: + uses: pyTooling/Actions/.github/workflows/Parameters.yml@r0 + with: + name: pyTooling + +Complex Example +=============== + +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 +systems (Windows, Ubuntu, MacOS, MinGW64) and the given list of Python versions including some mypy versions. In +addition a list of excludes (marked as :deletetion:`deletion`) and includes (marked as :additions:`additions`) is handed +over resulting in the following combinations: + ++---------+-------------+-------------+-------------+--------------+-------------------------+---------+----------+------------------------------+------------------------------+ +| Version | 3.7 | 3.8 | 3.9 | 3.10 | 3.11 | 3.12.a1 | mypy-3.7 | mypy-3.8 | mypy-3.9 | ++=========+=============+=============+=============+==============+=========================+=========+==========+==============================+==============================+ +| Windows | windows:3.7 | windows:3.8 | windows:3.9 | windows:3.10 | | | | :deletion:`windows:mypy-3.8` | :deletion:`windows:mypy-3.9` | ++---------+-------------+-------------+-------------+--------------+-------------------------+---------+----------+------------------------------+------------------------------+ +| Ubuntu | ubuntu:3.7 | ubuntu:3.8 | ubuntu:3.9 | ubuntu:3.10 | :addition:`ubuntu:3.11` | | | ubuntu:mypy-3.8 | ubuntu:mypy-3.9 | ++---------+-------------+-------------+-------------+--------------+-------------------------+---------+----------+------------------------------+------------------------------+ +| MacOS | macos:3.7 | macos:3.8 | macos:3.9 | macos:3.10 | :addition:`macos:3.11` | | | macos:mypy-3.8 | macos:mypy-3.9 | ++---------+-------------+-------------+-------------+--------------+-------------------------+---------+----------+------------------------------+------------------------------+ +| MSYS | | | | | | | | | | ++---------+-------------+-------------+-------------+--------------+-------------------------+---------+----------+------------------------------+------------------------------+ +| MinGW32 | | | | | | | | | | ++---------+-------------+-------------+-------------+--------------+-------------------------+---------+----------+------------------------------+------------------------------+ +| MinGW64 | | | | mingw64:3.10 | | | | | | ++---------+-------------+-------------+-------------+--------------+-------------------------+---------+----------+------------------------------+------------------------------+ +| Clang32 | | | | | | | | | | ++---------+-------------+-------------+-------------+--------------+-------------------------+---------+----------+------------------------------+------------------------------+ +| Clang64 | | | | | | | | | | ++---------+-------------+-------------+-------------+--------------+-------------------------+---------+----------+------------------------------+------------------------------+ +| UCRT64 | | | | | | | | | | ++---------+-------------+-------------+-------------+--------------+-------------------------+---------+----------+------------------------------+------------------------------+ + + + +.. code-block:: yaml + + name: Pipeline + + on: + push: + workflow_dispatch: + + jobs: + UnitTestingParams: + uses: pyTooling/Actions/.github/workflows/Parameters.yml@r0 + with: + name: pyTooling + python_version_list: "3.7 3.8 3.9 3.10 pypy-3.8 pypy-3.9" + include_list: "ubuntu:3.11 macos:3.11" + exclude_list: "windows:pypy-3.8 windows:pypy-3.9" + + PerformanceTestingParams: + uses: pyTooling/Actions/.github/workflows/Parameters.yml@r0 + with: + name: pyTooling + python_version_list: "3.10 3.11" + system_list: "ubuntu windows macos" + + PlatformTestingParams: + uses: pyTooling/Actions/.github/workflows/Parameters.yml@dev + with: + name: pyTooling + python_version_list: "3.10" + system_list: "ubuntu windows macos mingw32 mingw64 clang64 ucrt64" + +Template Parameters +******************* + +Name +====== +The name of the library or package. + + It's used to create artifact names. + + +python_version_list +=================== + +TBD + + +system_list +=========== + +TBD + + +include_list +============ + +TBD + +exclude_list +============ + +TBD + +Template Results +**************** + +Params +====== + + +Jobs +==== + + + diff --git a/doc/JobTemplate/PublishOnPyPI.rst b/doc/JobTemplate/PublishOnPyPI.rst new file mode 100644 index 0000000..05acf85 --- /dev/null +++ b/doc/JobTemplate/PublishOnPyPI.rst @@ -0,0 +1,86 @@ +PublishOnPyPI +############# + +Publish a source (``*.tar.gz``) and wheel (``*.whl``) packages to `PyPI `__. + +Instantiation +************* + +Simple Example +============== + +.. code-block:: yaml + + jobs: + # ... + + PublishOnPyPI: + uses: pyTooling/Actions/.github/workflows/PublishOnPyPI.yml@r0 + if: startsWith(github.ref, 'refs/tags') + with: + artifact: Package + secrets: + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + +Complex Example +=============== + +.. code-block:: yaml + + jobs: + # ... + + PublishOnPyPI: + uses: pyTooling/Actions/.github/workflows/PublishOnPyPI.yml@r0 + if: startsWith(github.ref, 'refs/tags') + needs: + - Params + - Package + with: + python_version: ${{ fromJson(needs.Params.outputs.params).python_version }} + requirements: -r dist/requirements.txt + artifact: ${{ fromJson(needs.Params.outputs.params).artifacts.Package }} + secrets: + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + +Template Parameters +******************* + +python_version +============== + +Python version used for uploading the package contents via `twine` to PyPI. + +**Default:** 3.11 + +requirements +============ + +List of requirements to be installed for uploading the package contents to PyPI. + +**Default:** wheel, twine + +artifact +======== + +Name of the artifact containing the package(s). + +Secrets +******* + +PYPI_TOKEN +========== + +The token to access the package at PyPI for uploading new data. + +Template Results +**************** + +*None* + +Dependencies +************ + +* actions/download-artifact +* actions/setup-python +* geekyeggo/delete-artifact diff --git a/doc/JobTemplate/PublishTestResults.rst b/doc/JobTemplate/PublishTestResults.rst new file mode 100644 index 0000000..cfaaf2f --- /dev/null +++ b/doc/JobTemplate/PublishTestResults.rst @@ -0,0 +1,39 @@ +PublishTestResults +################## + +Instantiation +************* + +Simple Example +============== + +.. code-block:: yaml + + TBD + +Complex Example +=============== + + + +.. code-block:: yaml + + TBD + +Template Parameters +******************* + +TBD 1 +===== + +TBD + +TBD 1 +===== + +TBD + +Template Results +**************** + +*None* diff --git a/doc/JobTemplate/PublishToGitHubPages.rst b/doc/JobTemplate/PublishToGitHubPages.rst new file mode 100644 index 0000000..bdb70ae --- /dev/null +++ b/doc/JobTemplate/PublishToGitHubPages.rst @@ -0,0 +1,39 @@ +PublishToGitHubPages +#################### + +Instantiation +************* + +Simple Example +============== + +.. code-block:: yaml + + TBD + +Complex Example +=============== + + + +.. code-block:: yaml + + TBD + +Template Parameters +******************* + +TBD 1 +===== + +TBD + +TBD 1 +===== + +TBD + +Template Results +**************** + +*None* diff --git a/doc/JobTemplate/Release.rst b/doc/JobTemplate/Release.rst new file mode 100644 index 0000000..0b28180 --- /dev/null +++ b/doc/JobTemplate/Release.rst @@ -0,0 +1,41 @@ +Release +####### + +publish GitHub Release. + +Instantiation +************* + +Simple Example +============== + +.. code-block:: yaml + + TBD + +Complex Example +=============== + + + +.. code-block:: yaml + + TBD + +Template Parameters +******************* + +TBD 1 +===== + +TBD + +TBD 1 +===== + +TBD + +Template Results +**************** + +*None* diff --git a/doc/JobTemplate/StaticTypeCheck.rst b/doc/JobTemplate/StaticTypeCheck.rst new file mode 100644 index 0000000..1da6930 --- /dev/null +++ b/doc/JobTemplate/StaticTypeCheck.rst @@ -0,0 +1,65 @@ +StaticTypeCheck +############### + +collect static type check result with `mypy`, and + optionally upload results as an HTML report. + Example `commands`: + + 1. Regular package + + ```yml + commands: mypy --html-report htmlmypy -p ToolName + ``` + + 2. Parent namespace package + + ```yml + commands: | + touch Parent/__init__.py + mypy --html-report htmlmypy -p ToolName + ``` + + 3. Child namespace package + + ```yml + commands: | + cd Parent + mypy --html-report ../htmlmypy -p ToolName + ``` + +Instantiation +************* + +Simple Example +============== + +.. code-block:: yaml + + TBD + +Complex Example +=============== + + + +.. code-block:: yaml + + TBD + +Template Parameters +******************* + +TBD 1 +===== + +TBD + +TBD 1 +===== + +TBD + +Template Results +**************** + +*None* diff --git a/doc/JobTemplate/UnitTesting.rst b/doc/JobTemplate/UnitTesting.rst new file mode 100644 index 0000000..7255f9c --- /dev/null +++ b/doc/JobTemplate/UnitTesting.rst @@ -0,0 +1,43 @@ +UnitTesting +########### + +run unit test with `pytest` using multiple versions of Python, and + optionally upload results as XML reports. Configuration options to `pytest` should be given via section + `[tool.pytest.ini_options]` in a `pyproject.toml` file. + +Instantiation +************* + +Simple Example +============== + +.. code-block:: yaml + + TBD + +Complex Example +=============== + + + +.. code-block:: yaml + + TBD + +Template Parameters +******************* + +TBD 1 +===== + +TBD + +TBD 1 +===== + +TBD + +Template Results +**************** + +*None* diff --git a/doc/JobTemplate/VerifyDocs.rst b/doc/JobTemplate/VerifyDocs.rst new file mode 100644 index 0000000..d6a94f3 --- /dev/null +++ b/doc/JobTemplate/VerifyDocs.rst @@ -0,0 +1,41 @@ +VerifyDocs +########## + +extract code examples from the README and test these code snippets. + +Instantiation +************* + +Simple Example +============== + +.. code-block:: yaml + + TBD + +Complex Example +=============== + + + +.. code-block:: yaml + + TBD + +Template Parameters +******************* + +TBD 1 +===== + +TBD + +TBD 1 +===== + +TBD + +Template Results +**************** + +*None* diff --git a/doc/JobTemplate/index.rst b/doc/JobTemplate/index.rst new file mode 100644 index 0000000..be86e43 --- /dev/null +++ b/doc/JobTemplate/index.rst @@ -0,0 +1,4 @@ +Overview +######## + + diff --git a/doc/License.rst b/doc/License.rst new file mode 100644 index 0000000..7df6024 --- /dev/null +++ b/doc/License.rst @@ -0,0 +1,136 @@ +.. Note:: This is a local copy of the `Apache License Version 2.0 `_. + +Apache License 2.0 +################## + +Version 2.0, January 2004 + +**TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION** + + +1. Definitions. +=============== +**"License"** shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +**"Licensor"** shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +**"Legal Entity"** shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that +entity. For the purposes of this definition, **"control"** means (i) the power, direct or indirect, to cause the direction or management of such entity, whether +by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +**"You"** (or **"Your"**) shall mean an individual or Legal Entity exercising permissions granted by this License. + +**"Source"** form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and +configuration files. + +**"Object"** form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object +code, generated documentation, and conversions to other media types. + +**"Work"** shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is +included in or attached to the work (an example is provided in the Appendix below). + +**"Derivative Works"** shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +**"Contribution"** shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative +Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to +submit on behalf of the copyright owner. For the purposes of this definition, **"submitted"** means any form of electronic, verbal, or written communication +sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue +tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is +conspicuously marked or otherwise designated in writing by the copyright owner as **"Not a Contribution."** + +**"Contributor"** shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. +============================== +Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. +=========================== +Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such +license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of +their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim +or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then +any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. +================== +You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +* You must give any other recipients of the Work or Derivative Works a copy of this License; and +* You must cause any modified files to carry prominent notices stating that You changed the files; and +* You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source + form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +* If the Work includes a **"NOTICE"** text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the + attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the + following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the + Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE + file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, + alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise +complies with the conditions stated in this License. + +5. Submission of Contributions. +=============================== +Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any +separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. +============== +This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable +and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. +========================== +Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, +MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and +assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. +=========================== +In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or +consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages +for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been +advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. +============================================== +While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other +liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole +responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +---------------------------------------------------------------------------------------------------------------------------------------------------------------- + +**Appendix: How to apply the Apache License to your work** + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying +information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or +class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +.. code-block:: none + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/doc/TODO.rst b/doc/TODO.rst new file mode 100644 index 0000000..3144da0 --- /dev/null +++ b/doc/TODO.rst @@ -0,0 +1,4 @@ +TODOs +##### + +.. todolist:: diff --git a/doc/_static/icon.png b/doc/_static/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..79763da1703a3db53a1e592563622efda94420fe GIT binary patch literal 43849 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 literal 0 HcmV?d00001 diff --git a/doc/_static/logo.png b/doc/_static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6c62cad298439f9cf3e65963a3c193a3273cae1d GIT binary patch literal 62739 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 literal 0 HcmV?d00001 diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 0000000..d42c29d --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,253 @@ +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +from importlib.util import find_spec +from sys import path as sys_path +from os.path import abspath +from pathlib import Path +from json import loads + +from pyTooling.Packaging import extractVersionInformation + +ROOT = Path(__file__).resolve().parent + +sys_path.insert(0, abspath(".")) +sys_path.insert(0, abspath("..")) +#sys_path.insert(0, abspath("../pyTooling")) +sys_path.insert(0, abspath("_extensions")) + + +# ============================================================================== +# Project information and versioning +# ============================================================================== +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +project = "Actions" + +packageInformationFile = Path(f"../{project}/__init__.py") +versionInformation = extractVersionInformation(packageInformationFile) + +author = versionInformation.Author +copyright = versionInformation.Copyright +version = ".".join(versionInformation.Version.split(".")[:2]) # e.g. 2.3 The short X.Y version. +release = versionInformation.Version + + +# ============================================================================== +# Miscellaneous settings +# ============================================================================== +# The master toctree document. +master_doc = "index" + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [ + "_build", + "_theme", + "Thumbs.db", + ".DS_Store" +] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = "manni" + + +# ============================================================================== +# Restructured Text settings +# ============================================================================== +prologPath = "prolog.inc" +try: + with open(prologPath, "r") as prologFile: + rst_prolog = prologFile.read() +except Exception as ex: + print(f"[ERROR:] While reading '{prologPath}'.") + print(ex) + rst_prolog = "" + + +# ============================================================================== +# Options for HTML output +# ============================================================================== +html_context = {} +ctx = ROOT / "context.json" +if ctx.is_file(): + html_context.update(loads(ctx.open('r').read())) + +if (ROOT / "_theme").is_dir(): + html_theme_path = ["."] + html_theme = "_theme" + 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, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] + +html_logo = str(Path(html_static_path[0]) / "logo.png") +html_favicon = str(Path(html_static_path[0]) / "icon.png") + +# Output file base name for HTML help builder. +htmlhelp_basename = "ActionsDoc" + +# If not None, a 'Last updated on:' timestamp is inserted at every page +# bottom, using the given strftime format. +# The empty string is equivalent to '%b %d, %Y'. +html_last_updated_fmt = "%d.%m.%Y" + +# ============================================================================== +# Python settings +# ============================================================================== +modindex_common_prefix = [ + f"{project}." +] + +# ============================================================================== +# Options for LaTeX / PDF output +# ============================================================================== +from textwrap import dedent + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + "papersize": "a4paper", + + # The font size ('10pt', '11pt' or '12pt'). + #'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + "preamble": dedent(r""" + % ================================================================================ + % User defined additional preamble code + % ================================================================================ + % Add more Unicode characters for pdfLaTeX. + % - Alternatively, compile with XeLaTeX or LuaLaTeX. + % - https://GitHub.com/sphinx-doc/sphinx/issues/3511 + % + \ifdefined\DeclareUnicodeCharacter + \DeclareUnicodeCharacter{2265}{$\geq$} + \DeclareUnicodeCharacter{21D2}{$\Rightarrow$} + \fi + + + % ================================================================================ + """), + + # Latex figure (float) alignment + #'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ( master_doc, + "Actions.tex", + "The pyTooling Actions Documentation", + "Patrick Lehmann", + "manual" + ), +] + + +# ============================================================================== +# Extensions +# ============================================================================== +extensions = [ +# Standard Sphinx extensions + "sphinx.ext.coverage", + "sphinx.ext.extlinks", + "sphinx.ext.intersphinx", + "sphinx.ext.todo", + "sphinx.ext.graphviz", + "sphinx.ext.mathjax", + "sphinx.ext.ifconfig", + "sphinx.ext.viewcode", +# SphinxContrib extensions + "sphinxcontrib.mermaid", +# Other extensions + "sphinx_fontawesome", +] + + +# ============================================================================== +# Sphinx.Ext.InterSphinx +# ============================================================================== +intersphinx_mapping = { + "python": ("https://docs.python.org/3", None), +} + + +# ============================================================================== +# Sphinx.Ext.AutoDoc +# ============================================================================== +# see: https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html#configuration +#autodoc_default_options = { +# "private-members": True, +# "special-members": True, +# "inherited-members": True, +# "exclude-members": "__weakref__" +#} +#autodoc_class_signature = "separated" +autodoc_member_order = "bysource" # alphabetical, groupwise, bysource +autodoc_typehints = "both" +#autoclass_content = "both" + + +# ============================================================================== +# Sphinx.Ext.ExtLinks +# ============================================================================== +extlinks = { + "gh": ("https://GitHub.com/%s", "gh:"), + "ghissue": ("https://GitHub.com/pyTooling/Actions/issues/%s", "issue #"), + "ghpull": ("https://GitHub.com/pyTooling/Actions/pull/%s", "pull request #"), + "ghsrc": ("https://GitHub.com/pyTooling/Actions/blob/main/%s", ""), + "wiki": ("https://en.wikipedia.org/wiki/%s", ""), +} + + +# ============================================================================== +# Sphinx.Ext.Graphviz +# ============================================================================== +graphviz_output_format = "svg" + + +# ============================================================================== +# SphinxContrib.Mermaid +# ============================================================================== +mermaid_params = [ + '--backgroundColor', 'transparent', +] +mermaid_verbose = True + + +# ============================================================================== +# Sphinx.Ext.ToDo +# ============================================================================== +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = True +todo_link_only = True + + +# ============================================================================== +# Sphinx.Ext.Coverage +# ============================================================================== +coverage_show_missing_items = True diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 0000000..020e393 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,120 @@ +.. include:: shields.inc + +.. raw:: latex + + \part{Introduction} + +.. only:: html + + | |SHIELD:svg:pyTooling-github| |SHIELD:svg:pyTooling-src-license| |SHIELD:svg:pyTooling-ghp-doc| |SHIELD:svg:pyTooling-doc-license| + | |SHIELD:svg:pyTooling-tag| |SHIELD:svg:pyTooling-date| + +.. Disabled shields: |SHIELD:svg:pyTooling-gitter| + +.. only:: latex + + |SHIELD:png:pyTooling-github| |SHIELD:png:pyTooling-src-license| |SHIELD:png:pyTooling-ghp-doc| |SHIELD:png:pyTooling-doc-license| + |SHIELD:png:pyTooling-tag| |SHIELD:png:pyTooling-date| + +.. Disabled shields: |SHIELD:svg:pyTooling-gitter| + +-------------------------------------------------------------------------------- + +pyTooling Actions Documentation +############################### + +**pyTooling Actions** are reusable steps and workflows for GitHub Actions easing the creation and maintenance of +workflows for Python projects on GitHub. + +GitHub Actions workflows, actions and documentation are mostly focused on JavaScript/TypeScript as the scripting +language for writing reusable CI code. +However, Python being equally popular and capable, usage of JS/TS might be bypassed, with some caveats. +This repository gathers reusable CI tooling for testing, packaging and distributing Python projects and documentation. + +Introduction +************ + + + +Package Details +*************** + + +Contributors +************ + +* `Patrick Lehmann `__ +* `Unai Martinez-Corral `__ (Maintainer) +* `and more... `__ + + +License +******* + +.. only:: html + + This Python package (source code) is licensed under `Apache License 2.0 `__. |br| + The accompanying documentation is licensed under `Creative Commons - Attribution 4.0 (CC-BY 4.0) `__. + +.. only:: latex + + This Python package (source code) is licensed under **Apache License 2.0**. |br| + The accompanying documentation is licensed under **Creative Commons - Attribution 4.0 (CC-BY 4.0)**. + + +------------------------------------ + +.. |docdate| date:: %b %d, %Y - %H:%M + +.. only:: html + + This document was generated on |docdate|. + +.. toctree:: + :caption: Overview + :hidden: + + Introduction + Dependency + +.. raw:: latex + + \part{Main Documentation} + +.. toctree:: + :caption: Job Templates + :hidden: + + JobTemplate/index + JobTemplate/Parameters + JobTemplate/CoverageCollection + JobTemplate/UnitTesting + JobTemplate/StaticTypeCheck + JobTemplate/PublishTestResults + JobTemplate/Package + JobTemplate/PublishOnPyPI + JobTemplate/VerifyDocs + JobTemplate/BuildTheDocs + JobTemplate/PublishToGitHubPages + JobTemplate/Release + JobTemplate/ArtifactCleanUp + +.. toctree:: + :caption: Actions + :hidden: + + Action/index + Action/Releaser + +.. raw:: latex + + \part{Appendix} + +.. toctree:: + :caption: Appendix + :hidden: + + License + Doc-License + genindex + TODO diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 0000000..39e6f08 --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,36 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build +set SPHINXOPTS=-v + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/doc/prolog.inc b/doc/prolog.inc new file mode 100644 index 0000000..75463a8 --- /dev/null +++ b/doc/prolog.inc @@ -0,0 +1,59 @@ +.. # Load pre-defined aliases and graphical characters like © from docutils + # is used to denote the special path + # \Lib\site-packages\docutils\parsers\rst\include +.. include:: +.. include:: + +.. # define a hard line break for HTML +.. |br| raw:: html + +
+ +.. # define horizontal line for HTML +.. |hr| raw:: html + +
+ +.. # define additional CSS based styles and ReST roles for HTML +.. raw:: html + + + +.. role:: bolditalic + :class: bolditalic + +.. role:: underline + :class: underline + +.. role:: strike + :class: strike + +.. role:: xlarge + :class: xlarge + +.. role:: red + :class: colorred +.. role:: green + :class: colorgreen +.. role:: blue + :class: colorblue +.. role:: purple + :class: colorpurple + +.. role:: deletion + :class: colorred strike +.. role:: addition + :class: colorgreen + +.. role:: pycode(code) + :language: python + :class: highlight diff --git a/doc/requirements.txt b/doc/requirements.txt new file mode 100644 index 0000000..1756b55 --- /dev/null +++ b/doc/requirements.txt @@ -0,0 +1,23 @@ +-r ../requirements.txt + +pyTooling>=2.5.0 + +# Enforce latest version on ReadTheDocs +sphinx>=5.3.0 + +# Sphinx Extenstions +#sphinx.ext.coverage +#sphinxcontrib-actdiag>=0.8.5 +sphinxcontrib-mermaid>=0.7.1 +#sphinxcontrib-seqdiag>=0.8.5 +#sphinxcontrib-textstyle>=0.2.1 +#sphinxcontrib-spelling>=2.2.0 +autoapi +sphinx_fontawesome>=0.0.6 +sphinx_autodoc_typehints>=1.19.4 +# changelog>=0.3.5 + +# BuildTheDocs Extensions (mostly patched Sphinx extensions) + +# For pyTooling.Configuration.YAML documentation +ruamel.yaml>=0.17 diff --git a/doc/shields.inc b/doc/shields.inc new file mode 100644 index 0000000..039867c --- /dev/null +++ b/doc/shields.inc @@ -0,0 +1,74 @@ +.. # Use http://b64.io/ to encode any image to base64. Then replace `/` with + # `%2F` and `+` with `%2B` (or use http://meyerweb.com/eric/tools/dencoder/). + # Beware that `?logo=data:image/png;base64,` must also be converted to + # percent encoding so that the URL is properly parsed. + +.. # Sourcecode link to 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 + :height: 22 + :target: https://GitHub.com/pyTooling/pyTooling +.. |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 + :height: 22 + :target: https://GitHub.com/pyTooling/pyTooling + +.. # Sourcecode license +.. |SHIELD:svg:pyTooling-src-license| image:: https://img.shields.io/pypi/l/pyTooling?longCache=true&style=flat-square&logo=Apache&label=code + :alt: Code license + :height: 22 + :target: Code-License.html +.. |SHIELD:png:pyTooling-src-license| image:: https://img.shields.io/pypi/l/pyTooling?longCache=true&style=flat-square&logo=Apache&label=code + :alt: Code license + :height: 22 + :target: https://GitHub.com/pyTooling/Actions/blob/main/LICENSE.md + +.. # GitHub tag +.. |SHIELD:svg:pyTooling-tag| image:: https://img.shields.io/github/v/tag/pyTooling/Actions?longCache=true&style=flat-square&logo=GitHub&include_prereleases + :alt: GitHub tag (latest SemVer incl. pre-release + :height: 22 + :target: https://GitHub.com/pyTooling/Actions/tags +.. |SHIELD:png:pyTooling-tag| image:: https://raster.shields.io/github/v/tag/pyTooling/Actions?longCache=true&style=flat-square&logo=GitHub&include_prereleases + :alt: GitHub tag (latest SemVer incl. pre-release + :height: 22 + :target: https://GitHub.com/pyTooling/Actions/tags + +.. # GitHub release date +.. |SHIELD:svg:pyTooling-date| image:: https://img.shields.io/github/release-date/pyTooling/Actions?longCache=true&style=flat-square&logo=GitHub + :alt: GitHub release date + :height: 22 + :target: https://GitHub.com/pyTooling/Actions/releases +.. |SHIELD:png:pyTooling-date| image:: https://raster.shields.io/github/release-date/pyTooling/Actions?longCache=true&style=flat-square&logo=GitHub + :alt: GitHub release date + :height: 22 + :target: https://GitHub.com/pyTooling/Actions/releases + +.. # Documentation license +.. |SHIELD:svg:pyTooling-doc-license| image:: https://img.shields.io/badge/doc-CC--BY%204.0-green?longCache=true&style=flat-square&logo=CreativeCommons&logoColor=fff + :alt: Documentation License + :height: 22 + :target: License.html +.. |SHIELD:png:pyTooling-doc-license| image:: https://raster.shields.io/badge/doc-CC--BY%204.0-green?longCache=true&style=flat-square&logo=CreativeCommons&logoColor=fff + :alt: Documentation License + :height: 22 + :target: https://GitHub.com/pyTooling/Actions/blob/main/doc/License.rst + +.. # GHPages - read now +.. |SHIELD:svg:pyTooling-ghp-doc| image:: https://img.shields.io/website?longCache=true&style=flat-square&label=pyTooling.github.io%2FpyTooling&logo=GitHub&logoColor=fff&up_color=blueviolet&up_message=Read%20now%20%E2%9E%9A&url=https%3A%2F%2FpyTooling.github.io%2FpyTooling%2Findex.html + :alt: Documentation - Read Now! + :height: 22 + :target: https://pyTooling.github.io/pyTooling/ +.. |SHIELD:png:pyTooling-ghp-doc| image:: https://raster.shields.io/website?longCache=true&style=flat-square&label=pyTooling.github.io%2FpyTooling&logo=GitHub&logoColor=fff&up_color=blueviolet&up_message=Read%20now%20%E2%9E%9A&url=https%3A%2F%2FpyTooling.github.io%2FpyTooling%2Findex.html + :alt: Documentation - Read Now! + :height: 22 + :target: https://pyTooling.github.io/pyTooling/ + +.. # Gitter +.. |SHIELD:svg:pyTooling-gitter| image:: https://img.shields.io/badge/chat-on%20gitter-4db797.svg?longCache=true&style=flat-square&logo=gitter&logoColor=e8ecef + :alt: Documentation License + :height: 22 + :target: https://gitter.im/hdl/community +.. |SHIELD:png:pyTooling-gitter| image:: https://raster.shields.io/badge/chat-on%20gitter-4db797.svg?longCache=true&style=flat-square&logo=gitter&logoColor=e8ecef + :alt: Documentation License + :height: 22 + :target: https://gitter.im/hdl/community diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e69de29