From d5772b47d44807092219ea71bc10071b56874cff Mon Sep 17 00:00:00 2001 From: Tiara Rodney Date: Mon, 9 Jun 2025 17:16:46 +0200 Subject: [PATCH 1/6] dev: packaging tinkering to figure out a good way too encapsulate a foreign pip-incompatible software library contractually. In this case the Sphinx theme depends upon a gzip-archive (tarball) software library of an HTML theme. The HTML theme provides static HTML assets and I expect them to be present under _static/ in the html builder output directory of Sphinx. The HTML theme is packaged as a gzip archive and provides a GPG signature. That's basically the contract. But the contract becomes intransparent as soon as the HTML assets are treated as part of the Sphinx theme project, so decompressed and unarchived into the src/ directory of the Sphinx theme and then handled through the sphinx-build hooks. The signature can't be verified against single files of the archive since the compressed archive is signed. Ideally, the archive would be decompressed and unarchived during sphinx-build, but I'm not really happy with the fact that a temporary directory is needed for this in order to cache as much as possible, so that decompressing isn't required upon every built. So within the temporary directory, I would have to keep track of the hash of the compressed archive in order to know when decompression and unarchiving is needed again, and to store the decompressed assets. Though event that is not quite intentful. If the performance of treating the tarball archive as a virtual filesystem, I'd rather let the HTML theme provide an additional signature for the tarball archive, that way I can check for the existance of files in the sphinx-build output directory by comparing against a listing of the tarball archive, after verifying the checksum of the archive hasn't changed. That way the contract wouldn't be broken and transparent for the user of this Sphinx theme. --- .../theme/seaharvest/__init__.py | 65 +++++++++++++++++-- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/__init__.py b/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/__init__.py index c8a5de2..b0c1807 100644 --- a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/__init__.py +++ b/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/__init__.py @@ -2,22 +2,79 @@ Tiara's Sphinx theme reference implementation. """ +from datclasses import dataclass from pathlib import Path +import pkg_resources from sys import version_info as python_version +import os.path +from typing import Optional from sphinx import version_info as sphinx_version +from sphinx import application from sphinx.locale import _ from sphinx.util.logging import getLogger +from hashlib import sha256 + +digest = sha256() + +zbuf = zlib.decompressobj() + + +re.sub('-*-', '-', re.sub('[^A-Za-z0-9_-]', '-', __name__)) + + +with pkg_resources.open_binary( + __name__, + '_vendor/html-theme-seaharvest-1.0.0.tar.gz' +) as fh: + + while True: + buf = fh.read(8096) + if not buf: break + digest.update(buf) + zbuf.decompress(buf) + +digest.update() + + + + +@dataclass +class StaticFilesZip(): + """ + """ + basename: str + sha256: str + +static_files_archive = StaticFilesArchive( + path=, + sha256='1234567', +) + + + logger = getLogger(__name__) -def setup(app): +def setup(app: application.Sphinx): """ """ - app.require_sphinx('8.0') + app.require_sphinx('5.0') - app.add_html_theme('sphinx-theme-ref', Path(__file__).resolve().parent) + rootdir = (Path(__file__) / ('../' * 6)) + archive = (rootdir / 'vendor/{static_archive_basename}').resolve() - app.add_js_file('assets/script/theme.js') + + app.add_html_theme(__name__.split('.')[-1], Path(__file__).parent) + + app.add_config_value( + 'html_static_archive_path', + [str(archive)], + True + ) + + app.add_js_file('_static/script/seaharvest.js') + + print(app.config['html_static_archive_path']) return {'parallel_read_safe': True, 'parallel_write_safe': True} From d8e70ef9213837134e659a6e5d94d6a686c13756 Mon Sep 17 00:00:00 2001 From: Tiara Rodney Date: Wed, 11 Jun 2025 20:13:13 +0200 Subject: [PATCH 2/6] chore: rename --- pyproject.toml | 4 ++-- .../sphinxcontrib/theme/{seaharvest => web2}/__init__.py | 2 +- .../theme/{seaharvest => web2}/assets/.gitignore | 0 .../theme/{seaharvest => web2}/changes/frameset.html | 0 .../theme/{seaharvest => web2}/changes/rstsource.html | 0 .../theme/{seaharvest => web2}/changes/versionchanges.html | 0 .../sphinxcontrib/theme/{seaharvest => web2}/defindex.html | 0 .../sphinxcontrib/theme/{seaharvest => web2}/domainindex.html | 0 .../theme/{seaharvest => web2}/genindex-single.html | 0 .../theme/{seaharvest => web2}/genindex-split.html | 0 .../sphinxcontrib/theme/{seaharvest => web2}/genindex.html | 0 .../sphinxcontrib/theme/{seaharvest => web2}/globaltoc.html | 0 .../sphinxcontrib/theme/{seaharvest => web2}/layout.html | 0 .../sphinxcontrib/theme/{seaharvest => web2}/localtoc.html | 0 .../sphinxcontrib/theme/{seaharvest => web2}/opensearch.xml | 0 .../sphinxcontrib/theme/{seaharvest => web2}/page.html | 0 .../sphinxcontrib/theme/{seaharvest => web2}/relations.html | 0 .../sphinxcontrib/theme/{seaharvest => web2}/search.html | 0 .../sphinxcontrib/theme/{seaharvest => web2}/searchbox.html | 0 .../sphinxcontrib/theme/{seaharvest => web2}/searchfield.html | 0 .../sphinxcontrib/theme/{seaharvest => web2}/sourcelink.html | 0 .../sphinxcontrib/theme/{seaharvest => web2}/theme.toml | 0 22 files changed, 3 insertions(+), 3 deletions(-) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/__init__.py (85%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/assets/.gitignore (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/changes/frameset.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/changes/rstsource.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/changes/versionchanges.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/defindex.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/domainindex.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/genindex-single.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/genindex-split.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/genindex.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/globaltoc.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/layout.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/localtoc.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/opensearch.xml (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/page.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/relations.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/search.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/searchbox.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/searchfield.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/sourcelink.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{seaharvest => web2}/theme.toml (100%) diff --git a/pyproject.toml b/pyproject.toml index 0a24189..5aa6513 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ requires = [ build-backend = "setuptools.build_meta" [project] -name = "byteb4rb1e.sphinxcontrib.theme.seaharvest" +name = "byteb4rb1e.sphinxcontrib.theme.web2" description = "Functional theme for Sphinx documentation generator" authors = [ { name = "Tiara Rodney", email = "tiara.rodney@administratrix.de" } @@ -37,7 +37,7 @@ dynamic = ["version"] requires-python = ">=3.8" [project.entry-points."sphinx.html_themes"] -seaharvest = "byteb4rb1e.sphinxcontrib.theme.seaharvest" +web2 = "byteb4rb1e.sphinxcontrib.theme.web2" [project.urls] Bitbucket = "https://bitbucket.org/byteb4rb1e/sphinxcontrib-theme-seaharvest" diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/__init__.py b/src/byteb4rb1e/sphinxcontrib/theme/web2/__init__.py similarity index 85% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/__init__.py rename to src/byteb4rb1e/sphinxcontrib/theme/web2/__init__.py index c8a5de2..4937c60 100644 --- a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/__init__.py +++ b/src/byteb4rb1e/sphinxcontrib/theme/web2/__init__.py @@ -16,7 +16,7 @@ def setup(app): """ app.require_sphinx('8.0') - app.add_html_theme('sphinx-theme-ref', Path(__file__).resolve().parent) + app.add_html_theme('web2', Path(__file__).resolve().parent) app.add_js_file('assets/script/theme.js') diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/assets/.gitignore b/src/byteb4rb1e/sphinxcontrib/theme/web2/assets/.gitignore similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/assets/.gitignore rename to src/byteb4rb1e/sphinxcontrib/theme/web2/assets/.gitignore diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/changes/frameset.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/changes/frameset.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/changes/frameset.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/changes/frameset.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/changes/rstsource.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/changes/rstsource.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/changes/rstsource.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/changes/rstsource.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/changes/versionchanges.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/changes/versionchanges.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/changes/versionchanges.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/changes/versionchanges.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/defindex.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/defindex.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/defindex.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/defindex.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/domainindex.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/domainindex.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/domainindex.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/domainindex.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/genindex-single.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/genindex-single.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/genindex-single.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/genindex-single.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/genindex-split.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/genindex-split.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/genindex-split.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/genindex-split.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/genindex.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/genindex.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/genindex.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/genindex.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/globaltoc.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/globaltoc.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/globaltoc.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/globaltoc.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/layout.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/layout.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/layout.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/layout.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/localtoc.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/localtoc.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/localtoc.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/localtoc.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/opensearch.xml b/src/byteb4rb1e/sphinxcontrib/theme/web2/opensearch.xml similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/opensearch.xml rename to src/byteb4rb1e/sphinxcontrib/theme/web2/opensearch.xml diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/page.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/page.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/page.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/page.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/relations.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/relations.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/relations.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/relations.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/search.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/search.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/search.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/search.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/searchbox.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/searchbox.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/searchbox.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/searchbox.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/searchfield.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/searchfield.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/searchfield.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/searchfield.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/sourcelink.html b/src/byteb4rb1e/sphinxcontrib/theme/web2/sourcelink.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/sourcelink.html rename to src/byteb4rb1e/sphinxcontrib/theme/web2/sourcelink.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/seaharvest/theme.toml b/src/byteb4rb1e/sphinxcontrib/theme/web2/theme.toml similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/seaharvest/theme.toml rename to src/byteb4rb1e/sphinxcontrib/theme/web2/theme.toml From 72723f0ced2f5d3d698be486d9bad29db384497b Mon Sep 17 00:00:00 2001 From: Tiara Rodney Date: Thu, 19 Jun 2025 17:56:05 +0200 Subject: [PATCH 3/6] feat(vendor): reinit --- vendor/91CD826E74B0174D181903DEF97C70941CD8C4EF.gpg | 10 ++++++++++ vendor/html-theme-seaharvest | 1 - vendor/html-theme-web2-1.0.0.tar.gz.asc | 7 +++++++ vendor/html-theme-web2-1.0.0.tar.sha256 | 1 + 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 vendor/91CD826E74B0174D181903DEF97C70941CD8C4EF.gpg delete mode 160000 vendor/html-theme-seaharvest create mode 100644 vendor/html-theme-web2-1.0.0.tar.gz.asc create mode 100644 vendor/html-theme-web2-1.0.0.tar.sha256 diff --git a/vendor/91CD826E74B0174D181903DEF97C70941CD8C4EF.gpg b/vendor/91CD826E74B0174D181903DEF97C70941CD8C4EF.gpg new file mode 100644 index 0000000..efbac37 --- /dev/null +++ b/vendor/91CD826E74B0174D181903DEF97C70941CD8C4EF.gpg @@ -0,0 +1,10 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEaDNFfRYJKwYBBAHaRw8BAQdAUDmP9/lyEpVWvIML/etRpkshVS8YpAp/1Gkb +i7+56F20IVRpYXJhIFJvZG5leSA8Y2ljZEBieXRlYjRyYjFlLm1lPoiZBBMWCgBB +FiEEkc2CbnSwF00YGQPe+XxwlBzYxO8FAmgzRX0CGwMFCQHhM4AFCwkIBwICIgIG +FQoJCAsCBBYCAwECHgcCF4AACgkQ+XxwlBzYxO82RQEAhtub8j5t7UGeGvQPxBsQ +C2l5qA6NnPfXyqZENJnZF5MBALssop/yUjWPjXG8U1/G9uOi48Z9v+Fols/M8ta1 +/YsD +=JL82 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/vendor/html-theme-seaharvest b/vendor/html-theme-seaharvest deleted file mode 160000 index 51a8959..0000000 --- a/vendor/html-theme-seaharvest +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 51a8959d251de8e3f6c78c88bd6b18575bd10502 diff --git a/vendor/html-theme-web2-1.0.0.tar.gz.asc b/vendor/html-theme-web2-1.0.0.tar.gz.asc new file mode 100644 index 0000000..dd0191b --- /dev/null +++ b/vendor/html-theme-web2-1.0.0.tar.gz.asc @@ -0,0 +1,7 @@ +-----BEGIN PGP SIGNATURE----- + +iHUEABYKAB0WIQSRzYJudLAXTRgZA975fHCUHNjE7wUCaFQrNAAKCRD5fHCUHNjE +7xb6AQDqP8+VECRJG+KyGe+5Z4PUWXbkb1l2J++N//uRmUwP2gEAxx0vS75IPPrO +PI1t8qiW9dQ4aN/YI7PEGmQ/lA4FpAc= +=qszW +-----END PGP SIGNATURE----- diff --git a/vendor/html-theme-web2-1.0.0.tar.sha256 b/vendor/html-theme-web2-1.0.0.tar.sha256 new file mode 100644 index 0000000..d8d393b --- /dev/null +++ b/vendor/html-theme-web2-1.0.0.tar.sha256 @@ -0,0 +1 @@ +63e49714a06c865bf8f15e94f9d514cbcdb9927dc20c748a373e93570c4c8e8b \ No newline at end of file From 95e6ee35edb1c8cafe0449d9a507b9a45b66a970 Mon Sep 17 00:00:00 2001 From: Tiara Rodney Date: Thu, 19 Jun 2025 17:57:06 +0200 Subject: [PATCH 4/6] chore: runtime version locking & path fix --- Pipfile | 6 +- Pipfile.lock | 435 +++++++-------------------------------------------- 2 files changed, 55 insertions(+), 386 deletions(-) diff --git a/Pipfile b/Pipfile index 010ca8f..45ff0f2 100644 --- a/Pipfile +++ b/Pipfile @@ -3,8 +3,6 @@ url = "https://pypi.org/simple" verify_ssl = true name = "pypi" -[packages] -sphinx-theme-ref = {file = ".", editable = true} [dev-packages] tox = "~=4.24.2" @@ -16,7 +14,7 @@ pylint = "~=3.3.6" build = "*" [requires] -python_version = "3.11" +python_version = "3" [scripts] -"build" = "python3 -m build" +"build/release" = "python3 -m build" diff --git a/Pipfile.lock b/Pipfile.lock index 29fca50..fb48c8a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "392503c17641b02b8fc371df27b291782f0d9bec49c60057424a5147f859d3c5" + "sha256": "d1fc51a334c037b89fa2fd6f634d84d5bbf48801d138aef103211d1111c22b7c" }, "pipfile-spec": 6, "requires": { - "python_version": "3.11" + "python_version": "3" }, "sources": [ { @@ -15,344 +15,15 @@ } ] }, - "default": { - "alabaster": { - "hashes": [ - "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", - "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b" - ], - "markers": "python_version >= '3.10'", - "version": "==1.0.0" - }, - "babel": { - "hashes": [ - "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", - "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2" - ], - "markers": "python_version >= '3.8'", - "version": "==2.17.0" - }, - "certifi": { - "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" - ], - "markers": "python_version >= '3.6'", - "version": "==2025.1.31" - }, - "charset-normalizer": { - "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" - ], - "markers": "python_version >= '3.7'", - "version": "==3.4.1" - }, - "docutils": { - "hashes": [ - "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", - "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2" - ], - "markers": "python_version >= '3.9'", - "version": "==0.21.2" - }, - "idna": { - "hashes": [ - "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", - "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" - ], - "markers": "python_version >= '3.6'", - "version": "==3.10" - }, - "imagesize": { - "hashes": [ - "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", - "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.1" - }, - "jinja2": { - "hashes": [ - "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", - "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.6" - }, - "markupsafe": { - "hashes": [ - "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", - "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", - "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", - "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", - "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", - "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", - "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", - "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", - "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", - "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", - "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", - "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", - "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", - "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", - "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", - "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", - "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", - "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", - "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", - "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", - "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", - "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", - "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", - "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", - "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", - "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", - "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", - "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", - "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", - "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", - "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", - "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", - "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", - "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", - "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", - "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", - "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", - "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", - "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", - "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", - "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", - "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", - "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", - "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", - "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", - "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", - "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", - "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", - "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", - "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", - "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", - "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", - "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", - "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", - "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", - "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", - "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", - "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", - "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", - "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", - "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50" - ], - "markers": "python_version >= '3.9'", - "version": "==3.0.2" - }, - "packaging": { - "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" - ], - "markers": "python_version >= '3.8'", - "version": "==24.2" - }, - "pygments": { - "hashes": [ - "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", - "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c" - ], - "markers": "python_version >= '3.8'", - "version": "==2.19.1" - }, - "requests": { - "hashes": [ - "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" - ], - "markers": "python_version >= '3.8'", - "version": "==2.32.3" - }, - "roman-numerals-py": { - "hashes": [ - "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", - "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d" - ], - "markers": "python_version >= '3.9'", - "version": "==3.1.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" - ], - "version": "==2.2.0" - }, - "sphinx": { - "hashes": [ - "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", - "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3" - ], - "markers": "python_version >= '3.11'", - "version": "==8.2.3" - }, - "sphinx-theme-ref": { - "editable": true, - "file": "." - }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", - "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.0" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", - "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.0" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", - "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9" - ], - "markers": "python_version >= '3.9'", - "version": "==2.1.0" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", - "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.0" - }, - "sphinxcontrib-serializinghtml": { - "hashes": [ - "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", - "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.0" - }, - "urllib3": { - "hashes": [ - "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", - "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" - ], - "markers": "python_version >= '3.9'", - "version": "==2.3.0" - } - }, + "default": {}, "develop": { "astroid": { "hashes": [ - "sha256:622cc8e3048684aa42c820d9d218978021c3c3d174fb03a9f0d615921744f550", - "sha256:d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248" + "sha256:104fb9cb9b27ea95e847a94c003be03a9e039334a8ebca5ee27dafaf5c5711eb", + "sha256:c332157953060c6deb9caa57303ae0d20b0fbdb2e59b4a4f2a6ba49d0a7961ce" ], "markers": "python_full_version >= '3.9.0'", - "version": "==3.3.9" + "version": "==3.3.10" }, "autopep8": { "hashes": [ @@ -374,19 +45,19 @@ }, "cachetools": { "hashes": [ - "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", - "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a" + "sha256:82e73ba88f7b30228b5507dce1a1f878498fc669d972aef2dde4f3a3c24f103e", + "sha256:f225782b84438f828328fc2ad74346522f27e5b1440f4e9fd18b20ebfd1aa2cf" ], - "markers": "python_version >= '3.7'", - "version": "==5.5.2" + "markers": "python_version >= '3.9'", + "version": "==6.0.0" }, "certifi": { "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", + "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" ], "markers": "python_version >= '3.6'", - "version": "==2025.1.31" + "version": "==2025.4.26" }, "chardet": { "hashes": [ @@ -406,11 +77,11 @@ }, "dill": { "hashes": [ - "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a", - "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c" + "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", + "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049" ], "markers": "python_version >= '3.8'", - "version": "==0.3.9" + "version": "==0.4.0" }, "distlib": { "hashes": [ @@ -484,19 +155,19 @@ }, "mypy-extensions": { "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" + "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", + "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" + "markers": "python_version >= '3.8'", + "version": "==1.1.0" }, "packaging": { "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==25.0" }, "pipenv": { "hashes": [ @@ -509,44 +180,44 @@ }, "platformdirs": { "hashes": [ - "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", - "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351" + "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", + "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" ], "markers": "python_version >= '3.9'", - "version": "==4.3.7" + "version": "==4.3.8" }, "pluggy": { "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" + "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", + "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" + "markers": "python_version >= '3.9'", + "version": "==1.6.0" }, "pycodestyle": { "hashes": [ - "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3", - "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521" + "sha256:35863c5974a271c7a726ed228a14a4f6daf49df369d8c50cd9a6f58a5e143ba9", + "sha256:c8415bf09abe81d9c7f872502a6eee881fbe85d8763dd5b9924bb0a01d67efae" ], - "markers": "python_version >= '3.8'", - "version": "==2.12.1" + "markers": "python_version >= '3.9'", + "version": "==2.13.0" }, "pylint": { "hashes": [ - "sha256:8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6", - "sha256:b634a041aac33706d56a0d217e6587228c66427e20ec21a019bc4cdee48c040a" + "sha256:2b11de8bde49f9c5059452e0c310c079c746a0a8eeaa789e5aa966ecc23e4559", + "sha256:43860aafefce92fca4cf6b61fe199cdc5ae54ea28f9bf4cd49de267b5195803d" ], "index": "pypi", "markers": "python_full_version >= '3.9.0'", - "version": "==3.3.6" + "version": "==3.3.7" }, "pyproject-api": { "hashes": [ - "sha256:326df9d68dea22d9d98b5243c46e3ca3161b07a1b9b18e213d1e24fd0e605766", - "sha256:7e8a9854b2dfb49454fae421cb86af43efbb2b2454e5646ffb7623540321ae6e" + "sha256:43c9918f49daab37e302038fc1aed54a8c7a91a9fa935d00b9a485f37e0f5335", + "sha256:7d6238d92f8962773dd75b5f0c4a6a27cce092a14b623b811dba656f3b628948" ], "markers": "python_version >= '3.9'", - "version": "==1.9.0" + "version": "==1.9.1" }, "pyproject-hooks": { "hashes": [ @@ -558,11 +229,11 @@ }, "setuptools": { "hashes": [ - "sha256:583b361c8da8de57403743e756609670de6fb2345920e36dc5c2d914c319c945", - "sha256:67122e78221da5cf550ddd04cf8742c8fe12094483749a792d56cd669d6cf58c" + "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", + "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c" ], "markers": "python_version >= '3.9'", - "version": "==77.0.3" + "version": "==80.9.0" }, "setuptools-scm": { "hashes": [ @@ -575,11 +246,11 @@ }, "tomlkit": { "hashes": [ - "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", - "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79" + "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", + "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0" ], "markers": "python_version >= '3.8'", - "version": "==0.13.2" + "version": "==0.13.3" }, "tox": { "hashes": [ @@ -592,19 +263,19 @@ }, "typing-extensions": { "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" + "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", + "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af" ], - "markers": "python_version >= '3.8'", - "version": "==4.12.2" + "markers": "python_version >= '3.9'", + "version": "==4.14.0" }, "virtualenv": { "hashes": [ - "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170", - "sha256:95e39403fcf3940ac45bc717597dba16110b74506131845d9b687d5e73d947ac" + "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", + "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af" ], "markers": "python_version >= '3.8'", - "version": "==20.29.3" + "version": "==20.31.2" } } } From 9de1a7db79cbedaefe3d4ee7bbf285bb33040113 Mon Sep 17 00:00:00 2001 From: Tiara Rodney Date: Thu, 19 Jun 2025 17:58:46 +0200 Subject: [PATCH 5/6] dirty --- .gitignore | 12 +- LICENSE | 0 Makefile | 71 ++++++++--- NOTES | 11 ++ README.md | 2 +- docs/Makefile | 2 + docs/diagrams/workflow.png | Bin 0 -> 67597 bytes docs/diagrams/workflow.puml | 32 +++++ pyproject.toml | 10 +- .../sphinxcontrib/theme/web2/.gitignore | 1 + .../theme/web2/_static_extra.tar.sha256 | 1 + .../theme/web2/assets/.gitignore | 20 --- .../theme/web2/test_sphinx_theme.py | 5 + tests/unit/__init__.py | 0 tests/unit/byteb4rb1e/__init__.py | 0 .../unit/byteb4rb1e/sphinxcontrib/__init__.py | 0 .../sphinxcontrib/theme/__init__.py | 0 .../sphinxcontrib/theme/web2/__init__.py | 0 .../theme/web2/test_unarchive.py | 3 + tox.ini | 120 +++++++++--------- 20 files changed, 180 insertions(+), 110 deletions(-) create mode 100644 LICENSE create mode 100644 NOTES create mode 100644 docs/Makefile create mode 100644 docs/diagrams/workflow.png create mode 100644 docs/diagrams/workflow.puml create mode 100644 src/byteb4rb1e/sphinxcontrib/theme/web2/.gitignore create mode 100644 src/byteb4rb1e/sphinxcontrib/theme/web2/_static_extra.tar.sha256 delete mode 100644 src/byteb4rb1e/sphinxcontrib/theme/web2/assets/.gitignore create mode 100644 tests/integration/byteb4rb1e/sphinxcontrib/theme/web2/test_sphinx_theme.py create mode 100644 tests/unit/__init__.py create mode 100644 tests/unit/byteb4rb1e/__init__.py create mode 100644 tests/unit/byteb4rb1e/sphinxcontrib/__init__.py create mode 100644 tests/unit/byteb4rb1e/sphinxcontrib/theme/__init__.py create mode 100644 tests/unit/byteb4rb1e/sphinxcontrib/theme/web2/__init__.py create mode 100644 tests/unit/byteb4rb1e/sphinxcontrib/theme/web2/test_unarchive.py diff --git a/.gitignore b/.gitignore index 00a6874..773a82e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,17 @@ +.tox/ + /dist/ /build/ -/src/**/*.egg-info -/src/**/*.pyc -/src/**/__pycache/ +*.egg-info +*.pyc /.venv/ /autom4te.cache/ /config.log /config.status /configure~ + +vendor/**/*.tar.gz +vendor/**/*.tar + +test-reports/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/Makefile b/Makefile index 1e6a41b..09fa329 100644 --- a/Makefile +++ b/Makefile @@ -1,31 +1,62 @@ -.PHONY: requirements.txt requirements-dev.txt configure Pipfile.lock src/sphinx_theme_ref/assets build +WEB2_PACKAGE_ID := html-theme-web2-1.0.0 +WEB2_PACKAGE_URL := https://bitbucket.org/byteb4rb1e/html-theme-web2/downloads/$(WEB2_PACKAGE_ID).tar.gz +PYPKG_DIR := src/byteb4rb1e/sphinxcontrib/theme/web2 +WITH_GPG = $(shell command -v gpg && echo yes) -PKG_BASENAME := sphinx_theme_ref +PYTHON3=$(if $(wildcard .venv/.*),.venv/bin/python3,python3) -VENDOR_OUTPUT_PATH := $(shell realpath ./src/sphinx_theme_ref/assets) +VERSION=$(shell $(PYTHON3) -m setuptools_scm) -Pipfile.lock: - .venv/bin/pipenv lock +.chore: requirements.txt requirements-dev.txt Pipfile.lock configure -requirements.txt: - .venv/bin/pipenv requirements > requirements.txt - -requirements-dev.txt: - .venv/bin/pipenv requirements --dev-only > requirements-dev.txt +.clean: + rm -rvf dist/ build/ configure: autoconf -src/sphinx_theme_ref/assets: - rm -r src/$(PKG_BASENAME)/assets - make -C vendor/html-theme-ref build/production OUTPUT_PATH=$(VENDOR_OUTPUT_PATH) +dist: src/ + $(PYTHON3) -m build -# user acceptance testing -uat: - trap 'kill 0' SIGINT; \ - make -C vendor/html-theme-ref watch OUTPUT_PATH=$(VENDOR_OUTPUT_PATH) & \ - wait +Pipfile.lock: + pipenv lock -build: - .venv/bin/pipenv run build +requirements.txt: + $(PYTHON3) -m pipenv requirements > requirements.txt +requirements-dev.txt: + $(PYTHON3) -m pipenv requirements --dev-only > requirements-dev.txt + +src src/: $(PYPKG_DIR)/_static_extra.tar $(PYPKG_DIR)/_static_extra.tar.sha256 + +$(PYPKG_DIR)/_static_extra.tar: vendor/$(WEB2_PACKAGE_ID).tar + cp -vf "$<" "$@" + +$(PYPKG_DIR)/_static_extra.tar.sha256: vendor/$(WEB2_PACKAGE_ID).tar.sha256 + cp -vf "$<" "$@" + +test-reports test-reports/: test-reports/unit test-reports/integration + +test-reports/unit: + $(PYTHON3) -m tox -m unit + +test-reports/integration: + $(PYTHON3) -m tox -m integration + +test-reports/audit.json: + $(PYTHON3) -m tox -m integration + +vendor/$(WEB2_PACKAGE_ID).tar.gz: $(if $(WITH_GPG),vendor/$(WEB2_PACKAGE_ID).tar.gz.asc,) + curl -L --fail --output "$@" "$(WEB2_PACKAGE_URL)" +ifneq ($(WITH_GPG),) + gpg --verify "$<" "$@" +endif + +vendor/$(WEB2_PACKAGE_ID).tar.gz.asc: + curl -L --fail --output "$@" "$(WEB2_PACKAGE_URL).asc" + +vendor/$(WEB2_PACKAGE_ID).tar: vendor/$(WEB2_PACKAGE_ID).tar.gz + gzip --decompress --keep --stdout "$<" > $@ + +vendor/$(WEB2_PACKAGE_ID).tar.sha256: + curl -L --fail --output "vendor/$(WEB2_PACKAGE_ID).tar.sha256" "$(patsubst %.gz,%.sha256,$(WEB2_PACKAGE_URL))" diff --git a/NOTES b/NOTES new file mode 100644 index 0000000..087166e --- /dev/null +++ b/NOTES @@ -0,0 +1,11 @@ + + +=== Configuration === + +1. Run sh configure +2. Run make .chore + + +Ḿakefile conventions + +abstract targets (e.g. chore, clean, etc.) must be prepended with an underscore. diff --git a/README.md b/README.md index c76c37b..e5a66d1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - + # Tiara's Sphinx Theme Reference Implementation > 🛌 **NOTICE:** This project is taking a naap. It depends upon diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..09b9b7c --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,2 @@ +$(patsubst %.puml,%.png,$(wildcard **/*.puml)): + plantuml "$$(echo "$@" | sed 's|.png$$|.puml|')" diff --git a/docs/diagrams/workflow.png b/docs/diagrams/workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..f74b07859e6893886faa4be6c76a70141adbb4c0 GIT binary patch literal 67597 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 QgmCim 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 Zn%nxIfZ|O76Z{*6qMVBCtHY [vendor/html-theme-web2-1.0.0.tar.gz] + [vendor/html-theme-web2-1.0.0.tar.gz] --> [vendor/html-theme-web2-1.0.0.tar] + [vendor/html-theme-web2-1.0.0.tar.gz.asc] --> [vendor/html-theme-web2-1.0.0.tar.gz] : GPG verify +} + +package "Python Project" { + [vendor/html-theme-web2-1.0.0.tar] --> [src/byteb4rb1e/sphinxcontrib/theme/web2/html-theme-web2.tar] : cp + [src/byteb4rb1e/sphinxcontrib/theme/web2/html-theme-web2.tar] ... [src/...] + [src/...] --> [dist] : build + [configure] --> [configure] : autoconf + [requirements.txt] <-- [Pipfile.lock] + [requirements-dev.txt] <-- [Pipfile.lock] +} + +package "Testing" { + [src/...] --> [test-reports/unit] : tox -m unit + [src/...] --> [test-reports/integration] : tox -m integration + [src/...] --> [test-reports/audit.json] : tox -m integration +} + +note right of [WEB2_PACKAGE_URL] + HTML theme tarball is fetched + as a compressed artifact +end note + +note right of [src/...] + Contains Python package source + and consumes the integrated theme +end note +@enduml diff --git a/pyproject.toml b/pyproject.toml index 5aa6513..5f4f841 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ description = "Functional theme for Sphinx documentation generator" authors = [ { name = "Tiara Rodney", email = "tiara.rodney@administratrix.de" } ] -license = { file = "LICENSE" } +license-files = ["LICENSE"] readme = "README.md" classifiers = [ "Development Status :: 1 - Planning", @@ -31,14 +31,18 @@ classifiers = [ "Topic :: Software Development :: Documentation", ] dependencies = [ - "sphinx >= 8.0,<9.0", + "sphinx >= 5.0" ] dynamic = ["version"] -requires-python = ">=3.8" +requires-python = ">=3.9" [project.entry-points."sphinx.html_themes"] web2 = "byteb4rb1e.sphinxcontrib.theme.web2" +[tool.setuptools.package-data] +# relative to root dir of package, NOT repository +"byteb4rb1e.sphinxcontrib.theme.web2" = ["*.tar", "*.tar.sha256"] + [project.urls] Bitbucket = "https://bitbucket.org/byteb4rb1e/sphinxcontrib-theme-seaharvest" GitHub = "https://github.com/ByteB4rb1e/sphinxcontrib-theme-seaharvest" diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/.gitignore b/src/byteb4rb1e/sphinxcontrib/theme/web2/.gitignore new file mode 100644 index 0000000..d874ad6 --- /dev/null +++ b/src/byteb4rb1e/sphinxcontrib/theme/web2/.gitignore @@ -0,0 +1 @@ +*.tar diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/_static_extra.tar.sha256 b/src/byteb4rb1e/sphinxcontrib/theme/web2/_static_extra.tar.sha256 new file mode 100644 index 0000000..d8d393b --- /dev/null +++ b/src/byteb4rb1e/sphinxcontrib/theme/web2/_static_extra.tar.sha256 @@ -0,0 +1 @@ +63e49714a06c865bf8f15e94f9d514cbcdb9927dc20c748a373e93570c4c8e8b \ No newline at end of file diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/assets/.gitignore b/src/byteb4rb1e/sphinxcontrib/theme/web2/assets/.gitignore deleted file mode 100644 index d772e58..0000000 --- a/src/byteb4rb1e/sphinxcontrib/theme/web2/assets/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -# generated by Tiara's HTML Theming Reference Implementation -# -# this .gitignore serves the purpose of allowing wrapping projects, that -# generate this project's assets dynamically, not having to worry about -# auxiliary debugging assets polution. The file is supposed to be copied by -# webpack into the output directory, so the globbing patterns shouldn't match -# the current directory. That's why it's called `gitignore` instead of -# `.gitignore` so that it isn't actually being picked up by git. webpack should -# rewrite the basename. -# -# Depending on your level of paranoia towards breaking changes in dependencies -# with no access to working versions, you can either choose to ignore the entire -# directory and generate HTML theme assets just-in-time, or commit them as -# static assets. I'm running registry proxies as pull-through mirrors locally, -# that I back up regularly, to keep my paranoia at bay. That way, I can.just -# gitignore the directory and generate all assets dynamically. -* -!/.gitignore -*.ts -*.map diff --git a/tests/integration/byteb4rb1e/sphinxcontrib/theme/web2/test_sphinx_theme.py b/tests/integration/byteb4rb1e/sphinxcontrib/theme/web2/test_sphinx_theme.py new file mode 100644 index 0000000..435f852 --- /dev/null +++ b/tests/integration/byteb4rb1e/sphinxcontrib/theme/web2/test_sphinx_theme.py @@ -0,0 +1,5 @@ + + +def test_default(): + """ + """ diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/byteb4rb1e/__init__.py b/tests/unit/byteb4rb1e/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/byteb4rb1e/sphinxcontrib/__init__.py b/tests/unit/byteb4rb1e/sphinxcontrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/byteb4rb1e/sphinxcontrib/theme/__init__.py b/tests/unit/byteb4rb1e/sphinxcontrib/theme/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/byteb4rb1e/sphinxcontrib/theme/web2/__init__.py b/tests/unit/byteb4rb1e/sphinxcontrib/theme/web2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/byteb4rb1e/sphinxcontrib/theme/web2/test_unarchive.py b/tests/unit/byteb4rb1e/sphinxcontrib/theme/web2/test_unarchive.py new file mode 100644 index 0000000..5428947 --- /dev/null +++ b/tests/unit/byteb4rb1e/sphinxcontrib/theme/web2/test_unarchive.py @@ -0,0 +1,3 @@ +def test_default(): + """ + """ diff --git a/tox.ini b/tox.ini index 6075fb8..b81dd10 100755 --- a/tox.ini +++ b/tox.ini @@ -1,73 +1,67 @@ [tox] -skipsdist = true -maxversion = 3.11.0 -isolated_build = True -env_list = - static-type-check +requires = + tox>=4.19 +env_list = + py3{8-12}-{unit} + py3{8-12}-sphinx{5-8}-{integration} lint - test - + format [testenv] -basepython = python3 deps = - {toxinidir} -setenv = PYTHONPATH = {toxinidir}/src - + . [testenv:lint] -description = lint with pylint -deps = - pylint >= 2.12.2, < 3 -commands = - python3 -m pylint {toxinidir}/src {posargs} - -[testenv:static-type-check] -description = static type checking -deps = - mypy >=1.5.1,<2 -commands = - python3 -m mypy {toxinidir}/src {posargs} - -[testenv:test] -description = test suite with pytest -deps = - pytest - pytest-cov -commands = - pytest \ - --junitxml=test-reports/full.xml \ - --cov-report term \ - --cov-report html:test-reports/coverage \ - --cov=wsgirouter \ - {posargs} - -[testenv:build-demo] -description = test suite with pytest -deps = - sphinx - {toxinidir} -commands = - sphinx-build -b html -Dhtml4_writer=0 \ - -d {envtmpdir}/doctrees demo \ - build/demo - -[testenv:autobuild-demo] -description = test suite with pytest -deps = - sphinx - sphinx-autobuild - {toxinidir} -commands = - sphinx-autobuild -b html -Dhtml4_writer=0 \ - -d {envtmpdir}/doctrees demo \ - --watch src/tiararodneycom_theme \ - build/demo - -[testenv:build-sdist] -description = build and package +description = run type check on code base +labels = static deps = - build >= 0.5.1, < 1 + mypy commands = - python3 -m build --sdist {posargs} + python3 -m mypy src tests --junit-xml test-reports/{env_name}.xml +[testenv:audit] +description = run type check on code base +labels = audit +deps = + pip-audit +commands = + pip-audit . + +[testenv:format] +description = run type check on code base +labels = static +deps = + black +commands = + black --check src tests + +[testenv:py3{9-13}-unit] +description = run type check on code base +labels = unit +deps = + {[testenv]deps} + pytest +commands = + pytest tests/unit --junitxml=test-reports/{env_name}.xml + +[testenv:py3{9-13}-sphinx{5-7}-integration] +description = run type check on code base +labels = integration +deps = + {[testenv]deps} + sphinx5: sphinx>=5.0,<=6.0 + sphinx6: sphinx>=6.0,<=7.0 + sphinx7: sphinx>=7.0,<=8.0 + pytest +commands = + pytest tests/integration --junitxml=test-reports/{env_name}.xml + +[testenv:py3{10-13}-sphinx8-integration] +description = run type check on code base +labels = integration +deps = + {[testenv]deps} + sphinx8: sphinx>=8.0,<=9.0 + pytest +commands = + pytest tests/integration --junitxml=test-reports/{env_name}.xml From 7bb0188a42212f109544e21280a5656215a5402d Mon Sep 17 00:00:00 2001 From: Tiara Rodney Date: Thu, 19 Jun 2025 17:58:46 +0200 Subject: [PATCH 6/6] dirty --- Makefile | 7 +- Pipfile | 9 +- Pipfile.lock | 157 ++---------------- pyproject.toml | 18 +- .../sphinxcontrib/theme/web2/__init__.py | 23 --- .../theme/{web2 => web20}/.gitignore | 0 .../sphinxcontrib/theme/web20/__init__.py | 23 +++ .../{web2 => web20}/_static_extra.tar.sha256 | 0 .../{web2 => web20}/changes/frameset.html | 0 .../{web2 => web20}/changes/rstsource.html | 0 .../changes/versionchanges.html | 0 .../theme/{web2 => web20}/defindex.html | 0 .../theme/{web2 => web20}/domainindex.html | 0 .../{web2 => web20}/genindex-single.html | 0 .../theme/{web2 => web20}/genindex-split.html | 0 .../theme/{web2 => web20}/genindex.html | 0 .../theme/{web2 => web20}/globaltoc.html | 0 .../theme/{web2 => web20}/layout.html | 0 .../theme/{web2 => web20}/localtoc.html | 0 .../theme/{web2 => web20}/opensearch.xml | 0 .../theme/{web2 => web20}/page.html | 0 .../theme/{web2 => web20}/relations.html | 0 .../theme/{web2 => web20}/search.html | 0 .../theme/{web2 => web20}/searchbox.html | 0 .../theme/{web2 => web20}/searchfield.html | 0 .../theme/{web2 => web20}/sourcelink.html | 0 .../theme/{web2 => web20}/theme.toml | 4 - .../theme/web20/test_sphinx_build.py | 31 ++++ tests/integration/conftest.py | 3 + tox.ini | 12 +- 30 files changed, 93 insertions(+), 194 deletions(-) delete mode 100644 src/byteb4rb1e/sphinxcontrib/theme/web2/__init__.py rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/.gitignore (100%) create mode 100644 src/byteb4rb1e/sphinxcontrib/theme/web20/__init__.py rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/_static_extra.tar.sha256 (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/changes/frameset.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/changes/rstsource.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/changes/versionchanges.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/defindex.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/domainindex.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/genindex-single.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/genindex-split.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/genindex.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/globaltoc.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/layout.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/localtoc.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/opensearch.xml (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/page.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/relations.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/search.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/searchbox.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/searchfield.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/sourcelink.html (100%) rename src/byteb4rb1e/sphinxcontrib/theme/{web2 => web20}/theme.toml (53%) create mode 100644 tests/integration/byteb4rb1e/sphinxcontrib/theme/web20/test_sphinx_build.py create mode 100644 tests/integration/conftest.py diff --git a/Makefile b/Makefile index 09fa329..cfc62fd 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ WEB2_PACKAGE_ID := html-theme-web2-1.0.0 WEB2_PACKAGE_URL := https://bitbucket.org/byteb4rb1e/html-theme-web2/downloads/$(WEB2_PACKAGE_ID).tar.gz -PYPKG_DIR := src/byteb4rb1e/sphinxcontrib/theme/web2 +PYPKG_DIR := src/byteb4rb1e/sphinxcontrib/theme/web20 WITH_GPG = $(shell command -v gpg && echo yes) PYTHON3=$(if $(wildcard .venv/.*),.venv/bin/python3,python3) @@ -35,10 +35,7 @@ $(PYPKG_DIR)/_static_extra.tar: vendor/$(WEB2_PACKAGE_ID).tar $(PYPKG_DIR)/_static_extra.tar.sha256: vendor/$(WEB2_PACKAGE_ID).tar.sha256 cp -vf "$<" "$@" -test-reports test-reports/: test-reports/unit test-reports/integration - -test-reports/unit: - $(PYTHON3) -m tox -m unit +test-reports test-reports/: test-reports/integration test-reports/integration: $(PYTHON3) -m tox -m integration diff --git a/Pipfile b/Pipfile index 45ff0f2..f6ae551 100644 --- a/Pipfile +++ b/Pipfile @@ -5,12 +5,9 @@ name = "pypi" [dev-packages] -tox = "~=4.24.2" -mypy = "~=1.15.0" -autopep8 = "~=2.3.2" -setuptools-scm = "~=8.2.0" -pipenv = "~=2024.4.1" -pylint = "~=3.3.6" +tox = "*" +setuptools-scm = "*" +pipenv = "*" build = "*" [requires] diff --git a/Pipfile.lock b/Pipfile.lock index fb48c8a..789b70a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "d1fc51a334c037b89fa2fd6f634d84d5bbf48801d138aef103211d1111c22b7c" + "sha256": "cc611a65c9337f2c4eeac34c5e620d626382f670a323ae780ff6385cec5e0610" }, "pipfile-spec": 6, "requires": { @@ -17,23 +17,6 @@ }, "default": {}, "develop": { - "astroid": { - "hashes": [ - "sha256:104fb9cb9b27ea95e847a94c003be03a9e039334a8ebca5ee27dafaf5c5711eb", - "sha256:c332157953060c6deb9caa57303ae0d20b0fbdb2e59b4a4f2a6ba49d0a7961ce" - ], - "markers": "python_full_version >= '3.9.0'", - "version": "==3.3.10" - }, - "autopep8": { - "hashes": [ - "sha256:89440a4f969197b69a995e4ce0661b031f455a9f776d2c5ba3dbd83466931758", - "sha256:ce8ad498672c845a0c3de2629c15b635ec2b05ef8177a6e7c91c74f3e9b51128" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==2.3.2" - }, "build": { "hashes": [ "sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5", @@ -45,19 +28,19 @@ }, "cachetools": { "hashes": [ - "sha256:82e73ba88f7b30228b5507dce1a1f878498fc669d972aef2dde4f3a3c24f103e", - "sha256:f225782b84438f828328fc2ad74346522f27e5b1440f4e9fd18b20ebfd1aa2cf" + "sha256:1c7bb3cf9193deaf3508b7c5f2a79986c13ea38965c5adcff1f84519cf39163e", + "sha256:b4c4f404392848db3ce7aac34950d17be4d864da4b8b66911008e430bc544587" ], "markers": "python_version >= '3.9'", - "version": "==6.0.0" + "version": "==6.1.0" }, "certifi": { "hashes": [ - "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", - "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" + "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", + "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b" ], - "markers": "python_version >= '3.6'", - "version": "==2025.4.26" + "markers": "python_version >= '3.7'", + "version": "==2025.6.15" }, "chardet": { "hashes": [ @@ -75,14 +58,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", "version": "==0.4.6" }, - "dill": { - "hashes": [ - "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", - "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049" - ], - "markers": "python_version >= '3.8'", - "version": "==0.4.0" - }, "distlib": { "hashes": [ "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", @@ -98,69 +73,6 @@ "markers": "python_version >= '3.9'", "version": "==3.18.0" }, - "isort": { - "hashes": [ - "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", - "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615" - ], - "markers": "python_full_version >= '3.9.0'", - "version": "==6.0.1" - }, - "mccabe": { - "hashes": [ - "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", - "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" - ], - "markers": "python_version >= '3.6'", - "version": "==0.7.0" - }, - "mypy": { - "hashes": [ - "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", - "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", - "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f", - "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2", - "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f", - "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b", - "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5", - "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", - "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", - "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", - "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c", - "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828", - "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba", - "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", - "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", - "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b", - "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", - "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e", - "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13", - "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", - "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", - "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", - "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", - "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b", - "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", - "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559", - "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3", - "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f", - "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", - "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980", - "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078", - "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==1.15.0" - }, - "mypy-extensions": { - "hashes": [ - "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", - "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" - ], - "markers": "python_version >= '3.8'", - "version": "==1.1.0" - }, "packaging": { "hashes": [ "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", @@ -171,12 +83,12 @@ }, "pipenv": { "hashes": [ - "sha256:ab26ee98a7d83d342c1f562ee0564094ab1de091e5d5cec4eeaa95fb600de998", - "sha256:e8ea6105c1cdda7d5c19df7bd6439a006751f3d4e017602c791e7b51314adf84" + "sha256:87370bedcf0ff66d226af07ca341ae94afcc08fed90d57ad9fea9ffd44ced4d3", + "sha256:f0a67aa928824e61003d52acea72a94b180800019f03d38a311966f6330bc8d1" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==2024.4.1" + "markers": "python_version >= '3.9'", + "version": "==2025.0.3" }, "platformdirs": { "hashes": [ @@ -194,23 +106,6 @@ "markers": "python_version >= '3.9'", "version": "==1.6.0" }, - "pycodestyle": { - "hashes": [ - "sha256:35863c5974a271c7a726ed228a14a4f6daf49df369d8c50cd9a6f58a5e143ba9", - "sha256:c8415bf09abe81d9c7f872502a6eee881fbe85d8763dd5b9924bb0a01d67efae" - ], - "markers": "python_version >= '3.9'", - "version": "==2.13.0" - }, - "pylint": { - "hashes": [ - "sha256:2b11de8bde49f9c5059452e0c310c079c746a0a8eeaa789e5aa966ecc23e4559", - "sha256:43860aafefce92fca4cf6b61fe199cdc5ae54ea28f9bf4cd49de267b5195803d" - ], - "index": "pypi", - "markers": "python_full_version >= '3.9.0'", - "version": "==3.3.7" - }, "pyproject-api": { "hashes": [ "sha256:43c9918f49daab37e302038fc1aed54a8c7a91a9fa935d00b9a485f37e0f5335", @@ -237,37 +132,21 @@ }, "setuptools-scm": { "hashes": [ - "sha256:136e2b1d393d709d2bcf26f275b8dec06c48b811154167b0fd6bb002aad17d6d", - "sha256:a18396a1bc0219c974d1a74612b11f9dce0d5bd8b1dc55c65f6ac7fd609e8c28" + "sha256:332ca0d43791b818b841213e76b1971b7711a960761c5bea5fc5cdb5196fbce3", + "sha256:3d555e92b75dacd037d32bafdf94f97af51ea29ae8c7b234cf94b7a5bd242a63" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==8.2.0" - }, - "tomlkit": { - "hashes": [ - "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", - "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0" - ], - "markers": "python_version >= '3.8'", - "version": "==0.13.3" + "version": "==8.3.1" }, "tox": { "hashes": [ - "sha256:92e8290e76ad4e15748860a205865696409a2d014eedeb796a34a0f3b5e7336e", - "sha256:d5948b350f76fae436d6545a5e87c2b676ab7a0d7d88c1308651245eadbe8aea" + "sha256:2b8a7fb986b82aa2c830c0615082a490d134e0626dbc9189986da46a313c4f20", + "sha256:b97d5ecc0c0d5755bcc5348387fef793e1bfa68eb33746412f4c60881d7f5f57" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==4.24.2" - }, - "typing-extensions": { - "hashes": [ - "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", - "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af" - ], "markers": "python_version >= '3.9'", - "version": "==4.14.0" + "version": "==4.27.0" }, "virtualenv": { "hashes": [ diff --git a/pyproject.toml b/pyproject.toml index 5f4f841..d1c8f26 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ requires = [ build-backend = "setuptools.build_meta" [project] -name = "byteb4rb1e.sphinxcontrib.theme.web2" +name = "byteb4rb1e.sphinxcontrib.theme.web20" description = "Functional theme for Sphinx documentation generator" authors = [ { name = "Tiara Rodney", email = "tiara.rodney@administratrix.de" } @@ -31,21 +31,27 @@ classifiers = [ "Topic :: Software Development :: Documentation", ] dependencies = [ - "sphinx >= 5.0" + "sphinx >= 5.0", + "byteb4rb1e.sphinxcontrib.ext @ git+https://bitbucket.org/byteb4rb1e/sphinxcontrib.git@a4fd97b55a2bff04b162e2f00dba148b0303f833" ] dynamic = ["version"] requires-python = ">=3.9" [project.entry-points."sphinx.html_themes"] -web2 = "byteb4rb1e.sphinxcontrib.theme.web2" +web20 = "byteb4rb1e.sphinxcontrib.theme.web20" [tool.setuptools.package-data] # relative to root dir of package, NOT repository -"byteb4rb1e.sphinxcontrib.theme.web2" = ["*.tar", "*.tar.sha256"] +"byteb4rb1e.sphinxcontrib.theme.web20" = [ + "*.tar", + "*.tar.sha256", + "theme.toml", + "**/*.html" +] [project.urls] -Bitbucket = "https://bitbucket.org/byteb4rb1e/sphinxcontrib-theme-seaharvest" -GitHub = "https://github.com/ByteB4rb1e/sphinxcontrib-theme-seaharvest" +Bitbucket = "https://bitbucket.org/byteb4rb1e/sphinxcontrib-theme-web20" +GitHub = "https://github.com/ByteB4rb1e/sphinxcontrib-theme-web20" [tool.mypy] strict = true diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/__init__.py b/src/byteb4rb1e/sphinxcontrib/theme/web2/__init__.py deleted file mode 100644 index 4937c60..0000000 --- a/src/byteb4rb1e/sphinxcontrib/theme/web2/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -Tiara's Sphinx theme reference implementation. -""" - -from pathlib import Path -from sys import version_info as python_version - -from sphinx import version_info as sphinx_version -from sphinx.locale import _ -from sphinx.util.logging import getLogger - -logger = getLogger(__name__) - -def setup(app): - """ - """ - app.require_sphinx('8.0') - - app.add_html_theme('web2', Path(__file__).resolve().parent) - - app.add_js_file('assets/script/theme.js') - - return {'parallel_read_safe': True, 'parallel_write_safe': True} diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/.gitignore b/src/byteb4rb1e/sphinxcontrib/theme/web20/.gitignore similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/.gitignore rename to src/byteb4rb1e/sphinxcontrib/theme/web20/.gitignore diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web20/__init__.py b/src/byteb4rb1e/sphinxcontrib/theme/web20/__init__.py new file mode 100644 index 0000000..2af760e --- /dev/null +++ b/src/byteb4rb1e/sphinxcontrib/theme/web20/__init__.py @@ -0,0 +1,23 @@ +""" +Tiara's Sphinx theme reference implementation. +""" +from pathlib import Path + +import sphinx.application +from sphinx.util.logging import getLogger + +logger = getLogger(__name__) + +def setup(app: sphinx.application.Sphinx): + """ + """ + app.require_sphinx('5.0') + app.add_html_theme('web20', Path(__file__).resolve().parent) + app.setup_extension("byteb4rb1e.sphinxcontrib.ext.html_static_archive") + + app.config["html_static_archive"] = 'pkg://byteb4rb1e.sphinxcontrib.theme.web20/_static_extra.tar' + + app.add_js_file('script/theme.js') + app.add_css_file('style/theme.css') + + return {'parallel_read_safe': True, 'parallel_write_safe': True} diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/_static_extra.tar.sha256 b/src/byteb4rb1e/sphinxcontrib/theme/web20/_static_extra.tar.sha256 similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/_static_extra.tar.sha256 rename to src/byteb4rb1e/sphinxcontrib/theme/web20/_static_extra.tar.sha256 diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/changes/frameset.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/changes/frameset.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/changes/frameset.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/changes/frameset.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/changes/rstsource.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/changes/rstsource.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/changes/rstsource.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/changes/rstsource.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/changes/versionchanges.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/changes/versionchanges.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/changes/versionchanges.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/changes/versionchanges.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/defindex.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/defindex.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/defindex.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/defindex.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/domainindex.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/domainindex.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/domainindex.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/domainindex.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/genindex-single.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/genindex-single.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/genindex-single.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/genindex-single.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/genindex-split.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/genindex-split.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/genindex-split.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/genindex-split.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/genindex.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/genindex.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/genindex.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/genindex.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/globaltoc.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/globaltoc.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/globaltoc.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/globaltoc.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/layout.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/layout.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/layout.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/layout.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/localtoc.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/localtoc.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/localtoc.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/localtoc.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/opensearch.xml b/src/byteb4rb1e/sphinxcontrib/theme/web20/opensearch.xml similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/opensearch.xml rename to src/byteb4rb1e/sphinxcontrib/theme/web20/opensearch.xml diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/page.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/page.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/page.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/page.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/relations.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/relations.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/relations.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/relations.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/search.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/search.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/search.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/search.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/searchbox.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/searchbox.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/searchbox.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/searchbox.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/searchfield.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/searchfield.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/searchfield.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/searchfield.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/sourcelink.html b/src/byteb4rb1e/sphinxcontrib/theme/web20/sourcelink.html similarity index 100% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/sourcelink.html rename to src/byteb4rb1e/sphinxcontrib/theme/web20/sourcelink.html diff --git a/src/byteb4rb1e/sphinxcontrib/theme/web2/theme.toml b/src/byteb4rb1e/sphinxcontrib/theme/web20/theme.toml similarity index 53% rename from src/byteb4rb1e/sphinxcontrib/theme/web2/theme.toml rename to src/byteb4rb1e/sphinxcontrib/theme/web20/theme.toml index a79e5a7..936dc0f 100644 --- a/src/byteb4rb1e/sphinxcontrib/theme/web2/theme.toml +++ b/src/byteb4rb1e/sphinxcontrib/theme/web20/theme.toml @@ -1,14 +1,10 @@ [theme] inherit = "none" -stylesheets = [ - "_static/style/seaharvest.css", -] sidebars = [ "localtoc.html", "relations.html", "sourcelink.html", "searchbox.html", ] -pygments_style = { default = "style_name", dark = "dark_style" } [options] diff --git a/tests/integration/byteb4rb1e/sphinxcontrib/theme/web20/test_sphinx_build.py b/tests/integration/byteb4rb1e/sphinxcontrib/theme/web20/test_sphinx_build.py new file mode 100644 index 0000000..02b9a22 --- /dev/null +++ b/tests/integration/byteb4rb1e/sphinxcontrib/theme/web20/test_sphinx_build.py @@ -0,0 +1,31 @@ +from pathlib import Path + +import pytest + +from byteb4rb1e.sphinxcontrib.testing.pytest.fixtures import ( + mock_sphinx_testapp, + mock_sphinx_testsrc_dir +) + + +def test_default( + mock_sphinx_testapp, + mock_sphinx_testsrc_dir, +) -> None: + """ + """ + src_dir = mock_sphinx_testsrc_dir() + (src_dir / 'conf.py').write_text(""" +project = "foobar" +master_doc = "index" +extensions = ["byteb4rb1e.sphinxcontrib.theme"] +html_theme = "web20" +""") + + app = mock_sphinx_testapp(srcdir=src_dir) + + app.build(force_all=True) + + assert (Path(app.outdir) / '_static' / 'style' / 'theme.css').exists() + assert (Path(app.outdir) / '_static' / 'script' / 'theme.js').exists() + diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py new file mode 100644 index 0000000..116baeb --- /dev/null +++ b/tests/integration/conftest.py @@ -0,0 +1,3 @@ + + +pytest_plugins = ["byteb4rb1e.sphinxcontrib.testing.pytest.fixtures"] diff --git a/tox.ini b/tox.ini index b81dd10..4c2167e 100755 --- a/tox.ini +++ b/tox.ini @@ -2,8 +2,7 @@ requires = tox>=4.19 env_list = - py3{8-12}-{unit} - py3{8-12}-sphinx{5-8}-{integration} + integration-py3{9-13}-sphinx{5-8} lint format @@ -35,15 +34,6 @@ deps = commands = black --check src tests -[testenv:py3{9-13}-unit] -description = run type check on code base -labels = unit -deps = - {[testenv]deps} - pytest -commands = - pytest tests/unit --junitxml=test-reports/{env_name}.xml - [testenv:py3{9-13}-sphinx{5-7}-integration] description = run type check on code base labels = integration