From cf3aff9f66510b3e3a7c9a006e47d0822ae678f9 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:12 +0200 Subject: [PATCH 01/44] DX: implement pixi configuration --- .envrc | 3 + .gitattributes | 1 + .gitignore | 1 + pixi.lock | 1927 ++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 20 + 5 files changed, 1952 insertions(+) create mode 100644 .gitattributes create mode 100644 pixi.lock diff --git a/.envrc b/.envrc index a00cf019..e1d415a5 100644 --- a/.envrc +++ b/.envrc @@ -2,6 +2,9 @@ if [ -e .venv ]; then source .venv/bin/activate elif [ -e venv ]; then source venv/bin/activate +elif [ -e .pixi ]; then + watch_file pixi.lock + eval "$(pixi shell-hook)" else layout anaconda fi diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..18f6c7e9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +pixi.lock linguist-language=YAML linguist-generated=true diff --git a/.gitignore b/.gitignore index 9ea7ce1e..7ee26cab 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,7 @@ prof/ # Virtual environments *venv/ +.pixi/ .tox/ pyvenv*/ diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 00000000..90deb9bb --- /dev/null +++ b/pixi.lock @@ -0,0 +1,1927 @@ +version: 5 +environments: + compwa-policy: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/a2/10639a79341f6c019dedc95bd48a4928eed9f1d1197f4c04f546fc7ae0ff/anyio-4.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/e6/a1551acbaa06f3e48b311329828a34bc9c51a8cfaecdeb4d03c329a1ef85/cachetools-5.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/98/69/5d8751b4b670d623aa7a47bef061d69c279e9f922f6705147983aa76c3ce/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/6f/eef79b779a540326fee9520e5542a8b428cc3bfa8b7c8f1022c1ee4fc66c/coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8e/41/9307e4f5f9976bc8b7fea0b66367734e8faf3ec84bc0d412d8cfabbb66cd/distlib-0.3.8-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6d/ca/086311cdfc017ec964b2436fe0c98c1f4efcb7e4c328956a22456e497655/fastjsonschema-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/f0/48285f0262fe47103a4a45972ed2f9b93e4c80b8fd609fa98da78b2a5706/filelock-3.15.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/43/e1d53588561e533212117750ee79ad0ba02a41f52a08c1df3396bd466c05/html2text-2024.2.26.tar.gz + - pypi: https://files.pythonhosted.org/packages/24/6c/a4f39abe7f19600b74528d0c717b52fff0b300bb0161081510d39c53cb00/identify-2.6.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/82/47/bb25ec04985d0693da478797c3d8c1092b140f3a53ccb984fbbd38affa5b/importlib_metadata-8.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ea/6d/a78a58b1d2007ebce56f1dc745b2763d4ba5a4b6faadca7dc034297c04c8/ini2toml-0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/d0/2b1e404231a0c57fadcca64361fcffd13eda5346222edaf04b7938300fd1/labels-20.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ef/f7/8a4dcea720a581e69ac8c5a38524baf0e3e2bb5f3819a9ff661464fe7d10/mdit_py_plugins-0.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/a3/ffc2ee9b8689920a524a8013bf05482f51d191d73a8a3939f3d47d9a485a/mypy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/de/21aa8394f16add8f7427f0a1326ccd2b3a2a8a3245c9252bc5ac034c6155/myst_parser-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/55/90db48d85f7689ec6f81c0db0622d704306c5284850383c090e6c7195a5c/pip-24.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/92/caae8c86e94681b42c246f0bca35c059a2f0529e5b92619f6aba4cf7e7b6/pre_commit-3.8.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/88/c1451b66664ae596bae93928ff372f4da89c2c7250132ecb76cc99256c93/pyproject_api-1.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a5/47/c7f8a0f210ad18576840922e0b504f0b7f5f73aea4a52ab14c5b58517edf/pytoml-0.1.21-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/d8/e73d56b1908a6c0e3e5982365eb293170cd458cc25a19363f69c76e00fd2/rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/16/64/c739f603413f5511d8319d65422f763636c31b6c6a785b046e1ad9fa1cb8/rtoml-0.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/73/67/8ece580cc363331d9a53055130f86b096bf16e38156e33b1d3014fffda6b/ruamel.yaml-0.18.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/b2/389b345a60131593028b0263fddaa580edb4081697a3f3aa1f168f67519f/ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c8/3b/2b683be597bbd02046678fc3fc1c199c641512b20212073b58f173822bb3/ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e1/58/e0ef3b9974a04ce9cde2a7a33881ddcb2d68450803745804545cdd8d258f/setuptools-72.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/f3/038b302fdfbe3be7da016777069f26ceefe11a681055ea1f7817546508e3/soupsieve-2.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/15/0a/8c4dba0094c349211adc8c9161803547fbedd7c3b1f9123c544aa3da7cb8/sphinx_api_relink-0.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/21/98/d32f45b19b60e52b4ddc714dee139a92c6ea8fa9115f994884d321c3454d/sphinx_argparse-0.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/53/de/1d005ba60b4b754d6e05079a479f16a8f6e08c1ec4f8d80288238502b4b6/sphinx_autobuild-2024.4.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/80/90574e2e82c955b9c6f6b77f7badb2cf2ef4ef77599e4343cced2d098681/sphinx_book_theme-1.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/ef/8546618a14e5a491616950b71e9e55de2877a1fecba73e4bc76c62ab53a0/sphinx_codeautolink-0.15.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/60/d976da9998e4f4a99e297cda09d61ce305919ea94cbeeb476dba4fece098/starlette-0.38.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7c/b753bf603852cab0a660da6e81f4ea5d2ca0f0b2b4870766d7aa9bceb7a2/tomlkit-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/58/ca62a2e4b93e6b647d095a81e8fd1e51ca74ee5298afe98b788f49748e46/tox-4.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f3/ad/ffbad24e2bc8f20bf047ec22af0c0a92f6ce2071eb21c9103df600cda6de/types_PyYAML-6.0.12.20240808-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/a2/d32ab58c0b216912638b140ab2170ee4b8644067c293b170e19fba340ccc/types_toml-0.10.8.20240310-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/d8/1bcb5e6508d14c6c9912cd964b286f04392298ffb3e4218f4a1292d64e76/uvicorn-0.30.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/4d/410156100224c5e2f0011d435e477b57aed9576fc7fe137abcf14ec16e11/virtualenv-20.26.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/65/f3e854c5b8912d76c8fefc7c891b3df628b9110907b968faadcb8142347e/watchfiles-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/06/dd/e8535f54b4aaded1ed44041ca8eb9de8786ce719ff148b56b4a903ef93e6/websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1b/d1/9babe2ccaecff775992753d8686970b1e2755d21c8a63be73aba7a4e7d77/wheel-0.44.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/38/f5c473fe9b90c8debdd29ea68d5add0289f1936d6f923b6b9cc0b931194c/zipp-3.19.2-py3-none-any.whl + - pypi: . + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6d/ca/086311cdfc017ec964b2436fe0c98c1f4efcb7e4c328956a22456e497655/fastjsonschema-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/43/e1d53588561e533212117750ee79ad0ba02a41f52a08c1df3396bd466c05/html2text-2024.2.26.tar.gz + - pypi: https://files.pythonhosted.org/packages/82/47/bb25ec04985d0693da478797c3d8c1092b140f3a53ccb984fbbd38affa5b/importlib_metadata-8.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ea/6d/a78a58b1d2007ebce56f1dc745b2763d4ba5a4b6faadca7dc034297c04c8/ini2toml-0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/55/90db48d85f7689ec6f81c0db0622d704306c5284850383c090e6c7195a5c/pip-24.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/d8/e73d56b1908a6c0e3e5982365eb293170cd458cc25a19363f69c76e00fd2/rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/16/64/c739f603413f5511d8319d65422f763636c31b6c6a785b046e1ad9fa1cb8/rtoml-0.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/73/67/8ece580cc363331d9a53055130f86b096bf16e38156e33b1d3014fffda6b/ruamel.yaml-0.18.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/b2/389b345a60131593028b0263fddaa580edb4081697a3f3aa1f168f67519f/ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e1/58/e0ef3b9974a04ce9cde2a7a33881ddcb2d68450803745804545cdd8d258f/setuptools-72.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7c/b753bf603852cab0a660da6e81f4ea5d2ca0f0b2b4870766d7aa9bceb7a2/tomlkit-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1b/d1/9babe2ccaecff775992753d8686970b1e2755d21c8a63be73aba7a4e7d77/wheel-0.44.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/38/f5c473fe9b90c8debdd29ea68d5add0289f1936d6f923b6b9cc0b931194c/zipp-3.19.2-py3-none-any.whl + - pypi: . +packages: +- kind: conda + name: _libgcc_mutex + version: '0.1' + build: conda_forge + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- kind: conda + name: _openmp_mutex + version: '4.5' + build: 2_gnu + build_number: 16 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- kind: pypi + name: accessible-pygments + version: 0.0.5 + url: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl + sha256: 88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7 + requires_dist: + - pygments>=1.5 + - pillow ; extra == 'dev' + - pkginfo>=1.10 ; extra == 'dev' + - playwright ; extra == 'dev' + - pre-commit ; extra == 'dev' + - setuptools ; extra == 'dev' + - twine>=5.0 ; extra == 'dev' + - hypothesis ; extra == 'tests' + - pytest ; extra == 'tests' + requires_python: '>=3.9' +- kind: pypi + name: alabaster + version: 0.7.16 + url: https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl + sha256: b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 + requires_python: '>=3.9' +- kind: pypi + name: anyio + version: 4.4.0 + url: https://files.pythonhosted.org/packages/7b/a2/10639a79341f6c019dedc95bd48a4928eed9f1d1197f4c04f546fc7ae0ff/anyio-4.4.0-py3-none-any.whl + sha256: c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7 + requires_dist: + - idna>=2.8 + - sniffio>=1.1 + - exceptiongroup>=1.0.2 ; python_version < '3.11' + - typing-extensions>=4.1 ; python_version < '3.11' + - packaging ; extra == 'doc' + - sphinx>=7 ; extra == 'doc' + - sphinx-rtd-theme ; extra == 'doc' + - sphinx-autodoc-typehints>=1.2.0 ; extra == 'doc' + - anyio[trio] ; extra == 'test' + - coverage[toml]>=7 ; extra == 'test' + - exceptiongroup>=1.2.0 ; extra == 'test' + - hypothesis>=4.0 ; extra == 'test' + - psutil>=5.9 ; extra == 'test' + - pytest>=7.0 ; extra == 'test' + - pytest-mock>=3.6.1 ; extra == 'test' + - trustme ; extra == 'test' + - uvloop>=0.17 ; (platform_python_implementation == 'CPython' and platform_system != 'Windows') and extra == 'test' + - trio>=0.23 ; extra == 'trio' + requires_python: '>=3.8' +- kind: pypi + name: attrs + version: 24.2.0 + url: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl + sha256: 81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 + requires_dist: + - importlib-metadata ; python_version < '3.8' + - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'benchmark' + - hypothesis ; extra == 'benchmark' + - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'benchmark' + - pympler ; extra == 'benchmark' + - pytest-codspeed ; extra == 'benchmark' + - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'benchmark' + - pytest-xdist[psutil] ; extra == 'benchmark' + - pytest>=4.3.0 ; extra == 'benchmark' + - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'cov' + - coverage[toml]>=5.3 ; extra == 'cov' + - hypothesis ; extra == 'cov' + - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'cov' + - pympler ; extra == 'cov' + - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'cov' + - pytest-xdist[psutil] ; extra == 'cov' + - pytest>=4.3.0 ; extra == 'cov' + - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'dev' + - hypothesis ; extra == 'dev' + - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'dev' + - pre-commit ; extra == 'dev' + - pympler ; extra == 'dev' + - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'dev' + - pytest-xdist[psutil] ; extra == 'dev' + - pytest>=4.3.0 ; extra == 'dev' + - cogapp ; extra == 'docs' + - furo ; extra == 'docs' + - myst-parser ; extra == 'docs' + - sphinx ; extra == 'docs' + - sphinx-notfound-page ; extra == 'docs' + - sphinxcontrib-towncrier ; extra == 'docs' + - towncrier<24.7 ; extra == 'docs' + - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'tests' + - hypothesis ; extra == 'tests' + - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests' + - pympler ; extra == 'tests' + - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests' + - pytest-xdist[psutil] ; extra == 'tests' + - pytest>=4.3.0 ; extra == 'tests' + - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests-mypy' + - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests-mypy' + requires_python: '>=3.7' +- kind: pypi + name: babel + version: 2.16.0 + url: https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl + sha256: 368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b + requires_dist: + - pytz>=2015.7 ; python_version < '3.9' + - pytest>=6.0 ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - freezegun~=1.0 ; extra == 'dev' + requires_python: '>=3.8' +- kind: pypi + name: beautifulsoup4 + version: 4.12.3 + url: https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl + sha256: b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed + requires_dist: + - soupsieve>1.2 + - cchardet ; extra == 'cchardet' + - chardet ; extra == 'chardet' + - charset-normalizer ; extra == 'charset-normalizer' + - html5lib ; extra == 'html5lib' + - lxml ; extra == 'lxml' + requires_python: '>=3.6.0' +- kind: pypi + name: build + version: 1.2.1 + url: https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl + sha256: 75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4 + requires_dist: + - packaging>=19.1 + - pyproject-hooks + - colorama ; os_name == 'nt' + - importlib-metadata>=4.6 ; python_full_version < '3.10.2' + - tomli>=1.1.0 ; python_version < '3.11' + - furo>=2023.8.17 ; extra == 'docs' + - sphinx~=7.0 ; extra == 'docs' + - sphinx-argparse-cli>=1.5 ; extra == 'docs' + - sphinx-autodoc-typehints>=1.10 ; extra == 'docs' + - sphinx-issues>=3.0.0 ; extra == 'docs' + - build[uv,virtualenv] ; extra == 'test' + - filelock>=3 ; extra == 'test' + - pytest>=6.2.4 ; extra == 'test' + - pytest-cov>=2.12 ; extra == 'test' + - pytest-mock>=2 ; extra == 'test' + - pytest-rerunfailures>=9.1 ; extra == 'test' + - pytest-xdist>=1.34 ; extra == 'test' + - wheel>=0.36.0 ; extra == 'test' + - setuptools>=42.0.0 ; extra == 'test' and python_version < '3.10' + - setuptools>=56.0.0 ; extra == 'test' and python_version == '3.10' + - setuptools>=56.0.0 ; extra == 'test' and python_version == '3.11' + - setuptools>=67.8.0 ; extra == 'test' and python_version >= '3.12' + - build[uv] ; extra == 'typing' + - importlib-metadata>=5.1 ; extra == 'typing' + - mypy~=1.9.0 ; extra == 'typing' + - tomli ; extra == 'typing' + - typing-extensions>=3.7.4.3 ; extra == 'typing' + - uv>=0.1.18 ; extra == 'uv' + - virtualenv>=20.0.35 ; extra == 'virtualenv' + requires_python: '>=3.8' +- kind: conda + name: bzip2 + version: 1.0.8 + build: h4bc722e_7 + build_number: 7 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- kind: conda + name: ca-certificates + version: 2024.7.4 + build: hbcca054_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda + sha256: c1548a3235376f464f9931850b64b02492f379b2f2bb98bc786055329b080446 + md5: 23ab7665c5f63cfb9f1f6195256daac6 + license: ISC + purls: [] + size: 154853 + timestamp: 1720077432978 +- kind: pypi + name: cachetools + version: 5.4.0 + url: https://files.pythonhosted.org/packages/04/e6/a1551acbaa06f3e48b311329828a34bc9c51a8cfaecdeb4d03c329a1ef85/cachetools-5.4.0-py3-none-any.whl + sha256: 3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474 + requires_python: '>=3.7' +- kind: pypi + name: certifi + version: 2024.7.4 + url: https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl + sha256: c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 + requires_python: '>=3.6' +- kind: pypi + name: cfgv + version: 3.4.0 + url: https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl + sha256: b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9 + requires_python: '>=3.8' +- kind: pypi + name: chardet + version: 5.2.0 + url: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl + sha256: e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970 + requires_python: '>=3.7' +- kind: pypi + name: charset-normalizer + version: 3.3.2 + url: https://files.pythonhosted.org/packages/98/69/5d8751b4b670d623aa7a47bef061d69c279e9f922f6705147983aa76c3ce/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 + requires_python: '>=3.7.0' +- kind: pypi + name: click + version: 8.1.7 + url: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl + sha256: ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 + requires_dist: + - colorama ; platform_system == 'Windows' + - importlib-metadata ; python_version < '3.8' + requires_python: '>=3.7' +- kind: pypi + name: colorama + version: 0.4.6 + url: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + sha256: 4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' +- kind: pypi + name: compwa-policy + version: 0.3.19.dev3 + path: . + sha256: 379e86ec055c85cc7afb4d9fe6b340c21f22e7307bde700fc952e677d1d12506 + requires_dist: + - pyyaml + - attrs>=20.1.0 + - html2text + - ini2toml + - nbformat + - pathspec + - pip-tools + - ruamel-yaml + - tomlkit + - rtoml + - typing-extensions ; python_version < '3.12.0' + - compwa-policy[doc] ; extra == 'dev' + - compwa-policy[sty] ; extra == 'dev' + - compwa-policy[test] ; extra == 'dev' + - labels ; extra == 'dev' + - sphinx-autobuild ; extra == 'dev' + - tox>=1.9 ; extra == 'dev' + - sphinx ; extra == 'doc' + - myst-parser ; extra == 'doc' + - sphinx-api-relink>=0.0.4 ; extra == 'doc' + - sphinx-api-relink ; extra == 'doc' + - sphinx-argparse ; extra == 'doc' + - sphinx-book-theme ; extra == 'doc' + - sphinx-codeautolink ; extra == 'doc' + - sphinx-copybutton ; extra == 'doc' + - compwa-policy[types] ; extra == 'sty' + - mypy ; extra == 'sty' + - pre-commit>=1.4.0 ; extra == 'sty' + - ruff ; extra == 'sty' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-xdist ; extra == 'test' + - pytest ; extra == 'types' + - sphinx-api-relink>=0.0.3 ; extra == 'types' + - types-pyyaml ; extra == 'types' + - types-toml ; extra == 'types' + requires_python: '>=3.7' + editable: true +- kind: pypi + name: coverage + version: 7.6.1 + url: https://files.pythonhosted.org/packages/9a/6f/eef79b779a540326fee9520e5542a8b428cc3bfa8b7c8f1022c1ee4fc66c/coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc + requires_dist: + - tomli ; python_full_version <= '3.11.0a6' and extra == 'toml' + requires_python: '>=3.8' +- kind: pypi + name: distlib + version: 0.3.8 + url: https://files.pythonhosted.org/packages/8e/41/9307e4f5f9976bc8b7fea0b66367734e8faf3ec84bc0d412d8cfabbb66cd/distlib-0.3.8-py2.py3-none-any.whl + sha256: 034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784 +- kind: pypi + name: docutils + version: 0.21.2 + url: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl + sha256: dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 + requires_python: '>=3.9' +- kind: pypi + name: exceptiongroup + version: 1.2.2 + url: https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl + sha256: 3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b + requires_dist: + - pytest>=6 ; extra == 'test' + requires_python: '>=3.7' +- kind: pypi + name: execnet + version: 2.1.1 + url: https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl + sha256: 26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc + requires_dist: + - hatch ; extra == 'testing' + - pre-commit ; extra == 'testing' + - pytest ; extra == 'testing' + - tox ; extra == 'testing' + requires_python: '>=3.8' +- kind: pypi + name: fastjsonschema + version: 2.20.0 + url: https://files.pythonhosted.org/packages/6d/ca/086311cdfc017ec964b2436fe0c98c1f4efcb7e4c328956a22456e497655/fastjsonschema-2.20.0-py3-none-any.whl + sha256: 5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a + requires_dist: + - colorama ; extra == 'devel' + - jsonschema ; extra == 'devel' + - json-spec ; extra == 'devel' + - pylint ; extra == 'devel' + - pytest ; extra == 'devel' + - pytest-benchmark ; extra == 'devel' + - pytest-cache ; extra == 'devel' + - validictory ; extra == 'devel' +- kind: pypi + name: filelock + version: 3.15.4 + url: https://files.pythonhosted.org/packages/ae/f0/48285f0262fe47103a4a45972ed2f9b93e4c80b8fd609fa98da78b2a5706/filelock-3.15.4-py3-none-any.whl + sha256: 6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7 + requires_dist: + - furo>=2023.9.10 ; extra == 'docs' + - sphinx-autodoc-typehints!=1.23.4,>=1.25.2 ; extra == 'docs' + - sphinx>=7.2.6 ; extra == 'docs' + - covdefaults>=2.3 ; extra == 'testing' + - coverage>=7.3.2 ; extra == 'testing' + - diff-cover>=8.0.1 ; extra == 'testing' + - pytest-asyncio>=0.21 ; extra == 'testing' + - pytest-cov>=4.1 ; extra == 'testing' + - pytest-mock>=3.12 ; extra == 'testing' + - pytest-timeout>=2.2 ; extra == 'testing' + - pytest>=7.4.3 ; extra == 'testing' + - virtualenv>=20.26.2 ; extra == 'testing' + - typing-extensions>=4.8 ; python_version < '3.11' and extra == 'typing' + requires_python: '>=3.8' +- kind: pypi + name: h11 + version: 0.14.0 + url: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl + sha256: e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 + requires_dist: + - typing-extensions ; python_version < '3.8' + requires_python: '>=3.7' +- kind: pypi + name: html2text + version: 2024.2.26 + url: https://files.pythonhosted.org/packages/1a/43/e1d53588561e533212117750ee79ad0ba02a41f52a08c1df3396bd466c05/html2text-2024.2.26.tar.gz + sha256: 05f8e367d15aaabc96415376776cdd11afd5127a77fce6e36afc60c563ca2c32 + requires_python: '>=3.8' +- kind: pypi + name: identify + version: 2.6.0 + url: https://files.pythonhosted.org/packages/24/6c/a4f39abe7f19600b74528d0c717b52fff0b300bb0161081510d39c53cb00/identify-2.6.0-py2.py3-none-any.whl + sha256: e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0 + requires_dist: + - ukkonen ; extra == 'license' + requires_python: '>=3.8' +- kind: pypi + name: idna + version: '3.7' + url: https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl + sha256: 82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 + requires_python: '>=3.5' +- kind: pypi + name: imagesize + version: 1.4.1 + url: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl + sha256: 0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' +- kind: pypi + name: importlib-metadata + version: 8.2.0 + url: https://files.pythonhosted.org/packages/82/47/bb25ec04985d0693da478797c3d8c1092b140f3a53ccb984fbbd38affa5b/importlib_metadata-8.2.0-py3-none-any.whl + sha256: 11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369 + requires_dist: + - zipp>=0.5 + - typing-extensions>=3.6.4 ; python_version < '3.8' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - ipython ; extra == 'perf' + - pytest!=8.1.*,>=6 ; extra == 'test' + - pytest-checkdocs>=2.4 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mypy ; extra == 'test' + - pytest-enabler>=2.2 ; extra == 'test' + - packaging ; extra == 'test' + - pyfakefs ; extra == 'test' + - flufl-flake8 ; extra == 'test' + - pytest-perf>=0.9.2 ; extra == 'test' + - jaraco-test>=5.4 ; extra == 'test' + - importlib-resources>=1.3 ; python_version < '3.9' and extra == 'test' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'test' + requires_python: '>=3.8' +- kind: pypi + name: ini2toml + version: '0.15' + url: https://files.pythonhosted.org/packages/ea/6d/a78a58b1d2007ebce56f1dc745b2763d4ba5a4b6faadca7dc034297c04c8/ini2toml-0.15-py3-none-any.whl + sha256: ad97b4abed0930b2682f232d874e17ce01a14c2b6b1d0461b363fd8366411a8d + requires_dist: + - packaging>=20.7 + - setuptools>=59.6 + - configupdater<4,>=3.0.1 ; extra == 'all' + - tomlkit<2,>=0.10.0 ; extra == 'all' + - tomli-w<2,>=0.4.0 ; extra == 'all' + - pyproject-fmt<2,>=0.4.0 ; python_version >= '3.7' and extra == 'experimental' + - configupdater<4,>=3.0.1 ; extra == 'full' + - tomlkit<2,>=0.10.0 ; extra == 'full' + - importlib-metadata ; python_version < '3.8' and extra == 'full' + - tomli-w<2,>=0.4.0 ; extra == 'lite' + - importlib-metadata ; python_version < '3.8' and extra == 'lite' + - isort ; extra == 'testing' + - setuptools ; extra == 'testing' + - tomli ; extra == 'testing' + - pytest ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - pytest-xdist ; extra == 'testing' + - pytest-randomly ; extra == 'testing' + - validate-pyproject<2,>=0.6 ; extra == 'testing' + - typing-extensions ; python_version < '3.8' and extra == 'typechecking' +- kind: pypi + name: iniconfig + version: 2.0.0 + url: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl + sha256: b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 + requires_python: '>=3.7' +- kind: pypi + name: jinja2 + version: 3.1.4 + url: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl + sha256: bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' +- kind: pypi + name: jsonschema + version: 4.23.0 + url: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl + sha256: fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 + requires_dist: + - attrs>=22.2.0 + - importlib-resources>=1.4.0 ; python_version < '3.9' + - jsonschema-specifications>=2023.3.6 + - pkgutil-resolve-name>=1.3.10 ; python_version < '3.9' + - referencing>=0.28.4 + - rpds-py>=0.7.1 + - fqdn ; extra == 'format' + - idna ; extra == 'format' + - isoduration ; extra == 'format' + - jsonpointer>1.13 ; extra == 'format' + - rfc3339-validator ; extra == 'format' + - rfc3987 ; extra == 'format' + - uri-template ; extra == 'format' + - webcolors>=1.11 ; extra == 'format' + - fqdn ; extra == 'format-nongpl' + - idna ; extra == 'format-nongpl' + - isoduration ; extra == 'format-nongpl' + - jsonpointer>1.13 ; extra == 'format-nongpl' + - rfc3339-validator ; extra == 'format-nongpl' + - rfc3986-validator>0.1.0 ; extra == 'format-nongpl' + - uri-template ; extra == 'format-nongpl' + - webcolors>=24.6.0 ; extra == 'format-nongpl' + requires_python: '>=3.8' +- kind: pypi + name: jsonschema-specifications + version: 2023.12.1 + url: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl + sha256: 87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c + requires_dist: + - importlib-resources>=1.4.0 ; python_version < '3.9' + - referencing>=0.31.0 + requires_python: '>=3.8' +- kind: pypi + name: jupyter-core + version: 5.7.2 + url: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl + sha256: 4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409 + requires_dist: + - platformdirs>=2.5 + - pywin32>=300 ; sys_platform == 'win32' and platform_python_implementation != 'PyPy' + - traitlets>=5.3 + - myst-parser ; extra == 'docs' + - pydata-sphinx-theme ; extra == 'docs' + - sphinx-autodoc-typehints ; extra == 'docs' + - sphinxcontrib-github-alt ; extra == 'docs' + - sphinxcontrib-spelling ; extra == 'docs' + - traitlets ; extra == 'docs' + - ipykernel ; extra == 'test' + - pre-commit ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest<8 ; extra == 'test' + requires_python: '>=3.8' +- kind: pypi + name: labels + version: 20.1.0 + url: https://files.pythonhosted.org/packages/e7/d0/2b1e404231a0c57fadcca64361fcffd13eda5346222edaf04b7938300fd1/labels-20.1.0-py3-none-any.whl + sha256: f8130632297c541275fbd4001b4347ff18cd5592776385f4fb688853be4c20d6 + requires_dist: + - click + - requests + - pytoml + - attrs + requires_python: '>=3.6' +- kind: conda + name: ld_impl_linux-64 + version: '2.40' + build: hf3520f5_7 + build_number: 7 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda + sha256: 764b6950aceaaad0c67ef925417594dd14cd2e22fff864aeef455ac259263d15 + md5: b80f2f396ca2c28b8c14c437a4ed1e74 + constrains: + - binutils_impl_linux-64 2.40 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 707602 + timestamp: 1718625640445 +- kind: conda + name: libffi + version: 3.4.2 + build: h7f98852_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + purls: [] + size: 58292 + timestamp: 1636488182923 +- kind: conda + name: libgcc-ng + version: 14.1.0 + build: h77fa898_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda + sha256: b8e869ac96591cda2704bf7e77a301025e405227791a0bddf14a3dac65125538 + md5: ca0fad6a41ddaef54a153b78eccb5037 + depends: + - _libgcc_mutex 0.1 conda_forge + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.1.0 h77fa898_0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 842109 + timestamp: 1719538896937 +- kind: conda + name: libgomp + version: 14.1.0 + build: h77fa898_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda + sha256: 7699df61a1f6c644b3576a40f54791561f2845983120477a16116b951c9cdb05 + md5: ae061a5ed5f05818acdf9adab72c146d + depends: + - _libgcc_mutex 0.1 conda_forge + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 456925 + timestamp: 1719538796073 +- kind: conda + name: libnsl + version: 2.0.1 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- kind: conda + name: libsqlite + version: 3.46.0 + build: hde9e2c9_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + sha256: daee3f68786231dad457d0dfde3f7f1f9a7f2018adabdbb864226775101341a8 + md5: 18aa975d2094c34aef978060ae7da7d8 + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0a0 + license: Unlicense + purls: [] + size: 865346 + timestamp: 1718050628718 +- kind: conda + name: libuuid + version: 2.38.1 + build: h0b41bf4_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- kind: conda + name: libxcrypt + version: 4.4.36 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- kind: conda + name: libzlib + version: 1.3.1 + build: h4ab18f5_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda + sha256: adf6096f98b537a11ae3729eaa642b0811478f0ea0402ca67b5108fe2cb0010d + md5: 57d7dc60e9325e3de37ff8dffd18e814 + depends: + - libgcc-ng >=12 + constrains: + - zlib 1.3.1 *_1 + license: Zlib + license_family: Other + purls: [] + size: 61574 + timestamp: 1716874187109 +- kind: pypi + name: markdown-it-py + version: 3.0.0 + url: https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl + sha256: 355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 + requires_dist: + - mdurl~=0.1 + - psutil ; extra == 'benchmarking' + - pytest ; extra == 'benchmarking' + - pytest-benchmark ; extra == 'benchmarking' + - pre-commit~=3.0 ; extra == 'code-style' + - commonmark~=0.9 ; extra == 'compare' + - markdown~=3.4 ; extra == 'compare' + - mistletoe~=1.0 ; extra == 'compare' + - mistune~=2.0 ; extra == 'compare' + - panflute~=2.3 ; extra == 'compare' + - linkify-it-py>=1,<3 ; extra == 'linkify' + - mdit-py-plugins ; extra == 'plugins' + - gprof2dot ; extra == 'profiling' + - mdit-py-plugins ; extra == 'rtd' + - myst-parser ; extra == 'rtd' + - pyyaml ; extra == 'rtd' + - sphinx ; extra == 'rtd' + - sphinx-copybutton ; extra == 'rtd' + - sphinx-design ; extra == 'rtd' + - sphinx-book-theme ; extra == 'rtd' + - jupyter-sphinx ; extra == 'rtd' + - coverage ; extra == 'testing' + - pytest ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - pytest-regressions ; extra == 'testing' + requires_python: '>=3.8' +- kind: pypi + name: markupsafe + version: 2.1.5 + url: https://files.pythonhosted.org/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 + requires_python: '>=3.7' +- kind: pypi + name: mdit-py-plugins + version: 0.4.1 + url: https://files.pythonhosted.org/packages/ef/f7/8a4dcea720a581e69ac8c5a38524baf0e3e2bb5f3819a9ff661464fe7d10/mdit_py_plugins-0.4.1-py3-none-any.whl + sha256: 1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a + requires_dist: + - markdown-it-py>=1.0.0,<4.0.0 + - pre-commit ; extra == 'code-style' + - myst-parser ; extra == 'rtd' + - sphinx-book-theme ; extra == 'rtd' + - coverage ; extra == 'testing' + - pytest ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - pytest-regressions ; extra == 'testing' + requires_python: '>=3.8' +- kind: pypi + name: mdurl + version: 0.1.2 + url: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + sha256: 84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 + requires_python: '>=3.7' +- kind: pypi + name: mypy + version: 1.11.1 + url: https://files.pythonhosted.org/packages/08/a3/ffc2ee9b8689920a524a8013bf05482f51d191d73a8a3939f3d47d9a485a/mypy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl + sha256: 11965c2f571ded6239977b14deebd3f4c3abd9a92398712d6da3a772974fad69 + requires_dist: + - typing-extensions>=4.6.0 + - mypy-extensions>=1.0.0 + - tomli>=1.1.0 ; python_version < '3.11' + - psutil>=4.0 ; extra == 'dmypy' + - pip ; extra == 'install-types' + - setuptools>=50 ; extra == 'mypyc' + - lxml ; extra == 'reports' + requires_python: '>=3.8' +- kind: pypi + name: mypy-extensions + version: 1.0.0 + url: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl + sha256: 4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d + requires_python: '>=3.5' +- kind: pypi + name: myst-parser + version: 3.0.1 + url: https://files.pythonhosted.org/packages/e2/de/21aa8394f16add8f7427f0a1326ccd2b3a2a8a3245c9252bc5ac034c6155/myst_parser-3.0.1-py3-none-any.whl + sha256: 6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1 + requires_dist: + - docutils>=0.18,<0.22 + - jinja2 + - markdown-it-py~=3.0 + - mdit-py-plugins~=0.4 + - pyyaml + - sphinx>=6,<8 + - pre-commit~=3.0 ; extra == 'code-style' + - linkify-it-py~=2.0 ; extra == 'linkify' + - sphinx>=7 ; extra == 'rtd' + - ipython ; extra == 'rtd' + - sphinx-book-theme~=1.1 ; extra == 'rtd' + - sphinx-design ; extra == 'rtd' + - sphinx-copybutton ; extra == 'rtd' + - sphinxext-rediraffe~=0.2.7 ; extra == 'rtd' + - sphinxext-opengraph~=0.9.0 ; extra == 'rtd' + - sphinx-pyscript ; extra == 'rtd' + - sphinx-tippy>=0.4.3 ; extra == 'rtd' + - sphinx-autodoc2~=0.5.0 ; extra == 'rtd' + - sphinx-togglebutton ; extra == 'rtd' + - beautifulsoup4 ; extra == 'testing' + - coverage[toml] ; extra == 'testing' + - defusedxml ; extra == 'testing' + - pytest>=8,<9 ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - pytest-regressions ; extra == 'testing' + - pytest-param-files~=0.6.0 ; extra == 'testing' + - sphinx-pytest ; extra == 'testing' + - pygments ; extra == 'testing-docutils' + - pytest>=8,<9 ; extra == 'testing-docutils' + - pytest-param-files~=0.6.0 ; extra == 'testing-docutils' + requires_python: '>=3.8' +- kind: pypi + name: nbformat + version: 5.10.4 + url: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + sha256: 3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b + requires_dist: + - fastjsonschema>=2.15 + - jsonschema>=2.6 + - jupyter-core!=5.0.*,>=4.12 + - traitlets>=5.1 + - myst-parser ; extra == 'docs' + - pydata-sphinx-theme ; extra == 'docs' + - sphinx ; extra == 'docs' + - sphinxcontrib-github-alt ; extra == 'docs' + - sphinxcontrib-spelling ; extra == 'docs' + - pep440 ; extra == 'test' + - pre-commit ; extra == 'test' + - pytest ; extra == 'test' + - testpath ; extra == 'test' + requires_python: '>=3.8' +- kind: conda + name: ncurses + version: '6.5' + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda + sha256: 4fc3b384f4072b68853a0013ea83bdfd3d66b0126e2238e1d6e1560747aa7586 + md5: fcea371545eda051b6deafb24889fc69 + depends: + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause + purls: [] + size: 887465 + timestamp: 1715194722503 +- kind: pypi + name: nodeenv + version: 1.9.1 + url: https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl + sha256: ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*' +- kind: conda + name: openssl + version: 3.3.1 + build: h4bc722e_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda + sha256: b294b3cc706ad1048cdb514f0db3da9f37ae3fcc0c53a7104083dd0918adb200 + md5: e1b454497f9f7c1147fdde4b53f1b512 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc-ng >=12 + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2895213 + timestamp: 1721194688955 +- kind: pypi + name: packaging + version: '24.1' + url: https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl + sha256: 5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 + requires_python: '>=3.8' +- kind: pypi + name: pathspec + version: 0.12.1 + url: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl + sha256: a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 + requires_python: '>=3.8' +- kind: pypi + name: pip + version: '24.2' + url: https://files.pythonhosted.org/packages/d4/55/90db48d85f7689ec6f81c0db0622d704306c5284850383c090e6c7195a5c/pip-24.2-py3-none-any.whl + sha256: 2cd581cf58ab7fcfca4ce8efa6dcacd0de5bf8d0a3eb9ec927e07405f4d9e2a2 + requires_python: '>=3.8' +- kind: pypi + name: pip-tools + version: 7.4.1 + url: https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl + sha256: 4c690e5fbae2f21e87843e89c26191f0d9454f362d8acdbd695716493ec8b3a9 + requires_dist: + - build>=1.0.0 + - click>=8 + - pip>=22.2 + - pyproject-hooks + - setuptools + - wheel + - tomli ; python_version < '3.11' + - covdefaults ; extra == 'coverage' + - pytest-cov ; extra == 'coverage' + - pytest>=7.2.0 ; extra == 'testing' + - pytest-rerunfailures ; extra == 'testing' + - pytest-xdist ; extra == 'testing' + - tomli-w ; extra == 'testing' + - flit-core<4,>=2 ; extra == 'testing' + - poetry-core>=1.0.0 ; extra == 'testing' + requires_python: '>=3.8' +- kind: pypi + name: platformdirs + version: 4.2.2 + url: https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl + sha256: 2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee + requires_dist: + - furo>=2023.9.10 ; extra == 'docs' + - proselint>=0.13 ; extra == 'docs' + - sphinx-autodoc-typehints>=1.25.2 ; extra == 'docs' + - sphinx>=7.2.6 ; extra == 'docs' + - appdirs==1.4.4 ; extra == 'test' + - covdefaults>=2.3 ; extra == 'test' + - pytest-cov>=4.1 ; extra == 'test' + - pytest-mock>=3.12 ; extra == 'test' + - pytest>=7.4.3 ; extra == 'test' + - mypy>=1.8 ; extra == 'type' + requires_python: '>=3.8' +- kind: pypi + name: pluggy + version: 1.5.0 + url: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl + sha256: 44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 + requires_dist: + - pre-commit ; extra == 'dev' + - tox ; extra == 'dev' + - pytest ; extra == 'testing' + - pytest-benchmark ; extra == 'testing' + requires_python: '>=3.8' +- kind: pypi + name: pre-commit + version: 3.8.0 + url: https://files.pythonhosted.org/packages/07/92/caae8c86e94681b42c246f0bca35c059a2f0529e5b92619f6aba4cf7e7b6/pre_commit-3.8.0-py2.py3-none-any.whl + sha256: 9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f + requires_dist: + - cfgv>=2.0.0 + - identify>=1.0.0 + - nodeenv>=0.11.1 + - pyyaml>=5.1 + - virtualenv>=20.10.0 + requires_python: '>=3.9' +- kind: pypi + name: pydata-sphinx-theme + version: 0.15.4 + url: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl + sha256: 2136ad0e9500d0949f96167e63f3e298620040aea8f9c74621959eda5d4cf8e6 + requires_dist: + - sphinx>=5 + - beautifulsoup4 + - docutils!=0.17.0 + - packaging + - babel + - pygments>=2.7 + - accessible-pygments + - typing-extensions + - numpydoc ; extra == 'doc' + - linkify-it-py ; extra == 'doc' + - rich ; extra == 'doc' + - sphinxext-rediraffe ; extra == 'doc' + - sphinx-sitemap ; extra == 'doc' + - sphinx-autoapi>=3.0.0 ; extra == 'doc' + - myst-parser ; extra == 'doc' + - ablog>=0.11.8 ; extra == 'doc' + - jupyter-sphinx ; extra == 'doc' + - pandas ; extra == 'doc' + - plotly ; extra == 'doc' + - matplotlib ; extra == 'doc' + - numpy ; extra == 'doc' + - xarray ; extra == 'doc' + - sphinx-copybutton ; extra == 'doc' + - sphinx-design ; extra == 'doc' + - sphinx-togglebutton ; extra == 'doc' + - jupyterlite-sphinx ; extra == 'doc' + - sphinxcontrib-youtube>=1.4.1 ; extra == 'doc' + - sphinx-favicon>=1.0.1 ; extra == 'doc' + - ipykernel ; extra == 'doc' + - nbsphinx ; extra == 'doc' + - ipyleaflet ; extra == 'doc' + - colorama ; extra == 'doc' + - ipywidgets ; extra == 'doc' + - graphviz ; extra == 'doc' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-regressions ; extra == 'test' + - sphinx[test] ; extra == 'test' + - pyyaml ; extra == 'dev' + - pre-commit ; extra == 'dev' + - pydata-sphinx-theme[doc,test] ; extra == 'dev' + - tox ; extra == 'dev' + - pandoc ; extra == 'dev' + - sphinx-theme-builder[cli] ; extra == 'dev' + - pytest-playwright ; extra == 'a11y' + - babel ; extra == 'i18n' + - jinja2 ; extra == 'i18n' + requires_python: '>=3.9' +- kind: pypi + name: pygments + version: 2.18.0 + url: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl + sha256: b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a + requires_dist: + - colorama>=0.4.6 ; extra == 'windows-terminal' + requires_python: '>=3.8' +- kind: pypi + name: pyproject-api + version: 1.7.1 + url: https://files.pythonhosted.org/packages/de/88/c1451b66664ae596bae93928ff372f4da89c2c7250132ecb76cc99256c93/pyproject_api-1.7.1-py3-none-any.whl + sha256: 2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb + requires_dist: + - packaging>=24.1 + - tomli>=2.0.1 ; python_version < '3.11' + - furo>=2024.5.6 ; extra == 'docs' + - sphinx-autodoc-typehints>=2.2.1 ; extra == 'docs' + - covdefaults>=2.3 ; extra == 'testing' + - pytest-cov>=5 ; extra == 'testing' + - pytest-mock>=3.14 ; extra == 'testing' + - pytest>=8.2.2 ; extra == 'testing' + - setuptools>=70.1 ; extra == 'testing' + requires_python: '>=3.8' +- kind: pypi + name: pyproject-hooks + version: 1.1.0 + url: https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl + sha256: 7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2 + requires_python: '>=3.7' +- kind: pypi + name: pytest + version: 8.3.2 + url: https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl + sha256: 4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5 + requires_dist: + - iniconfig + - packaging + - pluggy<2,>=1.5 + - exceptiongroup>=1.0.0rc8 ; python_version < '3.11' + - tomli>=1 ; python_version < '3.11' + - colorama ; sys_platform == 'win32' + - argcomplete ; extra == 'dev' + - attrs>=19.2 ; extra == 'dev' + - hypothesis>=3.56 ; extra == 'dev' + - mock ; extra == 'dev' + - pygments>=2.7.2 ; extra == 'dev' + - requests ; extra == 'dev' + - setuptools ; extra == 'dev' + - xmlschema ; extra == 'dev' + requires_python: '>=3.8' +- kind: pypi + name: pytest-cov + version: 5.0.0 + url: https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl + sha256: 4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652 + requires_dist: + - pytest>=4.6 + - coverage[toml]>=5.2.1 + - fields ; extra == 'testing' + - hunter ; extra == 'testing' + - process-tests ; extra == 'testing' + - pytest-xdist ; extra == 'testing' + - virtualenv ; extra == 'testing' + requires_python: '>=3.8' +- kind: pypi + name: pytest-xdist + version: 3.6.1 + url: https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl + sha256: 9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7 + requires_dist: + - execnet>=2.1 + - pytest>=7.0.0 + - psutil>=3.0 ; extra == 'psutil' + - setproctitle ; extra == 'setproctitle' + - filelock ; extra == 'testing' + requires_python: '>=3.8' +- kind: conda + name: python + version: 3.9.19 + build: h0755675_0_cpython + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda + sha256: b9253ca9ca5427e6da4b1d43353a110e0f2edfab9c951afb4bf01cbae2825b31 + md5: d9ee3647fbd9e8595b8df759b2bbefb8 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libffi >=3.4,<4.0a0 + - libgcc-ng >=12 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.2.13,<2.0.0a0 + - ncurses >=6.4.20240210,<7.0a0 + - openssl >=3.2.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.9.* *_cp39 + license: Python-2.0 + purls: [] + size: 23800555 + timestamp: 1710940120866 +- kind: pypi + name: pytoml + version: 0.1.21 + url: https://files.pythonhosted.org/packages/a5/47/c7f8a0f210ad18576840922e0b504f0b7f5f73aea4a52ab14c5b58517edf/pytoml-0.1.21-py2.py3-none-any.whl + sha256: 57a21e6347049f73bfb62011ff34cd72774c031b9828cb628a752225136dfc33 +- kind: pypi + name: pyyaml + version: 6.0.2 + url: https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 + requires_python: '>=3.8' +- kind: conda + name: readline + version: '8.2' + build: h8228510_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + md5: 47d31b792659ce70f470b5c82fdfb7a4 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 281456 + timestamp: 1679532220005 +- kind: pypi + name: referencing + version: 0.35.1 + url: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl + sha256: eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de + requires_dist: + - attrs>=22.2.0 + - rpds-py>=0.7.0 + requires_python: '>=3.8' +- kind: pypi + name: requests + version: 2.32.3 + url: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl + sha256: 70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 + requires_dist: + - charset-normalizer<4,>=2 + - idna<4,>=2.5 + - urllib3<3,>=1.21.1 + - certifi>=2017.4.17 + - pysocks!=1.5.7,>=1.5.6 ; extra == 'socks' + - chardet<6,>=3.0.2 ; extra == 'use-chardet-on-py3' + requires_python: '>=3.8' +- kind: pypi + name: rpds-py + version: 0.20.0 + url: https://files.pythonhosted.org/packages/04/d8/e73d56b1908a6c0e3e5982365eb293170cd458cc25a19363f69c76e00fd2/rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda + requires_python: '>=3.8' +- kind: pypi + name: rtoml + version: 0.11.0 + url: https://files.pythonhosted.org/packages/16/64/c739f603413f5511d8319d65422f763636c31b6c6a785b046e1ad9fa1cb8/rtoml-0.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: b750450e1ac63eb43dfbba3612dbb1830b6d90cc22c6ea78d7f2322ec698727d + requires_python: '>=3.8' +- kind: pypi + name: ruamel-yaml + version: 0.18.6 + url: https://files.pythonhosted.org/packages/73/67/8ece580cc363331d9a53055130f86b096bf16e38156e33b1d3014fffda6b/ruamel.yaml-0.18.6-py3-none-any.whl + sha256: 57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636 + requires_dist: + - ruamel-yaml-clib>=0.2.7 ; platform_python_implementation == 'CPython' and python_version < '3.13' + - ryd ; extra == 'docs' + - mercurial>5.7 ; extra == 'docs' + - ruamel-yaml-jinja2>=0.2 ; extra == 'jinja2' + requires_python: '>=3.7' +- kind: pypi + name: ruamel-yaml-clib + version: 0.2.8 + url: https://files.pythonhosted.org/packages/7c/b2/389b345a60131593028b0263fddaa580edb4081697a3f3aa1f168f67519f/ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl + sha256: da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5 + requires_python: '>=3.6' +- kind: pypi + name: ruff + version: 0.5.7 + url: https://files.pythonhosted.org/packages/c8/3b/2b683be597bbd02046678fc3fc1c199c641512b20212073b58f173822bb3/ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 8d796327eed8e168164346b769dd9a27a70e0298d667b4ecee6877ce8095ec8e + requires_python: '>=3.7' +- kind: pypi + name: setuptools + version: 72.1.0 + url: https://files.pythonhosted.org/packages/e1/58/e0ef3b9974a04ce9cde2a7a33881ddcb2d68450803745804545cdd8d258f/setuptools-72.1.0-py3-none-any.whl + sha256: 5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1 + requires_dist: + - packaging>=24 ; extra == 'core' + - ordered-set>=3.1.1 ; extra == 'core' + - more-itertools>=8.8 ; extra == 'core' + - jaraco-text>=3.7 ; extra == 'core' + - wheel>=0.43.0 ; extra == 'core' + - platformdirs>=2.6.2 ; extra == 'core' + - importlib-metadata>=6 ; python_version < '3.10' and extra == 'core' + - tomli>=2.0.1 ; python_version < '3.11' and extra == 'core' + - importlib-resources>=5.10.2 ; python_version < '3.9' and extra == 'core' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pygments-github-lexers==0.0.5 ; extra == 'doc' + - sphinx-favicon ; extra == 'doc' + - sphinx-inline-tabs ; extra == 'doc' + - sphinx-reredirects ; extra == 'doc' + - sphinxcontrib-towncrier ; extra == 'doc' + - sphinx-notfound-page<2,>=1 ; extra == 'doc' + - pyproject-hooks!=1.1 ; extra == 'doc' + - pytest!=8.1.*,>=6 ; extra == 'test' + - pytest-checkdocs>=2.4 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mypy ; extra == 'test' + - pytest-enabler>=2.2 ; extra == 'test' + - virtualenv>=13.0.0 ; extra == 'test' + - wheel ; extra == 'test' + - pip>=19.1 ; extra == 'test' + - packaging>=23.2 ; extra == 'test' + - jaraco-envs>=2.2 ; extra == 'test' + - pytest-xdist>=3 ; extra == 'test' + - jaraco-path>=3.2.0 ; extra == 'test' + - build[virtualenv]>=1.0.3 ; extra == 'test' + - filelock>=3.4.0 ; extra == 'test' + - ini2toml[lite]>=0.14 ; extra == 'test' + - tomli-w>=1.0.0 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-home>=0.5 ; extra == 'test' + - mypy==1.11.* ; extra == 'test' + - tomli ; extra == 'test' + - importlib-metadata ; extra == 'test' + - pytest-subprocess ; extra == 'test' + - pyproject-hooks!=1.1 ; extra == 'test' + - jaraco-test ; extra == 'test' + - pytest-ruff<0.4 ; platform_system == 'Windows' and extra == 'test' + - jaraco-develop>=7.21 ; (python_version >= '3.9' and sys_platform != 'cygwin') and extra == 'test' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'test' + - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' + - pytest-ruff>=0.3.2 ; sys_platform != 'cygwin' and extra == 'test' + requires_python: '>=3.8' +- kind: pypi + name: sniffio + version: 1.3.1 + url: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl + sha256: 2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 + requires_python: '>=3.7' +- kind: pypi + name: snowballstemmer + version: 2.2.0 + url: https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl + sha256: c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a +- kind: pypi + name: soupsieve + version: '2.5' + url: https://files.pythonhosted.org/packages/4c/f3/038b302fdfbe3be7da016777069f26ceefe11a681055ea1f7817546508e3/soupsieve-2.5-py3-none-any.whl + sha256: eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7 + requires_python: '>=3.8' +- kind: pypi + name: sphinx + version: 7.4.7 + url: https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl + sha256: c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239 + requires_dist: + - sphinxcontrib-applehelp + - sphinxcontrib-devhelp + - sphinxcontrib-jsmath + - sphinxcontrib-htmlhelp>=2.0.0 + - sphinxcontrib-serializinghtml>=1.1.9 + - sphinxcontrib-qthelp + - jinja2>=3.1 + - pygments>=2.17 + - docutils>=0.20,<0.22 + - snowballstemmer>=2.2 + - babel>=2.13 + - alabaster~=0.7.14 + - imagesize>=1.3 + - requests>=2.30.0 + - packaging>=23.0 + - importlib-metadata>=6.0 ; python_version < '3.10' + - tomli>=2 ; python_version < '3.11' + - colorama>=0.4.6 ; sys_platform == 'win32' + - sphinxcontrib-websupport ; extra == 'docs' + - flake8>=6.0 ; extra == 'lint' + - ruff==0.5.2 ; extra == 'lint' + - mypy==1.10.1 ; extra == 'lint' + - sphinx-lint>=0.9 ; extra == 'lint' + - types-docutils==0.21.0.20240711 ; extra == 'lint' + - types-requests>=2.30.0 ; extra == 'lint' + - importlib-metadata>=6.0 ; extra == 'lint' + - tomli>=2 ; extra == 'lint' + - pytest>=6.0 ; extra == 'lint' + - pytest>=8.0 ; extra == 'test' + - defusedxml>=0.7.1 ; extra == 'test' + - cython>=3.0 ; extra == 'test' + - setuptools>=70.0 ; extra == 'test' + - typing-extensions>=4.9 ; extra == 'test' + requires_python: '>=3.9' +- kind: pypi + name: sphinx-api-relink + version: 0.0.9 + url: https://files.pythonhosted.org/packages/15/0a/8c4dba0094c349211adc8c9161803547fbedd7c3b1f9123c544aa3da7cb8/sphinx_api_relink-0.0.9-py3-none-any.whl + sha256: d9395433391445aeb08a5608f82923d78f859ecc257ed91f2d0f5fcfe08d59e4 + requires_dist: + - sphinx>=4.4 + - colorama + - docutils + - importlib-metadata ; python_version < '3.8.0' + - typing-extensions ; python_version < '3.8.0' + - sphinx-api-relink[sty] ; extra == 'dev' + - mypy ; extra == 'sty' + - pre-commit>=1.4.0 ; extra == 'sty' + - ruff ; extra == 'sty' + - sphinx-api-relink[types] ; extra == 'sty' + - types-colorama ; extra == 'types' + - types-docutils ; extra == 'types' + - types-requests ; extra == 'types' + requires_python: '>=3.7' +- kind: pypi + name: sphinx-argparse + version: 0.4.0 + url: https://files.pythonhosted.org/packages/21/98/d32f45b19b60e52b4ddc714dee139a92c6ea8fa9115f994884d321c3454d/sphinx_argparse-0.4.0-py3-none-any.whl + sha256: 73bee01f7276fae2bf621ccfe4d167af7306e7288e3482005405d9f826f9b037 + requires_dist: + - commonmark>=0.5.6 ; extra == 'markdown' + - sphinx>=1.2.0 + requires_python: '>=3.7' +- kind: pypi + name: sphinx-autobuild + version: 2024.4.16 + url: https://files.pythonhosted.org/packages/53/de/1d005ba60b4b754d6e05079a479f16a8f6e08c1ec4f8d80288238502b4b6/sphinx_autobuild-2024.4.16-py3-none-any.whl + sha256: f2522779d30fcbf0253e09714f274ce8c608cb6ebcd67922b1c54de59faba702 + requires_dist: + - colorama + - sphinx + - starlette>=0.35 + - uvicorn>=0.25 + - watchfiles>=0.20 + - websockets>=11 + - pytest>=6 ; extra == 'test' + requires_python: '>=3.9' +- kind: pypi + name: sphinx-book-theme + version: 1.1.3 + url: https://files.pythonhosted.org/packages/2b/80/90574e2e82c955b9c6f6b77f7badb2cf2ef4ef77599e4343cced2d098681/sphinx_book_theme-1.1.3-py3-none-any.whl + sha256: a554a9a7ac3881979a87a2b10f633aa2a5706e72218a10f71be38b3c9e831ae9 + requires_dist: + - sphinx>=5 + - pydata-sphinx-theme>=0.15.2 + - pre-commit ; extra == 'code-style' + - ablog ; extra == 'doc' + - ipywidgets ; extra == 'doc' + - folium ; extra == 'doc' + - numpy ; extra == 'doc' + - matplotlib ; extra == 'doc' + - numpydoc ; extra == 'doc' + - myst-nb ; extra == 'doc' + - nbclient ; extra == 'doc' + - pandas ; extra == 'doc' + - plotly ; extra == 'doc' + - sphinx-design ; extra == 'doc' + - sphinx-examples ; extra == 'doc' + - sphinx-copybutton ; extra == 'doc' + - sphinx-tabs ; extra == 'doc' + - sphinx-togglebutton ; extra == 'doc' + - sphinx-thebe ; extra == 'doc' + - sphinxcontrib-bibtex ; extra == 'doc' + - sphinxcontrib-youtube ; extra == 'doc' + - sphinxext-opengraph ; extra == 'doc' + - beautifulsoup4 ; extra == 'test' + - coverage ; extra == 'test' + - defusedxml ; extra == 'test' + - myst-nb ; extra == 'test' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-regressions ; extra == 'test' + - sphinx-thebe ; extra == 'test' + requires_python: '>=3.9' +- kind: pypi + name: sphinx-codeautolink + version: 0.15.2 + url: https://files.pythonhosted.org/packages/b1/ef/8546618a14e5a491616950b71e9e55de2877a1fecba73e4bc76c62ab53a0/sphinx_codeautolink-0.15.2-py3-none-any.whl + sha256: 44d669ad92d11fd50dd4029887ea285acd95e097cf34a9cae3c6f707c1eb4763 + requires_dist: + - sphinx>=3.2.0 + - beautifulsoup4>=4.8.1 + - ipython!=8.7.0 ; extra == 'ipython' + requires_python: '>=3.7' +- kind: pypi + name: sphinx-copybutton + version: 0.5.2 + url: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl + sha256: fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e + requires_dist: + - sphinx>=1.8 + - pre-commit==2.12.1 ; extra == 'code-style' + - sphinx ; extra == 'rtd' + - ipython ; extra == 'rtd' + - myst-nb ; extra == 'rtd' + - sphinx-book-theme ; extra == 'rtd' + - sphinx-examples ; extra == 'rtd' + requires_python: '>=3.7' +- kind: pypi + name: sphinxcontrib-applehelp + version: 2.0.0 + url: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl + sha256: 4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 + requires_dist: + - ruff==0.5.5 ; extra == 'lint' + - mypy ; extra == 'lint' + - types-docutils ; extra == 'lint' + - sphinx>=5 ; extra == 'standalone' + - pytest ; extra == 'test' + requires_python: '>=3.9' +- kind: pypi + name: sphinxcontrib-devhelp + version: 2.0.0 + url: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl + sha256: aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 + requires_dist: + - ruff==0.5.5 ; extra == 'lint' + - mypy ; extra == 'lint' + - types-docutils ; extra == 'lint' + - sphinx>=5 ; extra == 'standalone' + - pytest ; extra == 'test' + requires_python: '>=3.9' +- kind: pypi + name: sphinxcontrib-htmlhelp + version: 2.1.0 + url: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl + sha256: 166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 + requires_dist: + - ruff==0.5.5 ; extra == 'lint' + - mypy ; extra == 'lint' + - types-docutils ; extra == 'lint' + - sphinx>=5 ; extra == 'standalone' + - pytest ; extra == 'test' + - html5lib ; extra == 'test' + requires_python: '>=3.9' +- kind: pypi + name: sphinxcontrib-jsmath + version: 1.0.1 + url: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl + sha256: 2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 + requires_dist: + - pytest ; extra == 'test' + - flake8 ; extra == 'test' + - mypy ; extra == 'test' + requires_python: '>=3.5' +- kind: pypi + name: sphinxcontrib-qthelp + version: 2.0.0 + url: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl + sha256: b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb + requires_dist: + - ruff==0.5.5 ; extra == 'lint' + - mypy ; extra == 'lint' + - types-docutils ; extra == 'lint' + - sphinx>=5 ; extra == 'standalone' + - pytest ; extra == 'test' + - defusedxml>=0.7.1 ; extra == 'test' + requires_python: '>=3.9' +- kind: pypi + name: sphinxcontrib-serializinghtml + version: 2.0.0 + url: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + sha256: 6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 + requires_dist: + - ruff==0.5.5 ; extra == 'lint' + - mypy ; extra == 'lint' + - types-docutils ; extra == 'lint' + - sphinx>=5 ; extra == 'standalone' + - pytest ; extra == 'test' + requires_python: '>=3.9' +- kind: pypi + name: starlette + version: 0.38.2 + url: https://files.pythonhosted.org/packages/c1/60/d976da9998e4f4a99e297cda09d61ce305919ea94cbeeb476dba4fece098/starlette-0.38.2-py3-none-any.whl + sha256: 4ec6a59df6bbafdab5f567754481657f7ed90dc9d69b0c9ff017907dd54faeff + requires_dist: + - anyio<5,>=3.4.0 + - typing-extensions>=3.10.0 ; python_version < '3.10' + - httpx>=0.22.0 ; extra == 'full' + - itsdangerous ; extra == 'full' + - jinja2 ; extra == 'full' + - python-multipart>=0.0.7 ; extra == 'full' + - pyyaml ; extra == 'full' + requires_python: '>=3.8' +- kind: conda + name: tk + version: 8.6.13 + build: noxft_h4845f30_101 + build_number: 101 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- kind: pypi + name: tomli + version: 2.0.1 + url: https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl + sha256: 939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc + requires_python: '>=3.7' +- kind: pypi + name: tomlkit + version: 0.13.0 + url: https://files.pythonhosted.org/packages/fd/7c/b753bf603852cab0a660da6e81f4ea5d2ca0f0b2b4870766d7aa9bceb7a2/tomlkit-0.13.0-py3-none-any.whl + sha256: 7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264 + requires_python: '>=3.8' +- kind: pypi + name: tox + version: 4.17.1 + url: https://files.pythonhosted.org/packages/c6/58/ca62a2e4b93e6b647d095a81e8fd1e51ca74ee5298afe98b788f49748e46/tox-4.17.1-py3-none-any.whl + sha256: 2974597c0353577126ab014f52d1a399fb761049e165ff34427f84e8cfe6c990 + requires_dist: + - cachetools>=5.4 + - chardet>=5.2 + - colorama>=0.4.6 + - filelock>=3.15.4 + - packaging>=24.1 + - platformdirs>=4.2.2 + - pluggy>=1.5 + - pyproject-api>=1.7.1 + - tomli>=2.0.1 ; python_version < '3.11' + - virtualenv>=20.26.3 + - furo>=2024.7.18 ; extra == 'docs' + - sphinx-argparse-cli>=1.16 ; extra == 'docs' + - sphinx-autodoc-typehints>=2.2.3 ; extra == 'docs' + - sphinx-copybutton>=0.5.2 ; extra == 'docs' + - sphinx-inline-tabs>=2023.4.21 ; extra == 'docs' + - sphinx>=7.4.7 ; extra == 'docs' + - sphinxcontrib-towncrier>=0.2.1a0 ; extra == 'docs' + - towncrier>=23.11 ; extra == 'docs' + - build[virtualenv]>=1.2.1 ; extra == 'testing' + - covdefaults>=2.3 ; extra == 'testing' + - detect-test-pollution>=1.2 ; extra == 'testing' + - devpi-process>=1 ; extra == 'testing' + - diff-cover>=9.1.1 ; extra == 'testing' + - distlib>=0.3.8 ; extra == 'testing' + - flaky>=3.8.1 ; extra == 'testing' + - hatch-vcs>=0.4 ; extra == 'testing' + - hatchling>=1.25 ; extra == 'testing' + - psutil>=6 ; extra == 'testing' + - pytest-cov>=5 ; extra == 'testing' + - pytest-mock>=3.14 ; extra == 'testing' + - pytest-xdist>=3.6.1 ; extra == 'testing' + - pytest>=8.3.2 ; extra == 'testing' + - re-assert>=1.1 ; extra == 'testing' + - setuptools>=70.3 ; extra == 'testing' + - time-machine>=2.14.2 ; implementation_name != 'pypy' and extra == 'testing' + - wheel>=0.43 ; extra == 'testing' + requires_python: '>=3.8' +- kind: pypi + name: traitlets + version: 5.14.3 + url: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + sha256: b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f + requires_dist: + - myst-parser ; extra == 'docs' + - pydata-sphinx-theme ; extra == 'docs' + - sphinx ; extra == 'docs' + - argcomplete>=3.0.3 ; extra == 'test' + - mypy>=1.7.0 ; extra == 'test' + - pre-commit ; extra == 'test' + - pytest-mock ; extra == 'test' + - pytest-mypy-testing ; extra == 'test' + - pytest<8.2,>=7.0 ; extra == 'test' + requires_python: '>=3.8' +- kind: pypi + name: types-pyyaml + version: 6.0.12.20240808 + url: https://files.pythonhosted.org/packages/f3/ad/ffbad24e2bc8f20bf047ec22af0c0a92f6ce2071eb21c9103df600cda6de/types_PyYAML-6.0.12.20240808-py3-none-any.whl + sha256: deda34c5c655265fc517b546c902aa6eed2ef8d3e921e4765fe606fe2afe8d35 + requires_python: '>=3.8' +- kind: pypi + name: types-toml + version: 0.10.8.20240310 + url: https://files.pythonhosted.org/packages/da/a2/d32ab58c0b216912638b140ab2170ee4b8644067c293b170e19fba340ccc/types_toml-0.10.8.20240310-py3-none-any.whl + sha256: 627b47775d25fa29977d9c70dc0cbab3f314f32c8d8d0c012f2ef5de7aaec05d + requires_python: '>=3.8' +- kind: pypi + name: typing-extensions + version: 4.12.2 + url: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl + sha256: 04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d + requires_python: '>=3.8' +- kind: conda + name: tzdata + version: 2024a + build: h0c530f3_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 + md5: 161081fc7cec0bfda0d86d7cb595f8d8 + license: LicenseRef-Public-Domain + purls: [] + size: 119815 + timestamp: 1706886945727 +- kind: pypi + name: urllib3 + version: 2.2.2 + url: https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl + sha256: a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 + requires_dist: + - brotli>=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' + - h2<5,>=4 ; extra == 'h2' + - pysocks!=1.5.7,<2.0,>=1.5.6 ; extra == 'socks' + - zstandard>=0.18.0 ; extra == 'zstd' + requires_python: '>=3.8' +- kind: pypi + name: uvicorn + version: 0.30.5 + url: https://files.pythonhosted.org/packages/67/d8/1bcb5e6508d14c6c9912cd964b286f04392298ffb3e4218f4a1292d64e76/uvicorn-0.30.5-py3-none-any.whl + sha256: b2d86de274726e9878188fa07576c9ceeff90a839e2b6e25c917fe05f5a6c835 + requires_dist: + - click>=7.0 + - h11>=0.8 + - typing-extensions>=4.0 ; python_version < '3.11' + - colorama>=0.4 ; sys_platform == 'win32' and extra == 'standard' + - httptools>=0.5.0 ; extra == 'standard' + - python-dotenv>=0.13 ; extra == 'standard' + - pyyaml>=5.1 ; extra == 'standard' + - uvloop!=0.15.0,!=0.15.1,>=0.14.0 ; (sys_platform != 'win32' and (sys_platform != 'cygwin' and platform_python_implementation != 'PyPy')) and extra == 'standard' + - watchfiles>=0.13 ; extra == 'standard' + - websockets>=10.4 ; extra == 'standard' + requires_python: '>=3.8' +- kind: pypi + name: virtualenv + version: 20.26.3 + url: https://files.pythonhosted.org/packages/07/4d/410156100224c5e2f0011d435e477b57aed9576fc7fe137abcf14ec16e11/virtualenv-20.26.3-py3-none-any.whl + sha256: 8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589 + requires_dist: + - distlib<1,>=0.3.7 + - filelock<4,>=3.12.2 + - importlib-metadata>=6.6 ; python_version < '3.8' + - platformdirs<5,>=3.9.1 + - furo>=2023.7.26 ; extra == 'docs' + - proselint>=0.13 ; extra == 'docs' + - sphinx!=7.3,>=7.1.2 ; extra == 'docs' + - sphinx-argparse>=0.4 ; extra == 'docs' + - sphinxcontrib-towncrier>=0.2.1a0 ; extra == 'docs' + - towncrier>=23.6 ; extra == 'docs' + - covdefaults>=2.3 ; extra == 'test' + - coverage-enable-subprocess>=1 ; extra == 'test' + - coverage>=7.2.7 ; extra == 'test' + - flaky>=3.7 ; extra == 'test' + - packaging>=23.1 ; extra == 'test' + - pytest-env>=0.8.2 ; extra == 'test' + - pytest-freezer>=0.4.8 ; (platform_python_implementation == 'PyPy' or (platform_python_implementation == 'CPython' and sys_platform == 'win32' and python_version >= '3.13')) and extra == 'test' + - pytest-mock>=3.11.1 ; extra == 'test' + - pytest-randomly>=3.12 ; extra == 'test' + - pytest-timeout>=2.1 ; extra == 'test' + - pytest>=7.4 ; extra == 'test' + - setuptools>=68 ; extra == 'test' + - time-machine>=2.10 ; platform_python_implementation == 'CPython' and extra == 'test' + requires_python: '>=3.7' +- kind: pypi + name: watchfiles + version: 0.23.0 + url: https://files.pythonhosted.org/packages/57/65/f3e854c5b8912d76c8fefc7c891b3df628b9110907b968faadcb8142347e/watchfiles-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 18e2de19801b0eaa4c5292a223effb7cfb43904cb742c5317a0ac686ed604765 + requires_dist: + - anyio>=3.0.0 + requires_python: '>=3.8' +- kind: pypi + name: websockets + version: '12.0' + url: https://files.pythonhosted.org/packages/06/dd/e8535f54b4aaded1ed44041ca8eb9de8786ce719ff148b56b4a903ef93e6/websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9 + requires_python: '>=3.8' +- kind: pypi + name: wheel + version: 0.44.0 + url: https://files.pythonhosted.org/packages/1b/d1/9babe2ccaecff775992753d8686970b1e2755d21c8a63be73aba7a4e7d77/wheel-0.44.0-py3-none-any.whl + sha256: 2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f + requires_dist: + - pytest>=6.0.0 ; extra == 'test' + - setuptools>=65 ; extra == 'test' + requires_python: '>=3.8' +- kind: conda + name: xz + version: 5.2.6 + build: h166bdaf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 + md5: 2161070d867d1b1204ea749c8eec4ef0 + depends: + - libgcc-ng >=12 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 418368 + timestamp: 1660346797927 +- kind: pypi + name: zipp + version: 3.19.2 + url: https://files.pythonhosted.org/packages/20/38/f5c473fe9b90c8debdd29ea68d5add0289f1936d6f923b6b9cc0b931194c/zipp-3.19.2-py3-none-any.whl + sha256: f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c + requires_dist: + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pytest!=8.1.*,>=6 ; extra == 'test' + - pytest-checkdocs>=2.4 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mypy ; extra == 'test' + - pytest-enabler>=2.2 ; extra == 'test' + - pytest-ruff>=0.2.1 ; extra == 'test' + - jaraco-itertools ; extra == 'test' + - jaraco-functools ; extra == 'test' + - more-itertools ; extra == 'test' + - big-o ; extra == 'test' + - pytest-ignore-flaky ; extra == 'test' + - jaraco-test ; extra == 'test' + - importlib-resources ; python_version < '3.9' and extra == 'test' + requires_python: '>=3.8' diff --git a/pyproject.toml b/pyproject.toml index 3c7d10f0..f3c29019 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -115,6 +115,7 @@ namespaces = false where = ["src"] [tool.setuptools_scm] +local_scheme = "no-local-version" write_to = "src/compwa_policy/version.py" [tool.coverage.run] @@ -147,6 +148,25 @@ module = ["ruamel.*"] ignore_missing_imports = true module = ["nbformat.*"] +[tool.pixi.project] +channels = ["conda-forge"] +platforms = ["linux-64"] + +[tool.pixi.dependencies] +python = "3.9.*" + +[tool.pixi.environments] +compwa-policy = {features = [ + "dev", + "doc", + "sty", + "test", + "types", +], solve-group = "default"} + +[tool.pixi.pypi-dependencies] +compwa-policy = {path = ".", editable = true} + [tool.pyright] exclude = [ "**/.git", From 6b1139521d469f4984341c3391c2928c9875e9fe Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:14 +0200 Subject: [PATCH 02/44] FEAT: automatically implement Pixi dev environment --- pixi.lock | 2 +- src/compwa_policy/check_dev_files/__init__.py | 2 ++ src/compwa_policy/check_dev_files/pixi.py | 28 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/compwa_policy/check_dev_files/pixi.py diff --git a/pixi.lock b/pixi.lock index 90deb9bb..419783ed 100644 --- a/pixi.lock +++ b/pixi.lock @@ -447,7 +447,7 @@ packages: requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' - kind: pypi name: compwa-policy - version: 0.3.19.dev3 + version: 0.3.19.dev4 path: . sha256: 379e86ec055c85cc7afb4d9fe6b340c21f22e7307bde700fc952e677d1d12506 requires_dist: diff --git a/src/compwa_policy/check_dev_files/__init__.py b/src/compwa_policy/check_dev_files/__init__.py index b71b98f2..988db379 100644 --- a/src/compwa_policy/check_dev_files/__init__.py +++ b/src/compwa_policy/check_dev_files/__init__.py @@ -22,6 +22,7 @@ jupyter, mypy, nbstripout, + pixi, precommit, prettier, pyright, @@ -82,6 +83,7 @@ def main(argv: Sequence[str] | None = None) -> int: if has_notebooks: do(jupyter.main, args.no_ruff) do(nbstripout.main, precommit_config, _to_list(args.allowed_cell_metadata)) + do(pixi.main) do(toml.main, precommit_config) # has to run before pre-commit do(prettier.main, precommit_config, args.no_prettierrc) if is_python_repo: diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py new file mode 100644 index 00000000..b2c547aa --- /dev/null +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -0,0 +1,28 @@ +"""Update pixi implementation.""" + +from tomlkit import inline_table + +from compwa_policy.utilities.pyproject import ModifiablePyproject +from compwa_policy.utilities.toml import to_toml_array + + +def main() -> None: + with ModifiablePyproject.load() as pyproject: + _update_dev_environment(pyproject) + + +def _update_dev_environment(pyproject: ModifiablePyproject) -> None: + if not pyproject.has_table("project.optional-dependencies"): + return + optional_dependencies = sorted(pyproject.get_table("project.optional-dependencies")) + expected = inline_table() + expected.update({ + "features": to_toml_array(optional_dependencies), + "solve-group": "default", + }) + environments = pyproject.get_table("tool.pixi.environments", create=True) + package_name = pyproject.get_package_name(raise_on_missing=True) + if environments.get(package_name) != expected: + environments[package_name] = expected + msg = "Updated Pixi developer environment" + pyproject.append_to_changelog(msg) From f92d30edc9bc6fa88c394d62505e233b4ae832ff Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:17 +0200 Subject: [PATCH 03/44] ENH: remove local git info from version if Pixi repo --- pixi.lock | 2 +- src/compwa_policy/check_dev_files/pixi.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pixi.lock b/pixi.lock index 419783ed..dfbaa78a 100644 --- a/pixi.lock +++ b/pixi.lock @@ -447,7 +447,7 @@ packages: requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' - kind: pypi name: compwa-policy - version: 0.3.19.dev4 + version: 0.3.19.dev5 path: . sha256: 379e86ec055c85cc7afb4d9fe6b340c21f22e7307bde700fc952e677d1d12506 requires_dist: diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index b2c547aa..8b030438 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -8,9 +8,22 @@ def main() -> None: with ModifiablePyproject.load() as pyproject: + _configure_setuptools_scm(pyproject) _update_dev_environment(pyproject) +def _configure_setuptools_scm(pyproject: ModifiablePyproject) -> None: + """Configure :code:`setuptools_scm` to not include git info in package version.""" + if not pyproject.has_table("tool.setuptools_scm"): + return + setuptools_scm = pyproject.get_table("tool.setuptools_scm") + expected_scheme = "no-local-version" + if setuptools_scm.get("local_scheme") != expected_scheme: + setuptools_scm["local_scheme"] = expected_scheme + msg = "Configured setuptools_scm to not include git info in package version for pixi" + pyproject.append_to_changelog(msg) + + def _update_dev_environment(pyproject: ModifiablePyproject) -> None: if not pyproject.has_table("project.optional-dependencies"): return From 6e1d63d0c6d869cd89f44f2297a7317393f4b2e0 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:22 +0200 Subject: [PATCH 04/44] ENH: switch to post-release version scheme --- pixi.lock | 4 ++-- pyproject.toml | 1 + src/compwa_policy/check_dev_files/pixi.py | 11 +++++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/pixi.lock b/pixi.lock index dfbaa78a..69cac5bc 100644 --- a/pixi.lock +++ b/pixi.lock @@ -447,9 +447,9 @@ packages: requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' - kind: pypi name: compwa-policy - version: 0.3.19.dev5 + version: 0.3.18.post6 path: . - sha256: 379e86ec055c85cc7afb4d9fe6b340c21f22e7307bde700fc952e677d1d12506 + sha256: 0855bd706b1c2f907c2257a6845cda3925b6f78840f9f1a5676af4bb1a14427c requires_dist: - pyyaml - attrs>=20.1.0 diff --git a/pyproject.toml b/pyproject.toml index f3c29019..c97e9439 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -116,6 +116,7 @@ where = ["src"] [tool.setuptools_scm] local_scheme = "no-local-version" +version_scheme = "post-release" write_to = "src/compwa_policy/version.py" [tool.coverage.run] diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 8b030438..a34bd816 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -2,7 +2,7 @@ from tomlkit import inline_table -from compwa_policy.utilities.pyproject import ModifiablePyproject +from compwa_policy.utilities.pyproject import ModifiablePyproject, complies_with_subset from compwa_policy.utilities.toml import to_toml_array @@ -17,9 +17,12 @@ def _configure_setuptools_scm(pyproject: ModifiablePyproject) -> None: if not pyproject.has_table("tool.setuptools_scm"): return setuptools_scm = pyproject.get_table("tool.setuptools_scm") - expected_scheme = "no-local-version" - if setuptools_scm.get("local_scheme") != expected_scheme: - setuptools_scm["local_scheme"] = expected_scheme + expected_scheme = { + "local_scheme": "no-local-version", + "version_scheme": "post-release", + } + if not complies_with_subset(setuptools_scm, expected_scheme): + setuptools_scm.update(expected_scheme) msg = "Configured setuptools_scm to not include git info in package version for pixi" pyproject.append_to_changelog(msg) From 80e05c22af554ab9f9b06924246ea660016c51be Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:26 +0200 Subject: [PATCH 05/44] DX: highlight `pixi.lock` as YAML file --- .vscode/settings.json | 3 +++ pixi.lock | 2 +- src/compwa_policy/check_dev_files/pixi.py | 12 +++++++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 8fd9d604..6cb7c6d2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -33,6 +33,9 @@ "cSpell.enabled": true, "diffEditor.experimental.showMoves": true, "editor.formatOnSave": true, + "files.associations": { + "**/pixi.lock": "yaml" + }, "files.watcherExclude": { "**/*_cache/**": true, "**/.eggs/**": true, diff --git a/pixi.lock b/pixi.lock index 69cac5bc..fde51a81 100644 --- a/pixi.lock +++ b/pixi.lock @@ -447,7 +447,7 @@ packages: requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' - kind: pypi name: compwa-policy - version: 0.3.18.post6 + version: 0.3.18.post7 path: . sha256: 0855bd706b1c2f907c2257a6845cda3925b6f78840f9f1a5676af4bb1a14427c requires_dist: diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index a34bd816..72a2056e 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -2,14 +2,20 @@ from tomlkit import inline_table +from compwa_policy.utilities import vscode +from compwa_policy.utilities.executor import Executor from compwa_policy.utilities.pyproject import ModifiablePyproject, complies_with_subset from compwa_policy.utilities.toml import to_toml_array def main() -> None: - with ModifiablePyproject.load() as pyproject: - _configure_setuptools_scm(pyproject) - _update_dev_environment(pyproject) + with Executor() as do, ModifiablePyproject.load() as pyproject: + do(_configure_setuptools_scm, pyproject) + do(_update_dev_environment, pyproject) + do( + vscode.update_settings, + {"files.associations": {"**/pixi.lock": "yaml"}}, + ) def _configure_setuptools_scm(pyproject: ModifiablePyproject) -> None: From b22d5dbb7b7456a0b6beaf7aa8ff8f918a8a7cc0 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:29 +0200 Subject: [PATCH 06/44] FIX: specify Pixi environment name in `.envrc` --- .envrc | 2 +- pixi.lock | 2 +- src/compwa_policy/check_dev_files/direnv.py | 54 +++++++++++++++------ 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/.envrc b/.envrc index e1d415a5..05db1f57 100644 --- a/.envrc +++ b/.envrc @@ -4,7 +4,7 @@ elif [ -e venv ]; then source venv/bin/activate elif [ -e .pixi ]; then watch_file pixi.lock - eval "$(pixi shell-hook)" + eval "$(pixi shell-hook --environment compwa-policy)" else layout anaconda fi diff --git a/pixi.lock b/pixi.lock index fde51a81..41b3a4db 100644 --- a/pixi.lock +++ b/pixi.lock @@ -447,7 +447,7 @@ packages: requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' - kind: pypi name: compwa-policy - version: 0.3.18.post7 + version: 0.3.18.post8 path: . sha256: 0855bd706b1c2f907c2257a6845cda3925b6f78840f9f1a5676af4bb1a14427c requires_dist: diff --git a/src/compwa_policy/check_dev_files/direnv.py b/src/compwa_policy/check_dev_files/direnv.py index d21850ff..d73af11e 100644 --- a/src/compwa_policy/check_dev_files/direnv.py +++ b/src/compwa_policy/check_dev_files/direnv.py @@ -4,37 +4,63 @@ from textwrap import dedent, indent +import rtoml + from compwa_policy.errors import PrecommitError from compwa_policy.utilities import CONFIG_PATH from compwa_policy.utilities.pyproject import Pyproject -__SCRIPTS = { - "conda": "layout anaconda", - "pixi": """ - watch_file pixi.lock - eval "$(pixi shell-hook)" - """, - "venv": "source venv/bin/activate", - "uv-venv": "source .venv/bin/activate", -} - def main() -> None: statements: list[tuple[str | None, str]] = [ - (".venv", __SCRIPTS["uv-venv"]), - ("venv", __SCRIPTS["venv"]), + (".venv", "source .venv/bin/activate"), + ("venv", "source venv/bin/activate"), ] if ( CONFIG_PATH.pixi_lock.exists() or CONFIG_PATH.pixi_toml.exists() or (CONFIG_PATH.pyproject.exists() and Pyproject.load().has_table("tool.pixi")) ): - statements.append((".pixi", __SCRIPTS["pixi"])) + dev_environment = __determine_pixi_dev_environment() + if dev_environment is None: + environment_flag = "" + else: + environment_flag = f" --environment {dev_environment}" + script = f""" + watch_file pixi.lock + eval "$(pixi shell-hook{environment_flag})" + """ + statements.append((".pixi", script)) if CONFIG_PATH.conda.exists(): - statements.append((None, __SCRIPTS["conda"])) + statements.append((None, "layout anaconda")) _update_envrc(statements) +def __determine_pixi_dev_environment() -> str | None: + search_terms = ["dev"] + if CONFIG_PATH.pyproject.exists(): + pyproject = Pyproject.load() + package_name = pyproject.get_package_name() + if package_name is not None: + search_terms.append(package_name) + available_environments = __get_pixi_environment_names() + for candidate in search_terms: + if candidate in available_environments: + return candidate + return None + + +def __get_pixi_environment_names() -> set[str]: + if CONFIG_PATH.pixi_toml.exists(): + pixi_config = rtoml.load(CONFIG_PATH.pixi_toml) + return set(pixi_config.get("environments", set())) + if CONFIG_PATH.pyproject.exists(): + pyproject = Pyproject.load() + if pyproject.has_table("tool.pixi.environments"): + return set(pyproject.get_table("tool.pixi.environments")) + return set() + + def _update_envrc(statements: list[tuple[str | None, str]]) -> None: expected = "" for i, (trigger_path, script) in enumerate(statements): From ca4b3585126e5744a8421b18bdf30b4a14b123ab Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:31 +0200 Subject: [PATCH 07/44] ENH: automatically write minimal Pixi configuration --- pixi.lock | 2 +- src/compwa_policy/check_dev_files/pixi.py | 14 ++++++ .../utilities/pyproject/__init__.py | 46 ++++++++++++++++++- 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/pixi.lock b/pixi.lock index 41b3a4db..94fc16e4 100644 --- a/pixi.lock +++ b/pixi.lock @@ -447,7 +447,7 @@ packages: requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' - kind: pypi name: compwa-policy - version: 0.3.18.post8 + version: 0.3.18.post9 path: . sha256: 0855bd706b1c2f907c2257a6845cda3925b6f78840f9f1a5676af4bb1a14427c requires_dist: diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 72a2056e..81c7dc7a 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -11,6 +11,7 @@ def main() -> None: with Executor() as do, ModifiablePyproject.load() as pyproject: do(_configure_setuptools_scm, pyproject) + do(_define_minimal_project, pyproject) do(_update_dev_environment, pyproject) do( vscode.update_settings, @@ -33,6 +34,19 @@ def _configure_setuptools_scm(pyproject: ModifiablePyproject) -> None: pyproject.append_to_changelog(msg) +def _define_minimal_project(pyproject: ModifiablePyproject) -> None: + """Create a minimal Pixi project definition if it does not exist.""" + settings = pyproject.get_table("tool.pixi.project", create=True) + minimal_settings = dict( + channels=["conda-forge"], + platforms=["linux-64"], + ) + if not complies_with_subset(settings, minimal_settings, exact_value_match=False): + settings.update(minimal_settings) + msg = "Defined minimal Pixi project settings" + pyproject.append_to_changelog(msg) + + def _update_dev_environment(pyproject: ModifiablePyproject) -> None: if not pyproject.has_table("project.optional-dependencies"): return diff --git a/src/compwa_policy/utilities/pyproject/__init__.py b/src/compwa_policy/utilities/pyproject/__init__.py index 4d696558..a05ec440 100644 --- a/src/compwa_policy/utilities/pyproject/__init__.py +++ b/src/compwa_policy/utilities/pyproject/__init__.py @@ -4,6 +4,7 @@ import io import sys +from collections import abc from contextlib import AbstractContextManager from pathlib import Path from textwrap import indent @@ -231,8 +232,49 @@ def append_to_changelog(self, message: str) -> None: self._changelog.append(message) -def complies_with_subset(settings: Mapping, minimal_settings: Mapping) -> bool: - return all(settings.get(key) == value for key, value in minimal_settings.items()) +def complies_with_subset( + settings: Mapping, + minimal_settings: Mapping, + *, + exact_value_match: bool = True, +) -> bool: + """Compare if a nested mapping fits inside another nested mapping. + + >>> complies_with_subset( + ... {"channels": ["conda-forge"]}, + ... {"channels": ["conda-forge"], "platforms": ["linux-64"]}, + ... ) + False + >>> complies_with_subset( + ... {"channels": ["conda-forge"], "platforms": ["linux-64"]}, + ... {"channels": ["conda-forge"]}, + ... ) + True + >>> complies_with_subset( + ... {"channels": ["conda-forge", "default"]}, + ... {"channels": ["conda-forge"]}, + ... exact_value_match=False, + ... ) + True + """ + if exact_value_match: + return all( + settings.get(key) == expected for key, expected in minimal_settings.items() + ) + for key, expected in minimal_settings.items(): + if not _complies_minimally(settings.get(key), expected): + return False + return True + + +def _complies_minimally(obj: Any, other: Any) -> bool: + if isinstance(other, abc.Mapping): + return complies_with_subset(obj, other, exact_value_match=False) + if isinstance(other, str): + return obj == other + if isinstance(obj, abc.Iterable): + return set(other) <= set(obj) + return obj == other def get_build_system() -> Literal["pyproject", "setup.cfg"] | None: From 7ac3e8730640f9237dc93ba035a50b01a47a93a3 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:32 +0200 Subject: [PATCH 08/44] ENH; install Python package in editable mode in Pixi --- pixi.lock | 2 +- src/compwa_policy/check_dev_files/__init__.py | 2 +- src/compwa_policy/check_dev_files/pixi.py | 18 +++++++++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/pixi.lock b/pixi.lock index 94fc16e4..fbede07e 100644 --- a/pixi.lock +++ b/pixi.lock @@ -447,7 +447,7 @@ packages: requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' - kind: pypi name: compwa-policy - version: 0.3.18.post9 + version: 0.3.18.post10 path: . sha256: 0855bd706b1c2f907c2257a6845cda3925b6f78840f9f1a5676af4bb1a14427c requires_dist: diff --git a/src/compwa_policy/check_dev_files/__init__.py b/src/compwa_policy/check_dev_files/__init__.py index 988db379..db0bee9c 100644 --- a/src/compwa_policy/check_dev_files/__init__.py +++ b/src/compwa_policy/check_dev_files/__init__.py @@ -83,7 +83,7 @@ def main(argv: Sequence[str] | None = None) -> int: if has_notebooks: do(jupyter.main, args.no_ruff) do(nbstripout.main, precommit_config, _to_list(args.allowed_cell_metadata)) - do(pixi.main) + do(pixi.main, is_python_repo) do(toml.main, precommit_config) # has to run before pre-commit do(prettier.main, precommit_config, args.no_prettierrc) if is_python_repo: diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 81c7dc7a..0b96a544 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -8,10 +8,12 @@ from compwa_policy.utilities.toml import to_toml_array -def main() -> None: +def main(is_python_package: bool) -> None: with Executor() as do, ModifiablePyproject.load() as pyproject: do(_configure_setuptools_scm, pyproject) do(_define_minimal_project, pyproject) + if is_python_package: + do(_install_package_editable, pyproject) do(_update_dev_environment, pyproject) do( vscode.update_settings, @@ -47,6 +49,20 @@ def _define_minimal_project(pyproject: ModifiablePyproject) -> None: pyproject.append_to_changelog(msg) +def _install_package_editable(pyproject: ModifiablePyproject) -> None: + editable = inline_table() + editable.update({ + "path": ".", + "editable": True, + }) + package_name = pyproject.get_package_name(raise_on_missing=True) + existing = pyproject.get_table("tool.pixi.pypi-dependencies", create=True) + if dict(existing.get(package_name, {})) != dict(editable): + existing[package_name] = editable + msg = "Installed Python package in editable mode in Pixi" + pyproject.append_to_changelog(msg) + + def _update_dev_environment(pyproject: ModifiablePyproject) -> None: if not pyproject.has_table("project.optional-dependencies"): return From 64a2675f8f107b59a2e39050d50aec5298ce0f42 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:33 +0200 Subject: [PATCH 09/44] ENH: pin Python version in Pixi environment --- pixi.lock | 2 +- src/compwa_policy/check_dev_files/__init__.py | 2 +- src/compwa_policy/check_dev_files/pixi.py | 15 ++++++++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/pixi.lock b/pixi.lock index fbede07e..d62718ca 100644 --- a/pixi.lock +++ b/pixi.lock @@ -447,7 +447,7 @@ packages: requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' - kind: pypi name: compwa-policy - version: 0.3.18.post10 + version: 0.3.18.post11 path: . sha256: 0855bd706b1c2f907c2257a6845cda3925b6f78840f9f1a5676af4bb1a14427c requires_dist: diff --git a/src/compwa_policy/check_dev_files/__init__.py b/src/compwa_policy/check_dev_files/__init__.py index db0bee9c..b0d98b1f 100644 --- a/src/compwa_policy/check_dev_files/__init__.py +++ b/src/compwa_policy/check_dev_files/__init__.py @@ -83,7 +83,7 @@ def main(argv: Sequence[str] | None = None) -> int: if has_notebooks: do(jupyter.main, args.no_ruff) do(nbstripout.main, precommit_config, _to_list(args.allowed_cell_metadata)) - do(pixi.main, is_python_repo) + do(pixi.main, is_python_repo, dev_python_version) do(toml.main, precommit_config) # has to run before pre-commit do(prettier.main, precommit_config, args.no_prettierrc) if is_python_repo: diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 0b96a544..ac615d0b 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -5,15 +5,17 @@ from compwa_policy.utilities import vscode from compwa_policy.utilities.executor import Executor from compwa_policy.utilities.pyproject import ModifiablePyproject, complies_with_subset +from compwa_policy.utilities.pyproject.getters import PythonVersion from compwa_policy.utilities.toml import to_toml_array -def main(is_python_package: bool) -> None: +def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: with Executor() as do, ModifiablePyproject.load() as pyproject: do(_configure_setuptools_scm, pyproject) do(_define_minimal_project, pyproject) if is_python_package: do(_install_package_editable, pyproject) + do(_set_dev_python_version, pyproject, dev_python_version) do(_update_dev_environment, pyproject) do( vscode.update_settings, @@ -63,6 +65,17 @@ def _install_package_editable(pyproject: ModifiablePyproject) -> None: pyproject.append_to_changelog(msg) +def _set_dev_python_version( + pyproject: ModifiablePyproject, dev_python_version: PythonVersion +) -> None: + dependencies = pyproject.get_table("tool.pixi.dependencies", create=True) + version = f"{dev_python_version}.*" + if dependencies.get("python") != version: + dependencies["python"] = version + msg = f"Set Python version for Pixi developer environment to {version}" + pyproject.append_to_changelog(msg) + + def _update_dev_environment(pyproject: ModifiablePyproject) -> None: if not pyproject.has_table("project.optional-dependencies"): return From d11e8e6057a640aa9ec8d9fee04edee029928814 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:34 +0200 Subject: [PATCH 10/44] MAINT: remove `pixi.lock` file --- .gitignore | 1 + pixi.lock | 1927 ---------------------------------------------------- 2 files changed, 1 insertion(+), 1927 deletions(-) delete mode 100644 pixi.lock diff --git a/.gitignore b/.gitignore index 7ee26cab..b9b70df8 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ prof/ .pixi/ .tox/ pyvenv*/ +pixi.lock # Settings .idea/ diff --git a/pixi.lock b/pixi.lock deleted file mode 100644 index d62718ca..00000000 --- a/pixi.lock +++ /dev/null @@ -1,1927 +0,0 @@ -version: 5 -environments: - compwa-policy: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7b/a2/10639a79341f6c019dedc95bd48a4928eed9f1d1197f4c04f546fc7ae0ff/anyio-4.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/e6/a1551acbaa06f3e48b311329828a34bc9c51a8cfaecdeb4d03c329a1ef85/cachetools-5.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/69/5d8751b4b670d623aa7a47bef061d69c279e9f922f6705147983aa76c3ce/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/6f/eef79b779a540326fee9520e5542a8b428cc3bfa8b7c8f1022c1ee4fc66c/coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/8e/41/9307e4f5f9976bc8b7fea0b66367734e8faf3ec84bc0d412d8cfabbb66cd/distlib-0.3.8-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6d/ca/086311cdfc017ec964b2436fe0c98c1f4efcb7e4c328956a22456e497655/fastjsonschema-2.20.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ae/f0/48285f0262fe47103a4a45972ed2f9b93e4c80b8fd609fa98da78b2a5706/filelock-3.15.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/43/e1d53588561e533212117750ee79ad0ba02a41f52a08c1df3396bd466c05/html2text-2024.2.26.tar.gz - - pypi: https://files.pythonhosted.org/packages/24/6c/a4f39abe7f19600b74528d0c717b52fff0b300bb0161081510d39c53cb00/identify-2.6.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/82/47/bb25ec04985d0693da478797c3d8c1092b140f3a53ccb984fbbd38affa5b/importlib_metadata-8.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ea/6d/a78a58b1d2007ebce56f1dc745b2763d4ba5a4b6faadca7dc034297c04c8/ini2toml-0.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/d0/2b1e404231a0c57fadcca64361fcffd13eda5346222edaf04b7938300fd1/labels-20.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/ef/f7/8a4dcea720a581e69ac8c5a38524baf0e3e2bb5f3819a9ff661464fe7d10/mdit_py_plugins-0.4.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/a3/ffc2ee9b8689920a524a8013bf05482f51d191d73a8a3939f3d47d9a485a/mypy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/de/21aa8394f16add8f7427f0a1326ccd2b3a2a8a3245c9252bc5ac034c6155/myst_parser-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d4/55/90db48d85f7689ec6f81c0db0622d704306c5284850383c090e6c7195a5c/pip-24.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/92/caae8c86e94681b42c246f0bca35c059a2f0529e5b92619f6aba4cf7e7b6/pre_commit-3.8.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/de/88/c1451b66664ae596bae93928ff372f4da89c2c7250132ecb76cc99256c93/pyproject_api-1.7.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a5/47/c7f8a0f210ad18576840922e0b504f0b7f5f73aea4a52ab14c5b58517edf/pytoml-0.1.21-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/d8/e73d56b1908a6c0e3e5982365eb293170cd458cc25a19363f69c76e00fd2/rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/16/64/c739f603413f5511d8319d65422f763636c31b6c6a785b046e1ad9fa1cb8/rtoml-0.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/73/67/8ece580cc363331d9a53055130f86b096bf16e38156e33b1d3014fffda6b/ruamel.yaml-0.18.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7c/b2/389b345a60131593028b0263fddaa580edb4081697a3f3aa1f168f67519f/ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c8/3b/2b683be597bbd02046678fc3fc1c199c641512b20212073b58f173822bb3/ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e1/58/e0ef3b9974a04ce9cde2a7a33881ddcb2d68450803745804545cdd8d258f/setuptools-72.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4c/f3/038b302fdfbe3be7da016777069f26ceefe11a681055ea1f7817546508e3/soupsieve-2.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/0a/8c4dba0094c349211adc8c9161803547fbedd7c3b1f9123c544aa3da7cb8/sphinx_api_relink-0.0.9-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/21/98/d32f45b19b60e52b4ddc714dee139a92c6ea8fa9115f994884d321c3454d/sphinx_argparse-0.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/de/1d005ba60b4b754d6e05079a479f16a8f6e08c1ec4f8d80288238502b4b6/sphinx_autobuild-2024.4.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/80/90574e2e82c955b9c6f6b77f7badb2cf2ef4ef77599e4343cced2d098681/sphinx_book_theme-1.1.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b1/ef/8546618a14e5a491616950b71e9e55de2877a1fecba73e4bc76c62ab53a0/sphinx_codeautolink-0.15.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/60/d976da9998e4f4a99e297cda09d61ce305919ea94cbeeb476dba4fece098/starlette-0.38.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/7c/b753bf603852cab0a660da6e81f4ea5d2ca0f0b2b4870766d7aa9bceb7a2/tomlkit-0.13.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/58/ca62a2e4b93e6b647d095a81e8fd1e51ca74ee5298afe98b788f49748e46/tox-4.17.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/ad/ffbad24e2bc8f20bf047ec22af0c0a92f6ce2071eb21c9103df600cda6de/types_PyYAML-6.0.12.20240808-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/a2/d32ab58c0b216912638b140ab2170ee4b8644067c293b170e19fba340ccc/types_toml-0.10.8.20240310-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/67/d8/1bcb5e6508d14c6c9912cd964b286f04392298ffb3e4218f4a1292d64e76/uvicorn-0.30.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/4d/410156100224c5e2f0011d435e477b57aed9576fc7fe137abcf14ec16e11/virtualenv-20.26.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/57/65/f3e854c5b8912d76c8fefc7c891b3df628b9110907b968faadcb8142347e/watchfiles-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/06/dd/e8535f54b4aaded1ed44041ca8eb9de8786ce719ff148b56b4a903ef93e6/websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/1b/d1/9babe2ccaecff775992753d8686970b1e2755d21c8a63be73aba7a4e7d77/wheel-0.44.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/20/38/f5c473fe9b90c8debdd29ea68d5add0289f1936d6f923b6b9cc0b931194c/zipp-3.19.2-py3-none-any.whl - - pypi: . - default: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6d/ca/086311cdfc017ec964b2436fe0c98c1f4efcb7e4c328956a22456e497655/fastjsonschema-2.20.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/43/e1d53588561e533212117750ee79ad0ba02a41f52a08c1df3396bd466c05/html2text-2024.2.26.tar.gz - - pypi: https://files.pythonhosted.org/packages/82/47/bb25ec04985d0693da478797c3d8c1092b140f3a53ccb984fbbd38affa5b/importlib_metadata-8.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ea/6d/a78a58b1d2007ebce56f1dc745b2763d4ba5a4b6faadca7dc034297c04c8/ini2toml-0.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d4/55/90db48d85f7689ec6f81c0db0622d704306c5284850383c090e6c7195a5c/pip-24.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/d8/e73d56b1908a6c0e3e5982365eb293170cd458cc25a19363f69c76e00fd2/rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/16/64/c739f603413f5511d8319d65422f763636c31b6c6a785b046e1ad9fa1cb8/rtoml-0.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/73/67/8ece580cc363331d9a53055130f86b096bf16e38156e33b1d3014fffda6b/ruamel.yaml-0.18.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7c/b2/389b345a60131593028b0263fddaa580edb4081697a3f3aa1f168f67519f/ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e1/58/e0ef3b9974a04ce9cde2a7a33881ddcb2d68450803745804545cdd8d258f/setuptools-72.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/7c/b753bf603852cab0a660da6e81f4ea5d2ca0f0b2b4870766d7aa9bceb7a2/tomlkit-0.13.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1b/d1/9babe2ccaecff775992753d8686970b1e2755d21c8a63be73aba7a4e7d77/wheel-0.44.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/20/38/f5c473fe9b90c8debdd29ea68d5add0289f1936d6f923b6b9cc0b931194c/zipp-3.19.2-py3-none-any.whl - - pypi: . -packages: -- kind: conda - name: _libgcc_mutex - version: '0.1' - build: conda_forge - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 - md5: d7c89558ba9fa0495403155b64376d81 - license: None - purls: [] - size: 2562 - timestamp: 1578324546067 -- kind: conda - name: _openmp_mutex - version: '4.5' - build: 2_gnu - build_number: 16 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 - md5: 73aaf86a425cc6e73fcf236a5a46396d - depends: - - _libgcc_mutex 0.1 conda_forge - - libgomp >=7.5.0 - constrains: - - openmp_impl 9999 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 23621 - timestamp: 1650670423406 -- kind: pypi - name: accessible-pygments - version: 0.0.5 - url: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - sha256: 88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7 - requires_dist: - - pygments>=1.5 - - pillow ; extra == 'dev' - - pkginfo>=1.10 ; extra == 'dev' - - playwright ; extra == 'dev' - - pre-commit ; extra == 'dev' - - setuptools ; extra == 'dev' - - twine>=5.0 ; extra == 'dev' - - hypothesis ; extra == 'tests' - - pytest ; extra == 'tests' - requires_python: '>=3.9' -- kind: pypi - name: alabaster - version: 0.7.16 - url: https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl - sha256: b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 - requires_python: '>=3.9' -- kind: pypi - name: anyio - version: 4.4.0 - url: https://files.pythonhosted.org/packages/7b/a2/10639a79341f6c019dedc95bd48a4928eed9f1d1197f4c04f546fc7ae0ff/anyio-4.4.0-py3-none-any.whl - sha256: c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7 - requires_dist: - - idna>=2.8 - - sniffio>=1.1 - - exceptiongroup>=1.0.2 ; python_version < '3.11' - - typing-extensions>=4.1 ; python_version < '3.11' - - packaging ; extra == 'doc' - - sphinx>=7 ; extra == 'doc' - - sphinx-rtd-theme ; extra == 'doc' - - sphinx-autodoc-typehints>=1.2.0 ; extra == 'doc' - - anyio[trio] ; extra == 'test' - - coverage[toml]>=7 ; extra == 'test' - - exceptiongroup>=1.2.0 ; extra == 'test' - - hypothesis>=4.0 ; extra == 'test' - - psutil>=5.9 ; extra == 'test' - - pytest>=7.0 ; extra == 'test' - - pytest-mock>=3.6.1 ; extra == 'test' - - trustme ; extra == 'test' - - uvloop>=0.17 ; (platform_python_implementation == 'CPython' and platform_system != 'Windows') and extra == 'test' - - trio>=0.23 ; extra == 'trio' - requires_python: '>=3.8' -- kind: pypi - name: attrs - version: 24.2.0 - url: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl - sha256: 81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 - requires_dist: - - importlib-metadata ; python_version < '3.8' - - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'benchmark' - - hypothesis ; extra == 'benchmark' - - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'benchmark' - - pympler ; extra == 'benchmark' - - pytest-codspeed ; extra == 'benchmark' - - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'benchmark' - - pytest-xdist[psutil] ; extra == 'benchmark' - - pytest>=4.3.0 ; extra == 'benchmark' - - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'cov' - - coverage[toml]>=5.3 ; extra == 'cov' - - hypothesis ; extra == 'cov' - - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'cov' - - pympler ; extra == 'cov' - - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'cov' - - pytest-xdist[psutil] ; extra == 'cov' - - pytest>=4.3.0 ; extra == 'cov' - - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'dev' - - hypothesis ; extra == 'dev' - - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'dev' - - pre-commit ; extra == 'dev' - - pympler ; extra == 'dev' - - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'dev' - - pytest-xdist[psutil] ; extra == 'dev' - - pytest>=4.3.0 ; extra == 'dev' - - cogapp ; extra == 'docs' - - furo ; extra == 'docs' - - myst-parser ; extra == 'docs' - - sphinx ; extra == 'docs' - - sphinx-notfound-page ; extra == 'docs' - - sphinxcontrib-towncrier ; extra == 'docs' - - towncrier<24.7 ; extra == 'docs' - - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'tests' - - hypothesis ; extra == 'tests' - - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests' - - pympler ; extra == 'tests' - - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests' - - pytest-xdist[psutil] ; extra == 'tests' - - pytest>=4.3.0 ; extra == 'tests' - - mypy>=1.11.1 ; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests-mypy' - - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests-mypy' - requires_python: '>=3.7' -- kind: pypi - name: babel - version: 2.16.0 - url: https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl - sha256: 368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b - requires_dist: - - pytz>=2015.7 ; python_version < '3.9' - - pytest>=6.0 ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - freezegun~=1.0 ; extra == 'dev' - requires_python: '>=3.8' -- kind: pypi - name: beautifulsoup4 - version: 4.12.3 - url: https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl - sha256: b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed - requires_dist: - - soupsieve>1.2 - - cchardet ; extra == 'cchardet' - - chardet ; extra == 'chardet' - - charset-normalizer ; extra == 'charset-normalizer' - - html5lib ; extra == 'html5lib' - - lxml ; extra == 'lxml' - requires_python: '>=3.6.0' -- kind: pypi - name: build - version: 1.2.1 - url: https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl - sha256: 75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4 - requires_dist: - - packaging>=19.1 - - pyproject-hooks - - colorama ; os_name == 'nt' - - importlib-metadata>=4.6 ; python_full_version < '3.10.2' - - tomli>=1.1.0 ; python_version < '3.11' - - furo>=2023.8.17 ; extra == 'docs' - - sphinx~=7.0 ; extra == 'docs' - - sphinx-argparse-cli>=1.5 ; extra == 'docs' - - sphinx-autodoc-typehints>=1.10 ; extra == 'docs' - - sphinx-issues>=3.0.0 ; extra == 'docs' - - build[uv,virtualenv] ; extra == 'test' - - filelock>=3 ; extra == 'test' - - pytest>=6.2.4 ; extra == 'test' - - pytest-cov>=2.12 ; extra == 'test' - - pytest-mock>=2 ; extra == 'test' - - pytest-rerunfailures>=9.1 ; extra == 'test' - - pytest-xdist>=1.34 ; extra == 'test' - - wheel>=0.36.0 ; extra == 'test' - - setuptools>=42.0.0 ; extra == 'test' and python_version < '3.10' - - setuptools>=56.0.0 ; extra == 'test' and python_version == '3.10' - - setuptools>=56.0.0 ; extra == 'test' and python_version == '3.11' - - setuptools>=67.8.0 ; extra == 'test' and python_version >= '3.12' - - build[uv] ; extra == 'typing' - - importlib-metadata>=5.1 ; extra == 'typing' - - mypy~=1.9.0 ; extra == 'typing' - - tomli ; extra == 'typing' - - typing-extensions>=3.7.4.3 ; extra == 'typing' - - uv>=0.1.18 ; extra == 'uv' - - virtualenv>=20.0.35 ; extra == 'virtualenv' - requires_python: '>=3.8' -- kind: conda - name: bzip2 - version: 1.0.8 - build: h4bc722e_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d - md5: 62ee74e96c5ebb0af99386de58cf9553 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 252783 - timestamp: 1720974456583 -- kind: conda - name: ca-certificates - version: 2024.7.4 - build: hbcca054_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda - sha256: c1548a3235376f464f9931850b64b02492f379b2f2bb98bc786055329b080446 - md5: 23ab7665c5f63cfb9f1f6195256daac6 - license: ISC - purls: [] - size: 154853 - timestamp: 1720077432978 -- kind: pypi - name: cachetools - version: 5.4.0 - url: https://files.pythonhosted.org/packages/04/e6/a1551acbaa06f3e48b311329828a34bc9c51a8cfaecdeb4d03c329a1ef85/cachetools-5.4.0-py3-none-any.whl - sha256: 3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474 - requires_python: '>=3.7' -- kind: pypi - name: certifi - version: 2024.7.4 - url: https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl - sha256: c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 - requires_python: '>=3.6' -- kind: pypi - name: cfgv - version: 3.4.0 - url: https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl - sha256: b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9 - requires_python: '>=3.8' -- kind: pypi - name: chardet - version: 5.2.0 - url: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - sha256: e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970 - requires_python: '>=3.7' -- kind: pypi - name: charset-normalizer - version: 3.3.2 - url: https://files.pythonhosted.org/packages/98/69/5d8751b4b670d623aa7a47bef061d69c279e9f922f6705147983aa76c3ce/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 - requires_python: '>=3.7.0' -- kind: pypi - name: click - version: 8.1.7 - url: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl - sha256: ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - requires_dist: - - colorama ; platform_system == 'Windows' - - importlib-metadata ; python_version < '3.8' - requires_python: '>=3.7' -- kind: pypi - name: colorama - version: 0.4.6 - url: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - sha256: 4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' -- kind: pypi - name: compwa-policy - version: 0.3.18.post11 - path: . - sha256: 0855bd706b1c2f907c2257a6845cda3925b6f78840f9f1a5676af4bb1a14427c - requires_dist: - - pyyaml - - attrs>=20.1.0 - - html2text - - ini2toml - - nbformat - - pathspec - - pip-tools - - ruamel-yaml - - tomlkit - - rtoml - - typing-extensions ; python_version < '3.12.0' - - compwa-policy[doc] ; extra == 'dev' - - compwa-policy[sty] ; extra == 'dev' - - compwa-policy[test] ; extra == 'dev' - - labels ; extra == 'dev' - - sphinx-autobuild ; extra == 'dev' - - tox>=1.9 ; extra == 'dev' - - sphinx ; extra == 'doc' - - myst-parser ; extra == 'doc' - - sphinx-api-relink>=0.0.4 ; extra == 'doc' - - sphinx-api-relink ; extra == 'doc' - - sphinx-argparse ; extra == 'doc' - - sphinx-book-theme ; extra == 'doc' - - sphinx-codeautolink ; extra == 'doc' - - sphinx-copybutton ; extra == 'doc' - - compwa-policy[types] ; extra == 'sty' - - mypy ; extra == 'sty' - - pre-commit>=1.4.0 ; extra == 'sty' - - ruff ; extra == 'sty' - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-xdist ; extra == 'test' - - pytest ; extra == 'types' - - sphinx-api-relink>=0.0.3 ; extra == 'types' - - types-pyyaml ; extra == 'types' - - types-toml ; extra == 'types' - requires_python: '>=3.7' - editable: true -- kind: pypi - name: coverage - version: 7.6.1 - url: https://files.pythonhosted.org/packages/9a/6f/eef79b779a540326fee9520e5542a8b428cc3bfa8b7c8f1022c1ee4fc66c/coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc - requires_dist: - - tomli ; python_full_version <= '3.11.0a6' and extra == 'toml' - requires_python: '>=3.8' -- kind: pypi - name: distlib - version: 0.3.8 - url: https://files.pythonhosted.org/packages/8e/41/9307e4f5f9976bc8b7fea0b66367734e8faf3ec84bc0d412d8cfabbb66cd/distlib-0.3.8-py2.py3-none-any.whl - sha256: 034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784 -- kind: pypi - name: docutils - version: 0.21.2 - url: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - sha256: dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 - requires_python: '>=3.9' -- kind: pypi - name: exceptiongroup - version: 1.2.2 - url: https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl - sha256: 3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b - requires_dist: - - pytest>=6 ; extra == 'test' - requires_python: '>=3.7' -- kind: pypi - name: execnet - version: 2.1.1 - url: https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl - sha256: 26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc - requires_dist: - - hatch ; extra == 'testing' - - pre-commit ; extra == 'testing' - - pytest ; extra == 'testing' - - tox ; extra == 'testing' - requires_python: '>=3.8' -- kind: pypi - name: fastjsonschema - version: 2.20.0 - url: https://files.pythonhosted.org/packages/6d/ca/086311cdfc017ec964b2436fe0c98c1f4efcb7e4c328956a22456e497655/fastjsonschema-2.20.0-py3-none-any.whl - sha256: 5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a - requires_dist: - - colorama ; extra == 'devel' - - jsonschema ; extra == 'devel' - - json-spec ; extra == 'devel' - - pylint ; extra == 'devel' - - pytest ; extra == 'devel' - - pytest-benchmark ; extra == 'devel' - - pytest-cache ; extra == 'devel' - - validictory ; extra == 'devel' -- kind: pypi - name: filelock - version: 3.15.4 - url: https://files.pythonhosted.org/packages/ae/f0/48285f0262fe47103a4a45972ed2f9b93e4c80b8fd609fa98da78b2a5706/filelock-3.15.4-py3-none-any.whl - sha256: 6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7 - requires_dist: - - furo>=2023.9.10 ; extra == 'docs' - - sphinx-autodoc-typehints!=1.23.4,>=1.25.2 ; extra == 'docs' - - sphinx>=7.2.6 ; extra == 'docs' - - covdefaults>=2.3 ; extra == 'testing' - - coverage>=7.3.2 ; extra == 'testing' - - diff-cover>=8.0.1 ; extra == 'testing' - - pytest-asyncio>=0.21 ; extra == 'testing' - - pytest-cov>=4.1 ; extra == 'testing' - - pytest-mock>=3.12 ; extra == 'testing' - - pytest-timeout>=2.2 ; extra == 'testing' - - pytest>=7.4.3 ; extra == 'testing' - - virtualenv>=20.26.2 ; extra == 'testing' - - typing-extensions>=4.8 ; python_version < '3.11' and extra == 'typing' - requires_python: '>=3.8' -- kind: pypi - name: h11 - version: 0.14.0 - url: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl - sha256: e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 - requires_dist: - - typing-extensions ; python_version < '3.8' - requires_python: '>=3.7' -- kind: pypi - name: html2text - version: 2024.2.26 - url: https://files.pythonhosted.org/packages/1a/43/e1d53588561e533212117750ee79ad0ba02a41f52a08c1df3396bd466c05/html2text-2024.2.26.tar.gz - sha256: 05f8e367d15aaabc96415376776cdd11afd5127a77fce6e36afc60c563ca2c32 - requires_python: '>=3.8' -- kind: pypi - name: identify - version: 2.6.0 - url: https://files.pythonhosted.org/packages/24/6c/a4f39abe7f19600b74528d0c717b52fff0b300bb0161081510d39c53cb00/identify-2.6.0-py2.py3-none-any.whl - sha256: e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0 - requires_dist: - - ukkonen ; extra == 'license' - requires_python: '>=3.8' -- kind: pypi - name: idna - version: '3.7' - url: https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl - sha256: 82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 - requires_python: '>=3.5' -- kind: pypi - name: imagesize - version: 1.4.1 - url: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl - sha256: 0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' -- kind: pypi - name: importlib-metadata - version: 8.2.0 - url: https://files.pythonhosted.org/packages/82/47/bb25ec04985d0693da478797c3d8c1092b140f3a53ccb984fbbd38affa5b/importlib_metadata-8.2.0-py3-none-any.whl - sha256: 11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369 - requires_dist: - - zipp>=0.5 - - typing-extensions>=3.6.4 ; python_version < '3.8' - - sphinx>=3.5 ; extra == 'doc' - - jaraco-packaging>=9.3 ; extra == 'doc' - - rst-linker>=1.9 ; extra == 'doc' - - furo ; extra == 'doc' - - sphinx-lint ; extra == 'doc' - - jaraco-tidelift>=1.4 ; extra == 'doc' - - ipython ; extra == 'perf' - - pytest!=8.1.*,>=6 ; extra == 'test' - - pytest-checkdocs>=2.4 ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-mypy ; extra == 'test' - - pytest-enabler>=2.2 ; extra == 'test' - - packaging ; extra == 'test' - - pyfakefs ; extra == 'test' - - flufl-flake8 ; extra == 'test' - - pytest-perf>=0.9.2 ; extra == 'test' - - jaraco-test>=5.4 ; extra == 'test' - - importlib-resources>=1.3 ; python_version < '3.9' and extra == 'test' - - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'test' - requires_python: '>=3.8' -- kind: pypi - name: ini2toml - version: '0.15' - url: https://files.pythonhosted.org/packages/ea/6d/a78a58b1d2007ebce56f1dc745b2763d4ba5a4b6faadca7dc034297c04c8/ini2toml-0.15-py3-none-any.whl - sha256: ad97b4abed0930b2682f232d874e17ce01a14c2b6b1d0461b363fd8366411a8d - requires_dist: - - packaging>=20.7 - - setuptools>=59.6 - - configupdater<4,>=3.0.1 ; extra == 'all' - - tomlkit<2,>=0.10.0 ; extra == 'all' - - tomli-w<2,>=0.4.0 ; extra == 'all' - - pyproject-fmt<2,>=0.4.0 ; python_version >= '3.7' and extra == 'experimental' - - configupdater<4,>=3.0.1 ; extra == 'full' - - tomlkit<2,>=0.10.0 ; extra == 'full' - - importlib-metadata ; python_version < '3.8' and extra == 'full' - - tomli-w<2,>=0.4.0 ; extra == 'lite' - - importlib-metadata ; python_version < '3.8' and extra == 'lite' - - isort ; extra == 'testing' - - setuptools ; extra == 'testing' - - tomli ; extra == 'testing' - - pytest ; extra == 'testing' - - pytest-cov ; extra == 'testing' - - pytest-xdist ; extra == 'testing' - - pytest-randomly ; extra == 'testing' - - validate-pyproject<2,>=0.6 ; extra == 'testing' - - typing-extensions ; python_version < '3.8' and extra == 'typechecking' -- kind: pypi - name: iniconfig - version: 2.0.0 - url: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl - sha256: b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 - requires_python: '>=3.7' -- kind: pypi - name: jinja2 - version: 3.1.4 - url: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - sha256: bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d - requires_dist: - - markupsafe>=2.0 - - babel>=2.7 ; extra == 'i18n' - requires_python: '>=3.7' -- kind: pypi - name: jsonschema - version: 4.23.0 - url: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl - sha256: fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 - requires_dist: - - attrs>=22.2.0 - - importlib-resources>=1.4.0 ; python_version < '3.9' - - jsonschema-specifications>=2023.3.6 - - pkgutil-resolve-name>=1.3.10 ; python_version < '3.9' - - referencing>=0.28.4 - - rpds-py>=0.7.1 - - fqdn ; extra == 'format' - - idna ; extra == 'format' - - isoduration ; extra == 'format' - - jsonpointer>1.13 ; extra == 'format' - - rfc3339-validator ; extra == 'format' - - rfc3987 ; extra == 'format' - - uri-template ; extra == 'format' - - webcolors>=1.11 ; extra == 'format' - - fqdn ; extra == 'format-nongpl' - - idna ; extra == 'format-nongpl' - - isoduration ; extra == 'format-nongpl' - - jsonpointer>1.13 ; extra == 'format-nongpl' - - rfc3339-validator ; extra == 'format-nongpl' - - rfc3986-validator>0.1.0 ; extra == 'format-nongpl' - - uri-template ; extra == 'format-nongpl' - - webcolors>=24.6.0 ; extra == 'format-nongpl' - requires_python: '>=3.8' -- kind: pypi - name: jsonschema-specifications - version: 2023.12.1 - url: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl - sha256: 87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c - requires_dist: - - importlib-resources>=1.4.0 ; python_version < '3.9' - - referencing>=0.31.0 - requires_python: '>=3.8' -- kind: pypi - name: jupyter-core - version: 5.7.2 - url: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl - sha256: 4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409 - requires_dist: - - platformdirs>=2.5 - - pywin32>=300 ; sys_platform == 'win32' and platform_python_implementation != 'PyPy' - - traitlets>=5.3 - - myst-parser ; extra == 'docs' - - pydata-sphinx-theme ; extra == 'docs' - - sphinx-autodoc-typehints ; extra == 'docs' - - sphinxcontrib-github-alt ; extra == 'docs' - - sphinxcontrib-spelling ; extra == 'docs' - - traitlets ; extra == 'docs' - - ipykernel ; extra == 'test' - - pre-commit ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-timeout ; extra == 'test' - - pytest<8 ; extra == 'test' - requires_python: '>=3.8' -- kind: pypi - name: labels - version: 20.1.0 - url: https://files.pythonhosted.org/packages/e7/d0/2b1e404231a0c57fadcca64361fcffd13eda5346222edaf04b7938300fd1/labels-20.1.0-py3-none-any.whl - sha256: f8130632297c541275fbd4001b4347ff18cd5592776385f4fb688853be4c20d6 - requires_dist: - - click - - requests - - pytoml - - attrs - requires_python: '>=3.6' -- kind: conda - name: ld_impl_linux-64 - version: '2.40' - build: hf3520f5_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda - sha256: 764b6950aceaaad0c67ef925417594dd14cd2e22fff864aeef455ac259263d15 - md5: b80f2f396ca2c28b8c14c437a4ed1e74 - constrains: - - binutils_impl_linux-64 2.40 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 707602 - timestamp: 1718625640445 -- kind: conda - name: libffi - version: 3.4.2 - build: h7f98852_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e - md5: d645c6d2ac96843a2bfaccd2d62b3ac3 - depends: - - libgcc-ng >=9.4.0 - license: MIT - license_family: MIT - purls: [] - size: 58292 - timestamp: 1636488182923 -- kind: conda - name: libgcc-ng - version: 14.1.0 - build: h77fa898_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda - sha256: b8e869ac96591cda2704bf7e77a301025e405227791a0bddf14a3dac65125538 - md5: ca0fad6a41ddaef54a153b78eccb5037 - depends: - - _libgcc_mutex 0.1 conda_forge - - _openmp_mutex >=4.5 - constrains: - - libgomp 14.1.0 h77fa898_0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 842109 - timestamp: 1719538896937 -- kind: conda - name: libgomp - version: 14.1.0 - build: h77fa898_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda - sha256: 7699df61a1f6c644b3576a40f54791561f2845983120477a16116b951c9cdb05 - md5: ae061a5ed5f05818acdf9adab72c146d - depends: - - _libgcc_mutex 0.1 conda_forge - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 456925 - timestamp: 1719538796073 -- kind: conda - name: libnsl - version: 2.0.1 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 - md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 - depends: - - libgcc-ng >=12 - license: LGPL-2.1-only - license_family: GPL - purls: [] - size: 33408 - timestamp: 1697359010159 -- kind: conda - name: libsqlite - version: 3.46.0 - build: hde9e2c9_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda - sha256: daee3f68786231dad457d0dfde3f7f1f9a7f2018adabdbb864226775101341a8 - md5: 18aa975d2094c34aef978060ae7da7d8 - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0a0 - license: Unlicense - purls: [] - size: 865346 - timestamp: 1718050628718 -- kind: conda - name: libuuid - version: 2.38.1 - build: h0b41bf4_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 - md5: 40b61aab5c7ba9ff276c41cfffe6b80b - depends: - - libgcc-ng >=12 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 33601 - timestamp: 1680112270483 -- kind: conda - name: libxcrypt - version: 4.4.36 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c - md5: 5aa797f8787fe7a17d1b0821485b5adc - depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later - purls: [] - size: 100393 - timestamp: 1702724383534 -- kind: conda - name: libzlib - version: 1.3.1 - build: h4ab18f5_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda - sha256: adf6096f98b537a11ae3729eaa642b0811478f0ea0402ca67b5108fe2cb0010d - md5: 57d7dc60e9325e3de37ff8dffd18e814 - depends: - - libgcc-ng >=12 - constrains: - - zlib 1.3.1 *_1 - license: Zlib - license_family: Other - purls: [] - size: 61574 - timestamp: 1716874187109 -- kind: pypi - name: markdown-it-py - version: 3.0.0 - url: https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl - sha256: 355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 - requires_dist: - - mdurl~=0.1 - - psutil ; extra == 'benchmarking' - - pytest ; extra == 'benchmarking' - - pytest-benchmark ; extra == 'benchmarking' - - pre-commit~=3.0 ; extra == 'code-style' - - commonmark~=0.9 ; extra == 'compare' - - markdown~=3.4 ; extra == 'compare' - - mistletoe~=1.0 ; extra == 'compare' - - mistune~=2.0 ; extra == 'compare' - - panflute~=2.3 ; extra == 'compare' - - linkify-it-py>=1,<3 ; extra == 'linkify' - - mdit-py-plugins ; extra == 'plugins' - - gprof2dot ; extra == 'profiling' - - mdit-py-plugins ; extra == 'rtd' - - myst-parser ; extra == 'rtd' - - pyyaml ; extra == 'rtd' - - sphinx ; extra == 'rtd' - - sphinx-copybutton ; extra == 'rtd' - - sphinx-design ; extra == 'rtd' - - sphinx-book-theme ; extra == 'rtd' - - jupyter-sphinx ; extra == 'rtd' - - coverage ; extra == 'testing' - - pytest ; extra == 'testing' - - pytest-cov ; extra == 'testing' - - pytest-regressions ; extra == 'testing' - requires_python: '>=3.8' -- kind: pypi - name: markupsafe - version: 2.1.5 - url: https://files.pythonhosted.org/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 - requires_python: '>=3.7' -- kind: pypi - name: mdit-py-plugins - version: 0.4.1 - url: https://files.pythonhosted.org/packages/ef/f7/8a4dcea720a581e69ac8c5a38524baf0e3e2bb5f3819a9ff661464fe7d10/mdit_py_plugins-0.4.1-py3-none-any.whl - sha256: 1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a - requires_dist: - - markdown-it-py>=1.0.0,<4.0.0 - - pre-commit ; extra == 'code-style' - - myst-parser ; extra == 'rtd' - - sphinx-book-theme ; extra == 'rtd' - - coverage ; extra == 'testing' - - pytest ; extra == 'testing' - - pytest-cov ; extra == 'testing' - - pytest-regressions ; extra == 'testing' - requires_python: '>=3.8' -- kind: pypi - name: mdurl - version: 0.1.2 - url: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - sha256: 84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 - requires_python: '>=3.7' -- kind: pypi - name: mypy - version: 1.11.1 - url: https://files.pythonhosted.org/packages/08/a3/ffc2ee9b8689920a524a8013bf05482f51d191d73a8a3939f3d47d9a485a/mypy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl - sha256: 11965c2f571ded6239977b14deebd3f4c3abd9a92398712d6da3a772974fad69 - requires_dist: - - typing-extensions>=4.6.0 - - mypy-extensions>=1.0.0 - - tomli>=1.1.0 ; python_version < '3.11' - - psutil>=4.0 ; extra == 'dmypy' - - pip ; extra == 'install-types' - - setuptools>=50 ; extra == 'mypyc' - - lxml ; extra == 'reports' - requires_python: '>=3.8' -- kind: pypi - name: mypy-extensions - version: 1.0.0 - url: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl - sha256: 4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d - requires_python: '>=3.5' -- kind: pypi - name: myst-parser - version: 3.0.1 - url: https://files.pythonhosted.org/packages/e2/de/21aa8394f16add8f7427f0a1326ccd2b3a2a8a3245c9252bc5ac034c6155/myst_parser-3.0.1-py3-none-any.whl - sha256: 6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1 - requires_dist: - - docutils>=0.18,<0.22 - - jinja2 - - markdown-it-py~=3.0 - - mdit-py-plugins~=0.4 - - pyyaml - - sphinx>=6,<8 - - pre-commit~=3.0 ; extra == 'code-style' - - linkify-it-py~=2.0 ; extra == 'linkify' - - sphinx>=7 ; extra == 'rtd' - - ipython ; extra == 'rtd' - - sphinx-book-theme~=1.1 ; extra == 'rtd' - - sphinx-design ; extra == 'rtd' - - sphinx-copybutton ; extra == 'rtd' - - sphinxext-rediraffe~=0.2.7 ; extra == 'rtd' - - sphinxext-opengraph~=0.9.0 ; extra == 'rtd' - - sphinx-pyscript ; extra == 'rtd' - - sphinx-tippy>=0.4.3 ; extra == 'rtd' - - sphinx-autodoc2~=0.5.0 ; extra == 'rtd' - - sphinx-togglebutton ; extra == 'rtd' - - beautifulsoup4 ; extra == 'testing' - - coverage[toml] ; extra == 'testing' - - defusedxml ; extra == 'testing' - - pytest>=8,<9 ; extra == 'testing' - - pytest-cov ; extra == 'testing' - - pytest-regressions ; extra == 'testing' - - pytest-param-files~=0.6.0 ; extra == 'testing' - - sphinx-pytest ; extra == 'testing' - - pygments ; extra == 'testing-docutils' - - pytest>=8,<9 ; extra == 'testing-docutils' - - pytest-param-files~=0.6.0 ; extra == 'testing-docutils' - requires_python: '>=3.8' -- kind: pypi - name: nbformat - version: 5.10.4 - url: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - sha256: 3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b - requires_dist: - - fastjsonschema>=2.15 - - jsonschema>=2.6 - - jupyter-core!=5.0.*,>=4.12 - - traitlets>=5.1 - - myst-parser ; extra == 'docs' - - pydata-sphinx-theme ; extra == 'docs' - - sphinx ; extra == 'docs' - - sphinxcontrib-github-alt ; extra == 'docs' - - sphinxcontrib-spelling ; extra == 'docs' - - pep440 ; extra == 'test' - - pre-commit ; extra == 'test' - - pytest ; extra == 'test' - - testpath ; extra == 'test' - requires_python: '>=3.8' -- kind: conda - name: ncurses - version: '6.5' - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - sha256: 4fc3b384f4072b68853a0013ea83bdfd3d66b0126e2238e1d6e1560747aa7586 - md5: fcea371545eda051b6deafb24889fc69 - depends: - - libgcc-ng >=12 - license: X11 AND BSD-3-Clause - purls: [] - size: 887465 - timestamp: 1715194722503 -- kind: pypi - name: nodeenv - version: 1.9.1 - url: https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl - sha256: ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9 - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*' -- kind: conda - name: openssl - version: 3.3.1 - build: h4bc722e_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda - sha256: b294b3cc706ad1048cdb514f0db3da9f37ae3fcc0c53a7104083dd0918adb200 - md5: e1b454497f9f7c1147fdde4b53f1b512 - depends: - - __glibc >=2.17,<3.0.a0 - - ca-certificates - - libgcc-ng >=12 - constrains: - - pyopenssl >=22.1 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 2895213 - timestamp: 1721194688955 -- kind: pypi - name: packaging - version: '24.1' - url: https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl - sha256: 5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 - requires_python: '>=3.8' -- kind: pypi - name: pathspec - version: 0.12.1 - url: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - sha256: a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 - requires_python: '>=3.8' -- kind: pypi - name: pip - version: '24.2' - url: https://files.pythonhosted.org/packages/d4/55/90db48d85f7689ec6f81c0db0622d704306c5284850383c090e6c7195a5c/pip-24.2-py3-none-any.whl - sha256: 2cd581cf58ab7fcfca4ce8efa6dcacd0de5bf8d0a3eb9ec927e07405f4d9e2a2 - requires_python: '>=3.8' -- kind: pypi - name: pip-tools - version: 7.4.1 - url: https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl - sha256: 4c690e5fbae2f21e87843e89c26191f0d9454f362d8acdbd695716493ec8b3a9 - requires_dist: - - build>=1.0.0 - - click>=8 - - pip>=22.2 - - pyproject-hooks - - setuptools - - wheel - - tomli ; python_version < '3.11' - - covdefaults ; extra == 'coverage' - - pytest-cov ; extra == 'coverage' - - pytest>=7.2.0 ; extra == 'testing' - - pytest-rerunfailures ; extra == 'testing' - - pytest-xdist ; extra == 'testing' - - tomli-w ; extra == 'testing' - - flit-core<4,>=2 ; extra == 'testing' - - poetry-core>=1.0.0 ; extra == 'testing' - requires_python: '>=3.8' -- kind: pypi - name: platformdirs - version: 4.2.2 - url: https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl - sha256: 2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee - requires_dist: - - furo>=2023.9.10 ; extra == 'docs' - - proselint>=0.13 ; extra == 'docs' - - sphinx-autodoc-typehints>=1.25.2 ; extra == 'docs' - - sphinx>=7.2.6 ; extra == 'docs' - - appdirs==1.4.4 ; extra == 'test' - - covdefaults>=2.3 ; extra == 'test' - - pytest-cov>=4.1 ; extra == 'test' - - pytest-mock>=3.12 ; extra == 'test' - - pytest>=7.4.3 ; extra == 'test' - - mypy>=1.8 ; extra == 'type' - requires_python: '>=3.8' -- kind: pypi - name: pluggy - version: 1.5.0 - url: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl - sha256: 44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 - requires_dist: - - pre-commit ; extra == 'dev' - - tox ; extra == 'dev' - - pytest ; extra == 'testing' - - pytest-benchmark ; extra == 'testing' - requires_python: '>=3.8' -- kind: pypi - name: pre-commit - version: 3.8.0 - url: https://files.pythonhosted.org/packages/07/92/caae8c86e94681b42c246f0bca35c059a2f0529e5b92619f6aba4cf7e7b6/pre_commit-3.8.0-py2.py3-none-any.whl - sha256: 9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f - requires_dist: - - cfgv>=2.0.0 - - identify>=1.0.0 - - nodeenv>=0.11.1 - - pyyaml>=5.1 - - virtualenv>=20.10.0 - requires_python: '>=3.9' -- kind: pypi - name: pydata-sphinx-theme - version: 0.15.4 - url: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - sha256: 2136ad0e9500d0949f96167e63f3e298620040aea8f9c74621959eda5d4cf8e6 - requires_dist: - - sphinx>=5 - - beautifulsoup4 - - docutils!=0.17.0 - - packaging - - babel - - pygments>=2.7 - - accessible-pygments - - typing-extensions - - numpydoc ; extra == 'doc' - - linkify-it-py ; extra == 'doc' - - rich ; extra == 'doc' - - sphinxext-rediraffe ; extra == 'doc' - - sphinx-sitemap ; extra == 'doc' - - sphinx-autoapi>=3.0.0 ; extra == 'doc' - - myst-parser ; extra == 'doc' - - ablog>=0.11.8 ; extra == 'doc' - - jupyter-sphinx ; extra == 'doc' - - pandas ; extra == 'doc' - - plotly ; extra == 'doc' - - matplotlib ; extra == 'doc' - - numpy ; extra == 'doc' - - xarray ; extra == 'doc' - - sphinx-copybutton ; extra == 'doc' - - sphinx-design ; extra == 'doc' - - sphinx-togglebutton ; extra == 'doc' - - jupyterlite-sphinx ; extra == 'doc' - - sphinxcontrib-youtube>=1.4.1 ; extra == 'doc' - - sphinx-favicon>=1.0.1 ; extra == 'doc' - - ipykernel ; extra == 'doc' - - nbsphinx ; extra == 'doc' - - ipyleaflet ; extra == 'doc' - - colorama ; extra == 'doc' - - ipywidgets ; extra == 'doc' - - graphviz ; extra == 'doc' - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-regressions ; extra == 'test' - - sphinx[test] ; extra == 'test' - - pyyaml ; extra == 'dev' - - pre-commit ; extra == 'dev' - - pydata-sphinx-theme[doc,test] ; extra == 'dev' - - tox ; extra == 'dev' - - pandoc ; extra == 'dev' - - sphinx-theme-builder[cli] ; extra == 'dev' - - pytest-playwright ; extra == 'a11y' - - babel ; extra == 'i18n' - - jinja2 ; extra == 'i18n' - requires_python: '>=3.9' -- kind: pypi - name: pygments - version: 2.18.0 - url: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl - sha256: b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a - requires_dist: - - colorama>=0.4.6 ; extra == 'windows-terminal' - requires_python: '>=3.8' -- kind: pypi - name: pyproject-api - version: 1.7.1 - url: https://files.pythonhosted.org/packages/de/88/c1451b66664ae596bae93928ff372f4da89c2c7250132ecb76cc99256c93/pyproject_api-1.7.1-py3-none-any.whl - sha256: 2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb - requires_dist: - - packaging>=24.1 - - tomli>=2.0.1 ; python_version < '3.11' - - furo>=2024.5.6 ; extra == 'docs' - - sphinx-autodoc-typehints>=2.2.1 ; extra == 'docs' - - covdefaults>=2.3 ; extra == 'testing' - - pytest-cov>=5 ; extra == 'testing' - - pytest-mock>=3.14 ; extra == 'testing' - - pytest>=8.2.2 ; extra == 'testing' - - setuptools>=70.1 ; extra == 'testing' - requires_python: '>=3.8' -- kind: pypi - name: pyproject-hooks - version: 1.1.0 - url: https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl - sha256: 7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2 - requires_python: '>=3.7' -- kind: pypi - name: pytest - version: 8.3.2 - url: https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl - sha256: 4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5 - requires_dist: - - iniconfig - - packaging - - pluggy<2,>=1.5 - - exceptiongroup>=1.0.0rc8 ; python_version < '3.11' - - tomli>=1 ; python_version < '3.11' - - colorama ; sys_platform == 'win32' - - argcomplete ; extra == 'dev' - - attrs>=19.2 ; extra == 'dev' - - hypothesis>=3.56 ; extra == 'dev' - - mock ; extra == 'dev' - - pygments>=2.7.2 ; extra == 'dev' - - requests ; extra == 'dev' - - setuptools ; extra == 'dev' - - xmlschema ; extra == 'dev' - requires_python: '>=3.8' -- kind: pypi - name: pytest-cov - version: 5.0.0 - url: https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl - sha256: 4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652 - requires_dist: - - pytest>=4.6 - - coverage[toml]>=5.2.1 - - fields ; extra == 'testing' - - hunter ; extra == 'testing' - - process-tests ; extra == 'testing' - - pytest-xdist ; extra == 'testing' - - virtualenv ; extra == 'testing' - requires_python: '>=3.8' -- kind: pypi - name: pytest-xdist - version: 3.6.1 - url: https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl - sha256: 9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7 - requires_dist: - - execnet>=2.1 - - pytest>=7.0.0 - - psutil>=3.0 ; extra == 'psutil' - - setproctitle ; extra == 'setproctitle' - - filelock ; extra == 'testing' - requires_python: '>=3.8' -- kind: conda - name: python - version: 3.9.19 - build: h0755675_0_cpython - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda - sha256: b9253ca9ca5427e6da4b1d43353a110e0f2edfab9c951afb4bf01cbae2825b31 - md5: d9ee3647fbd9e8595b8df759b2bbefb8 - depends: - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.45.2,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.2.13,<2.0.0a0 - - ncurses >=6.4.20240210,<7.0a0 - - openssl >=3.2.1,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.9.* *_cp39 - license: Python-2.0 - purls: [] - size: 23800555 - timestamp: 1710940120866 -- kind: pypi - name: pytoml - version: 0.1.21 - url: https://files.pythonhosted.org/packages/a5/47/c7f8a0f210ad18576840922e0b504f0b7f5f73aea4a52ab14c5b58517edf/pytoml-0.1.21-py2.py3-none-any.whl - sha256: 57a21e6347049f73bfb62011ff34cd72774c031b9828cb628a752225136dfc33 -- kind: pypi - name: pyyaml - version: 6.0.2 - url: https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 - requires_python: '>=3.8' -- kind: conda - name: readline - version: '8.2' - build: h8228510_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 - md5: 47d31b792659ce70f470b5c82fdfb7a4 - depends: - - libgcc-ng >=12 - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 281456 - timestamp: 1679532220005 -- kind: pypi - name: referencing - version: 0.35.1 - url: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl - sha256: eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de - requires_dist: - - attrs>=22.2.0 - - rpds-py>=0.7.0 - requires_python: '>=3.8' -- kind: pypi - name: requests - version: 2.32.3 - url: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - sha256: 70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 - requires_dist: - - charset-normalizer<4,>=2 - - idna<4,>=2.5 - - urllib3<3,>=1.21.1 - - certifi>=2017.4.17 - - pysocks!=1.5.7,>=1.5.6 ; extra == 'socks' - - chardet<6,>=3.0.2 ; extra == 'use-chardet-on-py3' - requires_python: '>=3.8' -- kind: pypi - name: rpds-py - version: 0.20.0 - url: https://files.pythonhosted.org/packages/04/d8/e73d56b1908a6c0e3e5982365eb293170cd458cc25a19363f69c76e00fd2/rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda - requires_python: '>=3.8' -- kind: pypi - name: rtoml - version: 0.11.0 - url: https://files.pythonhosted.org/packages/16/64/c739f603413f5511d8319d65422f763636c31b6c6a785b046e1ad9fa1cb8/rtoml-0.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: b750450e1ac63eb43dfbba3612dbb1830b6d90cc22c6ea78d7f2322ec698727d - requires_python: '>=3.8' -- kind: pypi - name: ruamel-yaml - version: 0.18.6 - url: https://files.pythonhosted.org/packages/73/67/8ece580cc363331d9a53055130f86b096bf16e38156e33b1d3014fffda6b/ruamel.yaml-0.18.6-py3-none-any.whl - sha256: 57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636 - requires_dist: - - ruamel-yaml-clib>=0.2.7 ; platform_python_implementation == 'CPython' and python_version < '3.13' - - ryd ; extra == 'docs' - - mercurial>5.7 ; extra == 'docs' - - ruamel-yaml-jinja2>=0.2 ; extra == 'jinja2' - requires_python: '>=3.7' -- kind: pypi - name: ruamel-yaml-clib - version: 0.2.8 - url: https://files.pythonhosted.org/packages/7c/b2/389b345a60131593028b0263fddaa580edb4081697a3f3aa1f168f67519f/ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl - sha256: da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5 - requires_python: '>=3.6' -- kind: pypi - name: ruff - version: 0.5.7 - url: https://files.pythonhosted.org/packages/c8/3b/2b683be597bbd02046678fc3fc1c199c641512b20212073b58f173822bb3/ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 8d796327eed8e168164346b769dd9a27a70e0298d667b4ecee6877ce8095ec8e - requires_python: '>=3.7' -- kind: pypi - name: setuptools - version: 72.1.0 - url: https://files.pythonhosted.org/packages/e1/58/e0ef3b9974a04ce9cde2a7a33881ddcb2d68450803745804545cdd8d258f/setuptools-72.1.0-py3-none-any.whl - sha256: 5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1 - requires_dist: - - packaging>=24 ; extra == 'core' - - ordered-set>=3.1.1 ; extra == 'core' - - more-itertools>=8.8 ; extra == 'core' - - jaraco-text>=3.7 ; extra == 'core' - - wheel>=0.43.0 ; extra == 'core' - - platformdirs>=2.6.2 ; extra == 'core' - - importlib-metadata>=6 ; python_version < '3.10' and extra == 'core' - - tomli>=2.0.1 ; python_version < '3.11' and extra == 'core' - - importlib-resources>=5.10.2 ; python_version < '3.9' and extra == 'core' - - sphinx>=3.5 ; extra == 'doc' - - jaraco-packaging>=9.3 ; extra == 'doc' - - rst-linker>=1.9 ; extra == 'doc' - - furo ; extra == 'doc' - - sphinx-lint ; extra == 'doc' - - jaraco-tidelift>=1.4 ; extra == 'doc' - - pygments-github-lexers==0.0.5 ; extra == 'doc' - - sphinx-favicon ; extra == 'doc' - - sphinx-inline-tabs ; extra == 'doc' - - sphinx-reredirects ; extra == 'doc' - - sphinxcontrib-towncrier ; extra == 'doc' - - sphinx-notfound-page<2,>=1 ; extra == 'doc' - - pyproject-hooks!=1.1 ; extra == 'doc' - - pytest!=8.1.*,>=6 ; extra == 'test' - - pytest-checkdocs>=2.4 ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-mypy ; extra == 'test' - - pytest-enabler>=2.2 ; extra == 'test' - - virtualenv>=13.0.0 ; extra == 'test' - - wheel ; extra == 'test' - - pip>=19.1 ; extra == 'test' - - packaging>=23.2 ; extra == 'test' - - jaraco-envs>=2.2 ; extra == 'test' - - pytest-xdist>=3 ; extra == 'test' - - jaraco-path>=3.2.0 ; extra == 'test' - - build[virtualenv]>=1.0.3 ; extra == 'test' - - filelock>=3.4.0 ; extra == 'test' - - ini2toml[lite]>=0.14 ; extra == 'test' - - tomli-w>=1.0.0 ; extra == 'test' - - pytest-timeout ; extra == 'test' - - pytest-home>=0.5 ; extra == 'test' - - mypy==1.11.* ; extra == 'test' - - tomli ; extra == 'test' - - importlib-metadata ; extra == 'test' - - pytest-subprocess ; extra == 'test' - - pyproject-hooks!=1.1 ; extra == 'test' - - jaraco-test ; extra == 'test' - - pytest-ruff<0.4 ; platform_system == 'Windows' and extra == 'test' - - jaraco-develop>=7.21 ; (python_version >= '3.9' and sys_platform != 'cygwin') and extra == 'test' - - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'test' - - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' - - pytest-ruff>=0.3.2 ; sys_platform != 'cygwin' and extra == 'test' - requires_python: '>=3.8' -- kind: pypi - name: sniffio - version: 1.3.1 - url: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - sha256: 2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 - requires_python: '>=3.7' -- kind: pypi - name: snowballstemmer - version: 2.2.0 - url: https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl - sha256: c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a -- kind: pypi - name: soupsieve - version: '2.5' - url: https://files.pythonhosted.org/packages/4c/f3/038b302fdfbe3be7da016777069f26ceefe11a681055ea1f7817546508e3/soupsieve-2.5-py3-none-any.whl - sha256: eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7 - requires_python: '>=3.8' -- kind: pypi - name: sphinx - version: 7.4.7 - url: https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl - sha256: c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239 - requires_dist: - - sphinxcontrib-applehelp - - sphinxcontrib-devhelp - - sphinxcontrib-jsmath - - sphinxcontrib-htmlhelp>=2.0.0 - - sphinxcontrib-serializinghtml>=1.1.9 - - sphinxcontrib-qthelp - - jinja2>=3.1 - - pygments>=2.17 - - docutils>=0.20,<0.22 - - snowballstemmer>=2.2 - - babel>=2.13 - - alabaster~=0.7.14 - - imagesize>=1.3 - - requests>=2.30.0 - - packaging>=23.0 - - importlib-metadata>=6.0 ; python_version < '3.10' - - tomli>=2 ; python_version < '3.11' - - colorama>=0.4.6 ; sys_platform == 'win32' - - sphinxcontrib-websupport ; extra == 'docs' - - flake8>=6.0 ; extra == 'lint' - - ruff==0.5.2 ; extra == 'lint' - - mypy==1.10.1 ; extra == 'lint' - - sphinx-lint>=0.9 ; extra == 'lint' - - types-docutils==0.21.0.20240711 ; extra == 'lint' - - types-requests>=2.30.0 ; extra == 'lint' - - importlib-metadata>=6.0 ; extra == 'lint' - - tomli>=2 ; extra == 'lint' - - pytest>=6.0 ; extra == 'lint' - - pytest>=8.0 ; extra == 'test' - - defusedxml>=0.7.1 ; extra == 'test' - - cython>=3.0 ; extra == 'test' - - setuptools>=70.0 ; extra == 'test' - - typing-extensions>=4.9 ; extra == 'test' - requires_python: '>=3.9' -- kind: pypi - name: sphinx-api-relink - version: 0.0.9 - url: https://files.pythonhosted.org/packages/15/0a/8c4dba0094c349211adc8c9161803547fbedd7c3b1f9123c544aa3da7cb8/sphinx_api_relink-0.0.9-py3-none-any.whl - sha256: d9395433391445aeb08a5608f82923d78f859ecc257ed91f2d0f5fcfe08d59e4 - requires_dist: - - sphinx>=4.4 - - colorama - - docutils - - importlib-metadata ; python_version < '3.8.0' - - typing-extensions ; python_version < '3.8.0' - - sphinx-api-relink[sty] ; extra == 'dev' - - mypy ; extra == 'sty' - - pre-commit>=1.4.0 ; extra == 'sty' - - ruff ; extra == 'sty' - - sphinx-api-relink[types] ; extra == 'sty' - - types-colorama ; extra == 'types' - - types-docutils ; extra == 'types' - - types-requests ; extra == 'types' - requires_python: '>=3.7' -- kind: pypi - name: sphinx-argparse - version: 0.4.0 - url: https://files.pythonhosted.org/packages/21/98/d32f45b19b60e52b4ddc714dee139a92c6ea8fa9115f994884d321c3454d/sphinx_argparse-0.4.0-py3-none-any.whl - sha256: 73bee01f7276fae2bf621ccfe4d167af7306e7288e3482005405d9f826f9b037 - requires_dist: - - commonmark>=0.5.6 ; extra == 'markdown' - - sphinx>=1.2.0 - requires_python: '>=3.7' -- kind: pypi - name: sphinx-autobuild - version: 2024.4.16 - url: https://files.pythonhosted.org/packages/53/de/1d005ba60b4b754d6e05079a479f16a8f6e08c1ec4f8d80288238502b4b6/sphinx_autobuild-2024.4.16-py3-none-any.whl - sha256: f2522779d30fcbf0253e09714f274ce8c608cb6ebcd67922b1c54de59faba702 - requires_dist: - - colorama - - sphinx - - starlette>=0.35 - - uvicorn>=0.25 - - watchfiles>=0.20 - - websockets>=11 - - pytest>=6 ; extra == 'test' - requires_python: '>=3.9' -- kind: pypi - name: sphinx-book-theme - version: 1.1.3 - url: https://files.pythonhosted.org/packages/2b/80/90574e2e82c955b9c6f6b77f7badb2cf2ef4ef77599e4343cced2d098681/sphinx_book_theme-1.1.3-py3-none-any.whl - sha256: a554a9a7ac3881979a87a2b10f633aa2a5706e72218a10f71be38b3c9e831ae9 - requires_dist: - - sphinx>=5 - - pydata-sphinx-theme>=0.15.2 - - pre-commit ; extra == 'code-style' - - ablog ; extra == 'doc' - - ipywidgets ; extra == 'doc' - - folium ; extra == 'doc' - - numpy ; extra == 'doc' - - matplotlib ; extra == 'doc' - - numpydoc ; extra == 'doc' - - myst-nb ; extra == 'doc' - - nbclient ; extra == 'doc' - - pandas ; extra == 'doc' - - plotly ; extra == 'doc' - - sphinx-design ; extra == 'doc' - - sphinx-examples ; extra == 'doc' - - sphinx-copybutton ; extra == 'doc' - - sphinx-tabs ; extra == 'doc' - - sphinx-togglebutton ; extra == 'doc' - - sphinx-thebe ; extra == 'doc' - - sphinxcontrib-bibtex ; extra == 'doc' - - sphinxcontrib-youtube ; extra == 'doc' - - sphinxext-opengraph ; extra == 'doc' - - beautifulsoup4 ; extra == 'test' - - coverage ; extra == 'test' - - defusedxml ; extra == 'test' - - myst-nb ; extra == 'test' - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-regressions ; extra == 'test' - - sphinx-thebe ; extra == 'test' - requires_python: '>=3.9' -- kind: pypi - name: sphinx-codeautolink - version: 0.15.2 - url: https://files.pythonhosted.org/packages/b1/ef/8546618a14e5a491616950b71e9e55de2877a1fecba73e4bc76c62ab53a0/sphinx_codeautolink-0.15.2-py3-none-any.whl - sha256: 44d669ad92d11fd50dd4029887ea285acd95e097cf34a9cae3c6f707c1eb4763 - requires_dist: - - sphinx>=3.2.0 - - beautifulsoup4>=4.8.1 - - ipython!=8.7.0 ; extra == 'ipython' - requires_python: '>=3.7' -- kind: pypi - name: sphinx-copybutton - version: 0.5.2 - url: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - sha256: fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e - requires_dist: - - sphinx>=1.8 - - pre-commit==2.12.1 ; extra == 'code-style' - - sphinx ; extra == 'rtd' - - ipython ; extra == 'rtd' - - myst-nb ; extra == 'rtd' - - sphinx-book-theme ; extra == 'rtd' - - sphinx-examples ; extra == 'rtd' - requires_python: '>=3.7' -- kind: pypi - name: sphinxcontrib-applehelp - version: 2.0.0 - url: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - sha256: 4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 - requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - requires_python: '>=3.9' -- kind: pypi - name: sphinxcontrib-devhelp - version: 2.0.0 - url: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - sha256: aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 - requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - requires_python: '>=3.9' -- kind: pypi - name: sphinxcontrib-htmlhelp - version: 2.1.0 - url: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - sha256: 166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 - requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - - html5lib ; extra == 'test' - requires_python: '>=3.9' -- kind: pypi - name: sphinxcontrib-jsmath - version: 1.0.1 - url: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - sha256: 2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 - requires_dist: - - pytest ; extra == 'test' - - flake8 ; extra == 'test' - - mypy ; extra == 'test' - requires_python: '>=3.5' -- kind: pypi - name: sphinxcontrib-qthelp - version: 2.0.0 - url: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - sha256: b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb - requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - - defusedxml>=0.7.1 ; extra == 'test' - requires_python: '>=3.9' -- kind: pypi - name: sphinxcontrib-serializinghtml - version: 2.0.0 - url: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - sha256: 6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 - requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - requires_python: '>=3.9' -- kind: pypi - name: starlette - version: 0.38.2 - url: https://files.pythonhosted.org/packages/c1/60/d976da9998e4f4a99e297cda09d61ce305919ea94cbeeb476dba4fece098/starlette-0.38.2-py3-none-any.whl - sha256: 4ec6a59df6bbafdab5f567754481657f7ed90dc9d69b0c9ff017907dd54faeff - requires_dist: - - anyio<5,>=3.4.0 - - typing-extensions>=3.10.0 ; python_version < '3.10' - - httpx>=0.22.0 ; extra == 'full' - - itsdangerous ; extra == 'full' - - jinja2 ; extra == 'full' - - python-multipart>=0.0.7 ; extra == 'full' - - pyyaml ; extra == 'full' - requires_python: '>=3.8' -- kind: conda - name: tk - version: 8.6.13 - build: noxft_h4845f30_101 - build_number: 101 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e - md5: d453b98d9c83e71da0741bb0ff4d76bc - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3318875 - timestamp: 1699202167581 -- kind: pypi - name: tomli - version: 2.0.1 - url: https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl - sha256: 939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc - requires_python: '>=3.7' -- kind: pypi - name: tomlkit - version: 0.13.0 - url: https://files.pythonhosted.org/packages/fd/7c/b753bf603852cab0a660da6e81f4ea5d2ca0f0b2b4870766d7aa9bceb7a2/tomlkit-0.13.0-py3-none-any.whl - sha256: 7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264 - requires_python: '>=3.8' -- kind: pypi - name: tox - version: 4.17.1 - url: https://files.pythonhosted.org/packages/c6/58/ca62a2e4b93e6b647d095a81e8fd1e51ca74ee5298afe98b788f49748e46/tox-4.17.1-py3-none-any.whl - sha256: 2974597c0353577126ab014f52d1a399fb761049e165ff34427f84e8cfe6c990 - requires_dist: - - cachetools>=5.4 - - chardet>=5.2 - - colorama>=0.4.6 - - filelock>=3.15.4 - - packaging>=24.1 - - platformdirs>=4.2.2 - - pluggy>=1.5 - - pyproject-api>=1.7.1 - - tomli>=2.0.1 ; python_version < '3.11' - - virtualenv>=20.26.3 - - furo>=2024.7.18 ; extra == 'docs' - - sphinx-argparse-cli>=1.16 ; extra == 'docs' - - sphinx-autodoc-typehints>=2.2.3 ; extra == 'docs' - - sphinx-copybutton>=0.5.2 ; extra == 'docs' - - sphinx-inline-tabs>=2023.4.21 ; extra == 'docs' - - sphinx>=7.4.7 ; extra == 'docs' - - sphinxcontrib-towncrier>=0.2.1a0 ; extra == 'docs' - - towncrier>=23.11 ; extra == 'docs' - - build[virtualenv]>=1.2.1 ; extra == 'testing' - - covdefaults>=2.3 ; extra == 'testing' - - detect-test-pollution>=1.2 ; extra == 'testing' - - devpi-process>=1 ; extra == 'testing' - - diff-cover>=9.1.1 ; extra == 'testing' - - distlib>=0.3.8 ; extra == 'testing' - - flaky>=3.8.1 ; extra == 'testing' - - hatch-vcs>=0.4 ; extra == 'testing' - - hatchling>=1.25 ; extra == 'testing' - - psutil>=6 ; extra == 'testing' - - pytest-cov>=5 ; extra == 'testing' - - pytest-mock>=3.14 ; extra == 'testing' - - pytest-xdist>=3.6.1 ; extra == 'testing' - - pytest>=8.3.2 ; extra == 'testing' - - re-assert>=1.1 ; extra == 'testing' - - setuptools>=70.3 ; extra == 'testing' - - time-machine>=2.14.2 ; implementation_name != 'pypy' and extra == 'testing' - - wheel>=0.43 ; extra == 'testing' - requires_python: '>=3.8' -- kind: pypi - name: traitlets - version: 5.14.3 - url: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - sha256: b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f - requires_dist: - - myst-parser ; extra == 'docs' - - pydata-sphinx-theme ; extra == 'docs' - - sphinx ; extra == 'docs' - - argcomplete>=3.0.3 ; extra == 'test' - - mypy>=1.7.0 ; extra == 'test' - - pre-commit ; extra == 'test' - - pytest-mock ; extra == 'test' - - pytest-mypy-testing ; extra == 'test' - - pytest<8.2,>=7.0 ; extra == 'test' - requires_python: '>=3.8' -- kind: pypi - name: types-pyyaml - version: 6.0.12.20240808 - url: https://files.pythonhosted.org/packages/f3/ad/ffbad24e2bc8f20bf047ec22af0c0a92f6ce2071eb21c9103df600cda6de/types_PyYAML-6.0.12.20240808-py3-none-any.whl - sha256: deda34c5c655265fc517b546c902aa6eed2ef8d3e921e4765fe606fe2afe8d35 - requires_python: '>=3.8' -- kind: pypi - name: types-toml - version: 0.10.8.20240310 - url: https://files.pythonhosted.org/packages/da/a2/d32ab58c0b216912638b140ab2170ee4b8644067c293b170e19fba340ccc/types_toml-0.10.8.20240310-py3-none-any.whl - sha256: 627b47775d25fa29977d9c70dc0cbab3f314f32c8d8d0c012f2ef5de7aaec05d - requires_python: '>=3.8' -- kind: pypi - name: typing-extensions - version: 4.12.2 - url: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - sha256: 04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d - requires_python: '>=3.8' -- kind: conda - name: tzdata - version: 2024a - build: h0c530f3_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 - md5: 161081fc7cec0bfda0d86d7cb595f8d8 - license: LicenseRef-Public-Domain - purls: [] - size: 119815 - timestamp: 1706886945727 -- kind: pypi - name: urllib3 - version: 2.2.2 - url: https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl - sha256: a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 - requires_dist: - - brotli>=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' - - h2<5,>=4 ; extra == 'h2' - - pysocks!=1.5.7,<2.0,>=1.5.6 ; extra == 'socks' - - zstandard>=0.18.0 ; extra == 'zstd' - requires_python: '>=3.8' -- kind: pypi - name: uvicorn - version: 0.30.5 - url: https://files.pythonhosted.org/packages/67/d8/1bcb5e6508d14c6c9912cd964b286f04392298ffb3e4218f4a1292d64e76/uvicorn-0.30.5-py3-none-any.whl - sha256: b2d86de274726e9878188fa07576c9ceeff90a839e2b6e25c917fe05f5a6c835 - requires_dist: - - click>=7.0 - - h11>=0.8 - - typing-extensions>=4.0 ; python_version < '3.11' - - colorama>=0.4 ; sys_platform == 'win32' and extra == 'standard' - - httptools>=0.5.0 ; extra == 'standard' - - python-dotenv>=0.13 ; extra == 'standard' - - pyyaml>=5.1 ; extra == 'standard' - - uvloop!=0.15.0,!=0.15.1,>=0.14.0 ; (sys_platform != 'win32' and (sys_platform != 'cygwin' and platform_python_implementation != 'PyPy')) and extra == 'standard' - - watchfiles>=0.13 ; extra == 'standard' - - websockets>=10.4 ; extra == 'standard' - requires_python: '>=3.8' -- kind: pypi - name: virtualenv - version: 20.26.3 - url: https://files.pythonhosted.org/packages/07/4d/410156100224c5e2f0011d435e477b57aed9576fc7fe137abcf14ec16e11/virtualenv-20.26.3-py3-none-any.whl - sha256: 8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589 - requires_dist: - - distlib<1,>=0.3.7 - - filelock<4,>=3.12.2 - - importlib-metadata>=6.6 ; python_version < '3.8' - - platformdirs<5,>=3.9.1 - - furo>=2023.7.26 ; extra == 'docs' - - proselint>=0.13 ; extra == 'docs' - - sphinx!=7.3,>=7.1.2 ; extra == 'docs' - - sphinx-argparse>=0.4 ; extra == 'docs' - - sphinxcontrib-towncrier>=0.2.1a0 ; extra == 'docs' - - towncrier>=23.6 ; extra == 'docs' - - covdefaults>=2.3 ; extra == 'test' - - coverage-enable-subprocess>=1 ; extra == 'test' - - coverage>=7.2.7 ; extra == 'test' - - flaky>=3.7 ; extra == 'test' - - packaging>=23.1 ; extra == 'test' - - pytest-env>=0.8.2 ; extra == 'test' - - pytest-freezer>=0.4.8 ; (platform_python_implementation == 'PyPy' or (platform_python_implementation == 'CPython' and sys_platform == 'win32' and python_version >= '3.13')) and extra == 'test' - - pytest-mock>=3.11.1 ; extra == 'test' - - pytest-randomly>=3.12 ; extra == 'test' - - pytest-timeout>=2.1 ; extra == 'test' - - pytest>=7.4 ; extra == 'test' - - setuptools>=68 ; extra == 'test' - - time-machine>=2.10 ; platform_python_implementation == 'CPython' and extra == 'test' - requires_python: '>=3.7' -- kind: pypi - name: watchfiles - version: 0.23.0 - url: https://files.pythonhosted.org/packages/57/65/f3e854c5b8912d76c8fefc7c891b3df628b9110907b968faadcb8142347e/watchfiles-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 18e2de19801b0eaa4c5292a223effb7cfb43904cb742c5317a0ac686ed604765 - requires_dist: - - anyio>=3.0.0 - requires_python: '>=3.8' -- kind: pypi - name: websockets - version: '12.0' - url: https://files.pythonhosted.org/packages/06/dd/e8535f54b4aaded1ed44041ca8eb9de8786ce719ff148b56b4a903ef93e6/websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9 - requires_python: '>=3.8' -- kind: pypi - name: wheel - version: 0.44.0 - url: https://files.pythonhosted.org/packages/1b/d1/9babe2ccaecff775992753d8686970b1e2755d21c8a63be73aba7a4e7d77/wheel-0.44.0-py3-none-any.whl - sha256: 2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f - requires_dist: - - pytest>=6.0.0 ; extra == 'test' - - setuptools>=65 ; extra == 'test' - requires_python: '>=3.8' -- kind: conda - name: xz - version: 5.2.6 - build: h166bdaf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 - md5: 2161070d867d1b1204ea749c8eec4ef0 - depends: - - libgcc-ng >=12 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 418368 - timestamp: 1660346797927 -- kind: pypi - name: zipp - version: 3.19.2 - url: https://files.pythonhosted.org/packages/20/38/f5c473fe9b90c8debdd29ea68d5add0289f1936d6f923b6b9cc0b931194c/zipp-3.19.2-py3-none-any.whl - sha256: f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c - requires_dist: - - sphinx>=3.5 ; extra == 'doc' - - jaraco-packaging>=9.3 ; extra == 'doc' - - rst-linker>=1.9 ; extra == 'doc' - - furo ; extra == 'doc' - - sphinx-lint ; extra == 'doc' - - jaraco-tidelift>=1.4 ; extra == 'doc' - - pytest!=8.1.*,>=6 ; extra == 'test' - - pytest-checkdocs>=2.4 ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-mypy ; extra == 'test' - - pytest-enabler>=2.2 ; extra == 'test' - - pytest-ruff>=0.2.1 ; extra == 'test' - - jaraco-itertools ; extra == 'test' - - jaraco-functools ; extra == 'test' - - more-itertools ; extra == 'test' - - big-o ; extra == 'test' - - pytest-ignore-flaky ; extra == 'test' - - jaraco-test ; extra == 'test' - - importlib-resources ; python_version < '3.9' and extra == 'test' - requires_python: '>=3.8' From 7c92bc04f4659dc57ff06d35cc5fae5c87671fe5 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:35 +0200 Subject: [PATCH 11/44] DX: avoid installing `sphinx-autobuild` v2024.4 --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index c97e9439..b941c3fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,6 +51,7 @@ dev = [ "pydeps", "sphinx-autobuild", "tox >=1.9", # for skip_install, use_develop + 'sphinx-autobuild!=2024.4.*; python_version <"3.10.0"', ] doc = [ "Sphinx", From aab9cf33d147fb6876dc5d9c927554fa2fcc5e18 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:35 +0200 Subject: [PATCH 12/44] DX: import tox tasks to pixi --- pyproject.toml | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index b941c3fd..479906c4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -166,6 +166,55 @@ compwa-policy = {features = [ "types", ], solve-group = "default"} +[tool.pixi.feature.dev.tasks.ci] +depends_on = ["coverage", "doc", "linkcheck", "sty"] + +[tool.pixi.feature.dev.tasks.cov] +cmd = """ +pytest \ + --cov-fail-under=35 \ + --cov-report=html \ + --cov-report=xml \ + --cov=compwa_policy +""" + +[tool.pixi.feature.dev.tasks.doc] +cmd = """ +sphinx-build \ + --builder html \ + --fail-on-warning \ + --keep-going \ + --show-traceback \ + docs/ docs/_build/html +""" + +[tool.pixi.feature.dev.tasks.doclive] +cmd = """ +sphinx-autobuild \ + --open-browser \ + --re-ignore '.*\\..egg-info' \ + --re-ignore '.*/__pycache__/.*' \ + --re-ignore 'docs/_build/.*' \ + --re-ignore 'docs/api/.*' \ + --watch docs \ + --watch src \ + docs/ docs/_build/html +""" + +[tool.pixi.feature.dev.tasks.linkcheck] +cmd = """ +sphinx-build \ + --builder linkcheck \ + --show-traceback \ + docs/ docs/_build/linkcheck +""" + +[tool.pixi.feature.dev.tasks.sty] +cmd = "pre-commit run --all-files" + +[tool.pixi.feature.dev.tasks.test] +cmd = "pytest" + [tool.pixi.pypi-dependencies] compwa-policy = {path = ".", editable = true} From 0e10a4627aa4336f5e25447f321dc23ed9748366 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:36 +0200 Subject: [PATCH 13/44] ENH: pack strings in single quotation marks in `tox.ini` --- pyproject.toml | 11 +++++- src/compwa_policy/check_dev_files/pixi.py | 43 +++++++++++++++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 479906c4..b654c9cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -192,7 +192,7 @@ sphinx-build \ cmd = """ sphinx-autobuild \ --open-browser \ - --re-ignore '.*\\..egg-info' \ + --re-ignore '.*\\.egg-info' \ --re-ignore '.*/__pycache__/.*' \ --re-ignore 'docs/_build/.*' \ --re-ignore 'docs/api/.*' \ @@ -209,6 +209,15 @@ sphinx-build \ docs/ docs/_build/linkcheck """ +[tool.pixi.feature.dev.tasks.pydeps] +cmd = """ +pydeps compwa_policy \ + -o module_structure.svg \ + --exclude '*._*' \ + --max-bacon=1 \ + --noshow +""" + [tool.pixi.feature.dev.tasks.sty] cmd = "pre-commit run --all-files" diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index ac615d0b..0ddcc9ef 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -1,8 +1,12 @@ """Update pixi implementation.""" -from tomlkit import inline_table +from configparser import ConfigParser +from textwrap import dedent -from compwa_policy.utilities import vscode +from tomlkit import inline_table, string +from tomlkit.items import String + +from compwa_policy.utilities import CONFIG_PATH, vscode from compwa_policy.utilities.executor import Executor from compwa_policy.utilities.pyproject import ModifiablePyproject, complies_with_subset from compwa_policy.utilities.pyproject.getters import PythonVersion @@ -15,6 +19,7 @@ def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: do(_define_minimal_project, pyproject) if is_python_package: do(_install_package_editable, pyproject) + do(_import_tox_tasks, pyproject) do(_set_dev_python_version, pyproject, dev_python_version) do(_update_dev_environment, pyproject) do( @@ -51,6 +56,40 @@ def _define_minimal_project(pyproject: ModifiablePyproject) -> None: pyproject.append_to_changelog(msg) +def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: + if not CONFIG_PATH.tox.exists(): + return + cfg = ConfigParser() + cfg.read(CONFIG_PATH.tox) + tox_jobs = [ + section[8:] + for section in cfg.sections() + if section.startswith("testenv:") # cspell:ignore testenv + ] + imported_jobs = [] + for job_name in tox_jobs: + pixi_table_name = f"tool.pixi.feature.dev.tasks.{job_name}" + if pyproject.has_table(pixi_table_name): + continue + pixi_table = pyproject.get_table(pixi_table_name, create=True) + command = cfg.get(section=f"testenv:{job_name}", option="commands", raw=True) + pixi_table["cmd"] = __to_pixi_command(command) + imported_jobs.append(job_name) + if imported_jobs: + msg = f"Imported the following tox jobs: {', '.join(imported_jobs)}" + pyproject.append_to_changelog(msg) + + +def __to_pixi_command(tox_command: str) -> String: + tox_command = tox_command.replace(" {posargs}", "") # cspell:ignore posargs + pixi_command = dedent(tox_command).strip() + pixi_command = pixi_command.replace(" {posargs}", "") + if "\n" in pixi_command: + pixi_command = "\n" + pixi_command + "\n" + pixi_command = pixi_command.replace("\\\n", "\\\n" + 4 * " ") + return string(pixi_command, multiline="\n" in pixi_command) + + def _install_package_editable(pyproject: ModifiablePyproject) -> None: editable = inline_table() editable.update({ From 5ccfcfc7e17997ba29b50e4a736de628840aee4b Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:37 +0200 Subject: [PATCH 14/44] FIX: import pure `testenv` as well --- pyproject.toml | 2 +- src/compwa_policy/check_dev_files/pixi.py | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b654c9cd..f5440d5d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -221,7 +221,7 @@ pydeps compwa_policy \ [tool.pixi.feature.dev.tasks.sty] cmd = "pre-commit run --all-files" -[tool.pixi.feature.dev.tasks.test] +[tool.pixi.feature.dev.tasks.tests] cmd = "pytest" [tool.pixi.pypi-dependencies] diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 0ddcc9ef..7c647ed9 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -64,15 +64,19 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: tox_jobs = [ section[8:] for section in cfg.sections() - if section.startswith("testenv:") # cspell:ignore testenv + if section.startswith("testenv") # cspell:ignore testenv ] imported_jobs = [] for job_name in tox_jobs: - pixi_table_name = f"tool.pixi.feature.dev.tasks.{job_name}" + task_name = job_name or "tests" + pixi_table_name = f"tool.pixi.feature.dev.tasks.{task_name}" if pyproject.has_table(pixi_table_name): continue + section = f"testenv:{job_name}" if job_name else "testenv" + if not cfg.has_option(section, "commands"): + continue + command = cfg.get(section, option="commands", raw=True) pixi_table = pyproject.get_table(pixi_table_name, create=True) - command = cfg.get(section=f"testenv:{job_name}", option="commands", raw=True) pixi_table["cmd"] = __to_pixi_command(command) imported_jobs.append(job_name) if imported_jobs: From 0514ee0f40d40f8da70d73784fbf15f49343c730 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:38 +0200 Subject: [PATCH 15/44] FEAT: define combined local CI job for Pixi --- pyproject.toml | 2 +- src/compwa_policy/check_dev_files/pixi.py | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f5440d5d..d9783e31 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -167,7 +167,7 @@ compwa-policy = {features = [ ], solve-group = "default"} [tool.pixi.feature.dev.tasks.ci] -depends_on = ["coverage", "doc", "linkcheck", "sty"] +depends_on = ["cov", "doc", "linkcheck", "sty"] [tool.pixi.feature.dev.tasks.cov] cmd = """ diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 7c647ed9..0d763b31 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -20,6 +20,7 @@ def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: if is_python_package: do(_install_package_editable, pyproject) do(_import_tox_tasks, pyproject) + do(_define_combined_ci_job, pyproject) do(_set_dev_python_version, pyproject, dev_python_version) do(_update_dev_environment, pyproject) do( @@ -43,6 +44,28 @@ def _configure_setuptools_scm(pyproject: ModifiablePyproject) -> None: pyproject.append_to_changelog(msg) +def _define_combined_ci_job(pyproject: ModifiablePyproject) -> None: + if not pyproject.has_table("tool.pixi.feature.dev.tasks"): + return + tasks = set(pyproject.get_table("tool.pixi.feature.dev.tasks")) + expected = {"linkcheck", "sty"} & tasks + if {"cov", "coverage"} & tasks: + expected.add("cov") + elif "tests" in tasks: + expected.add("tests") + if "docnb" in tasks: # cspelL:ignore docnb + expected.add("docnb") + elif "doc" in tasks: + expected.add("doc") + ci = pyproject.get_table("tool.pixi.feature.dev.tasks.ci", create=True) + existing = set(ci.get("depends_on", set())) + if not expected <= existing: + depends_on = expected | existing & tasks + ci["depends_on"] = to_toml_array(sorted(depends_on), multiline=False) + msg = "Updated combined CI job for Pixi" + pyproject.append_to_changelog(msg) + + def _define_minimal_project(pyproject: ModifiablePyproject) -> None: """Create a minimal Pixi project definition if it does not exist.""" settings = pyproject.get_table("tool.pixi.project", create=True) From f2d2ee296e21693aab37c024dc8975df1272766b Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:39 +0200 Subject: [PATCH 16/44] FIX: remove `posargs` with default arguments --- src/compwa_policy/check_dev_files/pixi.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 0d763b31..3fe56dd7 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -1,5 +1,6 @@ """Update pixi implementation.""" +import re from configparser import ConfigParser from textwrap import dedent @@ -108,9 +109,8 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: def __to_pixi_command(tox_command: str) -> String: - tox_command = tox_command.replace(" {posargs}", "") # cspell:ignore posargs + tox_command = re.sub(r" {posargs[^}]*}", "", tox_command) # cspell:ignore posargs pixi_command = dedent(tox_command).strip() - pixi_command = pixi_command.replace(" {posargs}", "") if "\n" in pixi_command: pixi_command = "\n" + pixi_command + "\n" pixi_command = pixi_command.replace("\\\n", "\\\n" + 4 * " ") From 8b966a3fc681295606229516cf8181db3fdf8883 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:40 +0200 Subject: [PATCH 17/44] FIX: print task names instead of tox job names --- src/compwa_policy/check_dev_files/pixi.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 3fe56dd7..e213bdd7 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -90,7 +90,7 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: for section in cfg.sections() if section.startswith("testenv") # cspell:ignore testenv ] - imported_jobs = [] + imported_tasks = [] for job_name in tox_jobs: task_name = job_name or "tests" pixi_table_name = f"tool.pixi.feature.dev.tasks.{task_name}" @@ -102,9 +102,9 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: command = cfg.get(section, option="commands", raw=True) pixi_table = pyproject.get_table(pixi_table_name, create=True) pixi_table["cmd"] = __to_pixi_command(command) - imported_jobs.append(job_name) - if imported_jobs: - msg = f"Imported the following tox jobs: {', '.join(imported_jobs)}" + imported_tasks.append(task_name) + if imported_tasks: + msg = f"Imported the following tox jobs: {', '.join(sorted(imported_tasks))}" pyproject.append_to_changelog(msg) From b37a6498e0107787f8e85f807575b4829f004855 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:41 +0200 Subject: [PATCH 18/44] ENH: import environment variables --- src/compwa_policy/check_dev_files/pixi.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index e213bdd7..5bce2c9f 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -5,7 +5,7 @@ from textwrap import dedent from tomlkit import inline_table, string -from tomlkit.items import String +from tomlkit.items import InlineTable, String from compwa_policy.utilities import CONFIG_PATH, vscode from compwa_policy.utilities.executor import Executor @@ -102,12 +102,30 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: command = cfg.get(section, option="commands", raw=True) pixi_table = pyproject.get_table(pixi_table_name, create=True) pixi_table["cmd"] = __to_pixi_command(command) + if cfg.has_option(section, "setenv"): # cspell:ignore setenv + job_environment = cfg.get(section, option="setenv", raw=True) + environment_variables = __to_environment_variables(job_environment) + if environment_variables: + pixi_table["env"] = environment_variables imported_tasks.append(task_name) if imported_tasks: msg = f"Imported the following tox jobs: {', '.join(sorted(imported_tasks))}" pyproject.append_to_changelog(msg) +def __to_environment_variables(tox_env: str) -> InlineTable: + lines = tox_env.splitlines() + lines = [s.strip() for s in lines] + lines = [s for s in lines if s] + environment_variables = inline_table() + for line in lines: + key, value = line.split("=", 1) + key = key.strip() + if key: + environment_variables[key] = string(value.strip()) + return environment_variables + + def __to_pixi_command(tox_command: str) -> String: tox_command = re.sub(r" {posargs[^}]*}", "", tox_command) # cspell:ignore posargs pixi_command = dedent(tox_command).strip() From 76c7999225d5322b9f1b41eb080362a4de55f024 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:42 +0200 Subject: [PATCH 19/44] DX: ignore `.gitattributes` with cSpell --- .cspell.json | 1 + src/compwa_policy/.template/.cspell.json | 1 + 2 files changed, 2 insertions(+) diff --git a/.cspell.json b/.cspell.json index 247e5db8..e9cd51a5 100644 --- a/.cspell.json +++ b/.cspell.json @@ -26,6 +26,7 @@ "*.rst_t", ".editorconfig", ".envrc", + ".gitattributes", ".gitignore", ".gitpod.*", ".pre-commit-config.yaml", diff --git a/src/compwa_policy/.template/.cspell.json b/src/compwa_policy/.template/.cspell.json index d264b409..c38ef86b 100644 --- a/src/compwa_policy/.template/.cspell.json +++ b/src/compwa_policy/.template/.cspell.json @@ -28,6 +28,7 @@ ".constraints/*.txt", ".editorconfig", ".envrc", + ".gitattributes", ".gitignore", ".gitpod.*", ".mypy.ini", From 5b08fef80cdc9a091dadf9ef58305590fa91d7d8 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:42 +0200 Subject: [PATCH 20/44] MAINT: remove redundant quotation marks in YAML --- environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment.yml b/environment.yml index 72ddb419..0fe9bac9 100644 --- a/environment.yml +++ b/environment.yml @@ -7,4 +7,4 @@ dependencies: - pip: - -e .[dev] variables: - PRETTIER_LEGACY_CLI: "1" + PRETTIER_LEGACY_CLI: 1 From 66e5cac12de53305b1aca9a6f06bb222e84ff7f1 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:43 +0200 Subject: [PATCH 21/44] MAINT: clean up type hints with `from __future__ import annotations` --- src/compwa_policy/check_dev_files/pixi.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 5bce2c9f..c686c817 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -1,18 +1,24 @@ """Update pixi implementation.""" +from __future__ import annotations + import re from configparser import ConfigParser from textwrap import dedent +from typing import TYPE_CHECKING from tomlkit import inline_table, string -from tomlkit.items import InlineTable, String from compwa_policy.utilities import CONFIG_PATH, vscode from compwa_policy.utilities.executor import Executor from compwa_policy.utilities.pyproject import ModifiablePyproject, complies_with_subset -from compwa_policy.utilities.pyproject.getters import PythonVersion from compwa_policy.utilities.toml import to_toml_array +if TYPE_CHECKING: + from tomlkit.items import InlineTable, String + + from compwa_policy.utilities.pyproject.getters import PythonVersion + def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: with Executor() as do, ModifiablePyproject.load() as pyproject: From 55e7be8e65d98e439bb7c01bd27bf870b608ee1d Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:44 +0200 Subject: [PATCH 22/44] ENH: import environment variables from Conda --- pyproject.toml | 3 + src/compwa_policy/check_dev_files/pixi.py | 70 +++++++++++++++++++++-- 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d9783e31..b0af8772 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -154,6 +154,9 @@ module = ["nbformat.*"] channels = ["conda-forge"] platforms = ["linux-64"] +[tool.pixi.activation] +env = {PRETTIER_LEGACY_CLI = "1"} + [tool.pixi.dependencies] python = "3.9.*" diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index c686c817..c88818f9 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -7,11 +7,16 @@ from textwrap import dedent from typing import TYPE_CHECKING +import yaml from tomlkit import inline_table, string from compwa_policy.utilities import CONFIG_PATH, vscode from compwa_policy.utilities.executor import Executor -from compwa_policy.utilities.pyproject import ModifiablePyproject, complies_with_subset +from compwa_policy.utilities.pyproject import ( + ModifiablePyproject, + Pyproject, + complies_with_subset, +) from compwa_policy.utilities.toml import to_toml_array if TYPE_CHECKING: @@ -26,6 +31,7 @@ def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: do(_define_minimal_project, pyproject) if is_python_package: do(_install_package_editable, pyproject) + do(_import_conda_environment, pyproject) do(_import_tox_tasks, pyproject) do(_define_combined_ci_job, pyproject) do(_set_dev_python_version, pyproject, dev_python_version) @@ -86,6 +92,25 @@ def _define_minimal_project(pyproject: ModifiablePyproject) -> None: pyproject.append_to_changelog(msg) +def _import_conda_environment(pyproject: ModifiablePyproject) -> None: + if not CONFIG_PATH.conda.exists(): + return + with CONFIG_PATH.conda.open() as stream: + conda = yaml.safe_load(stream) + conda_variables = {k: str(v) for k, v in conda.get("variables", {}).items()} + if not conda_variables: + return + activation_table = pyproject.get_table("tool.pixi.activation", create=True) + pixi_variables = dict(activation_table.get("env", {})) + if not complies_with_subset(pixi_variables, conda_variables): + new_environment = inline_table() + new_environment.update(pixi_variables) + new_environment.update(conda_variables) + activation_table["env"] = new_environment + msg = "Imported conda environment variables for Pixi" + pyproject.append_to_changelog(msg) + + def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: if not CONFIG_PATH.tox.exists(): return @@ -96,6 +121,7 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: for section in cfg.sections() if section.startswith("testenv") # cspell:ignore testenv ] + global_env_variables = __load_pixi_environment_variables(pyproject) imported_tasks = [] for job_name in tox_jobs: task_name = job_name or "tests" @@ -110,7 +136,11 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: pixi_table["cmd"] = __to_pixi_command(command) if cfg.has_option(section, "setenv"): # cspell:ignore setenv job_environment = cfg.get(section, option="setenv", raw=True) - environment_variables = __to_environment_variables(job_environment) + environment_variables = __convert_tox_environment_variables( + job_environment, + global_env_variables, + blacklisted_keys={"FORCE_COLOR"}, + ) if environment_variables: pixi_table["env"] = environment_variables imported_tasks.append(task_name) @@ -119,7 +149,32 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: pyproject.append_to_changelog(msg) -def __to_environment_variables(tox_env: str) -> InlineTable: +def __load_pixi_environment_variables(pyproject: Pyproject) -> dict[str, str]: + if not pyproject.has_table("tool.pixi.activation"): + return {} + activation_table = pyproject.get_table("tool.pixi.activation", create=True) + return dict(activation_table.get("env", {})) + + +def __convert_tox_environment_variables( + tox_env: str, global_env: dict[str, str], blacklisted_keys: set[str] +) -> InlineTable: + '''Convert tox environment variables to a dictionary. + + >>> tox_env = """ + ... KEY=0 + ... EMPTY_VAR= + ... FOO=bar + ... BAR=overwritten + ... FORCE_COLOR=baz + ... """ + >>> __convert_tox_environment_variables( + ... tox_env, + ... global_env={"FOO": "bar", "BAR": "something-else"}, + ... blacklisted_keys={"FORCE_COLOR"}, + ... ) + {'KEY': '0', 'EMPTY_VAR': '', 'BAR': 'overwritten'} + ''' lines = tox_env.splitlines() lines = [s.strip() for s in lines] lines = [s for s in lines if s] @@ -127,8 +182,13 @@ def __to_environment_variables(tox_env: str) -> InlineTable: for line in lines: key, value = line.split("=", 1) key = key.strip() - if key: - environment_variables[key] = string(value.strip()) + if not key: + continue + if key in blacklisted_keys: + continue + value = value.strip() + if global_env.get(key) != value: + environment_variables[key] = string(value) return environment_variables From 590f875c2359d39731016bd1203f3eb493a098fd Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:45 +0200 Subject: [PATCH 23/44] ENH: set Pixi activation.env as `Table`, not inline --- src/compwa_policy/check_dev_files/pixi.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index c88818f9..e28880f2 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -103,10 +103,7 @@ def _import_conda_environment(pyproject: ModifiablePyproject) -> None: activation_table = pyproject.get_table("tool.pixi.activation", create=True) pixi_variables = dict(activation_table.get("env", {})) if not complies_with_subset(pixi_variables, conda_variables): - new_environment = inline_table() - new_environment.update(pixi_variables) - new_environment.update(conda_variables) - activation_table["env"] = new_environment + activation_table["env"] = dict(**pixi_variables, **conda_variables) msg = "Imported conda environment variables for Pixi" pyproject.append_to_changelog(msg) From 7e91d1b82b2f876325f2328269790519873b735d Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:46 +0200 Subject: [PATCH 24/44] ENH: always clean up local Pixi task variables --- src/compwa_policy/check_dev_files/pixi.py | 61 ++++++++++++----------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index e28880f2..816f0ad6 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -36,6 +36,7 @@ def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: do(_define_combined_ci_job, pyproject) do(_set_dev_python_version, pyproject, dev_python_version) do(_update_dev_environment, pyproject) + do(_clean_up_task_env, pyproject) do( vscode.update_settings, {"files.associations": {"**/pixi.lock": "yaml"}}, @@ -118,7 +119,6 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: for section in cfg.sections() if section.startswith("testenv") # cspell:ignore testenv ] - global_env_variables = __load_pixi_environment_variables(pyproject) imported_tasks = [] for job_name in tox_jobs: task_name = job_name or "tests" @@ -135,7 +135,6 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: job_environment = cfg.get(section, option="setenv", raw=True) environment_variables = __convert_tox_environment_variables( job_environment, - global_env_variables, blacklisted_keys={"FORCE_COLOR"}, ) if environment_variables: @@ -146,32 +145,9 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: pyproject.append_to_changelog(msg) -def __load_pixi_environment_variables(pyproject: Pyproject) -> dict[str, str]: - if not pyproject.has_table("tool.pixi.activation"): - return {} - activation_table = pyproject.get_table("tool.pixi.activation", create=True) - return dict(activation_table.get("env", {})) - - def __convert_tox_environment_variables( - tox_env: str, global_env: dict[str, str], blacklisted_keys: set[str] + tox_env: str, blacklisted_keys: set[str] ) -> InlineTable: - '''Convert tox environment variables to a dictionary. - - >>> tox_env = """ - ... KEY=0 - ... EMPTY_VAR= - ... FOO=bar - ... BAR=overwritten - ... FORCE_COLOR=baz - ... """ - >>> __convert_tox_environment_variables( - ... tox_env, - ... global_env={"FOO": "bar", "BAR": "something-else"}, - ... blacklisted_keys={"FORCE_COLOR"}, - ... ) - {'KEY': '0', 'EMPTY_VAR': '', 'BAR': 'overwritten'} - ''' lines = tox_env.splitlines() lines = [s.strip() for s in lines] lines = [s for s in lines if s] @@ -183,12 +159,39 @@ def __convert_tox_environment_variables( continue if key in blacklisted_keys: continue - value = value.strip() - if global_env.get(key) != value: - environment_variables[key] = string(value) + environment_variables[key] = string(value.strip()) return environment_variables +def _clean_up_task_env(pyproject: ModifiablePyproject) -> None: + if not pyproject.has_table("tool.pixi.feature.dev.tasks"): + return + global_env = __load_pixi_environment_variables(pyproject) + tasks = pyproject.get_table("tool.pixi.feature.dev.tasks") + updated_tasks = [] + for task_name, task_table in tasks.items(): + local_env = task_table.get("env", {}) + if not local_env: + continue + expected = {k: v for k, v in local_env.items() if v != global_env.get(k)} + if local_env != expected: + if expected: + task_table["env"] = expected + else: + del task_table["env"] + updated_tasks.append(task_name) + if updated_tasks: + msg = f"Removed redundant environment variables from Pixi tasks {', '.join(updated_tasks)}" + pyproject.append_to_changelog(msg) + + +def __load_pixi_environment_variables(pyproject: Pyproject) -> dict[str, str]: + if not pyproject.has_table("tool.pixi.activation"): + return {} + activation_table = pyproject.get_table("tool.pixi.activation", create=True) + return dict(activation_table.get("env", {})) + + def __to_pixi_command(tox_command: str) -> String: tox_command = re.sub(r" {posargs[^}]*}", "", tox_command) # cspell:ignore posargs pixi_command = dedent(tox_command).strip() From a366c71607e610d2a5b56e014cc834caf4806937 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:47 +0200 Subject: [PATCH 25/44] ENH: update command `docnb` with that from `doc` etc --- .cspell.json | 3 ++ src/compwa_policy/check_dev_files/pixi.py | 39 +++++++++++++++++++- tests/check_dev_files/test_pixi.py | 44 +++++++++++++++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 tests/check_dev_files/test_pixi.py diff --git a/.cspell.json b/.cspell.json index e9cd51a5..92978179 100644 --- a/.cspell.json +++ b/.cspell.json @@ -76,6 +76,9 @@ "commitlint", "conda", "direnv", + "doclive", + "docnb", + "docnblive", "envrc", "fromdict", "indentless", diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 816f0ad6..bdf14dc1 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -20,7 +20,7 @@ from compwa_policy.utilities.toml import to_toml_array if TYPE_CHECKING: - from tomlkit.items import InlineTable, String + from tomlkit.items import InlineTable, String, Table from compwa_policy.utilities.pyproject.getters import PythonVersion @@ -37,6 +37,8 @@ def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: do(_set_dev_python_version, pyproject, dev_python_version) do(_update_dev_environment, pyproject) do(_clean_up_task_env, pyproject) + do(_update_docnb_and_doclive, pyproject, "tool.pixi.tasks") + do(_update_docnb_and_doclive, pyproject, "tool.pixi.feature.dev.tasks") do( vscode.update_settings, {"files.associations": {"**/pixi.lock": "yaml"}}, @@ -241,3 +243,38 @@ def _update_dev_environment(pyproject: ModifiablePyproject) -> None: environments[package_name] = expected msg = "Updated Pixi developer environment" pyproject.append_to_changelog(msg) + + +def _update_docnb_and_doclive(pyproject: ModifiablePyproject, table_key: str) -> None: + if not pyproject.has_table(table_key): + return + tasks = pyproject.get_table(table_key) + tables_to_overwrite = { + "doc": ["docnb", "docnb-force"], + "doclive": ["docnblive"], + } + updated_tasks = [] + for template_task_name, target_task_names in tables_to_overwrite.items(): + template_task = tasks.get(template_task_name) + if template_task is None: + continue + for task_name in target_task_names: + task = tasks.get(task_name) + if task is None: + continue + if ___overwrite_cmd(task, template_task): + updated_tasks.append(task_name) + if updated_tasks: + msg = f"Updated `cmd` of Pixi tasks {', '.join(updated_tasks)}" + pyproject.append_to_changelog(msg) + + +def ___overwrite_cmd(task: Table, template_task: Table) -> bool: + template_cmd = template_task.get("cmd") + if not template_cmd: + msg = f"Missing cmd for template task {template_task.name}" + raise ValueError(msg) + if task.get("cmd") != template_cmd: + task["cmd"] = template_task["cmd"] + return True + return False diff --git a/tests/check_dev_files/test_pixi.py b/tests/check_dev_files/test_pixi.py new file mode 100644 index 00000000..2a130015 --- /dev/null +++ b/tests/check_dev_files/test_pixi.py @@ -0,0 +1,44 @@ +from textwrap import dedent + +import pytest + +from compwa_policy.check_dev_files.pixi import _update_docnb_and_doclive +from compwa_policy.errors import PrecommitError +from compwa_policy.utilities.pyproject import ModifiablePyproject + + +@pytest.mark.parametrize( + "table_key", + [ + "tool.pixi.feature.dev.tasks", + "tool.pixi.tasks", + ], +) +def test_update_docnb_and_doclive(table_key: str): + content = dedent(f""" + [{table_key}.doc] + cmd = "command executed by doc" + + [{table_key}.docnb] + cmd = "some outdated command" + + [{table_key}.docnb-test] + cmd = "should not change" + """) + with pytest.raises( + PrecommitError, + match="Updated `cmd` of Pixi tasks docnb", + ), ModifiablePyproject.load(content) as pyproject: + _update_docnb_and_doclive(pyproject, table_key) + new_content = pyproject.dumps() + expected = dedent(f""" + [{table_key}.doc] + cmd = "command executed by doc" + + [{table_key}.docnb] + cmd = "command executed by doc" + + [{table_key}.docnb-test] + cmd = "should not change" + """) + assert new_content.strip() == expected.strip() From 6f5256ff821e8e73188528e8d03e32c8bd5c5154 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:48 +0200 Subject: [PATCH 26/44] MAINT: extract `has_pixi_config()` --- src/compwa_policy/check_dev_files/direnv.py | 7 ++----- src/compwa_policy/check_dev_files/pixi.py | 7 +++++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/compwa_policy/check_dev_files/direnv.py b/src/compwa_policy/check_dev_files/direnv.py index d73af11e..ba90b0ab 100644 --- a/src/compwa_policy/check_dev_files/direnv.py +++ b/src/compwa_policy/check_dev_files/direnv.py @@ -6,6 +6,7 @@ import rtoml +from compwa_policy.check_dev_files.pixi import has_pixi_config from compwa_policy.errors import PrecommitError from compwa_policy.utilities import CONFIG_PATH from compwa_policy.utilities.pyproject import Pyproject @@ -16,11 +17,7 @@ def main() -> None: (".venv", "source .venv/bin/activate"), ("venv", "source venv/bin/activate"), ] - if ( - CONFIG_PATH.pixi_lock.exists() - or CONFIG_PATH.pixi_toml.exists() - or (CONFIG_PATH.pyproject.exists() and Pyproject.load().has_table("tool.pixi")) - ): + if has_pixi_config(): dev_environment = __determine_pixi_dev_environment() if dev_environment is None: environment_flag = "" diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index bdf14dc1..cbd4e3e2 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -12,6 +12,7 @@ from compwa_policy.utilities import CONFIG_PATH, vscode from compwa_policy.utilities.executor import Executor +from compwa_policy.utilities.match import filter_files from compwa_policy.utilities.pyproject import ( ModifiablePyproject, Pyproject, @@ -278,3 +279,9 @@ def ___overwrite_cmd(task: Table, template_task: Table) -> bool: task["cmd"] = template_task["cmd"] return True return False + + +def has_pixi_config() -> bool: + if filter_files(["pixi.lock", "pixi.toml"]): + return True + return CONFIG_PATH.pyproject.exists() and Pyproject.load().has_table("tool.pixi") From 60ada43b5403703a37924e13272dfb77a45430e0 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:49 +0200 Subject: [PATCH 27/44] ENH: ensure that `.pixi` is listed under `.gitignore` --- src/compwa_policy/check_dev_files/pixi.py | 54 ++++++++++++++++------- src/compwa_policy/utilities/__init__.py | 1 + 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index cbd4e3e2..8da09cee 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -10,6 +10,7 @@ import yaml from tomlkit import inline_table, string +from compwa_policy.errors import PrecommitError from compwa_policy.utilities import CONFIG_PATH, vscode from compwa_policy.utilities.executor import Executor from compwa_policy.utilities.match import filter_files @@ -27,23 +28,39 @@ def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: - with Executor() as do, ModifiablePyproject.load() as pyproject: - do(_configure_setuptools_scm, pyproject) - do(_define_minimal_project, pyproject) - if is_python_package: - do(_install_package_editable, pyproject) - do(_import_conda_environment, pyproject) - do(_import_tox_tasks, pyproject) - do(_define_combined_ci_job, pyproject) - do(_set_dev_python_version, pyproject, dev_python_version) - do(_update_dev_environment, pyproject) - do(_clean_up_task_env, pyproject) - do(_update_docnb_and_doclive, pyproject, "tool.pixi.tasks") - do(_update_docnb_and_doclive, pyproject, "tool.pixi.feature.dev.tasks") - do( - vscode.update_settings, - {"files.associations": {"**/pixi.lock": "yaml"}}, - ) + with Executor() as do: + with ModifiablePyproject.load() as pyproject: + do(_configure_setuptools_scm, pyproject) + do(_define_minimal_project, pyproject) + if is_python_package: + do(_install_package_editable, pyproject) + do(_import_conda_environment, pyproject) + do(_import_tox_tasks, pyproject) + do(_define_combined_ci_job, pyproject) + do(_set_dev_python_version, pyproject, dev_python_version) + do(_update_dev_environment, pyproject) + do(_clean_up_task_env, pyproject) + do(_update_docnb_and_doclive, pyproject, "tool.pixi.tasks") + do(_update_docnb_and_doclive, pyproject, "tool.pixi.feature.dev.tasks") + do( + vscode.update_settings, + {"files.associations": {"**/pixi.lock": "yaml"}}, + ) + do(_check_gitignore) + + +def _check_gitignore() -> None: + if not has_pixi_config(): + return + ignore_path = ".pixi/" + msg = f"Please list {ignore_path} under {CONFIG_PATH.gitignore}" + if not CONFIG_PATH.gitignore.exists(): + raise PrecommitError(msg) + with CONFIG_PATH.gitignore.open() as stream: + lines = stream.readlines() + paths = {line.strip() for line in lines} + if ignore_path not in paths: + raise PrecommitError(msg) def _configure_setuptools_scm(pyproject: ModifiablePyproject) -> None: @@ -123,7 +140,10 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: if section.startswith("testenv") # cspell:ignore testenv ] imported_tasks = [] + blacklisted_jobs = {"jcache"} # cspell:ignore jcache for job_name in tox_jobs: + if job_name in blacklisted_jobs: + continue task_name = job_name or "tests" pixi_table_name = f"tool.pixi.feature.dev.tasks.{task_name}" if pyproject.has_table(pixi_table_name): diff --git a/src/compwa_policy/utilities/__init__.py b/src/compwa_policy/utilities/__init__.py index 6d199336..efc12f66 100644 --- a/src/compwa_policy/utilities/__init__.py +++ b/src/compwa_policy/utilities/__init__.py @@ -24,6 +24,7 @@ class _ConfigFilePaths(NamedTuple): editorconfig: Path = Path(".editorconfig") envrc: Path = Path(".envrc") github_workflow_dir: Path = Path(".github/workflows") + gitignore: Path = Path(".gitignore") gitpod: Path = Path(".gitpod.yml") pip_constraints: Path = Path(".constraints") pixi_lock: Path = Path("pixi.lock") From 6d25018e4cdc57788191f16ef213cd20984a9bae Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:49 +0200 Subject: [PATCH 28/44] ENH: check if pixi.lock is linguist YAML --- src/compwa_policy/check_dev_files/pixi.py | 15 +++++++++++++++ src/compwa_policy/utilities/__init__.py | 1 + 2 files changed, 16 insertions(+) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 8da09cee..dba91d8f 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -46,9 +46,24 @@ def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: vscode.update_settings, {"files.associations": {"**/pixi.lock": "yaml"}}, ) + do(_check_gitattributes) do(_check_gitignore) +def _check_gitattributes() -> None: + if not has_pixi_config(): + return + expected_line = "pixi.lock linguist-language=YAML linguist-generated=true" + msg = f"Please list {expected_line} under {CONFIG_PATH.gitattributes}" + if not CONFIG_PATH.gitattributes.exists(): + raise PrecommitError(msg) + with CONFIG_PATH.gitattributes.open() as stream: + lines = stream.readlines() + paths = {line.strip() for line in lines} + if expected_line not in paths: + raise PrecommitError(msg) + + def _check_gitignore() -> None: if not has_pixi_config(): return diff --git a/src/compwa_policy/utilities/__init__.py b/src/compwa_policy/utilities/__init__.py index efc12f66..ee93dfa4 100644 --- a/src/compwa_policy/utilities/__init__.py +++ b/src/compwa_policy/utilities/__init__.py @@ -23,6 +23,7 @@ class _ConfigFilePaths(NamedTuple): cspell: Path = Path(".cspell.json") editorconfig: Path = Path(".editorconfig") envrc: Path = Path(".envrc") + gitattributes: Path = Path(".gitattributes") github_workflow_dir: Path = Path(".github/workflows") gitignore: Path = Path(".gitignore") gitpod: Path = Path(".gitpod.yml") From 794ccfea646e44b07e2f6246e97015615aaf9c9c Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:50 +0200 Subject: [PATCH 29/44] MAINT: extract `__contains_line()` function --- src/compwa_policy/check_dev_files/pixi.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index dba91d8f..2cfce69e 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -22,6 +22,8 @@ from compwa_policy.utilities.toml import to_toml_array if TYPE_CHECKING: + from pathlib import Path + from tomlkit.items import InlineTable, String, Table from compwa_policy.utilities.pyproject.getters import PythonVersion @@ -57,10 +59,7 @@ def _check_gitattributes() -> None: msg = f"Please list {expected_line} under {CONFIG_PATH.gitattributes}" if not CONFIG_PATH.gitattributes.exists(): raise PrecommitError(msg) - with CONFIG_PATH.gitattributes.open() as stream: - lines = stream.readlines() - paths = {line.strip() for line in lines} - if expected_line not in paths: + if not __contains_line(CONFIG_PATH.gitattributes, expected_line): raise PrecommitError(msg) @@ -71,13 +70,16 @@ def _check_gitignore() -> None: msg = f"Please list {ignore_path} under {CONFIG_PATH.gitignore}" if not CONFIG_PATH.gitignore.exists(): raise PrecommitError(msg) - with CONFIG_PATH.gitignore.open() as stream: - lines = stream.readlines() - paths = {line.strip() for line in lines} - if ignore_path not in paths: + if not __contains_line(CONFIG_PATH.gitignore, ignore_path): raise PrecommitError(msg) +def __contains_line(path: Path, expected_line: str) -> bool: + with path.open() as stream: + lines = stream.readlines() + return expected_line in {line.strip() for line in lines} + + def _configure_setuptools_scm(pyproject: ModifiablePyproject) -> None: """Configure :code:`setuptools_scm` to not include git info in package version.""" if not pyproject.has_table("tool.setuptools_scm"): From 0170894a8c724d79d1d4f464afb9d5194268a87d Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:51 +0200 Subject: [PATCH 30/44] ENH: automatically update `.gitignore` and `.gitattributes` --- src/compwa_policy/check_dev_files/pixi.py | 62 ++++++++++++----------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 2cfce69e..6ff6f7ab 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -48,36 +48,8 @@ def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: vscode.update_settings, {"files.associations": {"**/pixi.lock": "yaml"}}, ) - do(_check_gitattributes) - do(_check_gitignore) - - -def _check_gitattributes() -> None: - if not has_pixi_config(): - return - expected_line = "pixi.lock linguist-language=YAML linguist-generated=true" - msg = f"Please list {expected_line} under {CONFIG_PATH.gitattributes}" - if not CONFIG_PATH.gitattributes.exists(): - raise PrecommitError(msg) - if not __contains_line(CONFIG_PATH.gitattributes, expected_line): - raise PrecommitError(msg) - - -def _check_gitignore() -> None: - if not has_pixi_config(): - return - ignore_path = ".pixi/" - msg = f"Please list {ignore_path} under {CONFIG_PATH.gitignore}" - if not CONFIG_PATH.gitignore.exists(): - raise PrecommitError(msg) - if not __contains_line(CONFIG_PATH.gitignore, ignore_path): - raise PrecommitError(msg) - - -def __contains_line(path: Path, expected_line: str) -> bool: - with path.open() as stream: - lines = stream.readlines() - return expected_line in {line.strip() for line in lines} + do(_update_gitattributes) + do(_update_gitignore) def _configure_setuptools_scm(pyproject: ModifiablePyproject) -> None: @@ -266,6 +238,36 @@ def _set_dev_python_version( pyproject.append_to_changelog(msg) +def _update_gitattributes() -> None: + if not has_pixi_config(): + return None + expected_line = "pixi.lock linguist-language=YAML linguist-generated=true" + msg = f"Added linguist definition for pixi.lock under {CONFIG_PATH.gitattributes}" + return __safe_update_file(expected_line, CONFIG_PATH.gitattributes, msg) + + +def _update_gitignore() -> None: + if not has_pixi_config(): + return None + ignore_path = ".pixi/" + msg = f"Added {ignore_path} under {CONFIG_PATH.gitignore}" + return __safe_update_file(ignore_path, CONFIG_PATH.gitignore, msg) + + +def __safe_update_file(expected_line: str, path: Path, msg: str) -> None: + if path.exists() and __contains_line(path, expected_line): + return + with path.open("a") as stream: + stream.write(expected_line + "\n") + raise PrecommitError(msg) + + +def __contains_line(path: Path, expected_line: str) -> bool: + with path.open() as stream: + lines = stream.readlines() + return expected_line in {line.strip() for line in lines} + + def _update_dev_environment(pyproject: ModifiablePyproject) -> None: if not pyproject.has_table("project.optional-dependencies"): return From 043719926b77cbb6844fcff00c89853d1191ce6d Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:52 +0200 Subject: [PATCH 31/44] MAINT: move `has_pixi_config()` check up --- src/compwa_policy/check_dev_files/pixi.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 6ff6f7ab..04df3f03 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -48,8 +48,9 @@ def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: vscode.update_settings, {"files.associations": {"**/pixi.lock": "yaml"}}, ) - do(_update_gitattributes) - do(_update_gitignore) + if has_pixi_config(): + do(_update_gitattributes) + do(_update_gitignore) def _configure_setuptools_scm(pyproject: ModifiablePyproject) -> None: @@ -239,16 +240,12 @@ def _set_dev_python_version( def _update_gitattributes() -> None: - if not has_pixi_config(): - return None expected_line = "pixi.lock linguist-language=YAML linguist-generated=true" msg = f"Added linguist definition for pixi.lock under {CONFIG_PATH.gitattributes}" return __safe_update_file(expected_line, CONFIG_PATH.gitattributes, msg) def _update_gitignore() -> None: - if not has_pixi_config(): - return None ignore_path = ".pixi/" msg = f"Added {ignore_path} under {CONFIG_PATH.gitignore}" return __safe_update_file(ignore_path, CONFIG_PATH.gitignore, msg) From 51f00fd94f39eb6cc7df0a37df4ab4590eb1df27 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:53 +0200 Subject: [PATCH 32/44] ENH: execute `direnv` check after `pixi` update --- src/compwa_policy/check_dev_files/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compwa_policy/check_dev_files/__init__.py b/src/compwa_policy/check_dev_files/__init__.py index b0d98b1f..68e1df52 100644 --- a/src/compwa_policy/check_dev_files/__init__.py +++ b/src/compwa_policy/check_dev_files/__init__.py @@ -60,7 +60,6 @@ def main(argv: Sequence[str] | None = None) -> int: do(conda.main, dev_python_version) do(cspell.main, precommit_config, args.no_cspell_update) do(dependabot.main, args.dependabot) - do(direnv.main) do(editorconfig.main, precommit_config) if not args.allow_labels: do(github_labels.main) @@ -84,6 +83,7 @@ def main(argv: Sequence[str] | None = None) -> int: do(jupyter.main, args.no_ruff) do(nbstripout.main, precommit_config, _to_list(args.allowed_cell_metadata)) do(pixi.main, is_python_repo, dev_python_version) + do(direnv.main) do(toml.main, precommit_config) # has to run before pre-commit do(prettier.main, precommit_config, args.no_prettierrc) if is_python_repo: From 18467307829fb09cb17938ad7460cb95f8f1b359 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:54 +0200 Subject: [PATCH 33/44] ENH: automatically import Conda dependencies --- src/compwa_policy/check_dev_files/pixi.py | 57 ++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 04df3f03..bf746568 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -36,6 +36,7 @@ def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: do(_define_minimal_project, pyproject) if is_python_package: do(_install_package_editable, pyproject) + do(_import_conda_dependencies, pyproject) do(_import_conda_environment, pyproject) do(_import_tox_tasks, pyproject) do(_define_combined_ci_job, pyproject) @@ -103,6 +104,58 @@ def _define_minimal_project(pyproject: ModifiablePyproject) -> None: pyproject.append_to_changelog(msg) +def _import_conda_dependencies(pyproject: ModifiablePyproject) -> None: + if not CONFIG_PATH.conda.exists(): + return + with CONFIG_PATH.conda.open() as stream: + conda = yaml.safe_load(stream) + conda_dependencies = conda.get("dependencies", []) + if not conda_dependencies: + return + blacklisted_dependencies = {"pip"} + expected_dependencies = {} + for dep in conda.get("dependencies", []): + if not isinstance(dep, str): + continue + package, version = __to_pixi_dependency(dep) + if package in blacklisted_dependencies: + continue + expected_dependencies[package] = version + dependencies = pyproject.get_table("tool.pixi.dependencies", create=True) + if not complies_with_subset(dependencies, expected_dependencies): + dependencies.update(expected_dependencies) + msg = "Imported conda dependencies into Pixi" + pyproject.append_to_changelog(msg) + + +def __to_pixi_dependency(conda_dependency: str) -> tuple[str, str]: + """Extract package name and version from a conda dependency string. + + >>> __to_pixi_dependency("julia") + ('julia', '*') + >>> __to_pixi_dependency("python==3.9.*") + ('python', '3.9.*') + >>> __to_pixi_dependency("graphviz # for binder") + ('graphviz', '*') + >>> __to_pixi_dependency("pip > 19 # needed") + ('pip', '>19') + >>> __to_pixi_dependency("compwa-policy!= 3.14") + ('compwa-policy', '!=3.14') + >>> __to_pixi_dependency("my_package~=1.2") + ('my_package', '~=1.2') + """ + matches = re.match(r"^([a-zA-Z0-9_-]+)([\!<=>~\s]*)([^ ^#]*)", conda_dependency) + if not matches: + msg = f"Could not extract package name and version from {conda_dependency}" + raise ValueError(msg) + package, operator, version = matches.groups() + if not version: + version = "*" + if operator in {"=", "=="}: + operator = "" + return package.strip(), f"{operator.strip()}{version.strip()}" + + def _import_conda_environment(pyproject: ModifiablePyproject) -> None: if not CONFIG_PATH.conda.exists(): return @@ -114,7 +167,9 @@ def _import_conda_environment(pyproject: ModifiablePyproject) -> None: activation_table = pyproject.get_table("tool.pixi.activation", create=True) pixi_variables = dict(activation_table.get("env", {})) if not complies_with_subset(pixi_variables, conda_variables): - activation_table["env"] = dict(**pixi_variables, **conda_variables) + new_env = pixi_variables + new_env.update(conda_variables) + activation_table["env"] = new_env msg = "Imported conda environment variables for Pixi" pyproject.append_to_changelog(msg) From bd93e51162040f74d31028053bbc569f3262a8ea Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:56 +0200 Subject: [PATCH 34/44] ENH: include default arguments for `posargs` --- src/compwa_policy/check_dev_files/pixi.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index bf746568..d51a4d39 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -261,7 +261,15 @@ def __load_pixi_environment_variables(pyproject: Pyproject) -> dict[str, str]: def __to_pixi_command(tox_command: str) -> String: - tox_command = re.sub(r" {posargs[^}]*}", "", tox_command) # cspell:ignore posargs + """Convert a tox command to a Pixi command. + + >>> __to_pixi_command("pytest {posargs}") + 'pytest' + >>> __to_pixi_command("pytest {posargs src tests}") + 'pytest src tests' + """ + # cspell:ignore posargs + tox_command = re.sub(r"\s*{posargs\s*([^}]*)}", r" \1", tox_command) pixi_command = dedent(tox_command).strip() if "\n" in pixi_command: pixi_command = "\n" + pixi_command + "\n" From deb6f0590bb733a2dfa9c6012443efac542dcf11 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:57 +0200 Subject: [PATCH 35/44] FIX: write `env` in task as inline table --- src/compwa_policy/check_dev_files/pixi.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index d51a4d39..d8f55c72 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -241,7 +241,8 @@ def _clean_up_task_env(pyproject: ModifiablePyproject) -> None: local_env = task_table.get("env", {}) if not local_env: continue - expected = {k: v for k, v in local_env.items() if v != global_env.get(k)} + expected = inline_table() + expected.update({k: v for k, v in local_env.items() if v != global_env.get(k)}) if local_env != expected: if expected: task_table["env"] = expected From b71da9433496e861e6e18e483c86d6f07f75fa57 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:57 +0200 Subject: [PATCH 36/44] ENH: use existing pyproject for gitignore update --- src/compwa_policy/check_dev_files/pixi.py | 43 ++++++++++++----------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index d8f55c72..9f69de3a 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -30,26 +30,25 @@ def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: - with Executor() as do: - with ModifiablePyproject.load() as pyproject: - do(_configure_setuptools_scm, pyproject) - do(_define_minimal_project, pyproject) - if is_python_package: - do(_install_package_editable, pyproject) - do(_import_conda_dependencies, pyproject) - do(_import_conda_environment, pyproject) - do(_import_tox_tasks, pyproject) - do(_define_combined_ci_job, pyproject) - do(_set_dev_python_version, pyproject, dev_python_version) - do(_update_dev_environment, pyproject) - do(_clean_up_task_env, pyproject) - do(_update_docnb_and_doclive, pyproject, "tool.pixi.tasks") - do(_update_docnb_and_doclive, pyproject, "tool.pixi.feature.dev.tasks") - do( - vscode.update_settings, - {"files.associations": {"**/pixi.lock": "yaml"}}, - ) - if has_pixi_config(): + with Executor() as do, ModifiablePyproject.load() as pyproject: + do(_configure_setuptools_scm, pyproject) + do(_define_minimal_project, pyproject) + if is_python_package: + do(_install_package_editable, pyproject) + do(_import_conda_dependencies, pyproject) + do(_import_conda_environment, pyproject) + do(_import_tox_tasks, pyproject) + do(_define_combined_ci_job, pyproject) + do(_set_dev_python_version, pyproject, dev_python_version) + do(_update_dev_environment, pyproject) + do(_clean_up_task_env, pyproject) + do(_update_docnb_and_doclive, pyproject, "tool.pixi.tasks") + do(_update_docnb_and_doclive, pyproject, "tool.pixi.feature.dev.tasks") + do( + vscode.update_settings, + {"files.associations": {"**/pixi.lock": "yaml"}}, + ) + if has_pixi_config(pyproject): do(_update_gitattributes) do(_update_gitignore) @@ -381,7 +380,9 @@ def ___overwrite_cmd(task: Table, template_task: Table) -> bool: return False -def has_pixi_config() -> bool: +def has_pixi_config(pyproject: Pyproject | None = None) -> bool: if filter_files(["pixi.lock", "pixi.toml"]): return True + if pyproject is not None: + return pyproject.has_table("tool.pixi") return CONFIG_PATH.pyproject.exists() and Pyproject.load().has_table("tool.pixi") From 0a502ecf965364cc14e945a279971fb9cd1e8262 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:58 +0200 Subject: [PATCH 37/44] FIX: allow `:` in posargs --- src/compwa_policy/check_dev_files/pixi.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 9f69de3a..f90f1b7d 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -265,11 +265,13 @@ def __to_pixi_command(tox_command: str) -> String: >>> __to_pixi_command("pytest {posargs}") 'pytest' + >>> __to_pixi_command("pytest {posargs:benchmarks}") + 'pytest benchmarks' >>> __to_pixi_command("pytest {posargs src tests}") 'pytest src tests' """ # cspell:ignore posargs - tox_command = re.sub(r"\s*{posargs\s*([^}]*)}", r" \1", tox_command) + tox_command = re.sub(r"\s*{posargs:?\s*([^}]*)}", r" \1", tox_command) pixi_command = dedent(tox_command).strip() if "\n" in pixi_command: pixi_command = "\n" + pixi_command + "\n" From a064c46fc24490ed440b90f19240033749c83ea2 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:57:59 +0200 Subject: [PATCH 38/44] ENH: run `cpsell` check at end of `check-dev-files` --- src/compwa_policy/check_dev_files/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compwa_policy/check_dev_files/__init__.py b/src/compwa_policy/check_dev_files/__init__.py index 68e1df52..7498c00d 100644 --- a/src/compwa_policy/check_dev_files/__init__.py +++ b/src/compwa_policy/check_dev_files/__init__.py @@ -58,7 +58,6 @@ def main(argv: Sequence[str] | None = None) -> int: do(citation.main, precommit_config) do(commitlint.main) do(conda.main, dev_python_version) - do(cspell.main, precommit_config, args.no_cspell_update) do(dependabot.main, args.dependabot) do(editorconfig.main, precommit_config) if not args.allow_labels: @@ -114,6 +113,7 @@ def main(argv: Sequence[str] | None = None) -> int: do(gitpod.main, args.no_gitpod, dev_python_version) do(precommit.main, precommit_config, has_notebooks) do(tox.main, has_notebooks) + do(cspell.main, precommit_config, args.no_cspell_update) return 1 if do.error_messages else 0 From 7c1f1428e30d8ce063f2a0b54c9fb778cc679e24 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:58:00 +0200 Subject: [PATCH 39/44] ENH: define `docnb` by running `doc` in `pixi --- src/compwa_policy/check_dev_files/pixi.py | 16 +++++----------- tests/check_dev_files/test_pixi.py | 2 +- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index f90f1b7d..e117b35f 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -357,27 +357,21 @@ def _update_docnb_and_doclive(pyproject: ModifiablePyproject, table_key: str) -> } updated_tasks = [] for template_task_name, target_task_names in tables_to_overwrite.items(): - template_task = tasks.get(template_task_name) - if template_task is None: - continue for task_name in target_task_names: task = tasks.get(task_name) if task is None: continue - if ___overwrite_cmd(task, template_task): + if __outsource_cmd(task, template_task_name): updated_tasks.append(task_name) if updated_tasks: msg = f"Updated `cmd` of Pixi tasks {', '.join(updated_tasks)}" pyproject.append_to_changelog(msg) -def ___overwrite_cmd(task: Table, template_task: Table) -> bool: - template_cmd = template_task.get("cmd") - if not template_cmd: - msg = f"Missing cmd for template task {template_task.name}" - raise ValueError(msg) - if task.get("cmd") != template_cmd: - task["cmd"] = template_task["cmd"] +def __outsource_cmd(task: Table, other_task_name: str) -> bool: + expected_cmd = f"pixi run {other_task_name}" + if task.get("cmd") != expected_cmd: + task["cmd"] = expected_cmd return True return False diff --git a/tests/check_dev_files/test_pixi.py b/tests/check_dev_files/test_pixi.py index 2a130015..707fc5aa 100644 --- a/tests/check_dev_files/test_pixi.py +++ b/tests/check_dev_files/test_pixi.py @@ -36,7 +36,7 @@ def test_update_docnb_and_doclive(table_key: str): cmd = "command executed by doc" [{table_key}.docnb] - cmd = "command executed by doc" + cmd = "pixi run doc" [{table_key}.docnb-test] cmd = "should not change" From a39a521573a3a466033f764c5f07f6a9ebcd2190 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:58:01 +0200 Subject: [PATCH 40/44] ENH: outsource pixi tasks to tox --- pyproject.toml | 44 ++----------- src/compwa_policy/check_dev_files/__init__.py | 8 ++- src/compwa_policy/check_dev_files/pixi.py | 61 ++++++++++++++----- 3 files changed, 59 insertions(+), 54 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b0af8772..999d9e52 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -173,53 +173,19 @@ compwa-policy = {features = [ depends_on = ["cov", "doc", "linkcheck", "sty"] [tool.pixi.feature.dev.tasks.cov] -cmd = """ -pytest \ - --cov-fail-under=35 \ - --cov-report=html \ - --cov-report=xml \ - --cov=compwa_policy -""" +cmd = "tox -e cov" [tool.pixi.feature.dev.tasks.doc] -cmd = """ -sphinx-build \ - --builder html \ - --fail-on-warning \ - --keep-going \ - --show-traceback \ - docs/ docs/_build/html -""" +cmd = "tox -e doc" [tool.pixi.feature.dev.tasks.doclive] -cmd = """ -sphinx-autobuild \ - --open-browser \ - --re-ignore '.*\\.egg-info' \ - --re-ignore '.*/__pycache__/.*' \ - --re-ignore 'docs/_build/.*' \ - --re-ignore 'docs/api/.*' \ - --watch docs \ - --watch src \ - docs/ docs/_build/html -""" +cmd = "tox -e doclive" [tool.pixi.feature.dev.tasks.linkcheck] -cmd = """ -sphinx-build \ - --builder linkcheck \ - --show-traceback \ - docs/ docs/_build/linkcheck -""" +cmd = "tox -e linkcheck" [tool.pixi.feature.dev.tasks.pydeps] -cmd = """ -pydeps compwa_policy \ - -o module_structure.svg \ - --exclude '*._*' \ - --max-bacon=1 \ - --noshow -""" +cmd = "tox -e pydeps" [tool.pixi.feature.dev.tasks.sty] cmd = "pre-commit run --all-files" diff --git a/src/compwa_policy/check_dev_files/__init__.py b/src/compwa_policy/check_dev_files/__init__.py index 7498c00d..b61b2534 100644 --- a/src/compwa_policy/check_dev_files/__init__.py +++ b/src/compwa_policy/check_dev_files/__init__.py @@ -81,7 +81,7 @@ def main(argv: Sequence[str] | None = None) -> int: if has_notebooks: do(jupyter.main, args.no_ruff) do(nbstripout.main, precommit_config, _to_list(args.allowed_cell_metadata)) - do(pixi.main, is_python_repo, dev_python_version) + do(pixi.main, is_python_repo, dev_python_version, args.outsource_pixi_to_tox) do(direnv.main) do(toml.main, precommit_config) # has to run before pre-commit do(prettier.main, precommit_config, args.no_prettierrc) @@ -180,6 +180,12 @@ def _create_argparse() -> ArgumentParser: action="store_true", default=False, ) + parser.add_argument( + "--outsource-pixi-to-tox", + action="store_false", + default=True, + help="Run ", + ) parser.add_argument( "--no-cspell-update", action="store_true", diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index e117b35f..446fd3c6 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -3,7 +3,6 @@ from __future__ import annotations import re -from configparser import ConfigParser from textwrap import dedent from typing import TYPE_CHECKING @@ -12,6 +11,7 @@ from compwa_policy.errors import PrecommitError from compwa_policy.utilities import CONFIG_PATH, vscode +from compwa_policy.utilities.cfg import open_config from compwa_policy.utilities.executor import Executor from compwa_policy.utilities.match import filter_files from compwa_policy.utilities.pyproject import ( @@ -22,6 +22,7 @@ from compwa_policy.utilities.toml import to_toml_array if TYPE_CHECKING: + from configparser import ConfigParser from pathlib import Path from tomlkit.items import InlineTable, String, Table @@ -29,7 +30,11 @@ from compwa_policy.utilities.pyproject.getters import PythonVersion -def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: +def main( + is_python_package: bool, + dev_python_version: PythonVersion, + outsource_pixi_to_tox: bool, +) -> None: with Executor() as do, ModifiablePyproject.load() as pyproject: do(_configure_setuptools_scm, pyproject) do(_define_minimal_project, pyproject) @@ -48,6 +53,8 @@ def main(is_python_package: bool, dev_python_version: PythonVersion) -> None: vscode.update_settings, {"files.associations": {"**/pixi.lock": "yaml"}}, ) + if outsource_pixi_to_tox: + do(_outsource_pixi_tasks_to_tox, pyproject) if has_pixi_config(pyproject): do(_update_gitattributes) do(_update_gitignore) @@ -176,16 +183,11 @@ def _import_conda_environment(pyproject: ModifiablePyproject) -> None: def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: if not CONFIG_PATH.tox.exists(): return - cfg = ConfigParser() - cfg.read(CONFIG_PATH.tox) - tox_jobs = [ - section[8:] - for section in cfg.sections() - if section.startswith("testenv") # cspell:ignore testenv - ] + tox = open_config(CONFIG_PATH.tox) + tox_jobs = __get_tox_job_names(tox) imported_tasks = [] blacklisted_jobs = {"jcache"} # cspell:ignore jcache - for job_name in tox_jobs: + for job_name, task_name in tox_jobs.items(): if job_name in blacklisted_jobs: continue task_name = job_name or "tests" @@ -193,13 +195,13 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: if pyproject.has_table(pixi_table_name): continue section = f"testenv:{job_name}" if job_name else "testenv" - if not cfg.has_option(section, "commands"): + if not tox.has_option(section, "commands"): continue - command = cfg.get(section, option="commands", raw=True) + command = tox.get(section, option="commands", raw=True) pixi_table = pyproject.get_table(pixi_table_name, create=True) pixi_table["cmd"] = __to_pixi_command(command) - if cfg.has_option(section, "setenv"): # cspell:ignore setenv - job_environment = cfg.get(section, option="setenv", raw=True) + if tox.has_option(section, "setenv"): # cspell:ignore setenv + job_environment = tox.get(section, option="setenv", raw=True) environment_variables = __convert_tox_environment_variables( job_environment, blacklisted_keys={"FORCE_COLOR"}, @@ -212,6 +214,15 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: pyproject.append_to_changelog(msg) +def __get_tox_job_names(cfg: ConfigParser) -> dict[str, str]: + tox_jobs = [ + section[8:] + for section in cfg.sections() + if section.startswith("testenv") # cspell:ignore testenv + ] + return {job: job or "tests" for job in tox_jobs if job} + + def __convert_tox_environment_variables( tox_env: str, blacklisted_keys: set[str] ) -> InlineTable: @@ -293,6 +304,28 @@ def _install_package_editable(pyproject: ModifiablePyproject) -> None: pyproject.append_to_changelog(msg) +def _outsource_pixi_tasks_to_tox(pyproject: ModifiablePyproject) -> None: + if not CONFIG_PATH.tox.exists(): + return + tox = open_config(CONFIG_PATH.tox) + blacklisted_jobs = {"sty"} + updated_tasks = [] + for tox_job, pixi_task in __get_tox_job_names(tox).items(): + if pixi_task in blacklisted_jobs: + continue + if not pyproject.has_table(f"tool.pixi.feature.dev.tasks.{pixi_task}"): + continue + task = pyproject.get_table(f"tool.pixi.feature.dev.tasks.{pixi_task}") + expected_cmd = f"tox -e {tox_job}" + if task.get("cmd") != expected_cmd: + task["cmd"] = expected_cmd + task.pop("env", None) + updated_tasks.append(pixi_task) + if updated_tasks: + msg = f"Outsourced Pixi tasks to tox: {', '.join(updated_tasks)}" + pyproject.append_to_changelog(msg) + + def _set_dev_python_version( pyproject: ModifiablePyproject, dev_python_version: PythonVersion ) -> None: From 78665854226e0d63150a2fc4fad187ae02a2e70c Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:58:02 +0200 Subject: [PATCH 41/44] BEHAVIOR: remove blacklisted environment copy variables --- src/compwa_policy/check_dev_files/pixi.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 446fd3c6..ac2a0cf0 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -202,10 +202,7 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: pixi_table["cmd"] = __to_pixi_command(command) if tox.has_option(section, "setenv"): # cspell:ignore setenv job_environment = tox.get(section, option="setenv", raw=True) - environment_variables = __convert_tox_environment_variables( - job_environment, - blacklisted_keys={"FORCE_COLOR"}, - ) + environment_variables = __convert_tox_environment_variables(job_environment) if environment_variables: pixi_table["env"] = environment_variables imported_tasks.append(task_name) @@ -223,9 +220,7 @@ def __get_tox_job_names(cfg: ConfigParser) -> dict[str, str]: return {job: job or "tests" for job in tox_jobs if job} -def __convert_tox_environment_variables( - tox_env: str, blacklisted_keys: set[str] -) -> InlineTable: +def __convert_tox_environment_variables(tox_env: str) -> InlineTable: lines = tox_env.splitlines() lines = [s.strip() for s in lines] lines = [s for s in lines if s] @@ -235,8 +230,6 @@ def __convert_tox_environment_variables( key = key.strip() if not key: continue - if key in blacklisted_keys: - continue environment_variables[key] = string(value.strip()) return environment_variables From f0685589aa2ab3da7beff56c27cf65360aa8224b Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:58:02 +0200 Subject: [PATCH 42/44] BEHAVIOR: do not outsource pixi tasks to tox by default --- src/compwa_policy/check_dev_files/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compwa_policy/check_dev_files/__init__.py b/src/compwa_policy/check_dev_files/__init__.py index b61b2534..8ec7b887 100644 --- a/src/compwa_policy/check_dev_files/__init__.py +++ b/src/compwa_policy/check_dev_files/__init__.py @@ -182,8 +182,8 @@ def _create_argparse() -> ArgumentParser: ) parser.add_argument( "--outsource-pixi-to-tox", - action="store_false", - default=True, + action="store_true", + default=False, help="Run ", ) parser.add_argument( From ca3bd4f154f97f25e1f28c4ca81d96262a38ba50 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:58:03 +0200 Subject: [PATCH 43/44] FIX: import main `testenv` job from `tox.ini` --- src/compwa_policy/check_dev_files/pixi.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index ac2a0cf0..99c7e7f9 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -190,7 +190,6 @@ def _import_tox_tasks(pyproject: ModifiablePyproject) -> None: for job_name, task_name in tox_jobs.items(): if job_name in blacklisted_jobs: continue - task_name = job_name or "tests" pixi_table_name = f"tool.pixi.feature.dev.tasks.{task_name}" if pyproject.has_table(pixi_table_name): continue @@ -217,7 +216,7 @@ def __get_tox_job_names(cfg: ConfigParser) -> dict[str, str]: for section in cfg.sections() if section.startswith("testenv") # cspell:ignore testenv ] - return {job: job or "tests" for job in tox_jobs if job} + return {job: job or "tests" for job in tox_jobs} def __convert_tox_environment_variables(tox_env: str) -> InlineTable: From 8df69904ba4b69735d7571f247cd069bdbb96890 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 12 Aug 2024 09:58:04 +0200 Subject: [PATCH 44/44] BEHAVIOR: define only one `default` pixi environment --- .envrc | 2 +- pyproject.toml | 4 ++-- src/compwa_policy/check_dev_files/pixi.py | 12 ++++-------- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/.envrc b/.envrc index 05db1f57..e1d415a5 100644 --- a/.envrc +++ b/.envrc @@ -4,7 +4,7 @@ elif [ -e venv ]; then source venv/bin/activate elif [ -e .pixi ]; then watch_file pixi.lock - eval "$(pixi shell-hook --environment compwa-policy)" + eval "$(pixi shell-hook)" else layout anaconda fi diff --git a/pyproject.toml b/pyproject.toml index 999d9e52..11457715 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -161,13 +161,13 @@ env = {PRETTIER_LEGACY_CLI = "1"} python = "3.9.*" [tool.pixi.environments] -compwa-policy = {features = [ +default = {features = [ "dev", "doc", "sty", "test", "types", -], solve-group = "default"} +]} [tool.pixi.feature.dev.tasks.ci] depends_on = ["cov", "doc", "linkcheck", "sty"] diff --git a/src/compwa_policy/check_dev_files/pixi.py b/src/compwa_policy/check_dev_files/pixi.py index 99c7e7f9..0df36bd8 100644 --- a/src/compwa_policy/check_dev_files/pixi.py +++ b/src/compwa_policy/check_dev_files/pixi.py @@ -358,16 +358,12 @@ def __contains_line(path: Path, expected_line: str) -> bool: def _update_dev_environment(pyproject: ModifiablePyproject) -> None: if not pyproject.has_table("project.optional-dependencies"): return - optional_dependencies = sorted(pyproject.get_table("project.optional-dependencies")) + optional_dependencies = pyproject.get_table("project.optional-dependencies") expected = inline_table() - expected.update({ - "features": to_toml_array(optional_dependencies), - "solve-group": "default", - }) + expected["features"] = to_toml_array(sorted(optional_dependencies)) environments = pyproject.get_table("tool.pixi.environments", create=True) - package_name = pyproject.get_package_name(raise_on_missing=True) - if environments.get(package_name) != expected: - environments[package_name] = expected + if environments.get("default") != expected: + environments["default"] = expected msg = "Updated Pixi developer environment" pyproject.append_to_changelog(msg)