This commit is contained in:
Tiara Rodney 2025-05-25 21:09:56 +02:00
parent a6979d54bd
commit 9632c5a54a
No known key found for this signature in database
GPG key ID: 5F43FAB4FBE5B5EB
9 changed files with 355 additions and 19 deletions

View file

@ -1,4 +1,10 @@
.PHONY: chore configure requirements-dev.txt requirements.txt
BITBUCKET_REPO_SLUG := "sphinxcontrib"
BITBUCKET_WORKSPACE := "byteb4rb1e"
DIST_PATH_PREFIX := "dist/"
TWINE_USERNAME := "__token__"
GPG_SIGNER_FINGERPRINT := "91CD826E74B0174D181903DEF97C70941CD8C4EF"
.PHONY: chore configure requirements-dev.txt requirements.txt publish archive
all: chore
@ -33,6 +39,35 @@ build/doc: docs
dist:
python3 -m pipenv run -v dist
ifdef SIGN
for path in $(DIST_PATH_PREFIX)*.tar.gz $(DIST_PATH_PREFIX)*.whl; do \
echo "$$path"; \
gpg --detach-sign --local-user $(GPG_SIGNER_FINGERPRINT) -v -a --yes "$$path"; \
done
endif
publish: dist
ifndef TWINE_PASSWORD
$(error TWINE_PASSWORD not set)
endif
for path in $(DIST_PATH_PREFIX)*.tar.gz $(DIST_PATH_PREFIX)*.whl; do \
echo "$$path"; \
twine upload $$path $$(test -f "$$path".asc && echo "$$path.asc"); \
done
archive: dist
ifndef BITBUCKET_ACCESS_TOKEN
$(error BITBUCKET_ACCESS_TOKEN not set)
endif
for path in $(DIST_PATH_PREFIX)*; do \
echo "$$path"; \
curl \
--request POST \
--header "Authorization: Bearer $$BITBUCKET_ACCESS_TOKEN" \
--form "files=@$$path;filename=$$(basename "$$path")" \
--fail \
https://api.bitbucket.org/2.0/repositories/$(BITBUCKET_WORKSPACE)/$(BITBUCKET_REPO_SLUG)/downloads; \
done
clean:
rm -rvf autom4te.cache/ config.status config.log configure~ dist/ build/

View file

@ -12,6 +12,7 @@ setuptools-scm = "*"
pipenv = "*"
tox = "*"
build = "*"
twine = "*"
[requires]
python_version = "3"

145
Pipfile.lock generated
View file

