Compare commits

..

1 commit

Author SHA1 Message Date
Tiara Rodney
d5772b47d4
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.
2025-06-09 18:10:34 +02:00
49 changed files with 700 additions and 298 deletions

12
.gitignore vendored
View file

@ -1,17 +1,11 @@
.tox/
/dist/ /dist/
/build/ /build/
*.egg-info /src/**/*.egg-info
*.pyc /src/**/*.pyc
/src/**/__pycache/
/.venv/ /.venv/
/autom4te.cache/ /autom4te.cache/
/config.log /config.log
/config.status /config.status
/configure~ /configure~
vendor/**/*.tar.gz
vendor/**/*.tar
test-reports/

View file

View file

@ -1,59 +1,31 @@
WEB2_PACKAGE_ID := html-theme-web2-1.0.0 .PHONY: requirements.txt requirements-dev.txt configure Pipfile.lock src/sphinx_theme_ref/assets build
WEB2_PACKAGE_URL := https://bitbucket.org/byteb4rb1e/html-theme-web2/downloads/$(WEB2_PACKAGE_ID).tar.gz
PYPKG_DIR := src/byteb4rb1e/sphinxcontrib/theme/web20
WITH_GPG = $(shell command -v gpg && echo yes)
PYTHON3=$(if $(wildcard .venv/.*),.venv/bin/python3,python3) PKG_BASENAME := sphinx_theme_ref
VERSION=$(shell $(PYTHON3) -m setuptools_scm) VENDOR_OUTPUT_PATH := $(shell realpath ./src/sphinx_theme_ref/assets)
.chore: requirements.txt requirements-dev.txt Pipfile.lock configure Pipfile.lock:
.venv/bin/pipenv lock
.clean: requirements.txt:
rm -rvf dist/ build/ .venv/bin/pipenv requirements > requirements.txt
requirements-dev.txt:
.venv/bin/pipenv requirements --dev-only > requirements-dev.txt
configure: configure:
autoconf autoconf
dist: src/ src/sphinx_theme_ref/assets:
$(PYTHON3) -m build rm -r src/$(PKG_BASENAME)/assets
make -C vendor/html-theme-ref build/production OUTPUT_PATH=$(VENDOR_OUTPUT_PATH)
Pipfile.lock: # user acceptance testing
pipenv lock uat:
trap 'kill 0' SIGINT; \
make -C vendor/html-theme-ref watch OUTPUT_PATH=$(VENDOR_OUTPUT_PATH) & \
wait
requirements.txt: build:
$(PYTHON3) -m pipenv requirements > requirements.txt .venv/bin/pipenv run build
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/integration
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))"

11
NOTES
View file

@ -1,11 +0,0 @@
=== Configuration ===
1. Run sh configure
2. Run make .chore
Ḿakefile conventions
abstract targets (e.g. chore, clean, etc.) must be prepended with an underscore.

15
Pipfile
View file

@ -3,15 +3,20 @@ url = "https://pypi.org/simple"
verify_ssl = true verify_ssl = true
name = "pypi" name = "pypi"
[packages]
sphinx-theme-ref = {file = ".", editable = true}
[dev-packages] [dev-packages]
tox = "*" tox = "~=4.24.2"
setuptools-scm = "*" mypy = "~=1.15.0"
pipenv = "*" autopep8 = "~=2.3.2"
setuptools-scm = "~=8.2.0"
pipenv = "~=2024.4.1"
pylint = "~=3.3.6"
build = "*" build = "*"
[requires] [requires]
python_version = "3" python_version = "3.11"
[scripts] [scripts]
"build/release" = "python3 -m build" "build" = "python3 -m build"

536
Pipfile.lock generated
View file

