diff --git a/Makefile b/Makefile index 5c1213c..bcd8036 100644 --- a/Makefile +++ b/Makefile @@ -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/ diff --git a/Pipfile b/Pipfile index b8bd7f6..5c10bcc 100644 --- a/Pipfile +++ b/Pipfile @@ -12,6 +12,7 @@ setuptools-scm = "*" pipenv = "*" tox = "*" build = "*" +twine = "*" [requires] python_version = "3" diff --git a/Pipfile.lock b/Pipfile.lock index dfb23fe..ac11403 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -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", diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml index fd8d371..eb80852 100644 --- a/bitbucket-pipelines.yml +++ b/bitbucket-pipelines.yml @@ -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: diff --git a/bitbucket-pipelines.yml.m4 b/bitbucket-pipelines.yml.m4 index 972b870..29aa92e 100644 --- a/bitbucket-pipelines.yml.m4 +++ b/bitbucket-pipelines.yml.m4 @@ -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: diff --git a/configure b/configure index fcf0cc0..1f12ce2 100644 --- a/configure +++ b/configure @@ -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 diff --git a/configure.ac b/configure.ac index c1dd9ba..bfaedba 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/pyproject.toml b/pyproject.toml index dd0bf4b..ffd1365 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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", diff --git a/requirements-dev.txt b/requirements-dev.txt index 0459120..b06e105 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -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