@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
"sha256": "06d6d361f77abd3a009873bdf02bbe76ac5e016fdeba32a9e2a22e50ff21f82b"
"sha256": "48c822d9e7bedd5ee25106b31093ce10a0071d7b12f7861e4e4cc46c5549c9ed"
},
"pipfile-spec": 6,
"requires": {
@ -533,6 +533,14 @@
"markers": "python_version >= '3.9'",
"version": "==3.18.0"
},
"id": {
"hashes": [
"sha256:292cb8a49eacbbdbce97244f47a97b4c62540169c976552e497fd57df0734c1d",
"sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658"
],
"markers": "python_version >= '3.8'",
"version": "==1.5.0"
},
"idna": {
"hashes": [
"sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
@ -549,6 +557,30 @@
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==1.4.1"
},
"jaraco.classes": {
"hashes": [
"sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd",
"sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"
],
"markers": "python_version >= '3.8'",
"version": "==3.4.0"
},
"jaraco.context": {
"hashes": [
"sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3",
"sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"
],
"markers": "python_version >= '3.8'",
"version": "==6.0.1"
},
"jaraco.functools": {
"hashes": [
"sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d",
"sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"
],
"markers": "python_version >= '3.8'",
"version": "==4.1.0"
},
"jinja2": {
"hashes": [
"sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d",
@ -557,6 +589,22 @@
"markers": "python_version >= '3.7'",
"version": "==3.1.6"
},
"keyring": {
"hashes": [
"sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66",
"sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"
],
"markers": "python_version >= '3.9'",
"version": "==25.6.0"
},
"markdown-it-py": {
"hashes": [
"sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1",
"sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"
],
"markers": "python_version >= '3.8'",
"version": "==3.0.0"
},
"markupsafe": {
"hashes": [
"sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4",
@ -624,6 +672,52 @@
"markers": "python_version >= '3.9'",
"version": "==3.0.2"
},
"mdurl": {
"hashes": [
"sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8",
"sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"
],
"markers": "python_version >= '3.7'",
"version": "==0.1.2"
},
"more-itertools": {
"hashes": [
"sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3",
"sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e"
],
"markers": "python_version >= '3.9'",
"version": "==10.7.0"
},
"nh3": {
"hashes": [
"sha256:087ffadfdcd497658c3adc797258ce0f06be8a537786a7217649fc1c0c60c293",
"sha256:20979783526641c81d2f5bfa6ca5ccca3d1e4472474b162c6256745fbfe31cd1",
"sha256:2a5174551f95f2836f2ad6a8074560f261cf9740a48437d6151fd2d4d7d617ab",
"sha256:31eedcd7d08b0eae28ba47f43fd33a653b4cdb271d64f1aeda47001618348fde",
"sha256:4990e7ee6a55490dbf00d61a6f476c9a3258e31e711e13713b2ea7d6616f670e",
"sha256:55823c5ea1f6b267a4fad5de39bc0524d49a47783e1fe094bcf9c537a37df251",
"sha256:6141caabe00bbddc869665b35fc56a478eb774a8c1dfd6fba9fe1dfdf29e6efa",
"sha256:637d4a10c834e1b7d9548592c7aad760611415fcd5bd346f77fd8a064309ae6d",
"sha256:63ca02ac6f27fc80f9894409eb61de2cb20ef0a23740c7e29f9ec827139fa578",
"sha256:6ae319f17cd8960d0612f0f0ddff5a90700fa71926ca800e9028e7851ce44a6f",
"sha256:6c9c30b8b0d291a7c5ab0967ab200598ba33208f754f2f4920e9343bdd88f79a",
"sha256:713d16686596e556b65e7f8c58328c2df63f1a7abe1277d87625dcbbc012ef82",
"sha256:818f2b6df3763e058efa9e69677b5a92f9bc0acff3295af5ed013da544250d5b",
"sha256:9d67709bc0d7d1f5797b21db26e7a8b3d15d21c9c5f58ccfe48b5328483b685b",
"sha256:a5f77e62aed5c4acad635239ac1290404c7e940c81abe561fd2af011ff59f585",
"sha256:a772dec5b7b7325780922dd904709f0f5f3a79fbf756de5291c01370f6df0967",
"sha256:a7ea28cd49293749d67e4fcf326c554c83ec912cd09cd94aa7ec3ab1921c8283",
"sha256:ac7006c3abd097790e611fe4646ecb19a8d7f2184b882f6093293b8d9b887431",
"sha256:b3b5c58161e08549904ac4abd450dacd94ff648916f7c376ae4b2c0652b98ff9",
"sha256:b8d55ea1fc7ae3633d758a92aafa3505cd3cc5a6e40470c9164d54dff6f96d42",
"sha256:bb0014948f04d7976aabae43fcd4cb7f551f9f8ce785a4c9ef66e6c2590f8629",
"sha256:d002b648592bf3033adfd875a48f09b8ecc000abd7f6a8769ed86b6ccc70c759",
"sha256:d426d7be1a2f3d896950fe263332ed1662f6c78525b4520c8e9861f8d7f0d243",
"sha256:fcff321bd60c6c5c9cb4ddf2554e22772bb41ebd93ad88171bbbb6f271255286"
],
"markers": "python_version >= '3.8'",
"version": "==0.2.21"
},
"packaging": {
"hashes": [
"sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484",
@ -681,6 +775,22 @@
"markers": "python_version >= '3.7'",
"version": "==1.2.0"
},
"pywin32-ctypes": {
"hashes": [
"sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8",
"sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"
],
"markers": "python_version >= '3.6'",
"version": "==0.2.3"
},
"readme-renderer": {
"hashes": [
"sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151",
"sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"
],
"markers": "python_version >= '3.9'",
"version": "==44.0"
},
"requests": {
"hashes": [
"sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
@ -689,6 +799,30 @@
"markers": "python_version >= '3.8'",
"version": "==2.32.3"
},
"requests-toolbelt": {
"hashes": [
"sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6",
"sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==1.0.0"
},
"rfc3986": {
"hashes": [
"sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd",
"sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"
],
"markers": "python_version >= '3.7'",
"version": "==2.0.0"
},
"rich": {
"hashes": [
"sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0",
"sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"
],
"markers": "python_full_version >= '3.8.0'",
"version": "==14.0.0"
},
"roman-numerals-py": {
"hashes": [
"sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c",
@ -787,6 +921,15 @@
"markers": "python_version >= '3.9'",
"version": "==4.26.0"
},
"twine": {
"hashes": [
"sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384",
"sha256:be324f6272eff91d07ee93f251edf232fc647935dd585ac003539b42404a8dbd"
],
"index": "pypi",
"markers": "python_version >= '3.8'",
"version": "==6.1.0"
},
"urllib3": {
"hashes": [
"sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466",

View file

@ -64,7 +64,10 @@ definitions:
artifacts:
- dist/*
script:
- echo "publish"
# signing key must be an unwrapped base64-encoded PGP private
# key with no password
- echo "$_GPG_SIGNING_KEY" | base64 -d | gpg --import
- .venv/bin/python3 -m pipenv run make publish -B SIGN=1
- step: &archive
name: archive
caches:
@ -72,7 +75,8 @@ definitions:
artifacts:
- dist/*
script:
- echo "archive"
- echo "$_GPG_SIGNING_KEY" | base64 -d | gpg --import
- .venv/bin/python3 -m pipenv run make archive -B SIGN=1
- step: &chore
name: chore
caches:

View file

@ -64,7 +64,10 @@ bootstrappipenv(` ')
artifacts:
- dist/*
script:
- echo "publish"
# signing key must be an unwrapped base64-encoded PGP private
# key with no password
- echo "$_GPG_SIGNING_KEY" | base64 -d | gpg --import
- .venv/bin/python3 -m pipenv run make publish -B SIGN=1
- step: &archive
name: archive
caches:
@ -72,7 +75,8 @@ bootstrappipenv(` ')
artifacts:
- dist/*
script:
- echo "archive"
- echo "$_GPG_SIGNING_KEY" | base64 -d | gpg --import
- .venv/bin/python3 -m pipenv run make archive -B SIGN=1
- step: &chore
name: chore
caches:

120
configure vendored
View file

@ -608,8 +608,10 @@ PACKAGE_URL=''
ac_subst_vars='LTLIBOBJS
LIBOBJS
REALPATH
PIPENV
PYTHON3
GIT
M4
MAKE
target_alias
host_alias
@ -1766,6 +1768,61 @@ then :
printf "%s\n" "$as_me: without GNU Make, you have to inspect 'Makefile' and deduce build targets yourself." >&6;}
fi
for ac_prog in m4
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_M4+y}
then :
printf %s "(cached) " >&6
else case e in #(
e) if test -n "$M4"; then
ac_cv_prog_M4="$M4" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
case $as_dir in #(((
'') as_dir=./ ;;
*/) ;;
*) as_dir=$as_dir/ ;;
esac
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_M4="$ac_prog"
printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi ;;
esac
fi
M4=$ac_cv_prog_M4
if test -n "$M4"; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $M4" >&5
printf "%s\n" "$M4" >&6; }
else
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi
test -n "$M4" && break
done
test -n "$M4" || M4="no"
if test "$M4" == "no"
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: without GNU M4, you will be unable to generate bitbucket-pipelines.yml." >&5
printf "%s\n" "$as_me: without GNU M4, you will be unable to generate bitbucket-pipelines.yml." >&6;}
fi
for ac_prog in git
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
@ -1880,12 +1937,12 @@ do
set dummy $ac_prog; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_PYTHON3+y}
if test ${ac_cv_prog_PIPENV+y}
then :
printf %s "(cached) " >&6
else case e in #(
e) if test -n "$PYTHON3"; then
ac_cv_prog_PYTHON3="$PYTHON3" # Let the user override the test.
e) if test -n "$PIPENV"; then
ac_cv_prog_PIPENV="$PIPENV" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
@ -1898,7 +1955,7 @@ do
esac
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_PYTHON3="$ac_prog"
ac_cv_prog_PIPENV="$ac_prog"
printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
@ -1909,20 +1966,34 @@ IFS=$as_save_IFS
fi ;;
esac
fi
PYTHON3=$ac_cv_prog_PYTHON3
if test -n "$PYTHON3"; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON3" >&5
printf "%s\n" "$PYTHON3" >&6; }
PIPENV=$ac_cv_prog_PIPENV
if test -n "$PIPENV"; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PIPENV" >&5
printf "%s\n" "$PIPENV" >&6; }
else
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi
test -n "$PYTHON3" && break
test -n "$PIPENV" && break
done
test -n "$PYTHON3" || PYTHON3="no"
test -n "$PIPENV" || PIPENV="no"
if test "$PIPENV" == "no"
then :
as_fn_error $? "install pipenv (pip) package, before continuing.
Alternatively bootstrap a venv:
python3 -m venv --system-site-packages .venv
.venv/bin/python3 -m pip install pipenv
Then execute this script through pipenv:
.venv/bin/python -m pipenv run sh ./configure
" "$LINENO" 5
fi
# required in Makefile to ensure proper path resolution during preprocessing
# realpath is not available on macOS
@ -1983,6 +2054,35 @@ alias='python3 -c \"import pathlib,sys;print(pathlib.Path(sys.argv[1]).resolve()
" "$LINENO" 5
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for TWINE_PASSWORD" >&5
printf %s "checking for TWINE_PASSWORD... " >&6; }
if test -z "$TWINE_PASSWORD"; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING:
TWINE_PASSWORD must be set to an API token of a PyPI account.
" >&5
printf "%s\n" "$as_me: WARNING:
TWINE_PASSWORD must be set to an API token of a PyPI account.
" >&2;}
else
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BITBUCKET_ACCESS_TOKEN" >&5
printf %s "checking for BITBUCKET_ACCESS_TOKEN... " >&6; }
if test -z "$BITBUCKET_ACCESS_TOKEN"; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: BITBUCKET_ACCESS_TOKEN not set" >&5
printf "%s\n" "$as_me: WARNING: BITBUCKET_ACCESS_TOKEN not set" >&2;}
else
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
fi
sh -ex << 'EOF'
uname
git --version