@ -1,11 +1,11 @@
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "cc611a65c9337f2c4eeac34c5e620d626382f670a323ae780ff6385cec5e0610" "sha256": "392503c17641b02b8fc371df27b291782f0d9bec49c60057424a5147f859d3c5"
}, },
"pipfile-spec": 6, "pipfile-spec": 6,
"requires": { "requires": {
"python_version": "3" "python_version": "3.11"
}, },
"sources": [ "sources": [
{ {
@ -15,8 +15,354 @@
} }
] ]
}, },
"default": {}, "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"
}
},
"develop": { "develop": {
"astroid": {
"hashes": [
"sha256:622cc8e3048684aa42c820d9d218978021c3c3d174fb03a9f0d615921744f550",
"sha256:d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248"
],
"markers": "python_full_version >= '3.9.0'",
"version": "==3.3.9"
},
"autopep8": {
"hashes": [
"sha256:89440a4f969197b69a995e4ce0661b031f455a9f776d2c5ba3dbd83466931758",
"sha256:ce8ad498672c845a0c3de2629c15b635ec2b05ef8177a6e7c91c74f3e9b51128"
],
"index": "pypi",
"markers": "python_version >= '3.9'",
"version": "==2.3.2"
},
"build": { "build": {
"hashes": [ "hashes": [
"sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5", "sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5",
@ -28,19 +374,19 @@
}, },
"cachetools": { "cachetools": {
"hashes": [ "hashes": [
"sha256:1c7bb3cf9193deaf3508b7c5f2a79986c13ea38965c5adcff1f84519cf39163e", "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4",
"sha256:b4c4f404392848db3ce7aac34950d17be4d864da4b8b66911008e430bc544587" "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a"
], ],
"markers": "python_version >= '3.9'", "markers": "python_version >= '3.7'",
"version": "==6.1.0" "version": "==5.5.2"
}, },
"certifi": { "certifi": {
"hashes": [ "hashes": [
"sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651",
"sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b" "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"
], ],
"markers": "python_version >= '3.7'", "markers": "python_version >= '3.6'",
"version": "==2025.6.15" "version": "==2025.1.31"
}, },
"chardet": { "chardet": {
"hashes": [ "hashes": [
@ -58,6 +404,14 @@
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.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" "version": "==0.4.6"
}, },
"dill": {
"hashes": [
"sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a",
"sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"
],
"markers": "python_version >= '3.8'",
"version": "==0.3.9"
},
"distlib": { "distlib": {
"hashes": [ "hashes": [
"sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87",
@ -73,46 +427,126 @@
"markers": "python_version >= '3.9'", "markers": "python_version >= '3.9'",
"version": "==3.18.0" "version": "==3.18.0"
}, },
"packaging": { "isort": {
"hashes": [ "hashes": [
"sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450",
"sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615"
], ],
"markers": "python_version >= '3.8'", "markers": "python_full_version >= '3.9.0'",
"version": "==25.0" "version": "==6.0.1"
}, },
"pipenv": { "mccabe": {
"hashes": [ "hashes": [
"sha256:87370bedcf0ff66d226af07ca341ae94afcc08fed90d57ad9fea9ffd44ced4d3", "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325",
"sha256:f0a67aa928824e61003d52acea72a94b180800019f03d38a311966f6330bc8d1" "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", "index": "pypi",
"markers": "python_version >= '3.9'", "markers": "python_version >= '3.9'",
"version": "==2025.0.3" "version": "==1.15.0"
},
"mypy-extensions": {
"hashes": [
"sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d",
"sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"
],
"markers": "python_version >= '3.5'",
"version": "==1.0.0"
},
"packaging": {
"hashes": [
"sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
"sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"
],
"markers": "python_version >= '3.8'",
"version": "==24.2"
},
"pipenv": {
"hashes": [
"sha256:ab26ee98a7d83d342c1f562ee0564094ab1de091e5d5cec4eeaa95fb600de998",
"sha256:e8ea6105c1cdda7d5c19df7bd6439a006751f3d4e017602c791e7b51314adf84"
],
"index": "pypi",
"markers": "python_version >= '3.8'",
"version": "==2024.4.1"
}, },
"platformdirs": { "platformdirs": {
"hashes": [ "hashes": [
"sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94",
"sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351"
], ],
"markers": "python_version >= '3.9'", "markers": "python_version >= '3.9'",
"version": "==4.3.8" "version": "==4.3.7"
}, },
"pluggy": { "pluggy": {
"hashes": [ "hashes": [
"sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
"sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"
], ],
"markers": "python_version >= '3.9'", "markers": "python_version >= '3.8'",
"version": "==1.6.0" "version": "==1.5.0"
},
"pycodestyle": {
"hashes": [
"sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3",
"sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"
],
"markers": "python_version >= '3.8'",
"version": "==2.12.1"
},
"pylint": {
"hashes": [
"sha256:8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6",
"sha256:b634a041aac33706d56a0d217e6587228c66427e20ec21a019bc4cdee48c040a"
],
"index": "pypi",
"markers": "python_full_version >= '3.9.0'",
"version": "==3.3.6"
}, },
"pyproject-api": { "pyproject-api": {
"hashes": [ "hashes": [
"sha256:43c9918f49daab37e302038fc1aed54a8c7a91a9fa935d00b9a485f37e0f5335", "sha256:326df9d68dea22d9d98b5243c46e3ca3161b07a1b9b18e213d1e24fd0e605766",
"sha256:7d6238d92f8962773dd75b5f0c4a6a27cce092a14b623b811dba656f3b628948" "sha256:7e8a9854b2dfb49454fae421cb86af43efbb2b2454e5646ffb7623540321ae6e"
], ],
"markers": "python_version >= '3.9'", "markers": "python_version >= '3.9'",
"version": "==1.9.1" "version": "==1.9.0"
}, },
"pyproject-hooks": { "pyproject-hooks": {
"hashes": [ "hashes": [
@ -124,37 +558,53 @@
}, },
"setuptools": { "setuptools": {
"hashes": [ "hashes": [
"sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", "sha256:583b361c8da8de57403743e756609670de6fb2345920e36dc5c2d914c319c945",
"sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c" "sha256:67122e78221da5cf550ddd04cf8742c8fe12094483749a792d56cd669d6cf58c"
], ],
"markers": "python_version >= '3.9'", "markers": "python_version >= '3.9'",
"version": "==80.9.0" "version": "==77.0.3"
}, },
"setuptools-scm": { "setuptools-scm": {
"hashes": [ "hashes": [
"sha256:332ca0d43791b818b841213e76b1971b7711a960761c5bea5fc5cdb5196fbce3", "sha256:136e2b1d393d709d2bcf26f275b8dec06c48b811154167b0fd6bb002aad17d6d",
"sha256:3d555e92b75dacd037d32bafdf94f97af51ea29ae8c7b234cf94b7a5bd242a63" "sha256:a18396a1bc0219c974d1a74612b11f9dce0d5bd8b1dc55c65f6ac7fd609e8c28"
], ],
"index": "pypi", "index": "pypi",
"markers": "python_version >= '3.8'", "markers": "python_version >= '3.8'",
"version": "==8.3.1" "version": "==8.2.0"
},
"tomlkit": {
"hashes": [
"sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde",
"sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"
],
"markers": "python_version >= '3.8'",
"version": "==0.13.2"
}, },
"tox": { "tox": {
"hashes": [ "hashes": [
"sha256:2b8a7fb986b82aa2c830c0615082a490d134e0626dbc9189986da46a313c4f20", "sha256:92e8290e76ad4e15748860a205865696409a2d014eedeb796a34a0f3b5e7336e",
"sha256:b97d5ecc0c0d5755bcc5348387fef793e1bfa68eb33746412f4c60881d7f5f57" "sha256:d5948b350f76fae436d6545a5e87c2b676ab7a0d7d88c1308651245eadbe8aea"
], ],
"index": "pypi", "index": "pypi",
"markers": "python_version >= '3.9'", "markers": "python_version >= '3.8'",
"version": "==4.27.0" "version": "==4.24.2"
},
"typing-extensions": {
"hashes": [
"sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
"sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
],
"markers": "python_version >= '3.8'",
"version": "==4.12.2"
}, },
"virtualenv": { "virtualenv": {
"hashes": [ "hashes": [
"sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170",
"sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af" "sha256:95e39403fcf3940ac45bc717597dba16110b74506131845d9b687d5e73d947ac"
], ],
"markers": "python_version >= '3.8'", "markers": "python_version >= '3.8'",
"version": "==20.31.2" "version": "==20.29.3"
} }
} }
} }

View file

@ -1,4 +1,4 @@
<a name="byteb4rb1e/sphinxcontrib/theme/web2"></a> <a name="tiara-sphinx-theme"></a>
# Tiara's Sphinx Theme Reference Implementation # Tiara's Sphinx Theme Reference Implementation
> 🛌 **NOTICE:** This project is taking a naap. It depends upon > 🛌 **NOTICE:** This project is taking a naap. It depends upon

View file

@ -1,2 +0,0 @@
$(patsubst %.puml,%.png,$(wildcard **/*.puml)):
plantuml "$$(echo "$@" | sed 's|.png$$|.puml|')"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

View file

@ -1,32 +0,0 @@
@startuml
package "Vendor Source" {
[WEB2_PACKAGE_URL] --> [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

View file

@ -7,12 +7,12 @@ requires = [
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"
[project] [project]
name = "byteb4rb1e.sphinxcontrib.theme.web20" name = "byteb4rb1e.sphinxcontrib.theme.seaharvest"
description = "Functional theme for Sphinx documentation generator" description = "Functional theme for Sphinx documentation generator"
authors = [ authors = [
{ name = "Tiara Rodney", email = "tiara.rodney@administratrix.de" } { name = "Tiara Rodney", email = "tiara.rodney@administratrix.de" }
] ]
license-files = ["LICENSE"] license = { file = "LICENSE" }
readme = "README.md" readme = "README.md"
classifiers = [ classifiers = [
"Development Status :: 1 - Planning", "Development Status :: 1 - Planning",
@ -31,27 +31,17 @@ classifiers = [
"Topic :: Software Development :: Documentation", "Topic :: Software Development :: Documentation",
] ]
dependencies = [ dependencies = [
"sphinx >= 5.0", "sphinx >= 8.0,<9.0",
"byteb4rb1e.sphinxcontrib.ext @ git+https://bitbucket.org/byteb4rb1e/sphinxcontrib.git@a4fd97b55a2bff04b162e2f00dba148b0303f833"
] ]
dynamic = ["version"] dynamic = ["version"]
requires-python = ">=3.9" requires-python = ">=3.8"
[project.entry-points."sphinx.html_themes"] [project.entry-points."sphinx.html_themes"]
web20 = "byteb4rb1e.sphinxcontrib.theme.web20" seaharvest = "byteb4rb1e.sphinxcontrib.theme.seaharvest"
[tool.setuptools.package-data]
# relative to root dir of package, NOT repository
"byteb4rb1e.sphinxcontrib.theme.web20" = [
"*.tar",
"*.tar.sha256",
"theme.toml",
"**/*.html"
]
[project.urls] [project.urls]
Bitbucket = "https://bitbucket.org/byteb4rb1e/sphinxcontrib-theme-web20" Bitbucket = "https://bitbucket.org/byteb4rb1e/sphinxcontrib-theme-seaharvest"
GitHub = "https://github.com/ByteB4rb1e/sphinxcontrib-theme-web20" GitHub = "https://github.com/ByteB4rb1e/sphinxcontrib-theme-seaharvest"
[tool.mypy] [tool.mypy]
strict = true strict = true

View file

@ -0,0 +1,80 @@
"""
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: application.Sphinx):
"""
"""
app.require_sphinx('5.0')
rootdir = (Path(__file__) / ('../' * 6))
archive = (rootdir / 'vendor/{static_archive_basename}').resolve()
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}

View file

@ -0,0 +1,20 @@
# 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

View file

@ -1,10 +1,14 @@
[theme] [theme]
inherit = "none" inherit = "none"
stylesheets = [
"_static/style/seaharvest.css",
]
sidebars = [ sidebars = [
"localtoc.html", "localtoc.html",
"relations.html", "relations.html",
"sourcelink.html", "sourcelink.html",
"searchbox.html", "searchbox.html",
] ]
pygments_style = { default = "style_name", dark = "dark_style" }
[options] [options]

View file

@ -1 +0,0 @@
*.tar

View file

@ -1,23 +0,0 @@
"""
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}

View file

@ -1 +0,0 @@
63e49714a06c865bf8f15e94f9d514cbcdb9927dc20c748a373e93570c4c8e8b

View file

@ -1,5 +0,0 @@
def test_default():
"""
"""

View file

@ -1,31 +0,0 @@
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()

View file

@ -1,3 +0,0 @@
pytest_plugins = ["byteb4rb1e.sphinxcontrib.testing.pytest.fixtures"]

View file

View file

@ -1,3 +0,0 @@
def test_default():
"""
"""

90
tox.ini
View file

@ -1,57 +1,73 @@
[tox] [tox]
requires = skipsdist = true
tox>=4.19 maxversion = 3.11.0
isolated_build = True
env_list = env_list =
integration-py3{9-13}-sphinx{5-8} static-type-check
lint lint
format test
[testenv] [testenv]
basepython = python3
deps = deps =
. {toxinidir}
setenv = PYTHONPATH = {toxinidir}/src
[testenv:lint] [testenv:lint]
description = run type check on code base description = lint with pylint
labels = static
deps = deps =
mypy pylint >= 2.12.2, < 3
commands = commands =
python3 -m mypy src tests --junit-xml test-reports/{env_name}.xml python3 -m pylint {toxinidir}/src {posargs}
[testenv:audit] [testenv:static-type-check]
description = run type check on code base description = static type checking
labels = audit
deps = deps =
pip-audit mypy >=1.5.1,<2
commands = commands =
pip-audit . python3 -m mypy {toxinidir}/src {posargs}
[testenv:format] [testenv:test]
description = run type check on code base description = test suite with pytest
labels = static
deps = deps =
black
commands =
black --check src tests
[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 pytest
pytest-cov
commands = commands =
pytest tests/integration --junitxml=test-reports/{env_name}.xml pytest \
--junitxml=test-reports/full.xml \
--cov-report term \
--cov-report html:test-reports/coverage \
--cov=wsgirouter \
{posargs}
[testenv:py3{10-13}-sphinx8-integration] [testenv:build-demo]
description = run type check on code base description = test suite with pytest
labels = integration
deps = deps =
{[testenv]deps} sphinx
sphinx8: sphinx>=8.0,<=9.0 {toxinidir}
pytest
commands = commands =
pytest tests/integration --junitxml=test-reports/{env_name}.xml 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
deps =
build >= 0.5.1, < 1
commands =
python3 -m build --sdist {posargs}

View file

@ -1,10 +0,0 @@
-----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-----

1
vendor/html-theme-seaharvest vendored Submodule

@ -0,0 +1 @@
Subproject commit 51a8959d251de8e3f6c78c88bd6b18575bd10502

View file

@ -1,7 +0,0 @@
-----BEGIN PGP SIGNATURE-----
iHUEABYKAB0WIQSRzYJudLAXTRgZA975fHCUHNjE7wUCaFQrNAAKCRD5fHCUHNjE
7xb6AQDqP8+VECRJG+KyGe+5Z4PUWXbkb1l2J++N//uRmUwP2gEAxx0vS75IPPrO
PI1t8qiW9dQ4aN/YI7PEGmQ/lA4FpAc=
=qszW
-----END PGP SIGNATURE-----

View file

@ -1 +0,0 @@
63e49714a06c865bf8f15e94f9d514cbcdb9927dc20c748a373e93570c4c8e8b