From d8e70ef9213837134e659a6e5d94d6a686c13756 Mon Sep 17 00:00:00 2001 From: Tiara Rodney Date: Wed, 11 Jun 2025 20:13:13 +0200 Subject: [PATCH 1/5] 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 2/5] 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 3/5] 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 4/5] 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 5/5] 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