View file

@ -4,6 +4,10 @@ AC_CHECK_PROGS([MAKE], [make], [no])
AS_IF([test "$MAKE" == "no"],
[AC_MSG_NOTICE([without GNU Make, you have to inspect 'Makefile' and deduce build targets yourself.])])
AC_CHECK_PROGS([M4], [m4], [no])
AS_IF([test "$M4" == "no"],
[AC_MSG_NOTICE([without GNU M4, you will be unable to generate bitbucket-pipelines.yml.])])
AC_CHECK_PROGS([GIT], [git], [no])
AS_IF([test "$GIT" == "no"],
[AC_MSG_ERROR([install Git, before continuing.])])
@ -12,7 +16,19 @@ AC_CHECK_PROGS([PYTHON3], [python3], [no])
AS_IF([test "$PYTHON3" == "no"],
[AC_MSG_ERROR([install Python 3, before continuing.])])
AC_CHECK_PROGS([PYTHON3], [pipenv], [no])
AC_CHECK_PROGS([PIPENV], [pipenv], [no])
AS_IF([test "$PIPENV" == "no"],
[AC_MSG_ERROR([install pipenv (pip) package, before continuing.
Alternatively bootstrap a venv:
python3 -m venv --system-site-packages .venv
.venv/bin/python3 -m pip install pipenv
Then execute this script through pipenv:
.venv/bin/python -m pipenv run sh ./configure
])])
# required in Makefile to ensure proper path resolution during preprocessing
# realpath is not available on macOS
@ -23,6 +39,25 @@ AS_IF([test "$REALPATH" == "no"],
alias='python3 -c "import pathlib,sys;print(pathlib.Path(sys.argv[[1]]).resolve())"'"
])])
AC_MSG_CHECKING([for TWINE_PASSWORD])
if test -z "$TWINE_PASSWORD"; then
AC_MSG_RESULT([no])
AC_MSG_WARN([
TWINE_PASSWORD must be set to an API token of a PyPI account.
])
else
AC_MSG_RESULT([yes])
fi
AC_MSG_CHECKING([for BITBUCKET_ACCESS_TOKEN])
if test -z "$BITBUCKET_ACCESS_TOKEN"; then
AC_MSG_RESULT([no])
AC_MSG_WARN([BITBUCKET_ACCESS_TOKEN not set])
else
AC_MSG_RESULT([yes])
fi
sh -ex << 'EOF'
uname
git --version

View file

@ -7,7 +7,7 @@ requires = [
build-backend = "setuptools.build_meta"
[project]
name = "byteb4rb1e-sphinxcontrib"
name = "byteb4rb1e.sphinxcontrib"
description = ""
authors = [
{ name = "Tiara Rodney", email = "tiara.rodney@byteb4rb1e.me" }
@ -19,7 +19,6 @@ classifiers = [
"Environment :: Web Environment",
"Framework :: Sphinx",
"Framework :: Sphinx :: Extension",
"Intended Audience :: Ìnformation Technology",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.9",

View file

@ -10,10 +10,19 @@ colorama==0.4.6
distlib==0.3.9
docutils==0.21.2
filelock==3.18.0
id==1.5.0
idna==3.10
imagesize==1.4.1
jaraco.classes==3.4.0
jaraco.context==6.0.1
jaraco.functools==4.1.0
jinja2==3.1.6
keyring==25.6.0
markdown-it-py==3.0.0
markupsafe==3.0.2
mdurl==0.1.2
more-itertools==10.7.0
nh3==0.2.21
packaging==25.0
pipenv==2025.0.2
platformdirs==4.3.8
@ -21,7 +30,12 @@ pluggy==1.6.0
pygments==2.19.1
pyproject-api==1.9.1
pyproject-hooks==1.2.0
pywin32-ctypes==0.2.3
readme-renderer==44.0
requests==2.32.3
requests-toolbelt==1.0.0
rfc3986==2.0.0
rich==14.0.0
roman-numerals-py==3.1.0
setuptools==80.7.1
setuptools-scm==8.3.1
@ -34,5 +48,6 @@ sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==2.0.0
sphinxcontrib-serializinghtml==2.0.0
tox==4.26.0
twine==6.1.0
urllib3==2.4.0
virtualenv==20.31.2