diff --git a/.gitignore b/.gitignore index 0292b483070c732cdf5d978d50f2c5fb7d22c6be..eb85b01c9a9584092ccfbc64d33b461b79825c19 100644 --- a/.gitignore +++ b/.gitignore @@ -7,21 +7,21 @@ *.pyc *.egg-info .nfs* -.coverage +.coverage* *.DS_Store .envrc coverage.xml test_results.xml junit-coverage.xml -environment.yaml html/ build/ doc/api/ dist/ cache/ -venv/ +.venv/ _citools/ _work/ .mypy_cache/ .pytest_cache/ +changelog.md .pixi/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 33ba40b6553c65c38298a4cdb2d22005bc7ea7fa..e83d3a931f91d5124d7c9f123161c437607cb039 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,4 +4,4 @@ include: - project: software/dev-profile - file: /gitlab/python.yml + file: /gitlab/pixi.yml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3cc867fac796880e62b14b1e365ee43ed542920e..d760e8d333cd079bbb42e8c1a59111d8b4c9576f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,13 +24,18 @@ repos: - id: check-added-large-files - id: check-toml - id: check-yaml - exclude: conda/meta.yaml + - id: check-json - id: debug-statements - id: check-case-conflict - id: trailing-whitespace - id: end-of-file-fixer - id: debug-statements - repo: https://github.com/fsfe/reuse-tool - rev: v3.0.1 + rev: v3.0.2 hooks: - id: reuse + exclude: | + (?x)( + ^.pixi/| + ^.pixi.lock| + ) diff --git a/conda/meta.yaml b/conda/meta.yaml deleted file mode 100644 index 7921d8cb4122385137d9a46ac632b8ccb2db1263..0000000000000000000000000000000000000000 --- a/conda/meta.yaml +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright © 2022 Idiap Research Institute <contact@idiap.ch> -# -# SPDX-License-Identifier: BSD-3-Clause - -{% set data = load_file_data(RECIPE_DIR + '/../pyproject.toml') %} - -package: - name: {{ data['project']['name'] }} - version: {{ environ.get('PACKAGE_VERSION', environ.get('GIT_DESCRIBE_TAG')) }} - -source: - path: .. - -build: - noarch: python - number: {{ environ.get('NEXT_BUILD_NUMBER', 0) }} - run_exports: - - {{ pin_subpackage(data['project']['name']) }} - script: - - "{{ PYTHON }} -m pip install {{ SRC_DIR }} -vv" - -requirements: - host: - - python >=3.10 - - pip - - hatchling - - versioningit - run: - - python >=3.10 - - pip - # conda/mamba ecosystem dependencies - - conda - - conda-build - - mamba - - boa - # things we depend on - - click >=8 - - tomli - - tomlkit - - cookiecutter - - packaging - - pyyaml - - gitpython - - python-gitlab - - python-dateutil - - pytz - - xdg - -test: - source_files: - - tests - imports: - - {{ data['project']['name'].replace('-','_') }} - commands: - - pytest -sv tests - requires: - - pytest {{ pytest }} - - git - -about: - home: {{ data['project']['urls']['homepage'] }} - summary: {{ data['project']['description'] }} - license: {{ data['project']['license'] }} - license_family: BSD diff --git a/doc/api.rst b/doc/api.rst index dd98683e92d124c94d09cde2f29f0f80ed78a5e5..003abb183c022c27e1d03c69964f02c3ce27ea86 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -17,11 +17,8 @@ This section includes information for using the Python API of idiap_devtools idiap_devtools.click - idiap_devtools.conda idiap_devtools.logging - idiap_devtools.profile idiap_devtools.python - idiap_devtools.update_pins idiap_devtools.utils .. autosummary:: diff --git a/doc/develop.rst b/doc/develop.rst deleted file mode 100644 index 845e773a2d4ac0914e092a1fd87b676d82d45802..0000000000000000000000000000000000000000 --- a/doc/develop.rst +++ /dev/null @@ -1,203 +0,0 @@ -.. Copyright © 2022 Idiap Research Institute <contact@idiap.ch> -.. -.. SPDX-License-Identifier: BSD-3-Clause - -.. _idiap-devtools.develop: - -=============================== - Local development of packages -=============================== - -We recommend you create isolated virtual environments using mamba_ (conda_) to -develop existing or new projects, then pip_ install development requirements -over that mamba_ environment. We offer guidance of two variants for installing -dependencies: one exclusively using Python packages, and a second which -installs most dependencies as conda_ packages (being able to better handle -non-Python dependencies such as Nvidia CUDA-compiled packages). In both cases, -the top-level package (or packages) is (are) always installed on the -development environment through pip_ (with `the --editable option <pip-e_>`_). - -.. note:: - - Pip_ may be configured with command-line options as shown below, but equally - through environment variables, or `configuration files <pip-config_>`_. We - leave to the developer's discretion the decision on how to best manage their - own use of pip_. - - -.. note:: - - You may develop software against different development (c.f. - :ref:`idiap-devtools.install.setup.profile`). In the context of these - instructions, we assume your development profile is located at - ``../profile``. - -.. tab:: pip - - In this variant, the latest (beta) versions of internally developed - dependencies are fetched from our local package registry if applicable. - Furthermore, external dependencies are fetched from PyPI and respect - versions used on the continuous integration (CI) server. It is useful to - reproduce bugs reported on the CI, during test builds: - - .. code:: sh - - $ git clone <PACKAGE-URL> # e.g. git clone git@gitlab.idiap.ch/software/clapp - $ cd <PACKAGE> # e.g. cd clapp - $ mamba create -n dev python=3.10 pip - $ conda activate dev - (dev) $ pip install --pre --index-url https://token:<YOUR-GITLAB-TOKEN>@gitlab.idiap.ch/api/v4/groups/software/-/packages/pypi/simple --extra-index-url https://pypi.org/simple --constraint ../profile/python/pip-constraints.txt --editable '.[qa,doc,test]' - (dev) $ # `dev` environment is now ready, just develop - - .. note:: - - If you need to install *private* packages developed through GitLab, you - must `generate a personal token <gitlab-token_>`_ with at least access to - the package registry (currently implemented through the ``read_api`` - privilege). - - Otherwise, you may suppress ``token:<YOUR-GITLAB-TOKEN>@`` from the - index-url option above. - - .. tip:: - - Optionally, you may create a standard Python virtual environment (instead of - a conda_ virtual environment) with either venv_ or virtualenv_, and then - apply the same instructions above to locally install dependencies and the - package itself. - - The Python version in this case will match that used to create the virtual - environment. - - -.. tab:: conda - - In this variant, the latest (beta) versions of internally developed - dependencies are fetched from our local conda (beta) package registry, if - applicable. Furthermore, external dependencies are fetched from conda-forge_ - and respect versions used on the continuous integration (CI) server. It is - useful to reproduce bugs reported on the CI, during conda-package test - builds, or to install further non-Python dependencies required for package - development (e.g. Nvidia CUDA-enabled packages): - - .. code:: sh - - $ git clone <PACKAGE> - $ cd <PACKAGE> - $ mamba run -n idiap-devtools --live-stream devtool env -vv . - $ mamba env create -n dev -f environment.yaml - $ conda activate dev - (dev) $ pip install --no-build-isolation --no-dependencies --editable . - (dev) $ # `dev` environment is now ready, just develop - - .. note:: - - The application ``devtool env`` uses the ``conda`` API to parse your - package's recipe (typically at ``conda/meta.yaml``) and - ``pyproject.toml``, and then to search dependencies (including those for - quality-assurance, documentation and tests, which may be not listed on - ``conda/meta.yaml``). The installation respects CI constraints - established on your chosen profile. - - -After that step, your package will be installed and ready for use inside the -``dev`` environment. You must activate the virtual environment everytime you -want to further develop the package, or simply deactivate it when you branch -off to another activity. - -With the development environment active, you can optionally test the package -installation by either building its Sphinx documentation, doctests, running its -test suite, or the quality assurance (pre-commit) checks: - -.. code:: sh - - $ conda activate dev - (dev) $ pre-commit run --all-files # quality assurance - (dev) $ pytest -sv tests/ # test units - (dev) $ sphinx-build doc sphinx # documentation - (dev) $ sphinx-build doctest doc sphinx # doctests - - -Developing multiple existing packages simultaneously ----------------------------------------------------- - -It may happen that you may want to develop several packages against each other -for your project. This is the case if you are changing a high-level package -``package-a``, that in turn depends on functionality on ``package-b`` you may -also need to adapt. While you change ``package-b``, you want to verify how -these changes work on ``package-a``. The procedure to accomodate this is -similar to the above, except you will git-clone and pip-install more packages: - - -.. tab:: pip - - In this variant, the latest (beta) versions of internally developed - dependencies are fetched from our local package registry if applicable. - Furthermore, external dependencies are fetched from PyPI and respect - versions used on the continuous integration (CI) server. - - To setup your environment, you must install packages in reverse dependence - order, with the top-level package (``package-a`` in this example), being - installed **by last**. - - .. code:: sh - - $ git clone <PACKAGE-A> - $ cd <PACKAGE-A> - $ git clone <PACKAGE-B> src/<PACKAGE-B> - $ mamba create -n dev python=3.10 pip - # get the constraints for the "target" development environment. - # this is just an example: - $ curl -O constraints.txt https://gitlab.idiap.ch/software/dev-profile/-/raw/main/python/pip-constraints.txt - $ conda activate dev - (dev) $ for pkg in "src/package-b" "."; do pip install --pre --index-url https://token:<YOUR-GITLAB-TOKEN>@gitlab.idiap.ch/api/v4/groups/software/-/packages/pypi/simple --extra-index-url https://pypi.org/simple --constraint constraints.txt --editable "${pkg}[qa,doc,test]"; done - (dev) $ # `dev` environment is now ready, just develop - - -.. tab:: conda - - In this variant, the latest (beta) versions of internally developed - dependencies are fetched from our local conda (beta) package registry, if - applicable. Furthermore, external dependencies are fetched from conda-forge_ - and respect versions used on the continuous integration (CI) server. It is - useful to reproduce bugs reported on the CI, during conda-package test - builds: - - .. code:: sh - - $ git clone <PACKAGE-A> - $ cd <PACKAGE-A> - $ git clone <PACKAGE-B> src/<PACKAGE-B> - $ mamba run -n idiap-devtools --live-stream devtool env -vv src/package-b . - $ mamba env create -n dev -f environment.yaml - $ conda activate dev - (dev) $ for pkg in "src/package-b" "."; do pip install --no-build-isolation --no-dependencies --editable "${pkg}" - (dev) $ # `dev` environment is now ready, just develop - - -Installing all constrained packages ------------------------------------ - -If you plan to develop many packages together, it may be faster to first -pre-install all (constrained) packages, to then pip-install all the individual -packages. Because the mamba_ (or conda_) ecosystem is a superset of Python -packages, we only provide this option: - - -.. code:: sh - - $ mamba run -n idiap-devtools --live-stream devtool fullenv -vv - $ mamba env create -n dev -f environment.yaml - $ conda activate dev - (dev) $ for pkg in "src/*"; do pip install --no-build-isolation --no-dependencies --editable "${pkg}" - - -Creating new packages ---------------------- - -To create a new package, use our `cookiecutter template -<cookiecutter-template_>`_ and associated instructions. Do **not** copy -another package source code, or no Xmas gifts for you... - - -.. include:: links.rst diff --git a/doc/index.rst b/doc/index.rst index 2d241b45e87f541d0751646f5ecdd2be22b80702..0ffc07f4a8e7495c103352c94e07e5c0b794ebf4 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -11,7 +11,8 @@ .. todolist:: This package contains a set of small utilities to support development of Python -packages through GitLab. It is targetted for package development at Idiap. +packages through GitLab. It is targetted for package development at Idiap, +however some of the commands provided can benefit a larger audience. Documentation @@ -21,7 +22,6 @@ Documentation :maxdepth: 2 install - develop release cli api diff --git a/doc/install.rst b/doc/install.rst index 3c9122c6a77d2956d3dde070cd9e9b6378f6a7ae..e6317dfc77dd72c1e58f4c793f8f3a1fd6955f44 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -8,42 +8,45 @@ Installation ============== -First install mamba_ or conda (preferably via mambaforge_, as it is already -setup to use conda-forge_ as its main distribution channel). Then, create a -new environment, containing this package: +Installation may follow one of two paths: deployment or development. Choose the +relevant tab for details on each of those installation paths. -.. tab:: mamba/conda (RECOMMENDED) +.. tab:: Deployment (pixi) - .. code-block:: sh + Use pixi_ to add this package as a dependence: - # installs the latest release on conda-forge: - mamba create -n idiap-devtools idiap-devtools + .. code:: sh - # OR, installs the latest development code: - mamba create -n idiap-devtools -c https://www.idiap.ch/software/biosignal/conda/label/beta idiap-devtools + pixi add idiap-devtools -.. tab:: pip +.. tab:: Development - .. warning:: + Checkout the repository, and then use pixi_ to setup a full development + environment: - While this is possible for testing purposes, it is **not recommended**, - as this package depends on conda/mamba for some of its functionality. If - you decide to do so, create a new conda/mamba environment, and - pip-install this package on it. + .. code:: sh - .. code-block:: sh + git clone git@gitlab.idiap.ch:software/idiap-devtools + pixi install --frozen - # creates the new environment - mamba create -n idiap-devtools python=3 pip conda mamba conda-build boa - conda activate idiap-devtools + .. tip:: - # installs the latest release on PyPI: - pip install idiap-devtools + The ``--frozen`` flag will ensure that the latest lock-file available + with sources is used. If you'd like to update the lock-file to the + latest set of compatible dependencies, remove that option. - # OR, installs the latest development code: - pip install git+https://gitlab.idiap.ch/software/idiap-devtools + If you use `direnv to setup your pixi environment + <https://pixi.sh/latest/features/environment/#using-pixi-with-direnv>`_ + when you enter the directory containing this package, you can use a + ``.envrc`` file similar to this: + + .. code:: sh + + watch_file pixi.lock + export PIXI_FROZEN="true" + eval "$(pixi shell-hook)" .. _idiap-devtools.install.running: @@ -53,35 +56,11 @@ Running This package contains a single command-line executable named ``devtool``, which in turn contains subcommands with various actions. To run the main -command-line tool, you must first activate the environment where it is -installed in, and then call it on the command-line: - -.. code-block:: sh - - conda activate idiap-devtools - devtool --help - conda deactivate # to go back to the previous state - - -It is possible to use the command ``mamba run`` (or ``conda run``, if you -installed miniforge) to, instead, automatically prefix the execution of -``devtool`` with an environment activation, and follow it with a deactivation. -This allows to compact the above form into a "one-liner": +command-line tool, use ``pixi run``: .. code-block:: sh - mamba run -n idiap-devtools --live-stream devtool --help - - -.. warning:: - - The ``devtool`` application requires that ``mamba``/``conda`` are available - on the environment it executes. When using ``mamba``/``conda`` to create - new environments, ensure you are using the mamba executable **from the - ``base`` environment**. Creating new environments as sub-environments of - the ``idiap-devtools`` environment may have surprising effects. A way to do - this is to first activate the ``base`` environment, and then create the new - environment. + pixi run devtool --help .. _idiap-devtools.install.setup: @@ -89,52 +68,6 @@ This allows to compact the above form into a "one-liner": Setup ----- -.. _idiap-devtools.install.setup.profile: - -Setting up Development Profiles -=============================== - -Development profiles contain a set of constants that are useful for developing, -and interacting with projects from a particular GitLab group, or groups. They -may contain webserver addresses, and both Python and conda installation -constraints (package pinnings). Development profiles are GitLab repositories, -organized in a specific way, and potentially used by various development, -continuous integration, and administrative tools. Some examples: - -* Software's group: https://gitlab.idiap.ch/software/dev-profile -* Biosignal's group: https://gitlab.idiap.ch/biosignal/software/dev-profile -* Bob's group: https://gitlab.idiap.ch/bob/dev-profile - -While developing using the command-line utility ``devtool``, one or more -commands may require you pass the base directory of a development profile. - -You may set a number of development shortcuts by configuring the section -``[profiles]`` on the file ``~/.config/idiap-devtools.toml``, like so: - -.. code-block:: toml - - [profiles] - default = "software" - software = "~/dev-profiles/software" - biosignal = "~/dev-profiles/biosignal" - bob = "~/dev-profiles/bob" - custom = "~/dev-profiles/custom-profile" - -.. note:: - - The location of the configuration file respects ``${XDG_CONFIG_HOME}``, - which defaults to ``~/.config`` in typical UNIX-style operating systems. - -The special ``default`` entry refers to one of the other entries in this -section, and determines the default profile to use, if none is passed on the -command-line. All other entries match name to a local directory where the -profile is available. - -Development profiles are typically shared via GitLab as independent -repositories. In this case, **it is your job to clone and ensure the profile -is kept up-to-date with your group's development requirements.** - - .. _idiap-devtools.install.setup.gitlab: Automated GitLab interaction diff --git a/doc/links.rst b/doc/links.rst index 09bee18e897fc6978082a039b786c68a39c78d36..f9720d365b7dd95b2e29acf420b8bcb93609f48c 100644 --- a/doc/links.rst +++ b/doc/links.rst @@ -5,19 +5,14 @@ .. place re-used URLs here, then include this file .. on your other RST sources. -.. _conda: https://conda.io .. _idiap: http://www.idiap.ch .. _python: http://www.python.org -.. _mamba: https://mamba.readthedocs.io/en/latest/index.html -.. _mambaforge: https://github.com/conda-forge/miniforge#mambaforge -.. _conda-forge: https://conda-forge.org +.. _pip: https://pip.pypa.io/en/stable/ +.. _uv: https://github.com/astral-sh/uv +.. _rye: https://github.com/astral-sh/rye +.. _poetry: https://python-poetry.org +.. _pixi: https://pixi.sh .. _venv: https://docs.python.org/3/library/venv.html .. _virtualenv: https://virtualenv.pypa.io/en/latest/ .. _gitlab-token: https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html -.. _cookiecutter: https://cookiecutter.readthedocs.io -.. _cookiecutter-template: https://gitlab.idiap.ch/software/cookiecutter-idiap-pypackage .. _semantic version numbers: https://semver.org - -.. _pip: https://pip.pypa.io/en/stable/ -.. _pip-e: https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-e -.. _pip-config: https://pip.pypa.io/en/stable/topics/configuration/ diff --git a/doc/release.rst b/doc/release.rst index 595d0845e41ea6ff81929004ee1c7af4a76e35e7..6fa6a47f90f0ab4258f9e63e649d384d72d78eb9 100644 --- a/doc/release.rst +++ b/doc/release.rst @@ -29,9 +29,7 @@ Use the ``--help`` flag in each command to learn more about each phase. Pipelines for stable and non-stable (a.k.a. beta) packages may differ w.r.t. deployment locations for various artefacts (e.g. packages and - documentation), but also w.r.t. requirements for the version of the profile - to be used (e.g. tagged versions non-tagged). You should check the target - development profile CI instructions for details. + documentation). Create the Changelogs diff --git a/pixi.lock b/pixi.lock index c80fba294aef8001dbd587d2d7c4cafe2b9d42ba..a07d8b6fb4b5933495143bc84737c9ecc7d2dd6e 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,27 +1,224 @@ -version: 4 +version: 5 environments: + build-ci: + channels: + - url: https://conda.anaconda.org/conda-forge/ + 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/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-0.8.0-py312h98912ed_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-42.0.7-py312hbcc2302_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.24.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.2.0-pyha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.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-13.2.0-h77fa898_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.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.45.3-h2797004_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.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.2.13-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.2.0-pyhd8ed1ab_0.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/nh3-0.2.17-py312h4b3b743_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gitlab-4.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-42.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py312h7900ff3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.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/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/twine-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.1.42-h0ea3d13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/versioningit-3.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.22.0-py312hd58854c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312h9f69965_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.16.0-py312h8e38eb3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-0.8.0-py312h02f2b3b_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.24.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.2.0-pyh534df25_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-17.0.6-h5f092b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.2.17-py312h5280bc4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.3-h4a7b5fc_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gitlab-4.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-42.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/twine-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.1.42-hc069d6b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/versioningit-3.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.22.0-py312h7975427_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda 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/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/auto-intersphinx-1.0.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/binaryornot-0.4.4-py_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/boa-0.17.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/boltons-24.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/boolean.py-4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda @@ -29,129 +226,110 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-0.8.0-py312h98912ed_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-24.3.0-py312h7900ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-build-24.3.0-py312h7900ff3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-index-0.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-libmamba-solver-24.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.2.0-pyh38be061_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cookiecutter-2.6.0-pyhca7485f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.4.4-py312h98912ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.1-py312h9a8786e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-42.0.7-py312hbcc2302_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fancycompleter-0.9.1-py312h7900ff3_1007.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/furo-2024.1.29-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/furo-2024.5.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.24.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.9.24-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-2.4-py312h7900ff3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.2-h2aa1ff5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.2.0-pyha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.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-13.2.0-h807b86a_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblief-0.14.1-hac33072_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmamba-1.5.8-had39da4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmambapy-1.5.8-py312hd9e9ff6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.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/libsolv-0.7.28-hfc55251_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.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/libxml2-2.12.6-h232c23b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/license-expression-30.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-5.1.0-py312h37b5203_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h516909a_1000.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/mamba-1.5.8-py312h9460a1c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-5.2.2-py312hb90d8a5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/menuinst-2.0.2-py312h7900ff3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.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/nh3-0.2.17-py312h4b3b743_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/patch-2.7.6-h7f98852_1002.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/patchelf-0.17.2-h58526e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pdbpp-0.10.3-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.42-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.42-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py312h98912ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/py-lief-0.14.1-py312h7070661_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/pycosat-0.6.6-py312h98912ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyrepl-0.9.0-py312h98912ed_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.2-hab00c5b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-debian-0.1.36-py_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/python-gitlab-4.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-libarchive-c-5.1-py312h7900ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-slugify-8.0.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.4.post0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.4.post0-h59595ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-42.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/reuse-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ripgrep-14.1.0-he8a937b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.0-py312h4b3b743_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py312h98912ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py312h98912ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.3.5-py312h9118e91_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.4.4-py312h5715c7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py312h7900ff3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.2.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-autodoc-typehints-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-autodoc-typehints-2.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-5.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda @@ -162,174 +340,139 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_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/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.4-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/truststore-0.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240316-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/twine-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/watchgod-0.8.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.1.42-h0ea3d13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/versioningit-3.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wmctrl-0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xdg-6.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.22.0-py312hd58854c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda - pypi: . osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/auto-intersphinx-1.0.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/binaryornot-0.4.4-py_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/boa-0.17.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/boltons-24.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/boolean.py-4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312h9f69965_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.28.1-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-986-h4c9edd9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-986-hd11630f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.16.0-py312h8e38eb3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/chardet-5.2.0-py312h81bd7bf_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-0.8.0-py312h02f2b3b_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/conda-24.3.0-py312h81bd7bf_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/conda-build-24.3.0-py312h81bd7bf_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-index-0.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-libmamba-solver-24.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.2.0-pyh38be061_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cookiecutter-2.6.0-pyhca7485f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.4.4-py312he37b823_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.5.1-py312h7e5086c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/docutils-0.20.1-py312h81bd7bf_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fancycompleter-0.9.1-py312h81bd7bf_1007.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-10.2.1-h2ffa867_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/furo-2024.1.29-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/furo-2024.5.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.24.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.9.24-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-2.4-py312h81bd7bf_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.2-h92f50d5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-711-h4c6efb1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-711-h5e7191b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.7.2-hcacb583_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.7.1-h2d989ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-16.0.6-h4653b0c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20191231-hc8eb9b7_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.2.0-pyh534df25_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-17.0.6-h5f092b4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblief-0.14.1-h3f3aa29_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm18-18.1.2-h30cc82d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmamba-1.5.8-h90c426b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmambapy-1.5.8-py312h344e357_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsolv-0.7.28-h1059232_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.2-h091b4b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxslt-1.1.39-h223e5b9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/license-expression-30.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-5.1.0-py312h9bf3b9e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.9.4-hb7217d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h642e427_1000.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mamba-1.5.8-py312h14bc7db_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-5.2.2-py312h0e5ab22_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py312he37b823_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/menuinst-2.0.2-py312h81bd7bf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.2.17-py312h5280bc4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.1-h0d3ecfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/patch-2.7.6-h27ca646_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pdbpp-0.10.3-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.42-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.42-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-5.9.8-py312he37b823_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/py-lief-0.14.1-py312h2721eaf_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pycosat-0.6.6-py312h02f2b3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyrepl-0.9.0-py312he37b823_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.2-hdf0ec26_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.3-h4a7b5fc_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-debian-0.1.36-py_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/python-gitlab-4.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-libarchive-c-5.1-py312h81bd7bf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-slugify-8.0.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-4_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.1-py312h02f2b3b_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-14.2.4.post0-h93a5062_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-cpp-14.2.4.post0-h965bd2d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-42.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/reuse-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ripgrep-14.1.0-h5ef7bb8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.18.0-py312h77200ec_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml-0.18.6-py312he37b823_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.8-py312he37b823_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.3.5-py312h1ae9fbf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.4.4-py312h3402d49_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.2.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-autodoc-typehints-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-autodoc-typehints-2.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-5.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda @@ -340,268 +483,460 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1100.0.11-he4954df_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.4-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/truststore-0.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240316-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/twine-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py312h389731b_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/watchgod-0.8.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.1.42-hc069d6b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/versioningit-3.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wmctrl-0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xdg-6.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-cpp-0.8.0-h13dd4ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.22.0-py312h7975427_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda - 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 - 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 - size: 23621 - timestamp: 1650670423406 -- kind: conda - name: alabaster - version: 0.7.16 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda - sha256: fd39ad2fabec1569bbb0dfdae34ab6ce7de6ec09dcec8638f83dad0373594069 - md5: def531a3ac77b7fb8c21d17bb5d0badb - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/alabaster - size: 18365 - timestamp: 1704848898483 -- kind: conda - name: anyio - version: 3.7.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.1-pyhd8ed1ab_0.conda - sha256: 62637ac498bcf47783cbf4f48e9b09e4e2f5a6ad42f43ca8f632c353827b94f4 - md5: 7b517e7a6f0790337906c055aa97ca49 - depends: - - exceptiongroup - - idna >=2.8 - - python >=3.7 - - sniffio >=1.1 - - typing_extensions - constrains: - - trio >=0.16,<0.22 - license: MIT - license_family: MIT - purls: - - pkg:pypi/anyio - size: 96707 - timestamp: 1688651250785 -- kind: conda - name: archspec - version: 0.2.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.3-pyhd8ed1ab_0.conda - sha256: cef4062ea91f07a961a808801d6b34a163632150037f4bd28232310ff0301cd7 - md5: 192278292e20704f663b9c766909d67b - depends: - - python >=3.6 - license: MIT OR Apache-2.0 - purls: - - pkg:pypi/archspec - size: 48780 - timestamp: 1708969700251 -- kind: conda - name: arrow - version: 1.3.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda - sha256: ff49825c7f9e29e09afa6284300810e7a8640d621740efb47c4541f4dc4969db - md5: b77d8c2313158e6e461ca0efb1c2c508 - depends: - - python >=3.8 - - python-dateutil >=2.7.0 - - types-python-dateutil >=2.8.10 - license: Apache-2.0 - license_family: Apache - size: 100096 - timestamp: 1696129131844 -- kind: conda - name: attrs - version: 23.2.0 - build: pyh71513ae_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda - sha256: 77c7d03bdb243a048fff398cedc74327b7dc79169ebe3b4c8448b0331ea55fea - md5: 5e4c0743c70186509d1412e03c2d8dfa - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/attrs - size: 54582 - timestamp: 1704011393776 -- kind: conda - name: auto-intersphinx - version: 1.0.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/auto-intersphinx-1.0.3-pyhd8ed1ab_0.conda - sha256: e4267429a056d1ffe73e482b4b61fbec6426108033ea080b76f4105b8c8fba90 - md5: 82ae03558e448895c9853852e6a8c996 - depends: - - lxml - - packaging - - python >=3.9 - - requests - - sphinx - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/auto-intersphinx - size: 28581 - timestamp: 1687786070078 -- kind: conda - name: babel - version: 2.14.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - sha256: 8584e3da58e92b72641c89ff9b98c51f0d5dbe76e527867804cbdf03ac91d8e6 - md5: 9669586875baeced8fc30c0826c3270e - depends: - - python >=3.7 - - pytz - - setuptools - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/babel - size: 7609750 - timestamp: 1702422720584 -- kind: conda - name: beautifulsoup4 - version: 4.12.3 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda - sha256: 7b05b2d0669029326c623b9df7a29fa49d1982a9e7e31b2fea34b4c9a4a72317 - md5: 332493000404d8411859539a5a630865 - depends: - - python >=3.6 - - soupsieve >=1.2 - license: MIT - license_family: MIT - size: 118200 - timestamp: 1705564819537 -- kind: conda - name: binaryornot - version: 0.4.4 - build: py_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/binaryornot-0.4.4-py_1.tar.bz2 - sha256: 8f65c16a9f85285e1f704a26d4c5ced25f46544f5cc20dc8a4aebd7796f8011a - md5: a556fa60840fcb9dd739d186bfd252f7 + qa-ci: + channels: + - url: https://conda.anaconda.org/conda-forge/ + 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/noarch/binaryornot-0.4.4-py_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/boolean.py-4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.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-13.2.0-h77fa898_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.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.45.3-h2797004_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.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.2.13-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/license-expression-30.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-debian-0.1.36-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gitlab-4.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/reuse-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.4.4-py312h5715c7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + - 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/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/binaryornot-0.4.4-py_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/boolean.py-4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312h9f69965_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.16.0-py312h8e38eb3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/chardet-5.2.0-py312h81bd7bf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-17.0.6-h5f092b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/license-expression-30.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py312he37b823_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.3-h4a7b5fc_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-debian-0.1.36-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gitlab-4.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.1-py312h02f2b3b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/reuse-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.4.4-py312h3402d49_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py312h389731b_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + test-ci-alternative: + 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/brotli-python-1.1.0-py311hb755f60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.1-py311h331c9d8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.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-13.2.0-h77fa898_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.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.45.3-h2797004_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.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.2.13-hd590300_5.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.0-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gitlab-4.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + - 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/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - pypi: . + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311ha891d26_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.5.1-py311hd3f4193_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-17.0.6-h5f092b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.9-h932a869_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gitlab-4.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-4_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + - 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 + 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: - - chardet - - python + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 license: BSD-3-Clause license_family: BSD - size: 378445 - timestamp: 1531097907306 + size: 23621 + timestamp: 1650670423406 - kind: conda - name: boa - version: 0.17.0 - build: pyhd8ed1ab_2 - build_number: 2 + name: alabaster + version: 0.7.16 + build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/boa-0.17.0-pyhd8ed1ab_2.conda - sha256: 2282008dc67c6fd0ae1c1f0b9c17887219513bcf91a594eb7474cb94c71744b4 - md5: c9c96644490a45ca16c61428fede3cf2 + url: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda + sha256: fd39ad2fabec1569bbb0dfdae34ab6ce7de6ec09dcec8638f83dad0373594069 + md5: def531a3ac77b7fb8c21d17bb5d0badb + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/alabaster + size: 18365 + timestamp: 1704848898483 +- kind: conda + name: anyio + version: 4.3.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda + sha256: 86aca4a31c09f9b4dbdb332cd9a6a7dbab62ca734d3f832651c0ab59c6a7f52e + md5: ac95aa8ed65adfdde51132595c79aade + depends: + - exceptiongroup >=1.0.2 + - idna >=2.8 + - python >=3.8 + - sniffio >=1.1 + - typing_extensions >=4.1 + constrains: + - trio >=0.23 + - uvloop >=0.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/anyio + size: 102331 + timestamp: 1708355504396 +- kind: conda + name: attrs + version: 23.2.0 + build: pyh71513ae_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda + sha256: 77c7d03bdb243a048fff398cedc74327b7dc79169ebe3b4c8448b0331ea55fea + md5: 5e4c0743c70186509d1412e03c2d8dfa depends: - - beautifulsoup4 - - boltons - - conda >=23.3 - - conda-build >=3.25,<24.5 - - jinja2 - - joblib - - json5 - - jsonschema - - libmambapy >=1.5,<1.6 - - prompt_toolkit - python >=3.7 - - rich - - ruamel.yaml >=0.15.0 - - watchgod + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs + size: 54582 + timestamp: 1704011393776 +- kind: conda + name: auto-intersphinx + version: 1.0.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/auto-intersphinx-1.0.3-pyhd8ed1ab_0.conda + sha256: e4267429a056d1ffe73e482b4b61fbec6426108033ea080b76f4105b8c8fba90 + md5: 82ae03558e448895c9853852e6a8c996 + depends: + - lxml + - packaging + - python >=3.9 + - requests + - sphinx license: BSD-3-Clause license_family: BSD - size: 67972 - timestamp: 1711841904460 + purls: + - pkg:pypi/auto-intersphinx + size: 28581 + timestamp: 1687786070078 - kind: conda - name: boltons - version: 24.0.0 + name: babel + version: 2.14.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/boltons-24.0.0-pyhd8ed1ab_0.conda - sha256: e44d07932306392372411ab1261670a552f96077f925af00c1559a18a73a1bdc - md5: 61de176bd62041f9cd5bd4fcd09eb0ff + url: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda + sha256: 8584e3da58e92b72641c89ff9b98c51f0d5dbe76e527867804cbdf03ac91d8e6 + md5: 9669586875baeced8fc30c0826c3270e + depends: + - python >=3.7 + - pytz + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/babel + size: 7609750 + timestamp: 1702422720584 +- kind: conda + name: backports + version: '1.0' + build: pyhd8ed1ab_3 + build_number: 3 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda + sha256: 711602276ae39276cb0faaca6fd0ac851fff0ca17151917569174841ef830bbd + md5: 54ca2e08b3220c148a1d8329c2678e02 depends: - - python ==2.7.*|>=3.7 + - python >=2.7 license: BSD-3-Clause license_family: BSD - size: 297896 - timestamp: 1711936529147 + size: 5950 + timestamp: 1669158729416 +- kind: conda + name: backports.tarfile + version: 1.0.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda + sha256: 7ba30f32daad2e7ca251508525185ba170eedc14123572611c2acf261c7956b3 + md5: c747b1d79f136013c3b7ebcba876afa6 + depends: + - backports + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/backports-tarfile + size: 31951 + timestamp: 1712700751335 +- kind: conda + name: beautifulsoup4 + version: 4.12.3 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda + sha256: 7b05b2d0669029326c623b9df7a29fa49d1982a9e7e31b2fea34b4c9a4a72317 + md5: 332493000404d8411859539a5a630865 + depends: + - python >=3.6 + - soupsieve >=1.2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/beautifulsoup4 + size: 118200 + timestamp: 1705564819537 +- kind: conda + name: binaryornot + version: 0.4.4 + build: py_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/binaryornot-0.4.4-py_1.tar.bz2 + sha256: 8f65c16a9f85285e1f704a26d4c5ced25f46544f5cc20dc8a4aebd7796f8011a + md5: a556fa60840fcb9dd739d186bfd252f7 + depends: + - chardet + - python + license: BSD-3-Clause + license_family: BSD + size: 378445 + timestamp: 1531097907306 - kind: conda name: boolean.py version: '4.0' @@ -619,6 +954,50 @@ packages: - pkg:pypi/boolean-py size: 28706 timestamp: 1690384476510 +- kind: conda + name: brotli-python + version: 1.1.0 + build: py311ha891d26_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311ha891d26_1.conda + sha256: 2d78c79ccf2c17236c52ef217a4c34b762eb7908a6903d94439f787aac1c8f4b + md5: 5e802b015e33447d1283d599d21f052b + depends: + - libcxx >=15.0.7 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - libbrotlicommon 1.1.0 hb547adb_1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli + size: 343332 + timestamp: 1695991223439 +- kind: conda + name: brotli-python + version: 1.1.0 + build: py311hb755f60_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda + sha256: 559093679e9fdb6061b7b80ca0f9a31fe6ffc213f1dae65bc5c82e2cd1a94107 + md5: cce9e7c3f1c307f2a5fb08a2922d6164 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - libbrotlicommon 1.1.0 hd590300_1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli + size: 351340 + timestamp: 1695990160360 - kind: conda name: brotli-python version: 1.1.0 @@ -637,6 +1016,8 @@ packages: - libbrotlicommon 1.1.0 hd590300_1 license: MIT license_family: MIT + purls: + - pkg:pypi/brotli size: 350604 timestamp: 1695990206327 - kind: conda @@ -657,6 +1038,8 @@ packages: - libbrotlicommon 1.1.0 hb547adb_1 license: MIT license_family: MIT + purls: + - pkg:pypi/brotli size: 343435 timestamp: 1695990731924 - kind: conda @@ -687,32 +1070,6 @@ packages: license_family: BSD size: 254228 timestamp: 1699279927352 -- kind: conda - name: c-ares - version: 1.28.1 - build: h93a5062_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.28.1-h93a5062_0.conda - sha256: 2fc553d7a75e912efbdd6b82cd7916cc9cb2773e6cd873b77e02d631dd7be698 - md5: 04f776a6139f7eafc2f38668570eb7db - license: MIT - license_family: MIT - size: 150488 - timestamp: 1711819630164 -- kind: conda - name: c-ares - version: 1.28.1 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda - sha256: cb25063f3342149c7924b21544109696197a9d774f1407567477d4f3026bf38a - md5: dcde58ff9a1f30b0037a2315d1846d1f - depends: - - libgcc-ng >=12 - license: MIT - license_family: MIT - size: 168875 - timestamp: 1711819445938 - kind: conda name: ca-certificates version: 2024.2.2 @@ -735,44 +1092,6 @@ packages: license: ISC size: 155725 timestamp: 1706844034242 -- kind: conda - name: cctools - version: '986' - build: h4c9edd9_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-986-h4c9edd9_0.conda - sha256: bfbfc99da17828d007286f40af86b44315769cfbcc4beba62a8ae64264bd1193 - md5: abcfabe468c14e506fceab2e85380b3b - depends: - - cctools_osx-arm64 986 hd11630f_0 - - ld64 711 h4c6efb1_0 - - libllvm18 >=18.1.1,<18.2.0a0 - license: APSL-2.0 - license_family: Other - size: 21460 - timestamp: 1710484691219 -- kind: conda - name: cctools_osx-arm64 - version: '986' - build: hd11630f_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-986-hd11630f_0.conda - sha256: 4152323bbb78e2730fea9004333c9c51fb82a9ddd935f005280bf621849ec53d - md5: cce200c91b2d291c85e66098fe0d31c2 - depends: - - ld64_osx-arm64 >=711,<712.0a0 - - libcxx - - libllvm18 >=18.1.1,<18.2.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - sigtool - constrains: - - cctools 986.* - - clang 18.1.* - - ld64 711.* - license: APSL-2.0 - license_family: Other - size: 1123368 - timestamp: 1710484635601 - kind: conda name: certifi version: 2024.2.2 @@ -785,6 +1104,8 @@ packages: depends: - python >=3.7 license: ISC + purls: + - pkg:pypi/certifi size: 160559 timestamp: 1707022289175 - kind: conda @@ -803,6 +1124,8 @@ packages: - python_abi 3.12.* *_cp312 license: MIT license_family: MIT + purls: + - pkg:pypi/cffi size: 284245 timestamp: 1696002181644 - kind: conda @@ -821,6 +1144,8 @@ packages: - python_abi 3.12.* *_cp312 license: MIT license_family: MIT + purls: + - pkg:pypi/cffi size: 294523 timestamp: 1696001868949 - kind: conda @@ -886,327 +1211,138 @@ packages: url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda sha256: 20cae47d31fdd58d99c4d2e65fbdcefa0b0de0c84e455ba9d6356a4bdbc4b5b9 md5: 7f4a9e3fcff3f6356ae99244a014da6a - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/charset-normalizer - size: 46597 - timestamp: 1698833765762 -- kind: conda - name: click - version: 8.1.7 - build: unix_pyh707e725_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec - md5: f3ad426304898027fc619827ff428eca - depends: - - __unix - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/click - size: 84437 - timestamp: 1692311973840 -- kind: conda - name: colorama - version: 0.4.6 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 - md5: 3faab06a954c2a04039983f2c4a50d99 - depends: - - python >=3.7 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/colorama - size: 25170 - timestamp: 1666700778190 -- kind: conda - name: conda - version: 24.3.0 - build: py312h7900ff3_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/conda-24.3.0-py312h7900ff3_0.conda - sha256: 64eee1c0f97bed16908ab6c4f3cd6c0bebb67fda5bba580888e513a1ef22f3f9 - md5: 3b7d3f731e02380fb68b654b037ae727 - depends: - - archspec >=0.2.3 - - boltons >=23.0.0 - - charset-normalizer - - conda-libmamba-solver >=23.11.0 - - conda-package-handling >=2.2.0 - - distro >=1.5.0 - - jsonpatch >=1.32 - - menuinst >=2 - - packaging >=23.0 - - platformdirs >=3.10.0 - - pluggy >=1.0.0 - - pycosat >=0.6.3 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - requests >=2.28.0,<3 - - ruamel.yaml >=0.11.14,<0.19 - - setuptools >=60.0.0 - - tqdm >=4 - - truststore >=0.8.0 - - zstandard >=0.19.0 - constrains: - - conda-build >=24.3 - - conda-env >=2.6 - - conda-content-trust >=0.1.1 - license: BSD-3-Clause - license_family: BSD - size: 1195527 - timestamp: 1711445992988 -- kind: conda - name: conda - version: 24.3.0 - build: py312h81bd7bf_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/conda-24.3.0-py312h81bd7bf_0.conda - sha256: d8fb7f84ea5d946c5acf50d9687a1d9f112116ef6a06c0bb645320fd4e7db6e7 - md5: 537dbde4ec642c05ea421a89ae16366a - depends: - - archspec >=0.2.3 - - boltons >=23.0.0 - - charset-normalizer - - conda-libmamba-solver >=23.11.0 - - conda-package-handling >=2.2.0 - - distro >=1.5.0 - - jsonpatch >=1.32 - - menuinst >=2 - - packaging >=23.0 - - platformdirs >=3.10.0 - - pluggy >=1.0.0 - - pycosat >=0.6.3 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - requests >=2.28.0,<3 - - ruamel.yaml >=0.11.14,<0.19 - - setuptools >=60.0.0 - - tqdm >=4 - - truststore >=0.8.0 - - zstandard >=0.19.0 - constrains: - - conda-content-trust >=0.1.1 - - conda-build >=24.3 - - conda-env >=2.6 - license: BSD-3-Clause - license_family: BSD - size: 1197572 - timestamp: 1711446174975 -- kind: conda - name: conda-build - version: 24.3.0 - build: py312h7900ff3_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/conda-build-24.3.0-py312h7900ff3_1.conda - sha256: fd1418aded3d3242d2f4e5f6ee11702658c69528443d66b4a00bbd093aeeff11 - md5: bfc15ed17aaea7bf1150dba5787c16d6 - depends: - - beautifulsoup4 - - chardet - - conda >=23.5.0 - - conda-index >=0.4.0 - - conda-package-handling >=1.3 - - filelock - - jinja2 - - jsonschema >=4.19 - - menuinst >=2 - - packaging - - patch >=2.6 - - patchelf - - pkginfo - - psutil - - py-lief - - python >=3.12,<3.13.0a0 - - python-libarchive-c - - python_abi 3.12.* *_cp312 - - pytz - - pyyaml - - requests - - ripgrep - - tqdm - constrains: - - conda-verify >=3.1.0 - license: BSD-3-Clause - license_family: BSD - size: 752571 - timestamp: 1711608769290 -- kind: conda - name: conda-build - version: 24.3.0 - build: py312h81bd7bf_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/conda-build-24.3.0-py312h81bd7bf_1.conda - sha256: dc86c2edbd0f55b40ae81d5350b7ba11685675587d3a3ecae9472b682e5fdbfe - md5: 75828728b3438c9c3826c2f98fbb361f - depends: - - beautifulsoup4 - - cctools - - chardet - - conda >=23.5.0 - - conda-index >=0.4.0 - - conda-package-handling >=1.3 - - filelock - - jinja2 - - jsonschema >=4.19 - - menuinst >=2 - - packaging - - patch >=2.6 - - pkginfo - - psutil - - py-lief - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python-libarchive-c - - python_abi 3.12.* *_cp312 - - pytz - - pyyaml - - requests - - ripgrep - - tqdm - constrains: - - conda-verify >=3.1.0 - license: BSD-3-Clause - license_family: BSD - size: 751442 - timestamp: 1711608951046 -- kind: conda - name: conda-index - version: 0.4.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/conda-index-0.4.0-pyhd8ed1ab_0.conda - sha256: 4171355e42939f31cd154b84b5b98cb9fe5d9f784ead23e5b7abf05281b5bb60 - md5: 6b2a22b4716391d141136cb8d5d4bd16 - depends: - - click >=8 - - conda >=4.12.0 - - conda-package-streaming - - filelock - - jinja2 - - more-itertools + depends: - python >=3.7 - - pyyaml >=6 - license: BSD-3-Clause - license_family: BSD - size: 176354 - timestamp: 1708062210737 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer + size: 46597 + timestamp: 1698833765762 - kind: conda - name: conda-libmamba-solver - version: 24.1.0 - build: pyhd8ed1ab_0 + name: click + version: 8.1.7 + build: unix_pyh707e725_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/conda-libmamba-solver-24.1.0-pyhd8ed1ab_0.conda - sha256: 0667d49300062da2b46b04c097a9ace55c7a133d035517ec093e54a54f8f6b55 - md5: 304dc78ad6e52e0fd663df1d484c1531 + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec + md5: f3ad426304898027fc619827ff428eca depends: - - boltons >=23.0.0 - - conda >=23.7.4 - - libmambapy >=1.5.6,<2.0a0 + - __unix - python >=3.8 license: BSD-3-Clause license_family: BSD - size: 41157 - timestamp: 1706566194042 + purls: + - pkg:pypi/click + size: 84437 + timestamp: 1692311973840 - kind: conda - name: conda-package-handling - version: 2.2.0 - build: pyh38be061_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.2.0-pyh38be061_0.conda - sha256: 9a221808405d813d8c555efce6944379b907d36d79e77d526d573efa6b996d26 - md5: 8a3ae7f6318376aa08ea753367bb7dd6 + name: cmarkgfm + version: 0.8.0 + build: py312h02f2b3b_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-0.8.0-py312h02f2b3b_3.conda + sha256: 2e95c3797cd2796f32de8408626d63cb1283f2b7b0826021d2e26cc58d9231a0 + md5: ffedee35be7a5015d09e2660a66b89c9 depends: - - conda-package-streaming >=0.9.0 - - python >=3.7 - - zstandard >=0.15 - license: BSD-3-Clause - license_family: BSD - size: 255143 - timestamp: 1691048232276 + - cffi >=1.0.0 + - python >=3.12.0rc3,<3.13.0a0 + - python >=3.12.0rc3,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cmarkgfm + size: 113474 + timestamp: 1695670347968 - kind: conda - name: conda-package-streaming - version: 0.9.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.9.0-pyhd8ed1ab_0.conda - sha256: 654a2488f77bf43555787d952dbffdc5d97956ff4aa9e0414a7131bb741dcf4c - md5: 38253361efb303deead3eab39ae9269b + name: cmarkgfm + version: 0.8.0 + build: py312h98912ed_3 + build_number: 3 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-0.8.0-py312h98912ed_3.conda + sha256: 1a9e60b18664c22f872435a1d2b1d727e37ea4159736b116afff364b9577dc02 + md5: 0c9c09134b2fb151c2bd8181b2c56080 depends: - - python >=3.7 - - zstandard >=0.15 - license: BSD-3-Clause - license_family: BSD - size: 19183 - timestamp: 1691009348105 + - cffi >=1.0.0 + - libgcc-ng >=12 + - python >=3.12.0rc3,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cmarkgfm + size: 135963 + timestamp: 1695669875921 - kind: conda - name: cookiecutter - version: 2.6.0 - build: pyhca7485f_0 + name: colorama + version: 0.4.6 + build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/cookiecutter-2.6.0-pyhca7485f_0.conda - sha256: 5bed5805127757a4f03231eb7fe971cfe3c3411eeef036e670c41bfd8a42d91d - md5: d6260b53b9db90017321af0b45cc00da - depends: - - arrow - - binaryornot >=0.4.4 - - click >=7.0,<9.0.0 - - jinja2 >=2.7,<4.0.0 + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + md5: 3faab06a954c2a04039983f2c4a50d99 + depends: - python >=3.7 - - python-slugify >=4.0.0 - - pyyaml >=5.3.1 - - requests >=2.23.0 - - rich license: BSD-3-Clause license_family: BSD - size: 100813 - timestamp: 1708609086718 + purls: + - pkg:pypi/colorama + size: 25170 + timestamp: 1666700778190 - kind: conda name: coverage - version: 7.4.4 - build: py312h98912ed_0 + version: 7.5.1 + build: py311h331c9d8_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.4.4-py312h98912ed_0.conda - sha256: f160f9c89799bf6a14a023711d56cd800117c7a3ad2e117e1a2ced764b0b5206 - md5: 7002151fcfe55ded0595fc7c3f5e1209 + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.1-py311h331c9d8_0.conda + sha256: 2ecb21dc0efec42419c50f63daf1db0d6910f47db1b2653ebc5c43f76302024e + md5: 9f35e13e3b9e05e153b78f42662061f6 depends: - libgcc-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tomli license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/coverage - size: 357166 - timestamp: 1710462905888 + size: 369007 + timestamp: 1714846741185 - kind: conda name: coverage - version: 7.4.4 - build: py312he37b823_0 + version: 7.5.1 + build: py311hd3f4193_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.5.1-py311hd3f4193_0.conda + sha256: 6eaa811402fc3433bd891179410a434d0826da1f44579eccccc9dbb632769403 + md5: 81834421a20531c880f6c0a5342f3922 + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage + size: 368146 + timestamp: 1714846963260 +- kind: conda + name: coverage + version: 7.5.1 + build: py312h7e5086c_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.4.4-py312he37b823_0.conda - sha256: dbc8525782d7fd0a42a3abbedcad306281b97790f940e1eacee403ad2f97b262 - md5: 6b07da81f772158ca309d27f3deaf3f4 + url: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.5.1-py312h7e5086c_0.conda + sha256: dc3d6d36edd2587da94cd0045ccf3460cf84ce77a40f62db4a75d3653e96c8d6 + md5: 08067b92914143861a65b650dd0af4d0 depends: + - __osx >=11.0 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 @@ -1215,8 +1351,64 @@ packages: license_family: APACHE purls: - pkg:pypi/coverage - size: 354947 - timestamp: 1710463118659 + size: 359716 + timestamp: 1714846946149 +- kind: conda + name: coverage + version: 7.5.1 + build: py312h9a8786e_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.1-py312h9a8786e_0.conda + sha256: 272e507f0ea567ec4c9cf2621c27d34eec5aaa70ebea5d03d508b33b4497de17 + md5: 2d24a25dab0d00182eeed1ba9b64a12d + depends: + - libgcc-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage + size: 360545 + timestamp: 1714846745949 +- kind: conda + name: cryptography + version: 42.0.7 + build: py312hbcc2302_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/cryptography-42.0.7-py312hbcc2302_0.conda + sha256: 91fa2d4229096ecffa36e71a33f2163d1138dc1ef98a0be20ba0e5905e420a85 + md5: 7bc0e1aae21b2e82d03959931f4294f0 + depends: + - cffi >=1.12 + - libgcc-ng >=12 + - openssl >=3.3.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + purls: + - pkg:pypi/cryptography + size: 1978679 + timestamp: 1715044173081 +- kind: conda + name: dbus + version: 1.13.6 + build: h5008d03_3 + build_number: 3 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + sha256: 8f5f995699a2d9dbdd62c61385bfeeb57c82a681a7c8c5313c395aa0ccab68a5 + md5: ecfff944ba3960ecb334b9a2663d708d + depends: + - expat >=2.4.2,<3.0a0 + - libgcc-ng >=9.4.0 + - libglib >=2.70.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 618596 + timestamp: 1640112124844 - kind: conda name: distlib version: 0.3.8 @@ -1235,57 +1427,38 @@ packages: size: 274915 timestamp: 1702383349284 - kind: conda - name: distro - version: 1.9.0 + name: docutils + version: 0.21.2 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_0.conda - sha256: ae1c13d709c8001331b5b9345e4bcd77e9ae712d25f7958b2ebcbe0b068731b7 - md5: bbdb409974cd6cb30071b1d978302726 - depends: - - python >=3.6 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/distro - size: 42039 - timestamp: 1704321683916 -- kind: conda - name: docutils - version: 0.20.1 - build: py312h7900ff3_3 - build_number: 3 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3.conda - sha256: b9fb75d806afc53d9d7b98edb0c45ac38a3cc983916b8dac4ad7ddac5c18a024 - md5: 1b90835ae26b9b8250b302649359a989 + url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda + sha256: 362bfe3afaac18298c48c0c6a935641544077ce5105a42a2d8ebe750ad07c574 + md5: e8cd5d629f65bdf0f3bb312cde14659e depends: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.9 license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 purls: - pkg:pypi/docutils - size: 898253 - timestamp: 1701882735141 + size: 403226 + timestamp: 1713930478970 - kind: conda - name: docutils - version: 0.20.1 - build: py312h81bd7bf_3 - build_number: 3 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/docutils-0.20.1-py312h81bd7bf_3.conda - sha256: e1ad41c6401ab2ada143d6e1dbbe6ae8afbe3e651211bb414b9ae1f0f8c13249 - md5: 50ea9a1ab48349f343ca2ae82833bda4 + name: editables + version: '0.5' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + sha256: de160a7494e7bc72360eea6a29cbddf194d0a79f45ff417a4de20e6858cf79a9 + md5: 9873878e2a069bc358b69e9a29c1ecd5 depends: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 + - python >=3.7 + license: MIT + license_family: MIT purls: - - pkg:pypi/docutils - size: 901757 - timestamp: 1701883118423 + - pkg:pypi/editables + size: 10988 + timestamp: 1705857085102 - kind: conda name: exceptiongroup version: 1.2.0 @@ -1303,6 +1476,21 @@ packages: - pkg:pypi/exceptiongroup size: 20551 timestamp: 1704921321122 +- kind: conda + name: expat + version: 2.6.2 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda + sha256: 89916c536ae5b85bb8bf0cfa27d751e274ea0911f04e4a928744735c14ef5155 + md5: 53fb86322bdb89496d7579fe3f02fd61 + depends: + - libexpat 2.6.2 h59595ed_0 + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 137627 + timestamp: 1710362144873 - kind: conda name: fancycompleter version: 0.9.1 @@ -1344,58 +1532,29 @@ packages: timestamp: 1709161451678 - kind: conda name: filelock - version: 3.13.3 + version: 3.14.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda - sha256: 3bb2b4b8b97160ee7d2ed40b9dbc78555932274e82ef314c8a400a1d17aa4626 - md5: ff15f46b0d34308f4d40c1c51df07592 + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda + sha256: 6031be667e1b0cc0dee713f1cbca887cdee4daafa8bac478da33096f3147d38b + md5: 831d85ae0acfba31b8efd0f0d07da736 depends: - python >=3.7 license: Unlicense purls: - pkg:pypi/filelock - size: 15611 - timestamp: 1711394721380 -- kind: conda - name: fmt - version: 10.2.1 - build: h00ab1b0_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda - sha256: 7b9ba098a3661e023c3555e01554354ac4891af8f8998e85f0fcbfdac79fc0d4 - md5: 35ef8bc24bd34074ebae3c943d551728 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: MIT - license_family: MIT - size: 193853 - timestamp: 1704454679950 -- kind: conda - name: fmt - version: 10.2.1 - build: h2ffa867_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-10.2.1-h2ffa867_0.conda - sha256: 8570ae6fb7cd1179c646e2c48105e91b3ed8ba15855f12965cc5c9719753c06f - md5: 8cccde6755bdd787f9840f38a34b4e7d - depends: - - libcxx >=15 - license: MIT - license_family: MIT - size: 174209 - timestamp: 1704454873305 + size: 15902 + timestamp: 1714422911808 - kind: conda name: furo - version: 2024.1.29 + version: 2024.5.6 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/furo-2024.1.29-pyhd8ed1ab_0.conda - sha256: aba336c5d783817f63d8c8d12b3488911953dc6a88c692de242b6387482337eb - md5: f67437927d5ead424d7dcf1f4d9b7c66 + url: https://conda.anaconda.org/conda-forge/noarch/furo-2024.5.6-pyhd8ed1ab_0.conda + sha256: 1c99f4b62b84b66b78a74d5781bf92c3ab1795c4d18476c4f7580dee0c8f3a07 + md5: c5d6d467e2d8a74cdd2a888d8e348950 depends: - beautifulsoup4 - pygments >=2.7 @@ -1404,8 +1563,10 @@ packages: - sphinx-basic-ng license: MIT license_family: MIT - size: 80275 - timestamp: 1706572345810 + purls: + - pkg:pypi/furo + size: 83103 + timestamp: 1715029589799 - kind: conda name: gitdb version: 4.0.11 @@ -1443,6 +1604,196 @@ packages: - pkg:pypi/gitpython size: 156827 timestamp: 1711991122366 +- kind: conda + name: h11 + version: 0.14.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + sha256: 817d2c77d53afe3f3d9cf7f6eb8745cdd8ea76c7adaa9d7ced75c455a2c2c085 + md5: b21ed0883505ba1910994f1df031a428 + depends: + - python >=3 + - typing_extensions + license: MIT + license_family: MIT + purls: + - pkg:pypi/h11 + size: 48251 + timestamp: 1664132995560 +- kind: conda + name: h2 + version: 4.1.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + sha256: bfc6a23849953647f4e255c782e74a0e18fe16f7e25c7bb0bc57b83bb6762c7a + md5: b748fbf7060927a6e82df7cb5ee8f097 + depends: + - hpack >=4.0,<5 + - hyperframe >=6.0,<7 + - python >=3.6.1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2 + size: 46754 + timestamp: 1634280590080 +- kind: conda + name: hatch + version: 1.10.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/hatch-1.10.0-pyhd8ed1ab_0.conda + sha256: c640173693bb4279977cb6f0ec5589080f8884c0b884425370a67333abfca96d + md5: b607d2f0443d35dc50251c50ea96fb10 + depends: + - click >=8.0.6 + - hatchling >=1.24.2 + - httpx >=0.22.0 + - hyperlink >=21.0.0 + - keyring >=23.5.0 + - packaging >=23.2 + - pexpect >=4.8,<5 + - platformdirs >=2.5.0 + - python >=3.8 + - rich >=11.2.0 + - shellingham >=1.4.0 + - tomli-w >=1.0 + - tomlkit >=0.11.1 + - userpath >=1.7,<2 + - uv >=0.1.35 + - virtualenv >=20.26.1 + - zstandard <1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hatch + size: 174266 + timestamp: 1714687924505 +- kind: conda + name: hatchling + version: 1.24.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.24.2-pyhd8ed1ab_0.conda + sha256: 1161601871d8aa6c5ff7719a277462cdf0160351a88f2a84a22d6ead3b90150f + md5: 28cef29029f6da70e7a987a76a3599a4 + depends: + - editables >=0.3 + - importlib-metadata + - packaging >=21.3 + - pathspec >=0.10.1 + - pluggy >=1.0.0 + - python >=3.7 + - tomli >=1.2.2 + - trove-classifiers + license: MIT + license_family: MIT + purls: + - pkg:pypi/hatchling + size: 63793 + timestamp: 1713757830609 +- kind: conda + name: hpack + version: 4.0.0 + build: pyh9f0ad1d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + sha256: 5dec948932c4f740674b1afb551223ada0c55103f4c7bf86a110454da3d27cb8 + md5: 914d6646c4dbb1fd3ff539830a12fd71 + depends: + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack + size: 25341 + timestamp: 1598856368685 +- kind: conda + name: httpcore + version: 1.0.5 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + sha256: 4025644200eefa0598e4600a66fd4804a57d9fd7054a5c8c45e508fd875e0b84 + md5: a6b9a0158301e697e4d0a36a3d60e133 + depends: + - anyio >=3.0,<5.0 + - certifi + - h11 >=0.13,<0.15 + - h2 >=3,<5 + - python >=3.8 + - sniffio 1.* + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/httpcore + size: 45816 + timestamp: 1711597091407 +- kind: conda + name: httpx + version: 0.27.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + sha256: fdaf341fb2630b7afe8238315448fc93947f77ebfa4da68bb349e1bcf820af58 + md5: 9f359af5a886fd6ca6b2b6ea02e58332 + depends: + - anyio + - certifi + - httpcore 1.* + - idna + - python >=3.8 + - sniffio + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/httpx + size: 64651 + timestamp: 1708531043505 +- kind: conda + name: hyperframe + version: 6.0.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + sha256: e374a9d0f53149328134a8d86f5d72bca4c6dcebed3c0ecfa968c02996289330 + md5: 9f765cbfab6870c8435b9eefecd7a1f4 + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe + size: 14646 + timestamp: 1619110249723 +- kind: conda + name: hyperlink + version: 21.0.0 + build: pyhd3deb0d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 + sha256: 026cb82ada41be9ee2836a2ace526e85c4603e77617887c41c6e62c9bde798b3 + md5: 1303beb57b40f8f4ff6fb1bb23bf0553 + depends: + - idna >=2.6 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperlink + size: 72732 + timestamp: 1610092261086 - kind: conda name: icu version: '73.2' @@ -1472,37 +1823,36 @@ packages: timestamp: 1692902104771 - kind: conda name: identify - version: 2.5.35 + version: 2.5.36 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda - sha256: 971683b13d1b820157bef9993c63dd8b0611d2d60fc4b522da163aee2e70e518 - md5: 9472bfd206a2b7bb8143835e37667054 + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda + sha256: dc98ab2233d3ed3692499e2a06b027489ee317658cef9277ec23cab00236f31c + md5: ba68cb5105760379432cebc82b45af40 depends: - python >=3.6 - ukkonen license: MIT license_family: MIT - size: 78364 - timestamp: 1708283690891 + purls: + - pkg:pypi/identify + size: 78375 + timestamp: 1713673091737 - kind: pypi name: idiap-devtools - version: 1.0.1.dev36+g96137c1.d20240416 + version: 1.0.1.dev37+g2c4ecdc.d20240513 path: . - sha256: 90209fe9fcfc82861e4b23eb0829bce7c9be7e2ff459126af6d3cedc37db2500 + sha256: d31be5f4e9375e93a5e0c5b50cd840dc0baecf171e0b12cac9b8a4038a0c1b22 requires_dist: - - click >=8 - - cookiecutter + - click>=8 - gitpython - packaging - python-dateutil - python-gitlab - pytz - - pyyaml - tomli - tomlkit - - xdg - auto-intersphinx ; extra == 'doc' - furo ; extra == 'doc' - sphinx ; extra == 'doc' @@ -1517,21 +1867,21 @@ packages: editable: true - kind: conda name: idna - version: '3.6' + version: '3.7' build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda - sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07 - md5: 1a76f09108576397c41c0b0c5bd84134 + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + sha256: 9687ee909ed46169395d4f99a0ee94b80a52f87bed69cd454bb6d37ffeb0ec7b + md5: c0cc1420498b17414d8617d0b9f506ca depends: - python >=3.6 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/idna - size: 50124 - timestamp: 1701027126206 + size: 52718 + timestamp: 1713279497047 - kind: conda name: imagesize version: 1.4.1 @@ -1563,8 +1913,25 @@ packages: - zipp >=0.5 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/importlib-metadata size: 27043 timestamp: 1710971498183 +- kind: conda + name: importlib_metadata + version: 7.1.0 + build: hd8ed1ab_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda + sha256: 01dc057a45dedcc742a71599f67c7383ae2bf873be6018ebcbd06ac8d994dedb + md5: 6ef2b72d291b39e479d7694efa2b2b98 + depends: + - importlib-metadata >=7.1.0,<7.1.1.0a0 + license: Apache-2.0 + license_family: APACHE + size: 9444 + timestamp: 1710971502542 - kind: conda name: importlib_resources version: 6.4.0 @@ -1603,410 +1970,172 @@ packages: size: 11101 timestamp: 1673103208955 - kind: conda - name: jinja2 - version: 3.1.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - sha256: fd517b7dd3a61eca34f8a6f9f92f306397149cae1204fce72ac3d227107dafdc - md5: e7d8df6509ba635247ff9aea31134262 - depends: - - markupsafe >=2.0 - - python >=3.7 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/jinja2 - size: 111589 - timestamp: 1704967140287 -- kind: conda - name: joblib - version: 1.3.2 - build: pyhd8ed1ab_0 + name: jaraco.classes + version: 3.4.0 + build: pyhd8ed1ab_1 + build_number: 1 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda - sha256: 31e05d47970d956206188480b038829d24ac11fe8216409d8584d93d40233878 - md5: 4da50d410f553db77e62ab62ffaa1abc + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda + sha256: 538b1c6df537a36c63fd0ed83cb1c1c25b07d8d3b5e401991fdaff261a4b5b4d + md5: 7b756504d362cbad9b73a50a5455cafd depends: - - python >=3.7 - - setuptools - license: BSD-3-Clause - license_family: BSD - size: 221200 - timestamp: 1691577306309 + - more-itertools + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jaraco-classes + size: 12223 + timestamp: 1713939433204 - kind: conda - name: json5 - version: 0.9.24 - build: pyhd8ed1ab_0 + name: jaraco.context + version: 5.3.0 + build: pyhd8ed1ab_1 + build_number: 1 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/json5-0.9.24-pyhd8ed1ab_0.conda - sha256: 148a427d4867ecd367b2bb9c2ef11ae7795abeabc8454f802f28ff692b3ce1aa - md5: fc9780a517b51ea3798fc011c17ffd51 + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda + sha256: 9e2aeacb1aed3ab4fc5883a357e8a874e12f687af300f8708ec12de2995e17d2 + md5: 72d7ad2dcd0f37eccb2ee35a1c8f6aaa depends: - - python >=3.7,<4.0 - license: Apache-2.0 - license_family: APACHE + - backports.tarfile + - python >=3.8 + license: MIT + license_family: MIT purls: - - pkg:pypi/json5 - size: 27927 - timestamp: 1710632397456 + - pkg:pypi/jaraco-context + size: 12456 + timestamp: 1714372284922 - kind: conda - name: jsonpatch - version: '1.33' + name: jaraco.functools + version: 4.0.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_0.conda - sha256: fbb17e33ace3225c6416d1604637c1058906b8223da968cc015128985336b2b4 - md5: bfdb7c5c6ad1077c82a69a8642c87aff + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda + sha256: d2e866fd22a48eaa2f795b6a3b0bf16f066293322ce04dd65cca36267160ead6 + md5: 547670a612fd335eaa5ffbf0fa75cb64 depends: - - jsonpointer >=1.9 + - more-itertools - python >=3.8 - license: BSD-3-Clause - license_family: BSD + license: MIT + license_family: MIT purls: - - pkg:pypi/jsonpatch - size: 17366 - timestamp: 1695536420928 + - pkg:pypi/jaraco-functools + size: 15192 + timestamp: 1701695329516 - kind: conda - name: jsonpointer - version: '2.4' - build: py312h7900ff3_3 - build_number: 3 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-2.4-py312h7900ff3_3.conda - sha256: c211a79cff8aa001a6e14e923c37278231dca7f0970d8db155c4b9e48ac87a5a - md5: 50f62bdb9b60b13c2f6ae69957342e4d + name: jeepney + version: 0.8.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 + sha256: 16639759b811866d63315fe1391f6fb45f5478b823972f4d3d9f0392b7dd80b8 + md5: 9800ad1699b42612478755a2d26c722d depends: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD + - python >=3.7 + license: MIT + license_family: MIT purls: - - pkg:pypi/jsonpointer - size: 18033 - timestamp: 1695397448370 + - pkg:pypi/jeepney + size: 36895 + timestamp: 1649085298891 - kind: conda - name: jsonpointer - version: '2.4' - build: py312h81bd7bf_3 - build_number: 3 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-2.4-py312h81bd7bf_3.conda - sha256: 6cb2d17da9083e05f5ead7902a5cd6ec9567cd3da972c65c03f090515c9fa176 - md5: 327361b24f5348cab04ad9b1f74e831d + name: jinja2 + version: 3.1.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + sha256: 27380d870d42d00350d2d52598cddaf02f9505fb24be09488da0c9b8d1428f2d + md5: 7b86ecb7d3557821c649b3c31e3eb9f2 depends: - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - markupsafe >=2.0 + - python >=3.7 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/jsonpointer - size: 18542 - timestamp: 1695397720755 + - pkg:pypi/jinja2 + size: 111565 + timestamp: 1715127275924 - kind: conda - name: jsonschema - version: 4.21.1 - build: pyhd8ed1ab_0 + name: keyring + version: 25.2.0 + build: pyh534df25_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda - sha256: c5c1b4e08e91fdd697289015be1a176409b4e63942899a43b276f1f250be8129 - md5: 8a3a3d01629da20befa340919e3dd2c4 - depends: - - attrs >=22.2.0 - - importlib_resources >=1.4.0 - - jsonschema-specifications >=2023.03.6 - - pkgutil-resolve-name >=1.3.10 + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.2.0-pyh534df25_0.conda + sha256: 29ffedc5e90f850a66007174f3785eb6a322a93cc6df9e8c9a7646f7761c694a + md5: acaf59f096327bc5757c91303cae99ca + depends: + - __osx + - importlib_metadata >=4.11.4 + - importlib_resources + - jaraco.classes + - jaraco.context + - jaraco.functools - python >=3.8 - - referencing >=0.28.4 - - rpds-py >=0.7.1 license: MIT license_family: MIT - size: 72817 - timestamp: 1705707712082 + purls: + - pkg:pypi/keyring + size: 36710 + timestamp: 1714167932993 - kind: conda - name: jsonschema-specifications - version: 2023.12.1 - build: pyhd8ed1ab_0 + name: keyring + version: 25.2.0 + build: pyha804496_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda - sha256: a9630556ddc3121c0be32f4cbf792dd9102bd380d5cd81d57759d172cf0c2da2 - md5: a0e4efb5f35786a05af4809a2fb1f855 - depends: - - importlib_resources >=1.4.0 + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.2.0-pyha804496_0.conda + sha256: 3a6dc8525071aa1016b81d24ee3845a2c26280b863392d7551b40a6c8d0f60c0 + md5: 7a14341f0ed09e83e28b28140f058ae0 + depends: + - __linux + - importlib_metadata >=4.11.4 + - importlib_resources + - jaraco.classes + - jaraco.context + - jaraco.functools + - jeepney >=0.4.2 - python >=3.8 - - referencing >=0.31.0 + - secretstorage >=3.2 license: MIT license_family: MIT purls: - - pkg:pypi/jsonschema-specifications - size: 16431 - timestamp: 1703778502971 -- kind: conda - name: keyutils - version: 1.6.1 - build: h166bdaf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb - md5: 30186d27e2c9fa62b45fb1476b7200e3 - depends: - - libgcc-ng >=10.3.0 - license: LGPL-2.1-or-later - size: 117831 - timestamp: 1646151697040 -- kind: conda - name: krb5 - version: 1.21.2 - build: h659d440_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda - sha256: 259bfaae731989b252b7d2228c1330ef91b641c9d68ff87dae02cbae682cb3e4 - md5: cd95826dbd331ed1be26bdf401432844 - depends: - - keyutils >=1.6.1,<2.0a0 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - openssl >=3.1.2,<4.0a0 - license: MIT - license_family: MIT - size: 1371181 - timestamp: 1692097755782 -- kind: conda - name: krb5 - version: 1.21.2 - build: h92f50d5_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.2-h92f50d5_0.conda - sha256: 70bdb9b4589ec7c7d440e485ae22b5a352335ffeb91a771d4c162996c3070875 - md5: 92f1cff174a538e0722bf2efb16fc0b2 - depends: - - libcxx >=15.0.7 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - openssl >=3.1.2,<4.0a0 - license: MIT - license_family: MIT - size: 1195575 - timestamp: 1692098070699 -- kind: conda - name: ld64 - version: '711' - build: h4c6efb1_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-711-h4c6efb1_0.conda - sha256: 467371e8dbd4fc99f507024c3d10c0ac4a8528286e9507a1f365e26cb90f4df0 - md5: 289df626863e8c720c3aa220964378cc - depends: - - ld64_osx-arm64 711 h5e7191b_0 - - libllvm18 >=18.1.1,<18.2.0a0 - constrains: - - cctools 986.* - - cctools_osx-arm64 986.* - license: APSL-2.0 - license_family: Other - size: 18678 - timestamp: 1710484665887 -- kind: conda - name: ld64_osx-arm64 - version: '711' - build: h5e7191b_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-711-h5e7191b_0.conda - sha256: 82f964dcff2052b327762ca44651407451ad396a1540c664928841c72b7cf3c0 - md5: c751b76ae8112e3d516831063da179cc - depends: - - libcxx - - libllvm18 >=18.1.1,<18.2.0a0 - - sigtool - - tapi >=1100.0.11,<1101.0a0 - constrains: - - ld 711.* - - cctools 986.* - - cctools_osx-arm64 986.* - - clang >=18.1.1,<19.0a0 - license: APSL-2.0 - license_family: Other - size: 1064448 - timestamp: 1710484550965 + - pkg:pypi/keyring + size: 36608 + timestamp: 1714167807674 - kind: conda name: ld_impl_linux-64 version: '2.40' - build: h41732ed_0 + build: h55db66e_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda - sha256: f6cc89d887555912d6c61b295d398cff9ec982a3417d38025c45d5dd9b9e79cd - md5: 7aca3059a1729aa76c597603f10b0dd3 + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda + sha256: ef969eee228cfb71e55146eaecc6af065f468cb0bc0a5239bc053b39db0b5f09 + md5: 10569984e7db886e4f1abc2b47ad79a1 constrains: - binutils_impl_linux-64 2.40 license: GPL-3.0-only license_family: GPL - size: 704696 - timestamp: 1674833944779 -- kind: conda - name: libarchive - version: 3.7.2 - build: h2aa1ff5_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.2-h2aa1ff5_1.conda - sha256: 340ed0bb02fe26a2b2e29cedf6559e2999b820f434e745c108e788d629ae4b17 - md5: 3bf887827d1968275978361a6e405e4f - depends: - - bzip2 >=1.0.8,<2.0a0 - - libgcc-ng >=12 - - libxml2 >=2.12.2,<3.0.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - lz4-c >=1.9.3,<1.10.0a0 - - lzo >=2.10,<3.0a0 - - openssl >=3.2.0,<4.0a0 - - xz >=5.2.6,<6.0a0 - - zstd >=1.5.5,<1.6.0a0 - license: BSD-2-Clause - license_family: BSD - size: 866168 - timestamp: 1701994227275 -- kind: conda - name: libarchive - version: 3.7.2 - build: hcacb583_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.7.2-hcacb583_1.conda - sha256: 307dd9984deccab782a834022a708ba070950d3d0f3b370ce9331ad1db013576 - md5: 1c8c447ce71bf5f769674b621142a73a - depends: - - bzip2 >=1.0.8,<2.0a0 - - libiconv >=1.17,<2.0a0 - - libxml2 >=2.12.2,<3.0.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - lz4-c >=1.9.3,<1.10.0a0 - - lzo >=2.10,<3.0a0 - - openssl >=3.2.0,<4.0a0 - - xz >=5.2.6,<6.0a0 - - zstd >=1.5.5,<1.6.0a0 - license: BSD-2-Clause - license_family: BSD - size: 783812 - timestamp: 1701994487530 -- kind: conda - name: libcurl - version: 8.7.1 - build: h2d989ff_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.7.1-h2d989ff_0.conda - sha256: 973ac9368efca712a8fd19fe68524d7d9a3087fd88ad6b7fcdf60c3d2e19a498 - md5: 34b9171710f0d9bf093d55bdc36ff355 - depends: - - krb5 >=1.21.2,<1.22.0a0 - - libnghttp2 >=1.58.0,<2.0a0 - - libssh2 >=1.11.0,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openssl >=3.2.1,<4.0a0 - - zstd >=1.5.5,<1.6.0a0 - license: curl - license_family: MIT - size: 358080 - timestamp: 1711548548174 -- kind: conda - name: libcurl - version: 8.7.1 - build: hca28451_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda - sha256: 82a75e9a5d9ee5b2f487d850ec5d4edc18a56eb9527608a95a916c40baae3843 - md5: 755c7f876815003337d2c61ff5d047e5 - depends: - - krb5 >=1.21.2,<1.22.0a0 - - libgcc-ng >=12 - - libnghttp2 >=1.58.0,<2.0a0 - - libssh2 >=1.11.0,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openssl >=3.2.1,<4.0a0 - - zstd >=1.5.5,<1.6.0a0 - license: curl - license_family: MIT - size: 398293 - timestamp: 1711548114077 + size: 713322 + timestamp: 1713651222435 - kind: conda name: libcxx - version: 16.0.6 - build: h4653b0c_0 + version: 17.0.6 + build: h5f092b4_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-16.0.6-h4653b0c_0.conda - sha256: 11d3fb51c14832d9e4f6d84080a375dec21ea8a3a381a1910e67ff9cedc20355 - md5: 9d7d724faf0413bf1dbc5a85935700c8 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-17.0.6-h5f092b4_0.conda + sha256: 119d3d9306f537d4c89dc99ed99b94c396d262f0b06f7833243646f68884f2c2 + md5: a96fd5dda8ce56c86a971e0fa02751d0 + depends: + - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 1160232 - timestamp: 1686896993785 -- kind: conda - name: libedit - version: 3.1.20191231 - build: hc8eb9b7_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20191231-hc8eb9b7_2.tar.bz2 - sha256: 3912636197933ecfe4692634119e8644904b41a58f30cad9d1fc02f6ba4d9fca - md5: 30e4362988a2623e9eb34337b83e01f9 - depends: - - ncurses >=6.2,<7.0.0a0 - license: BSD-2-Clause - license_family: BSD - size: 96607 - timestamp: 1597616630749 -- kind: conda - name: libedit - version: 3.1.20191231 - build: he28a2e2_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 - sha256: a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf - md5: 4d331e44109e3f0e19b4cb8f9b82f3e1 - depends: - - libgcc-ng >=7.5.0 - - ncurses >=6.2,<7.0.0a0 - license: BSD-2-Clause - license_family: BSD - size: 123878 - timestamp: 1597616541093 -- kind: conda - name: libev - version: '4.33' - build: h93a5062_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f - md5: 36d33e440c31857372a72137f78bacf5 - license: BSD-2-Clause - license_family: BSD - size: 107458 - timestamp: 1702146414478 -- kind: conda - name: libev - version: '4.33' - build: hd590300_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 - md5: 172bf1cd1ff8629f2b1179945ed45055 - depends: - - libgcc-ng >=12 - license: BSD-2-Clause - license_family: BSD - size: 112766 - timestamp: 1702146165126 + size: 1248885 + timestamp: 1715020154867 - kind: conda name: libexpat version: 2.6.2 @@ -2068,36 +2197,55 @@ packages: - kind: conda name: libgcc-ng version: 13.2.0 - build: h807b86a_5 - build_number: 5 + build: h77fa898_7 + build_number: 7 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda - sha256: d32f78bfaac282cfe5205f46d558704ad737b8dbf71f9227788a5ca80facaba4 - md5: d4ff227c46917d3b4565302a2bbb276b + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda + sha256: 62af2b89acbe74a21606c8410c276e57309c0a2ab8a9e8639e3c8131c0b60c92 + md5: 72ec1b1b04c4d15d4204ece1ecea5978 depends: - _libgcc_mutex 0.1 conda_forge - _openmp_mutex >=4.5 constrains: - - libgomp 13.2.0 h807b86a_5 + - libgomp 13.2.0 h77fa898_7 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 770506 - timestamp: 1706819192021 + size: 775806 + timestamp: 1715016057793 +- kind: conda + name: libglib + version: 2.80.2 + build: hf974151_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda + sha256: 93e03b6cf4765bc06d64fa3dac65f22c53ae4a30247bb0e2dea0bd9c47a3fb26 + md5: 72724f6a78ecb15559396966226d5838 + depends: + - libffi >=3.4,<4.0a0 + - libgcc-ng >=12 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pcre2 >=10.43,<10.44.0a0 + constrains: + - glib 2.80.2 *_0 + license: LGPL-2.1-or-later + size: 3912673 + timestamp: 1715252654366 - kind: conda name: libgomp version: 13.2.0 - build: h807b86a_5 - build_number: 5 + build: h77fa898_7 + build_number: 7 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda - sha256: 0d3d4b1b0134283ea02d58e8eb5accf3655464cf7159abf098cc694002f8d34e - md5: d211c42b9ce49aee3734fdc828731689 + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda + sha256: 781444fa069d3b50e8ed667b750571cacda785761c7fc2a89ece1ac49693d4ad + md5: abf3fec87c2563697defa759dec3d639 depends: - _libgcc_mutex 0.1 conda_forge license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 419751 - timestamp: 1706819107383 + size: 422336 + timestamp: 1715015995979 - kind: conda name: libiconv version: '1.17' @@ -2124,188 +2272,6 @@ packages: license: LGPL-2.1-only size: 705775 timestamp: 1702682170569 -- kind: conda - name: liblief - version: 0.14.1 - build: h3f3aa29_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/liblief-0.14.1-h3f3aa29_1.conda - sha256: 09ce81a54a7713058f5bf334dcd8e901435cce4eac9db05dcfe73454cab4f813 - md5: ff67fa3d5bb43a834a9bf658b8c0aa6c - depends: - - __osx >=11.0 - - libcxx >=16 - license: Apache-2.0 - license_family: Apache - size: 1547201 - timestamp: 1711564083758 -- kind: conda - name: liblief - version: 0.14.1 - build: hac33072_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/liblief-0.14.1-hac33072_1.conda - sha256: 9c43233e6a4dc4732150c5df7f22647f94eebfb0029f864ff08e406eacf4e941 - md5: 2f6a34571bb9e99ecf3486012739e73b - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: Apache-2.0 - license_family: Apache - size: 1843928 - timestamp: 1711563126697 -- kind: conda - name: libllvm18 - version: 18.1.2 - build: h30cc82d_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm18-18.1.2-h30cc82d_0.conda - sha256: 0d94c605bae6d743713dd902e2f56f52f65cbd3456b90c5d7c464321607e2b5b - md5: 6e8e9ff62e7886035618ac93fad76f9e - depends: - - libcxx >=16 - - libxml2 >=2.12.6,<3.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - zstd >=1.5.5,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 25780908 - timestamp: 1710946768066 -- kind: conda - name: libmamba - version: 1.5.8 - build: h90c426b_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libmamba-1.5.8-h90c426b_0.conda - sha256: a6182bd735fe6a8bdd511096931a991b7d431cbfa2358f3aebb98132f063c89d - md5: e02e82b493ab683be580380193db1b64 - depends: - - fmt >=10.2.1,<11.0a0 - - libarchive >=3.7.2,<3.8.0a0 - - libcurl >=8.6.0,<9.0a0 - - libcxx >=16 - - libsolv >=0.7.23 - - openssl >=3.2.1,<4.0a0 - - reproc >=14.2,<15.0a0 - - reproc-cpp >=14.2,<15.0a0 - - yaml-cpp >=0.8.0,<0.9.0a0 - - zstd >=1.5.5,<1.6.0a0 - license: BSD-3-Clause - license_family: BSD - size: 1201341 - timestamp: 1711395432570 -- kind: conda - name: libmamba - version: 1.5.8 - build: had39da4_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libmamba-1.5.8-had39da4_0.conda - sha256: 79c275862cc084c9f0dc1a13bd42313d48202181d5d64615b3046bf2380ef57d - md5: def669885dc103d8acb7ac2ac35e0b2f - depends: - - fmt >=10.2.1,<11.0a0 - - libarchive >=3.7.2,<3.8.0a0 - - libcurl >=8.6.0,<9.0a0 - - libgcc-ng >=12 - - libsolv >=0.7.23 - - libstdcxx-ng >=12 - - openssl >=3.2.1,<4.0a0 - - reproc >=14.2,<15.0a0 - - reproc-cpp >=14.2,<15.0a0 - - yaml-cpp >=0.8.0,<0.9.0a0 - - zstd >=1.5.5,<1.6.0a0 - license: BSD-3-Clause - license_family: BSD - size: 1671126 - timestamp: 1711394919576 -- kind: conda - name: libmambapy - version: 1.5.8 - build: py312h344e357_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libmambapy-1.5.8-py312h344e357_0.conda - sha256: 7cb94cf454c20cf25cf0c394e812ca7f86ceae47bb45f5b11518dd204f752cf0 - md5: 9167478ca4942d118d3b79f6149c758f - depends: - - fmt >=10.2.1,<11.0a0 - - libcxx >=16 - - libmamba 1.5.8 h90c426b_0 - - openssl >=3.2.1,<4.0a0 - - pybind11-abi 4 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - yaml-cpp >=0.8.0,<0.9.0a0 - license: BSD-3-Clause - license_family: BSD - size: 255134 - timestamp: 1711395612039 -- kind: conda - name: libmambapy - version: 1.5.8 - build: py312hd9e9ff6_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libmambapy-1.5.8-py312hd9e9ff6_0.conda - sha256: 429c8fd6f7be1040a52cedaa8cd7aa02a42ccc8a27baa0a4394516401e9d7b28 - md5: ab74748421323fd59d9fda55e45b979e - depends: - - fmt >=10.2.1,<11.0a0 - - libgcc-ng >=12 - - libmamba 1.5.8 had39da4_0 - - libstdcxx-ng >=12 - - openssl >=3.2.1,<4.0a0 - - pybind11-abi 4 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - yaml-cpp >=0.8.0,<0.9.0a0 - license: BSD-3-Clause - license_family: BSD - size: 306497 - timestamp: 1711395345839 -- kind: conda - name: libnghttp2 - version: 1.58.0 - build: h47da74e_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda - sha256: 1910c5306c6aa5bcbd623c3c930c440e9c77a5a019008e1487810e3c1d3716cb - md5: 700ac6ea6d53d5510591c4344d5c989a - depends: - - c-ares >=1.23.0,<2.0a0 - - libev >=4.33,<4.34.0a0 - - libev >=4.33,<5.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 - - openssl >=3.2.0,<4.0a0 - license: MIT - license_family: MIT - size: 631936 - timestamp: 1702130036271 -- kind: conda - name: libnghttp2 - version: 1.58.0 - build: ha4dd798_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda - sha256: fc97aaaf0c6d0f508be313d86c2705b490998d382560df24be918b8e977802cd - md5: 1813e066bfcef82de579a0be8a766df4 - depends: - - __osx >=10.9 - - c-ares >=1.23.0,<2.0a0 - - libcxx >=16.0.6 - - libev >=4.33,<4.34.0a0 - - libev >=4.33,<5.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openssl >=3.2.0,<4.0a0 - license: MIT - license_family: MIT - size: 565451 - timestamp: 1702130473930 - kind: conda name: libnsl version: 2.0.1 @@ -2320,110 +2286,46 @@ packages: license_family: GPL size: 33408 timestamp: 1697359010159 -- kind: conda - name: libsolv - version: 0.7.28 - build: h1059232_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsolv-0.7.28-h1059232_2.conda - sha256: fd83e17e0f71cba0eeecffd6dd7bb0b0b39ac5c5b456b425c1d92f860151ff68 - md5: 00e4d252cbbeb894f15d01a1545aa876 - depends: - - libcxx >=16 - - libzlib >=1.2.13,<1.3.0a0 - license: BSD-3-Clause - license_family: BSD - size: 386817 - timestamp: 1711553518981 -- kind: conda - name: libsolv - version: 0.7.28 - build: hfc55251_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.28-hfc55251_2.conda - sha256: f21f2653a0a73bfcdfeecbeb2198b5ebd3f0c9f541fe0044e995bf43df3096d2 - md5: 535bafe1ed0a5bdd3f4c125ca05d378c - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 - license: BSD-3-Clause - license_family: BSD - size: 468273 - timestamp: 1711553127824 - kind: conda name: libsqlite - version: 3.45.2 + version: 3.45.3 build: h091b4b1_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.2-h091b4b1_0.conda - sha256: 7c234320a1a2132b9cc972aaa06bb215bb220a5b1addb0bed7a5a321c805920e - md5: 9d07427ee5bd9afd1e11ce14368a48d6 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda + sha256: 4337f466eb55bbdc74e168b52ec8c38f598e3664244ec7a2536009036e2066cc + md5: c8c1186c7f3351f6ffddb97b1f54fc58 depends: - libzlib >=1.2.13,<1.3.0a0 license: Unlicense - size: 825300 - timestamp: 1710255078823 -- kind: conda - name: libsqlite - version: 3.45.2 - build: h2797004_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda - sha256: 8cdbeb7902729e319510a82d7c642402981818702b58812af265ef55d1315473 - md5: 866983a220e27a80cb75e85cb30466a1 - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 - license: Unlicense - size: 857489 - timestamp: 1710254744982 + size: 824794 + timestamp: 1713367748819 - kind: conda - name: libssh2 - version: 1.11.0 - build: h0841786_0 + name: libsqlite + version: 3.45.3 + build: h2797004_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - sha256: 50e47fd9c4f7bf841a11647ae7486f65220cfc988ec422a4475fe8d5a823824d - md5: 1f5a58e686b13bcfde88b93f547d23fe + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda + sha256: e2273d6860eadcf714a759ffb6dc24a69cfd01f2a0ea9d6c20f86049b9334e0c + md5: b3316cbe90249da4f8e84cd66e1cc55b depends: - libgcc-ng >=12 - libzlib >=1.2.13,<1.3.0a0 - - openssl >=3.1.1,<4.0a0 - license: BSD-3-Clause - license_family: BSD - size: 271133 - timestamp: 1685837707056 -- kind: conda - name: libssh2 - version: 1.11.0 - build: h7a5bd25_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda - sha256: bb57d0c53289721fff1eeb3103a1c6a988178e88d8a8f4345b0b91a35f0e0015 - md5: 029f7dc931a3b626b94823bc77830b01 - depends: - - libzlib >=1.2.13,<1.3.0a0 - - openssl >=3.1.1,<4.0a0 - license: BSD-3-Clause - license_family: BSD - size: 255610 - timestamp: 1685837894256 + license: Unlicense + size: 859858 + timestamp: 1713367435849 - kind: conda name: libstdcxx-ng version: 13.2.0 - build: h7e041cc_5 - build_number: 5 + build: hc0a3c3a_7 + build_number: 7 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda - sha256: a56c5b11f1e73a86e120e6141a42d9e935a99a2098491ac9e15347a1476ce777 - md5: f6f6600d18a4047b54f803cf708b868a + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda + sha256: 35f1e08be0a84810c9075f5bd008495ac94e6c5fe306dfe4b34546f11fed850f + md5: 53ebd4c833fa01cb2c6353e99f905406 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 3834139 - timestamp: 1706819252496 + size: 3837704 + timestamp: 1715016117360 - kind: conda name: libuuid version: 2.38.1 @@ -2455,12 +2357,12 @@ packages: - kind: conda name: libxml2 version: 2.12.6 - build: h0d0cfa8_1 - build_number: 1 + build: h0d0cfa8_2 + build_number: 2 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_1.conda - sha256: f18775ca8494ead5451d4acfc53fa7ebf7a8b5ed04c43bcc50fab847c9780cb3 - md5: c08526c957192192e1e7b4f622761144 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_2.conda + sha256: a5c10af641d6accf3effb3c3a3c594d931bb374f9e3e796719f3ecf769cfb0fc + md5: 27577d561de7659487b062c363d8a527 depends: - icu >=73.2,<74.0a0 - libiconv >=1.17,<2.0a0 @@ -2468,17 +2370,17 @@ packages: - xz >=5.2.6,<6.0a0 license: MIT license_family: MIT - size: 588539 - timestamp: 1711318256840 + size: 588638 + timestamp: 1713314780561 - kind: conda name: libxml2 version: 2.12.6 - build: h232c23b_1 - build_number: 1 + build: h232c23b_2 + build_number: 2 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda - sha256: c0bd693bb1a7e5aba388a0c79be16ff92e2411e03aaa920f94b4b33bf099e254 - md5: 6853448e9ca1cfd5f15382afd2a6d123 + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda + sha256: 0fd41df7211aae04f492c8550ce10238e8cfa8b1abebc2215a983c5e66d284ea + md5: 9a3a42df8a95f65334dfc7b80da1195d depends: - icu >=73.2,<74.0a0 - libgcc-ng >=12 @@ -2487,8 +2389,8 @@ packages: - xz >=5.2.6,<6.0a0 license: MIT license_family: MIT - size: 705994 - timestamp: 1711318087106 + size: 704938 + timestamp: 1713314718258 - kind: conda name: libxslt version: 1.1.39 @@ -2570,138 +2472,45 @@ packages: timestamp: 1690394219675 - kind: conda name: lxml - version: 5.1.0 - build: py312h37b5203_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/lxml-5.1.0-py312h37b5203_0.conda - sha256: 5fcfa6dc3c8cb0e4530d3f5aeaa5fb67d4f1e406d17e8075f1bdc1f122c08f73 - md5: f39740e31558f179fb1d1941a241efc6 + version: 5.2.2 + build: py312h0e5ab22_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-5.2.2-py312h0e5ab22_0.conda + sha256: 6dda17b6be96e13adb7810e7aeaa676429b93ce472e636f73ba56f2b61918d24 + md5: d049fc23bf40c0f7d97bc4a35d91b97c depends: - - libgcc-ng >=12 - - libxml2 >=2.12.3,<3.0.0a0 + - __osx >=11.0 + - libxml2 >=2.12.6,<3.0a0 - libxslt >=1.1.39,<2.0a0 - libzlib >=1.2.13,<1.3.0a0 - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: BSD-3-Clause and MIT-CMU purls: - pkg:pypi/lxml - size: 1490575 - timestamp: 1704724512042 + size: 1149120 + timestamp: 1715599148831 - kind: conda name: lxml - version: 5.1.0 - build: py312h9bf3b9e_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-5.1.0-py312h9bf3b9e_0.conda - sha256: 89272ef9521c8a859ef6396585e313a1f085a9d85e1579d36660b5966f43e588 - md5: ff623d12bba9a6a4e892fa17c2a35d0b + version: 5.2.2 + build: py312hb90d8a5_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/lxml-5.2.2-py312hb90d8a5_0.conda + sha256: fab93c7618006b5595add86b0cb12501642dcb3a295de54eef17e0dd1aaf22ae + md5: da3e0a20f8eb75072ad036198c37be61 depends: - - libxml2 >=2.12.3,<3.0.0a0 + - libgcc-ng >=12 + - libxml2 >=2.12.6,<3.0a0 - libxslt >=1.1.39,<2.0a0 - libzlib >=1.2.13,<1.3.0a0 - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: BSD-3-Clause and MIT-CMU purls: - pkg:pypi/lxml - size: 1223959 - timestamp: 1704724844405 -- kind: conda - name: lz4-c - version: 1.9.4 - build: hb7217d7_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.9.4-hb7217d7_0.conda - sha256: fc343b8c82efe40819b986e29ba748366514e5ab94a1e1138df195af5f45fa24 - md5: 45505bec548634f7d05e02fb25262cb9 - depends: - - libcxx >=14.0.6 - license: BSD-2-Clause - license_family: BSD - size: 141188 - timestamp: 1674727268278 -- kind: conda - name: lz4-c - version: 1.9.4 - build: hcb278e6_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - sha256: 1b4c105a887f9b2041219d57036f72c4739ab9e9fe5a1486f094e58c76b31f5f - md5: 318b08df404f9c9be5712aaa5a6f0bb0 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: BSD-2-Clause - license_family: BSD - size: 143402 - timestamp: 1674727076728 -- kind: conda - name: lzo - version: '2.10' - build: h516909a_1000 - build_number: 1000 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h516909a_1000.tar.bz2 - sha256: 25d16e6aaa3d0b450e61d0c4fadd7c9fd17f16e2fef09b34507209342d63c9f6 - md5: bb14fcb13341b81d5eb386423b9d2bac - depends: - - libgcc-ng >=7.5.0 - license: GPL v2+ - license_family: GPL2 - size: 321113 - timestamp: 1597681972321 -- kind: conda - name: lzo - version: '2.10' - build: h642e427_1000 - build_number: 1000 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h642e427_1000.tar.bz2 - sha256: ae029e5c16893071d29a11ddbfdbdb01b2ebf10d1785f54370934439d8b71817 - md5: ddab5f96f5573a9bd5e24f9994fd6ec9 - license: GPL v2+ - license_family: GPL2 - size: 157236 - timestamp: 1597683217947 -- kind: conda - name: mamba - version: 1.5.8 - build: py312h14bc7db_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/mamba-1.5.8-py312h14bc7db_0.conda - sha256: e4c11d2d11c7f80a4e31173942e7241701d8d7c7eb45d21df0ff7d0e12bb6132 - md5: 298031a00a13bb7921fa37772cb31799 - depends: - - conda >=24,<25 - - libmambapy 1.5.8 py312h344e357_0 - - openssl >=3.2.1,<4.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - size: 65192 - timestamp: 1711396302606 -- kind: conda - name: mamba - version: 1.5.8 - build: py312h9460a1c_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/mamba-1.5.8-py312h9460a1c_0.conda - sha256: 4fcfcf73b2b3cfe7e50fac5488a3dbd51a76a9da93af79b0c5856bc3bece7589 - md5: b82e8ad83fdeab869ef209d3f419a99c - depends: - - conda >=24,<25 - - libmambapy 1.5.8 py312hd9e9ff6_0 - - openssl >=3.2.1,<4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - size: 64618 - timestamp: 1711395503622 + size: 1399383 + timestamp: 1715598656220 - kind: conda name: markdown-it-py version: 3.0.0 @@ -2777,35 +2586,6 @@ packages: - pkg:pypi/mdurl size: 14680 timestamp: 1704317789138 -- kind: conda - name: menuinst - version: 2.0.2 - build: py312h7900ff3_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/menuinst-2.0.2-py312h7900ff3_0.conda - sha256: 39f942fb43dcd553e54f27ec55e0a2155b6ceae9f9528be1e7c2f9a9758b05e0 - md5: acb03947d606ff797a036d31723490fc - depends: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause AND MIT - size: 158511 - timestamp: 1705068403609 -- kind: conda - name: menuinst - version: 2.0.2 - build: py312h81bd7bf_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/menuinst-2.0.2-py312h81bd7bf_0.conda - sha256: e9f2fec42e3a6c0c46e2576b20e107f2f6b6cf26d69d7b9e563822df70eb4b0a - md5: 802a33b3ca10e299f2fc9d6783140cc7 - depends: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause AND MIT - size: 159866 - timestamp: 1705068748439 - kind: conda name: more-itertools version: 10.2.0 @@ -2825,28 +2605,66 @@ packages: timestamp: 1704738585811 - kind: conda name: ncurses - version: 6.4.20240210 - build: h078ce10_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda - sha256: 06f0905791575e2cd3aa961493c56e490b3d82ad9eb49f1c332bd338b0216911 - md5: 616ae8691e6608527d0071e6766dcb81 + 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 - size: 820249 - timestamp: 1710866874348 + size: 887465 + timestamp: 1715194722503 - kind: conda name: ncurses - version: 6.4.20240210 - build: h59595ed_0 + version: '6.5' + build: hb89a1cb_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda + sha256: 87d7cf716d9d930dab682cb57b3b8d3a61940b47d6703f3529a155c938a6990a + md5: b13ad5724ac9ae98b6b4fd87e4500ba4 + license: X11 AND BSD-3-Clause + size: 795131 + timestamp: 1715194898402 +- kind: conda + name: nh3 + version: 0.2.17 + build: py312h4b3b743_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda - sha256: aa0f005b6727aac6507317ed490f0904430584fa8ca722657e7f0fb94741de81 - md5: 97da8860a0da5413c7c98a3b3838a645 + url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.2.17-py312h4b3b743_0.conda + sha256: 60067873dda1f5433fee8e2b7c02a32785153d2be73c75cfffae47ca4566a9c2 + md5: cfa305e03624c82d451a5ef250960bbd depends: - libgcc-ng >=12 - license: X11 AND BSD-3-Clause - size: 895669 - timestamp: 1710866638986 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/nh3 + size: 607053 + timestamp: 1711545731955 +- kind: conda + name: nh3 + version: 0.2.17 + build: py312h5280bc4_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.2.17-py312h5280bc4_0.conda + sha256: b5ff8a687db7ef51fe5f854fe37975f08b70a2ad0ff585d9444e4e3bd77b3d95 + md5: 7a6d211257e3d264516ae4d67ce181a4 + depends: + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/nh3 + size: 582437 + timestamp: 1711545995406 - kind: conda name: nodeenv version: 1.8.0 @@ -2861,34 +2679,34 @@ packages: - setuptools license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/nodeenv size: 34358 timestamp: 1683893151613 - kind: conda name: openssl - version: 3.2.1 - build: h0d3ecfb_1 - build_number: 1 + version: 3.3.0 + build: h0d3ecfb_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.1-h0d3ecfb_1.conda - sha256: 519dc941d7ab0ebf31a2878d85c2f444450e7c5f6f41c4d07252c6bb3417b78b - md5: eb580fb888d93d5d550c557323ac5cee + url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda + sha256: 51f9be8fe929c2bb3243cd0707b6dfcec27541f8284b4bd9b063c288fc46f482 + md5: 25b0e522c3131886a637e347b2ca0c0f depends: - ca-certificates constrains: - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 2855250 - timestamp: 1710793435903 + size: 2888226 + timestamp: 1714466346030 - kind: conda name: openssl - version: 3.2.1 - build: hd590300_1 - build_number: 1 + version: 3.3.0 + build: hd590300_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda - sha256: 2c689444ed19a603be457284cf2115ee728a3fafb7527326e96054dee7cdc1a7 - md5: 9d731343cff6ee2e5a25c4a091bf8e2a + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda + sha256: fdbf05e4db88c592366c90bb82e446edbe33c6e49e5130d51c580b2629c0b5d5 + md5: c0f3abb4a16477208bbd43a39bd56f18 depends: - ca-certificates - libgcc-ng >=12 @@ -2896,8 +2714,8 @@ packages: - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 2865379 - timestamp: 1710793235846 + size: 2895187 + timestamp: 1714466138265 - kind: conda name: packaging version: '24.0' @@ -2916,48 +2734,38 @@ packages: size: 49832 timestamp: 1710076089469 - kind: conda - name: patch - version: 2.7.6 - build: h27ca646_1002 - build_number: 1002 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/patch-2.7.6-h27ca646_1002.tar.bz2 - sha256: 45316f216976a35180e1973840de08013f075bc94a9a57ae9a9e4e52ea2224d4 - md5: 129d8d6f5a313a5c3e9ed39710d71147 - license: GPL-3.0-or-later - license_family: GPL - size: 130036 - timestamp: 1612446664446 -- kind: conda - name: patch - version: 2.7.6 - build: h7f98852_1002 - build_number: 1002 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/patch-2.7.6-h7f98852_1002.tar.bz2 - sha256: fc30d1b643c35d82abd294cde6b34f7b9e952856c0386f4f069c3a2b7feb28dd - md5: 4c1bbbec45149a186b915c67d086ed3b + name: pathspec + version: 0.12.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + sha256: 4e534e66bfe8b1e035d2169d0e5b185450546b17e36764272863e22e0370be4d + md5: 17064acba08d3686f1135b5ec1b32b12 depends: - - libgcc-ng >=9.3.0 - license: GPL-3.0-or-later - license_family: GPL - size: 123495 - timestamp: 1612446599889 + - python >=3.7 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec + size: 41173 + timestamp: 1702250135032 - kind: conda - name: patchelf - version: 0.17.2 - build: h58526e2_0 + name: pcre2 + version: '10.43' + build: hcad00b1_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/patchelf-0.17.2-h58526e2_0.conda - sha256: eb355ac225be2f698e19dba4dcab7cb0748225677a9799e9cc8e4cadc3cb738f - md5: ba76a6a448819560b5f8b08a9c74f415 + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda + sha256: 766dd986a7ed6197676c14699000bba2625fd26c8a890fcb7a810e5cf56155bc + md5: 8292dea9e022d9610a11fce5e0896ed8 depends: - - libgcc-ng >=7.5.0 - - libstdcxx-ng >=7.5.0 - license: GPL-3.0-or-later - license_family: GPL - size: 94048 - timestamp: 1673473024463 + - bzip2 >=1.0.8,<2.0a0 + - libgcc-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + size: 950847 + timestamp: 1708118050286 - kind: conda name: pdbpp version: 0.10.3 @@ -2974,8 +2782,27 @@ packages: - wmctrl license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pdbpp size: 25010 timestamp: 1626016866544 +- kind: conda + name: pexpect + version: 4.9.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda + sha256: 90a09d134a4a43911b716d4d6eb9d169238aff2349056f7323d9db613812667e + md5: 629f3203c99b32e0988910c93e77f3b6 + depends: + - ptyprocess >=0.5 + - python >=3.7 + license: ISC + purls: + - pkg:pypi/pexpect + size: 53600 + timestamp: 1706113273252 - kind: conda name: pkginfo version: 1.10.0 @@ -2993,66 +2820,49 @@ packages: - pkg:pypi/pkginfo size: 28142 timestamp: 1709561205511 -- kind: conda - name: pkgutil-resolve-name - version: 1.3.10 - build: pyhd8ed1ab_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - sha256: fecf95377134b0e8944762d92ecf7b0149c07d8186fb5db583125a2705c7ea0a - md5: 405678b942f2481cecdb3e010f4925d9 - depends: - - python >=3.6 - license: MIT AND PSF-2.0 - purls: - - pkg:pypi/pkgutil-resolve-name - size: 10778 - timestamp: 1694617398467 - kind: conda name: platformdirs - version: 4.2.0 + version: 4.2.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda - sha256: 2ebfb971236ab825dd79dd6086ea742a9901008ffb9c6222c1f2b5172a8039d3 - md5: a0bc3eec34b0fab84be6b2da94e98e20 + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + sha256: 5718fef2954f016834058ae1d359e407ff8e2e847b35ab43d5d91bcf22d5578d + md5: d478a8a3044cdff1aa6e62f9269cefe0 depends: - python >=3.8 license: MIT license_family: MIT purls: - pkg:pypi/platformdirs - size: 20210 - timestamp: 1706713564353 + size: 20248 + timestamp: 1713912912262 - kind: conda name: pluggy - version: 1.4.0 + version: 1.5.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda - sha256: 6edfd2c41938ea772096c674809bfcf2ebb9bef7e82de6c7ea0b966b86bfb4d0 - md5: 139e9feb65187e916162917bb2484976 + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + sha256: 33eaa3359948a260ebccf9cdc2fd862cea5a6029783289e13602d8e634cd9a26 + md5: d3483c8fc2dc2cc3f5cf43e26d60cabf depends: - python >=3.8 license: MIT license_family: MIT purls: - pkg:pypi/pluggy - size: 23384 - timestamp: 1706116931972 + size: 23815 + timestamp: 1713667175451 - kind: conda name: pre-commit - version: 3.7.0 + version: 3.7.1 build: pyha770c72_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda - sha256: b7a1d56fb1374df77019521bbcbe109ff17337181c4d392918e5ec1a10a9df87 - md5: 846ba0877cda9c4f11e13720cacd1968 + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + sha256: 689c169ce6ed5d516d8524cc1e6ef2687dff19747c1ed1ee9b347a71f47ff12d + md5: 724bc4489c1174fc8e3233b0624fa51f depends: - cfgv >=2.0.0 - identify >=1.0.0 @@ -3062,161 +2872,26 @@ packages: - virtualenv >=20.10.0 license: MIT license_family: MIT - size: 180574 - timestamp: 1711480432386 + purls: + - pkg:pypi/pre-commit + size: 179748 + timestamp: 1715432871404 - kind: conda - name: prompt-toolkit - version: 3.0.42 - build: pyha770c72_0 + name: ptyprocess + version: 0.7.0 + build: pyhd3deb0d_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.42-pyha770c72_0.conda - sha256: 58525b2a9305fb154b2b0d43a48b9a6495441b80e4fbea44f2a34a597d2cef16 - md5: 0bf64bf10eee21f46ac83c161917fa86 - depends: - - python >=3.7 - - wcwidth - constrains: - - prompt_toolkit 3.0.42 - license: BSD-3-Clause - license_family: BSD - size: 270398 - timestamp: 1702399557137 -- kind: conda - name: prompt_toolkit - version: 3.0.42 - build: hd8ed1ab_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.42-hd8ed1ab_0.conda - sha256: fd2185d501bf34cb4c121f2f5ade9157ac75e1644a9da81355c4c8f9c1b82d4d - md5: 85a2189ecd2fcdd86e92b2d4ea8fe461 - depends: - - prompt-toolkit >=3.0.42,<3.0.43.0a0 - license: BSD-3-Clause - license_family: BSD - size: 6846 - timestamp: 1702399567048 -- kind: conda - name: psutil - version: 5.9.8 - build: py312h98912ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py312h98912ed_0.conda - sha256: 27e7f8f5d30c74439f39d61e21ac14c0cd03b5d55f7bf9f946fb619016f73c61 - md5: 3facaca6cc0f7988df3250efccd32da3 - depends: - - libgcc-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/psutil - size: 486243 - timestamp: 1705722547420 -- kind: conda - name: psutil - version: 5.9.8 - build: py312he37b823_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-5.9.8-py312he37b823_0.conda - sha256: a996bd5f878da264d1d3ba7fde717b0a2c158a86645efb1e899d087cca74832d - md5: cd6e99b9c5a623735161973b5f693a86 + url: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + sha256: fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a + md5: 359eeb6536da0e687af562ed265ec263 depends: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD + - python + license: ISC purls: - - pkg:pypi/psutil - size: 499490 - timestamp: 1705722767772 -- kind: conda - name: py-lief - version: 0.14.1 - build: py312h2721eaf_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/py-lief-0.14.1-py312h2721eaf_1.conda - sha256: 09e288c5a14f7469e551ab810e6e9e24c8fbe15e3e02004750e9754ade2979f6 - md5: b157344e38369e52964a83bf85ef93d4 - depends: - - __osx >=11.0 - - libcxx >=16 - - liblief 0.14.1 h3f3aa29_1 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: Apache - size: 539467 - timestamp: 1711566025401 -- kind: conda - name: py-lief - version: 0.14.1 - build: py312h7070661_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/py-lief-0.14.1-py312h7070661_1.conda - sha256: 8410ab9d798a10299133a0e105c3c50cf3cde1cc21bbd79eae3df6f8fd56e289 - md5: f69fc698e1625960fd3cc5cc796205f6 - depends: - - libgcc-ng >=12 - - liblief 0.14.1 hac33072_1 - - libstdcxx-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: Apache - size: 758297 - timestamp: 1711563364357 -- kind: conda - name: pybind11-abi - version: '4' - build: hd8ed1ab_3 - build_number: 3 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2 - sha256: d4fb485b79b11042a16dc6abfb0c44c4f557707c2653ac47c81e5d32b24a3bb0 - md5: 878f923dd6acc8aeb47a75da6c4098be - license: BSD-3-Clause - license_family: BSD - size: 9906 - timestamp: 1610372835205 -- kind: conda - name: pycosat - version: 0.6.6 - build: py312h02f2b3b_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pycosat-0.6.6-py312h02f2b3b_0.conda - sha256: 79622e905c3185fe96c57bf6c57b20c545e86b3a6e7da88f24dc50d03ddbe3a6 - md5: 4d07092345b6e66e580ce3cd9141c6da - depends: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - size: 86424 - timestamp: 1696356256622 -- kind: conda - name: pycosat - version: 0.6.6 - build: py312h98912ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pycosat-0.6.6-py312h98912ed_0.conda - sha256: b973d39eb9fd9625fe97e2fbb4b6f758ea47aa288f5f8c7769e3f36a3acbb5da - md5: 8f1c372e7b843167be885dc8229931c1 - depends: - - libgcc-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - size: 88549 - timestamp: 1696355931150 + - pkg:pypi/ptyprocess + size: 16546 + timestamp: 1609419417991 - kind: conda name: pycparser version: '2.22' @@ -3236,21 +2911,21 @@ packages: timestamp: 1711811634025 - kind: conda name: pygments - version: 2.17.2 + version: 2.18.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda - sha256: af5f8867450dc292f98ea387d4d8945fc574284677c8f60eaa9846ede7387257 - md5: 140a7f159396547e9799aa98f9f0742e + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + sha256: 78267adf4e76d0d64ea2ffab008c501156c108bb08fecb703816fb63e279780b + md5: b7f5c092b8f9800150d998a71b76d5a1 depends: - - python >=3.7 + - python >=3.8 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/pygments - size: 860425 - timestamp: 1700608076927 + size: 879295 + timestamp: 1714846885370 - kind: conda name: pyrepl version: 0.9.0 @@ -3312,19 +2987,19 @@ packages: timestamp: 1661604969727 - kind: conda name: pytest - version: 8.1.1 + version: 8.2.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda - sha256: 3c481d6b54af1a33c32a3f3eaa3e0971955431e7023db55808740cd062271c73 - md5: 94ff09cdedcb7b17e9cd5097ee2cfcff + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda + sha256: 02227fea7b50132a75fb223c2d796306ffebd4dc6324897455f17cb54d16683d + md5: 088ff7e08f4f10a06190468048c2a353 depends: - colorama - exceptiongroup >=1.0.0rc8 - iniconfig - packaging - - pluggy <2.0,>=1.4 + - pluggy <2.0,>=1.5 - python >=3.8 - tomli >=1 constrains: @@ -3333,8 +3008,8 @@ packages: license_family: MIT purls: - pkg:pypi/pytest - size: 255523 - timestamp: 1709992719691 + size: 257122 + timestamp: 1714308481448 - kind: conda name: pytest-cov version: 5.0.0 @@ -3351,53 +3026,112 @@ packages: - toml license: MIT license_family: MIT + purls: + - pkg:pypi/pytest-cov size: 25507 timestamp: 1711411153367 - kind: conda name: python - version: 3.12.2 - build: hab00c5b_0_cpython + version: 3.11.9 + build: h932a869_0_cpython + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.9-h932a869_0_cpython.conda + sha256: a436ceabde1f056a0ac3e347dadc780ee2a135a421ddb6e9a469370769829e3c + md5: 293e0713ae804b5527a673e7605c04fc + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.45.3,<4.0a0 + - libzlib >=1.2.13,<1.3.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.11.* *_cp311 + license: Python-2.0 + size: 14644189 + timestamp: 1713552154779 +- kind: conda + name: python + version: 3.11.9 + build: hb806964_0_cpython subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.2-hab00c5b_0_cpython.conda - sha256: ddb7a2d8d78046bda5d7631e6814f9468d2eb054e10f86f4648c9d1fdaa30c0f - md5: ad7b68400f3a6ebe72b00be093c7f301 + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda + sha256: 177f33a1fb8d3476b38f73c37b42f01c0b014fa0e039a701fd9f83d83aae6d40 + md5: ac68acfa8b558ed406c75e98d3428d7b depends: - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.5.0,<3.0a0 + - libexpat >=2.6.2,<3.0a0 - libffi >=3.4,<4.0a0 - libgcc-ng >=12 - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.45.1,<4.0a0 + - libsqlite >=3.45.3,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libxcrypt >=4.4.36 - libzlib >=1.2.13,<1.3.0a0 - - ncurses >=6.4,<7.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.12.* *_cp312 + - python_abi 3.11.* *_cp311 license: Python-2.0 - size: 32312631 - timestamp: 1708118077305 + size: 30884494 + timestamp: 1713553104915 - kind: conda name: python - version: 3.12.2 - build: hdf0ec26_0_cpython + version: 3.12.3 + build: h4a7b5fc_0_cpython subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.2-hdf0ec26_0_cpython.conda - sha256: ccd6c55a286d51d907c878ed2bfa7d1becce0fee71374a9386c5eb90d803ac72 - md5: 85e91138ae921a2771f57a50120272bd + url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.3-h4a7b5fc_0_cpython.conda + sha256: c761fb3713ea66bce3889b33b6f400afb2dd192d1fc2686446e9d8166cfcec6b + md5: 8643ab37bece6ae8f112464068d9df9c + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libzlib >=1.2.13,<1.3.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.12.* *_cp312 + license: Python-2.0 + size: 13207557 + timestamp: 1713206576646 +- kind: conda + name: python + version: 3.12.3 + build: hab00c5b_0_cpython + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda + sha256: f9865bcbff69f15fd89a33a2da12ad616e98d65ce7c83c644b92e66e5016b227 + md5: 2540b74d304f71d3e89c81209db4db84 depends: - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.5.0,<3.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.2,<3.0a0 - libffi >=3.4,<4.0a0 - - libsqlite >=3.45.1,<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,<1.3.0a0 - - ncurses >=6.4,<7.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 @@ -3406,8 +3140,8 @@ packages: constrains: - python_abi 3.12.* *_cp312 license: Python-2.0 - size: 13085901 - timestamp: 1708117361381 + size: 31991381 + timestamp: 1713208036041 - kind: conda name: python-dateutil version: 2.9.0 @@ -3441,6 +3175,8 @@ packages: - six license: GPL-3.0-or-later license_family: GPL + purls: + - pkg:pypi/python-debian size: 66742 timestamp: 1572978048259 - kind: conda @@ -3463,62 +3199,35 @@ packages: size: 86889 timestamp: 1705315869275 - kind: conda - name: python-libarchive-c - version: '5.1' - build: py312h7900ff3_0 + name: python_abi + version: '3.11' + build: 4_cp311 + build_number: 4 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python-libarchive-c-5.1-py312h7900ff3_0.conda - sha256: 243538d18db27dbb2c27453146c81386acc7909f32f9b7845980ad843ca9ed66 - md5: 5c766786ca3f47e406785553cfc05ce7 - depends: - - libarchive - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: CC0-1.0 - license_family: CC - purls: - - pkg:pypi/libarchive-c - size: 69718 - timestamp: 1709828706620 + url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda + sha256: 0be3ac1bf852d64f553220c7e6457e9c047dfb7412da9d22fbaa67e60858b3cf + md5: d786502c97404c94d7d58d258a445a65 + constrains: + - python 3.11.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6385 + timestamp: 1695147338551 - kind: conda - name: python-libarchive-c - version: '5.1' - build: py312h81bd7bf_0 + name: python_abi + version: '3.11' + build: 4_cp311 + build_number: 4 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python-libarchive-c-5.1-py312h81bd7bf_0.conda - sha256: ce2f6ea609799d379d2cc1fca01266b4d0af2f29cc7b5987f14a5440ef5c5f93 - md5: 9228b410f4d130823fc86407861c0527 - depends: - - libarchive - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: CC0-1.0 - license_family: CC - purls: - - pkg:pypi/libarchive-c - size: 70407 - timestamp: 1709829093907 -- kind: conda - name: python-slugify - version: 8.0.4 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/python-slugify-8.0.4-pyhd8ed1ab_0.conda - sha256: a1270bfd4f1d648766c8f95403f208e50d34af94761bc553a960102c6bff9fa0 - md5: 4b11845622b3c3178c0e989235b53975 - depends: - - python >=3.7 - - text-unidecode >=1.3 + url: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-4_cp311.conda + sha256: 4837089c477b9b84fa38a17f453e6634e68237267211b27a8a2f5ccd847f4e55 + md5: 8d3751bc73d3bbb66f216fa2331d5649 constrains: - - slugify <0 - - awesome-slugify <0 - - unidecode >=1.1.1 - license: MIT - license_family: MIT - size: 15127 - timestamp: 1707425775664 + - python 3.11.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6492 + timestamp: 1695147509940 - kind: conda name: python_abi version: '3.12' @@ -3582,6 +3291,8 @@ packages: - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT + purls: + - pkg:pypi/pyyaml size: 182705 timestamp: 1695373895409 - kind: conda @@ -3600,6 +3311,8 @@ packages: - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT + purls: + - pkg:pypi/pyyaml size: 196583 timestamp: 1695373632212 - kind: conda @@ -3634,86 +3347,26 @@ packages: size: 250351 timestamp: 1679532511311 - kind: conda - name: referencing - version: 0.34.0 + name: readme_renderer + version: '42.0' build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda - sha256: 2e631e9e1d49280770573f7acc7441b70181b2dc21948bb1be15eaae80550672 - md5: e4492c22e314be5c75db3469e3bbf3d9 - depends: - - attrs >=22.2.0 + url: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-42.0-pyhd8ed1ab_0.conda + sha256: 61e03765ebdb168fc8747e8183db4067b55888c89d59e0f4f53b5b4046846cda + md5: fdc16f5dc3a911d8f43f64f814a45961 + depends: + - cmarkgfm >=0.8.0 + - docutils >=0.13.1 + - nh3 >=0.2.14 + - pygments >=2.5.1 - python >=3.8 - - rpds-py >=0.7.0 - license: MIT - license_family: MIT + license: Apache-2.0 + license_family: APACHE purls: - - pkg:pypi/referencing - size: 42071 - timestamp: 1710763821612 -- kind: conda - name: reproc - version: 14.2.4.post0 - build: h93a5062_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-14.2.4.post0-h93a5062_1.conda - sha256: e12534c909613b56c539eed6f4cd55da2eb03086435101fad79c383a9c3df527 - md5: ef7ae6d7bb50c8c735551d825e1ea287 - license: MIT - license_family: MIT - size: 32026 - timestamp: 1698242638367 -- kind: conda - name: reproc - version: 14.2.4.post0 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.4.post0-hd590300_1.conda - sha256: bb2e4e0ce93bc61bc7c03c4f66abcb8161b0a4f1c41b5156cf1e5e17892b05d8 - md5: 82ca53502dfd5a64a80dee76dae14685 - depends: - - libgcc-ng >=12 - license: MIT - license_family: MIT - size: 33928 - timestamp: 1698242272153 -- kind: conda - name: reproc-cpp - version: 14.2.4.post0 - build: h59595ed_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.4.post0-h59595ed_1.conda - sha256: 8f0c6852471c0f2b02ab21d7c2877e30fc7f4d7d8034ca90bd9fdc3a22277fe9 - md5: 715e1d720ec1a03715bebd237972fca5 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - reproc 14.2.4.post0 hd590300_1 - license: MIT - license_family: MIT - size: 25379 - timestamp: 1698242302911 -- kind: conda - name: reproc-cpp - version: 14.2.4.post0 - build: h965bd2d_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-cpp-14.2.4.post0-h965bd2d_1.conda - sha256: 83736a55ff9cf3a54591aa44c3ee1181cd570c0a452b8d8a2ab113f3e0b0974b - md5: f81d00496e13ee828f84b3ef17e41346 - depends: - - __osx >=10.9 - - libcxx >=16.0.6 - - reproc 14.2.4.post0 h93a5062_1 - license: MIT - license_family: MIT - size: 24527 - timestamp: 1698242706531 + - pkg:pypi/readme-renderer + size: 17373 + timestamp: 1694242843889 - kind: conda name: requests version: 2.31.0 @@ -3778,6 +3431,23 @@ packages: - pkg:pypi/reuse size: 146563 timestamp: 1705680540750 +- kind: conda + name: rfc3986 + version: 2.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_0.tar.bz2 + sha256: dd6bfb7c4248ba7612f2e6e4a066d6804ba96dfcaeddf43475a2c846ccfcc396 + md5: d337886e38f965bf97aaec382ff6db00 + depends: + - python >=3.4 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/rfc3986 + size: 34075 + timestamp: 1641825125307 - kind: conda name: rich version: 13.7.1 @@ -3794,153 +3464,20 @@ packages: - typing_extensions >=4.0.0,<5.0.0 license: MIT license_family: MIT + purls: + - pkg:pypi/rich size: 184347 timestamp: 1709150578093 -- kind: conda - name: ripgrep - version: 14.1.0 - build: h5ef7bb8_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ripgrep-14.1.0-h5ef7bb8_0.conda - sha256: 9a44c36b8d26fee6efee90bb4c2976ea3f9d29ed028f0188fb51b36525635f75 - md5: e24b0b5c662ec0ba685c5ce7cb38ef42 - constrains: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 1420792 - timestamp: 1705521277663 -- kind: conda - name: ripgrep - version: 14.1.0 - build: he8a937b_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ripgrep-14.1.0-he8a937b_0.conda - sha256: 4fcf37724b87440765cb3c6cf573e99d12fc631001426a0309d132f495c3d62a - md5: 5a476f7033a8a1b9175626b5ebf86d1d - depends: - - libgcc-ng >=12 - license: MIT - license_family: MIT - size: 1683808 - timestamp: 1705520837423 -- kind: conda - name: rpds-py - version: 0.18.0 - build: py312h4b3b743_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.0-py312h4b3b743_0.conda - sha256: 7d8ca38e56db7f803dbc42240bd1918d6084f01cfd56e252a7121c5cdf850191 - md5: cc8165b34bdb002ade83b068f44e5774 - depends: - - libgcc-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/rpds-py - size: 919366 - timestamp: 1707922953470 -- kind: conda - name: rpds-py - version: 0.18.0 - build: py312h77200ec_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.18.0-py312h77200ec_0.conda - sha256: 3848b40a75246402ce99793cca8f0974c835952be3e215cbe4e6d6b8bbd49c30 - md5: d28b1b0c190d1c0166449b1641801842 - depends: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/rpds-py - size: 294636 - timestamp: 1707923464809 -- kind: conda - name: ruamel.yaml - version: 0.18.6 - build: py312h98912ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py312h98912ed_0.conda - sha256: 26856daba883254736b7f3767c08f445b5d010eebbf4fc7aa384ee80e24aa663 - md5: a99a06a875138829ef65f44bbe2c30ca - depends: - - libgcc-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - ruamel.yaml.clib >=0.1.2 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ruamel-yaml - size: 268015 - timestamp: 1707298336196 -- kind: conda - name: ruamel.yaml - version: 0.18.6 - build: py312he37b823_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml-0.18.6-py312he37b823_0.conda - sha256: 4a27b50445842e97a31e3f412816d4a0d576b4f1ee327b9a892a183ba5c60f6f - md5: cb9f9b4797001b2c52383f4007fa1f4b - depends: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - ruamel.yaml.clib >=0.1.2 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ruamel-yaml - size: 268637 - timestamp: 1707298502612 -- kind: conda - name: ruamel.yaml.clib - version: 0.2.8 - build: py312h98912ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py312h98912ed_0.conda - sha256: 5965302881d8b1049291e3ba3912286cdc72cb82303230cbbf0a048c6f6dd7c1 - md5: 05f31c2a79ba61df8d6d903ce4a4ce7b - depends: - - libgcc-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - size: 135640 - timestamp: 1707314642857 -- kind: conda - name: ruamel.yaml.clib - version: 0.2.8 - build: py312he37b823_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.8-py312he37b823_0.conda - sha256: c3138824f484cca2804d22758c75965b578cd35b35243ff02e64da06bda03477 - md5: 2fa02324046cfcb7a67fae30fd06a945 - depends: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - size: 111221 - timestamp: 1707315016121 - kind: conda name: ruff - version: 0.3.5 - build: py312h1ae9fbf_0 + version: 0.4.4 + build: py312h3402d49_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.3.5-py312h1ae9fbf_0.conda - sha256: 5296fa79876620d8265163b57a718ed17c271c05e95281fdae722591349e146b - md5: 0f3eea1aaceaeefe6007431c3ed547c5 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.4.4-py312h3402d49_0.conda + sha256: 09f47bd451076a28db84ceb9552d9c318402d8768b12a466cb503a39600da905 + md5: ed152476a82a8ebae71ce4eb335cb725 depends: + - __osx >=11.0 - libcxx >=16 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython @@ -3951,16 +3488,16 @@ packages: license_family: MIT purls: - pkg:pypi/ruff - size: 5771748 - timestamp: 1712000754650 + size: 5808812 + timestamp: 1715290154581 - kind: conda name: ruff - version: 0.3.5 - build: py312h9118e91_0 + version: 0.4.4 + build: py312h5715c7c_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.3.5-py312h9118e91_0.conda - sha256: fe8320ae9f369adb60990ab5e2d55246be58b1bb569f6753f8e566e958fc5475 - md5: a02f3dd98086ac515702e68e7fb88f62 + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.4.4-py312h5715c7c_0.conda + sha256: 23795ee023595be9e5c52736b280de4a2adb2082993615ee05e71e563628b266 + md5: b217a3a08f3cc3275822367a0a9abb54 depends: - libgcc-ng >=12 - libstdcxx-ng >=12 @@ -3970,39 +3507,63 @@ packages: license_family: MIT purls: - pkg:pypi/ruff - size: 6285718 - timestamp: 1711999610306 + size: 6280363 + timestamp: 1715289943071 +- kind: conda + name: secretstorage + version: 3.3.3 + build: py312h7900ff3_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py312h7900ff3_2.conda + sha256: 0479e3f8c8e90049a6d92d4c7e67916c6d6cdafd11a1a31c54c785cce44aeb20 + md5: 39067833cbb620066d492f8bd6f11dbf + depends: + - cryptography + - dbus + - jeepney >=0.6 + - python >=3.12.0rc3,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/secretstorage + size: 31766 + timestamp: 1695551875966 - kind: conda name: setuptools - version: 69.2.0 + version: 69.5.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda - sha256: 78a75c75a5dacda6de5f4056c9c990141bdaf4f64245673a590594d00bc63713 - md5: da214ecd521a720a9d521c68047682dc + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + sha256: 72d143408507043628b32bed089730b6d5f5445eccc44b59911ec9f262e365e7 + md5: 7462280d81f639363e6e63c81276bd9e depends: - python >=3.8 license: MIT license_family: MIT purls: - pkg:pypi/setuptools - size: 471183 - timestamp: 1710344615844 + size: 501790 + timestamp: 1713094963112 - kind: conda - name: sigtool - version: 0.1.3 - build: h44b9a77_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 - sha256: 70791ae00a3756830cb50451db55f63e2a42a2fa2a8f1bab1ebd36bbb7d55bff - md5: 4a2cac04f86a4540b8c9b8d8f597848f + name: shellingham + version: 1.5.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + sha256: 3c49a0a101c41b7cf6ac05a1872d7a1f91f1b6d02eecb4a36b605a19517862bb + md5: d08db09a552699ee9e7eec56b4eb3899 depends: - - openssl >=3.0.0,<4.0a0 + - python >=3.7 license: MIT license_family: MIT - size: 210264 - timestamp: 1643442231687 + purls: + - pkg:pypi/shellingham + size: 14568 + timestamp: 1698144516278 - kind: conda name: six version: 1.16.0 @@ -4091,18 +3652,18 @@ packages: timestamp: 1693929424267 - kind: conda name: sphinx - version: 7.2.6 + version: 7.3.7 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.2.6-pyhd8ed1ab_0.conda - sha256: 665d1fe6d20c6cc672ff20e6ebb405860f878b487d3d8d86a5952733fb7bbc42 - md5: bbfd1120d1824d2d073bc65935f0e4c0 + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda + sha256: 41101e2b0b8722087f06bd73251ba95ef89db515982b6a89aeebfa98ebcb65a1 + md5: 7b1465205e28d75d2c0e1a868ee00a67 depends: - - alabaster >=0.7,<0.8 + - alabaster >=0.7.14,<0.8.dev0 - babel >=2.9 - colorama >=0.4.5 - - docutils >=0.18.1,<0.21 + - docutils >=0.18.1,<0.22 - imagesize >=1.3 - importlib-metadata >=4.8 - jinja2 >=3.0 @@ -4117,30 +3678,31 @@ packages: - sphinxcontrib-jsmath - sphinxcontrib-qthelp - sphinxcontrib-serializinghtml >=1.1.9 + - tomli >=2.0 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/sphinx - size: 1281207 - timestamp: 1694647544854 + size: 1345378 + timestamp: 1713555005540 - kind: conda name: sphinx-autodoc-typehints - version: 2.0.0 + version: 2.1.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autodoc-typehints-2.0.0-pyhd8ed1ab_0.conda - sha256: 68c1278b8f9d284ae50411c7ed9a2687d45121bb8c0c21e4cabbd68b15c016e2 - md5: a62c457036381a498c95c18b8551e91c + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autodoc-typehints-2.1.0-pyhd8ed1ab_0.conda + sha256: f331eda04d540a0ebdceea03faaef6f1a57db93cc1ac74a71512e6a20cd4e125 + md5: ab586f5de577d96a890f0ffc48de7956 depends: - - python >=3.8 - - sphinx >=7.1.2 + - python >=3.9 + - sphinx >=7.3.5 license: MIT license_family: MIT purls: - pkg:pypi/sphinx-autodoc-typehints - size: 23309 - timestamp: 1707388700709 + size: 23394 + timestamp: 1713418816794 - kind: conda name: sphinx-basic-ng version: 1.0.0b2 @@ -4156,6 +3718,8 @@ packages: - sphinx >=4.0,<8.0 license: MIT license_family: MIT + purls: + - pkg:pypi/sphinx-basic-ng size: 20316 timestamp: 1690475062890 - kind: conda @@ -4321,38 +3885,6 @@ packages: - pkg:pypi/sphinxcontrib-serializinghtml size: 28776 timestamp: 1705118378942 -- kind: conda - name: tapi - version: 1100.0.11 - build: he4954df_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1100.0.11-he4954df_0.tar.bz2 - sha256: 1709265fbee693a9e8b4126b0a3e68a6c4718b05821c659279c1af051f2d40f3 - md5: d83362e7d0513f35f454bc50b0ca591d - depends: - - libcxx >=11.0.0.a0 - license: NCSA - license_family: MIT - size: 191416 - timestamp: 1602687595316 -- kind: conda - name: text-unidecode - version: '1.3' - build: pyhd8ed1ab_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_1.conda - sha256: db64669a918dec8c744f80a85b9c82216b79298256c7c8bd19bdba54a02f8914 - md5: ba8aba332d8868897ce44ad74015a7fe - depends: - - python >=3.4 - license: Artistic-1.0-Perl - license_family: OTHER - purls: - - pkg:pypi/text-unidecode - size: 65029 - timestamp: 1694707244466 - kind: conda name: tk version: 8.6.13 @@ -4419,87 +3951,99 @@ packages: size: 15940 timestamp: 1644342331069 - kind: conda - name: tomlkit - version: 0.12.4 - build: pyha770c72_0 + name: tomli-w + version: 1.0.0 + build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.4-pyha770c72_0.conda - sha256: 8d45c266bf919788abacd9828f4a2101d7216f6d4fc7c8d3417034fe0d795a18 - md5: 37c47ea93ef00dd80d880fc4ba21256a + url: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + sha256: efb5f78a224c4bb14aab04690c9912256ea12c3a8b8413e60167573ce1282b02 + md5: 73506d1ab4202481841c68c169b7ef6c depends: - python >=3.7 license: MIT license_family: MIT purls: - - pkg:pypi/tomlkit - size: 37173 - timestamp: 1709043886347 + - pkg:pypi/tomli-w + size: 10052 + timestamp: 1638551820635 - kind: conda - name: tqdm - version: 4.66.2 - build: pyhd8ed1ab_0 + name: tomlkit + version: 0.12.5 + build: pyha770c72_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.2-pyhd8ed1ab_0.conda - sha256: 416d1d9318f3267325ad7e2b8a575df20ff9031197b30c0222c3d3b023877260 - md5: 2b8dfb969f984497f3f98409a9545776 + url: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + sha256: 5117eff35992d896ca177dfffc08be8a9b3bf3d306ddc3d8bf4b699cdf1e1b79 + md5: e5dde5caf905e9d95895e05f94967e14 depends: - - colorama - python >=3.7 - license: MPL-2.0 or MIT + license: MIT + license_family: MIT purls: - - pkg:pypi/tqdm - size: 89567 - timestamp: 1707598746354 + - pkg:pypi/tomlkit + size: 37297 + timestamp: 1715185504185 - kind: conda - name: truststore - version: 0.8.0 + name: trove-classifiers + version: 2024.4.10 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/truststore-0.8.0-pyhd8ed1ab_0.conda - sha256: ba49bed74ca170c5a3bf995c33a6179fd74b33abb2444f511862e7f9f57f9149 - md5: 08316d001eca8854392cf2837828ea11 + url: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda + sha256: cbc8e5c5f82b1eeff7aa21aaff77757336c1e6d64a4255b071c783acd60f4618 + md5: 9622d541e2314c0207bebdc0359fa478 depends: - - python >=3.10 - license: MIT - license_family: MIT + - python >=3.7 + license: Apache-2.0 + license_family: Apache purls: - - pkg:pypi/truststore - size: 20667 - timestamp: 1694154740564 + - pkg:pypi/trove-classifiers + size: 18444 + timestamp: 1712814840654 - kind: conda - name: types-python-dateutil - version: 2.9.0.20240316 + name: twine + version: 5.0.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240316-pyhd8ed1ab_0.conda - sha256: 6630bbc43dfb72339fadafc521db56c9d17af72bfce459af195eecb01163de20 - md5: 7831efa91d57475373ee52fb92e8d137 + url: https://conda.anaconda.org/conda-forge/noarch/twine-5.0.0-pyhd8ed1ab_0.conda + sha256: 8dd14197546abf76980994db8d4e0ac861b395750d2968d259a38e80ed3e8013 + md5: e3482aff5aebc831cba9ac6b74395c6c depends: - - python >=3.6 - license: Apache-2.0 AND MIT - size: 21769 - timestamp: 1710590028155 + - importlib_metadata >=3.6 + - keyring >=15.1 + - pkginfo >=1.8.1 + - python >=3.8 + - readme_renderer >=35.0 + - requests >=2.20 + - requests-toolbelt >=0.8.0,!=0.9.0 + - rfc3986 >=1.4.0 + - rich >=12.0.0 + - urllib3 >=1.26.0 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/twine + size: 32579 + timestamp: 1707690947551 - kind: conda name: typing_extensions - version: 4.10.0 + version: 4.11.0 build: pyha770c72_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda - sha256: 4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451 - md5: 16ae769069b380646c47142d719ef466 + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda + sha256: a7e8714d14f854058e971a6ed44f18cc37cc685f98ddefb2e6b7899a0cc4d1a2 + md5: 6ef2fc37559256cf682d8b3375e89b80 depends: - python >=3.8 license: PSF-2.0 license_family: PSF purls: - pkg:pypi/typing-extensions - size: 37018 - timestamp: 1708904796013 + size: 37583 + timestamp: 1712330089194 - kind: conda name: tzdata version: 2024a @@ -4529,6 +4073,8 @@ packages: - python_abi 3.12.* *_cp312 license: MIT license_family: MIT + purls: + - pkg:pypi/ukkonen size: 13948 timestamp: 1695549890285 - kind: conda @@ -4548,6 +4094,8 @@ packages: - python_abi 3.12.* *_cp312 license: MIT license_family: MIT + purls: + - pkg:pypi/ukkonen size: 14050 timestamp: 1695549556745 - kind: conda @@ -4570,60 +4118,93 @@ packages: size: 94669 timestamp: 1708239595549 - kind: conda - name: virtualenv - version: 20.25.1 + name: userpath + version: 1.7.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda - sha256: 1ced4445cf72cd9dc344ad04bdaf703a08cc428c8c46e4bda928ad79786ee153 - md5: 8797a4e26be36880a603aba29c785352 + url: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 + sha256: c8cbddd625340e1b00b53bafabc764526ee85f7ddb91018424bab0eea057796d + md5: 5bf074c9253a3bf914becfc50757406f depends: - - distlib <1,>=0.3.7 - - filelock <4,>=3.12.2 - - platformdirs <5,>=3.9.1 - - python >=3.8 + - click + - python >=3.6 license: MIT license_family: MIT purls: - - pkg:pypi/virtualenv - size: 3148218 - timestamp: 1708602229963 + - pkg:pypi/userpath + size: 17423 + timestamp: 1632758637093 +- kind: conda + name: uv + version: 0.1.42 + build: h0ea3d13_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/uv-0.1.42-h0ea3d13_0.conda + sha256: e0a914f438575c0b7498f94eea40880ffd2030fba6af55c1bdaa6438e31ec685 + md5: 437bdf174ef88a618a3cde1e774af632 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: Apache-2.0 OR MIT + size: 12247166 + timestamp: 1715258525266 +- kind: conda + name: uv + version: 0.1.42 + build: hc069d6b_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.1.42-hc069d6b_0.conda + sha256: 52f197298bfb9c2419de18800f7227d61e557e0e5aec9bed9d66a9a7f1dae15a + md5: b1f10250e97c2d5180e3f31c58634776 + depends: + - __osx >=11.0 + - libcxx >=16 + constrains: + - __osx >=11.0 + license: Apache-2.0 OR MIT + size: 9090647 + timestamp: 1715258739944 - kind: conda - name: watchgod - version: 0.8.2 + name: versioningit + version: 3.1.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/watchgod-0.8.2-pyhd8ed1ab_0.tar.bz2 - sha256: 5139550cbd5d93cb6b3d4954267d21fdaccd81b816d421c7a8ee031f27432179 - md5: 8bf811791ff4ea8b6368b8ff451c6421 + url: https://conda.anaconda.org/conda-forge/noarch/versioningit-3.1.1-pyhd8ed1ab_0.conda + sha256: 9f90b1e10aae23761464407f2535de9b905df92a2d2c564a7f7fe3c64735dcbf + md5: d471782c9969774528f6d62ebc8a06d8 depends: - - anyio >=3.0.0,<4 + - importlib-metadata >=3.6 + - packaging >=17.1 - python >=3.7 + - tomli >=1.2,<3.0 license: MIT license_family: MIT purls: - - pkg:pypi/watchgod - size: 14983 - timestamp: 1648824691525 + - pkg:pypi/versioningit + size: 161217 + timestamp: 1714400685966 - kind: conda - name: wcwidth - version: 0.2.13 + name: virtualenv + version: 20.26.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda - sha256: b6cd2fee7e728e620ec736d8dfee29c6c9e2adbd4e695a31f1d8f834a83e57e3 - md5: 68f0738df502a14213624b288c60c9ad + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda + sha256: d603f8608f353a7aaa794c00bd3df71aafd5b56bf53af3e9c3dfe135203a4f33 + md5: 4e1cd2faf006a6e62c148f95cef0cac2 depends: + - distlib <1,>=0.3.7 + - filelock <4,>=3.12.2 + - platformdirs <5,>=3.9.1 - python >=3.8 license: MIT license_family: MIT purls: - - pkg:pypi/wcwidth - size: 32709 - timestamp: 1704731373922 + - pkg:pypi/virtualenv + size: 3459994 + timestamp: 1714439521015 - kind: conda name: wmctrl version: '0.5' @@ -4642,22 +4223,6 @@ packages: - pkg:pypi/wmctrl size: 10415 timestamp: 1695590958853 -- kind: conda - name: xdg - version: 6.0.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/xdg-6.0.0-pyhd8ed1ab_0.conda - sha256: d42e6523ae7b552faf24f0b9a8d6ad95f41720fccdaa1be548abd2ece5c095e0 - md5: b484cd48062264f3cc16b58572c21411 - depends: - - python >=3.6 - license: ISC - purls: - - pkg:pypi/xdg - size: 9808 - timestamp: 1677532487640 - kind: conda name: xz version: 5.2.6 @@ -4710,35 +4275,6 @@ packages: license_family: MIT size: 89141 timestamp: 1641346969816 -- kind: conda - name: yaml-cpp - version: 0.8.0 - build: h13dd4ca_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-cpp-0.8.0-h13dd4ca_0.conda - sha256: e65a52fb1c9821ba3a7a670d650314f8ff983865e77ba9f69f74e0906844943d - md5: e783a232972a5c7dca549111e63a78b2 - depends: - - libcxx >=15.0.7 - license: MIT - license_family: MIT - size: 130329 - timestamp: 1695712959746 -- kind: conda - name: yaml-cpp - version: 0.8.0 - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h59595ed_0.conda - sha256: a65bb5284369e548a15a44b14baf1f7ac34fa4718d7d987dd29032caba2ecf20 - md5: 965eaacd7c18eb8361fd12bb9e7a57d7 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: MIT - license_family: MIT - size: 204867 - timestamp: 1695710312002 - kind: conda name: zipp version: 3.17.0 diff --git a/pyproject.toml b/pyproject.toml index 44d7c0c7fd2b69e6a88915aabe0e98ba3fafc728..8ab0054a520231e6c8fdf7d15ae3523e31fc22dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,16 +24,13 @@ classifiers = [ ] dependencies = [ "click>=8", - "cookiecutter", "gitpython", "packaging", "python-dateutil", "python-gitlab", "pytz", - "pyyaml", "tomli", "tomlkit", - "xdg", ] [project.urls] @@ -64,24 +61,22 @@ platforms = ["linux-64", "osx-arm64"] [tool.pixi.dependencies] click = ">=8" -cookiecutter = "*" gitpython = "*" packaging = "*" python-dateutil = "*" python-gitlab = "*" pytz = "*" -pyyaml = "*" tomli = "*" tomlkit = "*" -xdg = "*" -# conda/mamba ecosystem dependencies -conda = "*" -conda-build = "*" -mamba = "*" -boa = "*" -[tool.pixi.pypi-dependencies] -idiap-devtools = { path = ".", editable = true, extras = ["qa", "doc", "test"] } +[tool.pixi.feature.self.pypi-dependencies] +idiap-devtools = { path = ".", editable = true } + +[tool.pixi.feature.py311.dependencies] +python = "~=3.11.0" + +[tool.pixi.feature.py312.dependencies] +python = "~=3.12.0" [tool.pixi.feature.qa.dependencies] pre-commit = "*" @@ -91,6 +86,7 @@ reuse = "*" [tool.pixi.feature.qa.tasks] qa-install = "pre-commit install" qa = "pre-commit run --all-files" +qa-ci = "pre-commit run --all-files --show-diff-on-failure --verbose" [tool.pixi.feature.doc.dependencies] sphinx = "*" @@ -102,7 +98,9 @@ sphinx-inline-tabs = "*" sphinx-click = "*" [tool.pixi.feature.doc.tasks] -doc = "rm -rf doc/api && rm -rf html && sphinx-build -aEW doc html" +doc-clean = "rm -rf doc/api && rm -rf html" +doc = "sphinx-build -aEW doc html" +doctest = "sphinx-build -aEb doctest doc html/doctest" [tool.pixi.feature.test.dependencies] pytest = "*" @@ -115,8 +113,25 @@ pdbpp = "*" test = "pytest -sv tests/" test-ci = "pytest -sv --cov-report 'html:html/coverage' --cov-report 'xml:coverage.xml' --junitxml 'junit-coverage.xml' --ignore '.profile' tests/" +[tool.pixi.feature.build.dependencies] +hatch = "*" +versioningit = "*" +twine = "*" + +[tool.pixi.feature.build.tasks] +build = "hatch build" +check = "twine check dist/*" +upload = "twine upload dist/*" + +[tool.pixi.feature.dev.dependencies] +pdbpp = "*" +uv = "*" + [tool.pixi.environments] -default = { features = [ "qa", "doc", "test", "debug" ] } +default = { features = ["qa", "build", "doc", "test", "dev", "py312", "self", "debug"] } +qa-ci = { features = ["qa", "py312"] } +build-ci = { features = ["build", "py312"] } +test-ci-alternative = { features = ["test", "py311", "self"] } [tool.hatch.version] source = "versioningit" diff --git a/src/idiap_devtools/click.py b/src/idiap_devtools/click.py index 96d1d0e741eb45a0134b7d77b75833c73aef7e90..ab4c7c9c4ef65852538da217ab88a8e94812c06b 100644 --- a/src/idiap_devtools/click.py +++ b/src/idiap_devtools/click.py @@ -7,8 +7,6 @@ import typing import click -from .profile import get_profile_path - def verbosity_option( logger: logging.Logger, @@ -168,37 +166,3 @@ class PreserveIndentCommand(click.Command): formatter.write_paragraph() for line in self.description.split("\n"): formatter.write_text(line) - - -def validate_profile(_: click.Context, __: str, value: str) -> str: - """Call back for click doing a profile name validation. - - Arguments: - - _: current command context - - __: The option being validated - - value: The value set for the option - - - Returns - ------- - The validated option value - """ - profile_path = get_profile_path(value) - if profile_path is None: - raise click.BadParameter( - "You have not provided a development profile path " - "(-P/--profile) option or set the `default' profile at " - "your configuration file. I need one of these to " - "load my development constants" - ) - - if not (profile_path / "profile.toml").exists(): - raise click.BadParameter( - f"Error while attempting to load the profile `{value}' from " - f"`{str(profile_path / 'profile.toml')}' - file does not exist!" - ) - - return value diff --git a/src/idiap_devtools/conda.py b/src/idiap_devtools/conda.py deleted file mode 100644 index 83c00e30f0ba6d6d9c5549320d01486e1ad6fa4c..0000000000000000000000000000000000000000 --- a/src/idiap_devtools/conda.py +++ /dev/null @@ -1,119 +0,0 @@ -# Copyright © 2022 Idiap Research Institute <contact@idiap.ch> -# -# SPDX-License-Identifier: BSD-3-Clause - -import contextlib -import copy -import logging -import pathlib -import typing - -from .utils import uniq - -logger = logging.getLogger(__name__) - - -@contextlib.contextmanager -def root_logger_protection(): - """Protect the root logger against spurious (conda) manipulation. - - Still to verify: conda does some operations on loggers at import, so - we may need to put the import inside this context manager too. - """ - root_logger = logging.getLogger() - level = root_logger.level - handlers = copy.copy(root_logger.handlers) - - yield - - root_logger.setLevel(level) - root_logger.handlers = handlers - - -def make_conda_config( - options: dict[str, typing.Any], -) -> typing.Any: - """Create a conda configuration for a build merging various sources. - - This function will use the conda-build API to construct a configuration by - merging different sources of information. - - - Arguments: - - options: A dictionary (typically read from a condarc YAML file) that - contains build and channel options - - Returns - ------- - A dictionary containing the merged configuration, as produced by - conda-build API's ``get_or_merge_config()`` function. - """ - - with root_logger_protection(): - import conda_build.api - - from conda.utils import url_path - - retval = conda_build.api.get_or_merge_config(None, **options) - - retval.channel_urls = [] - - for url in options["channels"]: - # allow people to specify relative or absolute paths to local channels - # These channels still must follow conda rules - they must have the - # appropriate platform-specific subdir (e.g. win-64) - url_ = pathlib.Path(url) - if url_.is_dir(): - if not url_.is_absolute(): - url = str(url_.resolve()) - with root_logger_protection(): - url = url_path(url) - retval.channel_urls.append(url) - - return retval - - -def use_mambabuild(): - """Inject mamba solver to conda build API to speed up resolves.""" - # only importing this module will do the job. - - with root_logger_protection(): - from boa.cli.mambabuild import prepare - - prepare() - - -def get_rendered_metadata(recipe_dir, config): - """Render the recipe and returns the interpreted YAML file.""" - with root_logger_protection(): - import conda_build.api - - # use mambabuild instead - use_mambabuild() - return conda_build.api.render(recipe_dir, config=config) - - -def get_parsed_recipe(metadata): - """Render the recipe and returns the interpreted YAML file.""" - with root_logger_protection(): - return metadata[0][0].get_rendered_recipe_text() - - -def remove_pins(deps): - """Return dependencies without their pinned versions.""" - return [ll.split()[0] for ll in deps] - - -def parse_dependencies(recipe_dir, config) -> tuple[str, list[str]]: - """Parse dependencies in a meta.yaml file.""" - metadata = get_rendered_metadata(recipe_dir, config) - recipe = get_parsed_recipe(metadata) - requirements = [] - for section in ("build", "host"): - requirements += remove_pins(recipe.get("requirements", {}).get(section, [])) - # we don't remove pins for the rest of the recipe - requirements += recipe.get("requirements", {}).get("run", []) - requirements += recipe.get("test", {}).get("requires", []) - - return recipe["package"]["name"], uniq(requirements) diff --git a/src/idiap_devtools/gitlab/release.py b/src/idiap_devtools/gitlab/release.py index 7e777a7e75f795010055e17d11b548559956542e..2f87d5e390c6894de661b829ca33eb3039c852a7 100644 --- a/src/idiap_devtools/gitlab/release.py +++ b/src/idiap_devtools/gitlab/release.py @@ -14,10 +14,6 @@ import packaging.requirements import packaging.version import tomlkit -from git import Repo - -from idiap_devtools.profile import Profile - logger = logging.getLogger(__name__) @@ -56,10 +52,14 @@ def _update_readme( } # matches the graphical badge in the readme's text with the given version - doc_image_re = re.compile(r"docs\-(" + "|".join(variants) + r")\-", re.VERBOSE) + doc_image_re = re.compile( + r"docs\-(" + "|".join(variants) + r")\-", re.VERBOSE | re.IGNORECASE + ) # matches all other occurrences we need to handle - branch_re = re.compile(r"/(" + "|".join(variants) + r")", re.VERBOSE) + branch_re = re.compile( + r"/(" + "|".join(variants) + r")", re.VERBOSE | re.IGNORECASE + ) new_contents = [] for line in contents.splitlines(): @@ -85,179 +85,30 @@ def _update_readme( return "\n".join(new_contents) + "\n" -def _pin_versions_of_packages_list( - packages_list: list[str], - dependencies_versions: list[packaging.requirements.Requirement], -) -> list[str]: - """Add its version to each package according to a dictionary of versions. - - Modifies ``packages_list`` in-place. - - Iterates over ``packages_list`` and sets the version to be the corresponding - one in ``dependencies_versions``. - - Edge cases: - - **Package not in ``dependencies_versions``**: The package will not be - pinned. - - **Package already has version specifier**: Raises a ``ValueError``. - - Arguments: - - packages_list: The packages to pin. - - dependencies_versions: All the known packages with their desired version - pinning. - - Raises - ------ - ``ValueError`` if a version in ``dependencies_versions`` conflicts with - an already present pinning in ``packages_list``. - """ - - # Check that there is not the same dependency twice in the pins - seen = set() - for d in dependencies_versions: - if d.name in seen: - raise NotImplementedError( - "Pinning with more than one specification per dependency not" - "supported." - ) - seen.add(d.name) - - # Make it easier to retrieve the dependency pin for each package. - dependencies_dict = {d.name: d for d in dependencies_versions} - - results = [] - - # package is the dependency we want to pin - for pkg_id, package in enumerate(packages_list): - results.append(package) - - # Get the dependency package version specifier if already present. - pkg_req = packaging.requirements.Requirement(package) - - if pkg_req.url is not None: - logger.warning( - "Ignoring dependency '%s' as it is specified with a url (%s).", - pkg_req.name, - pkg_req.url, - ) - - # Retrieve this dependency's constraint Requirement object - desired_pin = dependencies_dict.get(pkg_req.name) - - if desired_pin is None: - logger.warning( - "Dependency '%s' is not available in constraints. Skipping " - "pinning. Consider adding this package to your dev-profile " - "constraints file.", - pkg_req.name, - ) - continue - - # A Requirement is composed of: - # name[extras]@ url ; marker - # Or - # name[extras]specifier; marker - # Where extras and marker are optional - - # The following handles those different fields - - if desired_pin.url is not None: - logger.info( - "Pinning of %s will be done with a URL (%s).", - pkg_req.name, - desired_pin.url, - ) - else: - # Build the 'specs' field - if not desired_pin.specifier: - logger.warning( - "Dependency '%s' has no version specifier in constraints " - "'%s'. Skipping pinning.", - pkg_req.name, - desired_pin, - ) - continue - - # If version specifiers are already present in that dependency - if pkg_req.specifier: - raise ValueError( - f"You cannot specify a version for the dependency {pkg_req}" - ) - specs_str = str(desired_pin.specifier) - - # Build the 'marker' field - if pkg_req.marker is not None: - raise ValueError( - f"You can not specify a marker for the dependency {pkg_req}! " - f"({pkg_req.marker})" - ) - marker_str = "" - if desired_pin.marker is not None: - marker_str = f"; {desired_pin.marker}" - - # Build the 'extras' field - if len(pkg_req.extras) > 0: - raise ValueError( - f"You can not specify extras for the dependency {pkg_req}! " - f"({pkg_req.extras})" - ) - - extras_str = "" - if len(desired_pin.extras) > 0: - extras_str = f"[{','.join(desired_pin.extras)}]" - - # Assemble the dependency specification in one string - if desired_pin.url is not None: - final_str = "".join( - ( - pkg_req.name, - extras_str, - "@ ", - desired_pin.url, - " ", - marker_str, - ) - ) - else: - final_str = "".join((pkg_req.name, extras_str, specs_str, marker_str)) - - # Replace the package specification with the pinned version - packages_list[pkg_id] = str(packaging.requirements.Requirement(final_str)) - logger.debug("Package pinned: %s", packages_list[pkg_id]) - - return packages_list - - def _update_pyproject( contents: str, version: str, default_branch: str, update_urls: bool, - profile: Profile | None = None, ) -> str: """Update contents of pyproject.toml to make it release/latest ready. - - Sets the project.version field to the given version. - - Pins the dependencies version to the ones in the given dev-profile. - - Saves the dev-profile's url and commit in the pyproject.toml. + - Sets the project.version field to the given version, if the version is + not dynamic. - Updates the documentation URLs to point specifically to the given version. - Arguments: - - contents: Text of the ``pyproject.toml`` file from a package + Parameters + ---------- + contents + Text of the ``pyproject.toml`` file from a package + version + Format of the version string is '#.#.#' + default_branch + The name of the default project branch to use + update_urls + If set to ``True``, then also updates the relevant URL links + considering the version number provided at ``version``. - version: Format of the version string is '#.#.#' - - default_branch: The name of the default project branch to use - - update_urls: If set to ``True``, then also updates the relevant URL - links considering the version number provided at ``version``. - - profile: Used to retrieve and note the current dev-profile commit. Returns ------- @@ -275,102 +126,46 @@ def _update_pyproject( } data = tomlkit.loads(contents) + project = data.setdefault("project", {}) - if re.match(packaging.version.VERSION_PATTERN, version, re.VERBOSE) is not None: + if "version" in project.get("dynamic", []): + logger.info("Not setting project version on pyproject.toml as it is dynamic") + + elif ( + re.match( + packaging.version.VERSION_PATTERN, + version, + re.VERBOSE | re.IGNORECASE, + ) + is not None + ): logger.info( "Updating pyproject.toml version from '%s' to '%s'", data.get("project", {}).get("version", "unknown version"), version, ) - data["project"]["version"] = version + project["version"] = version else: logger.info( - "Not setting project version on pyproject.toml as it is " + f"Not setting project version on pyproject.toml as it is " f"not PEP-440 compliant (given value: `{version}')" ) - # Pinning of the dependencies packages version - if profile is not None: - dependencies_pins = profile.python_constraints() - - # Main dependencies - logger.info("Pinning versions of dependencies.") - pkg_deps = data.get("project", {}).get("dependencies", []) - ( - _pin_versions_of_packages_list( - packages_list=pkg_deps, - dependencies_versions=dependencies_pins, - ), + if update_urls: + # matches all other occurrences we need to handle + branch_re = re.compile( + r"/(" + "|".join(variants) + r")", re.VERBOSE | re.IGNORECASE ) - # Optional dependencies - opt_pkg_deps = data.get("project", {}).get("optional-dependencies", []) - for pkg_group in opt_pkg_deps: - logger.info( - "Pinning versions of optional dependencies group `%s`.", - pkg_group, - ) - _pin_versions_of_packages_list( - packages_list=opt_pkg_deps[pkg_group], - dependencies_versions=dependencies_pins, - ) - - # Registering dev-profile version - logger.info("Annotating pyproject with current dev-profile commit.") - logger.debug("Using dev-profile at '%s'", profile._basedir) # noqa: SLF001 - profile_repo = Repo(profile._basedir) # noqa: SLF001 - if profile_repo.is_dirty(): - raise RuntimeError( - "dev-profile was modified and is dirty! Unable to ensure a " - "commit corresponds to the current state of that repository. " - "Please commit and push your changes." - ) - logger.debug("Fetching origin of dev-profile.") - profile_repo.remotes.origin.fetch() - logger.debug("Checking that the local commits are available on origin.") - commits_ahead = [c for c in profile_repo.iter_commits("origin/main..HEAD")] - if len(commits_ahead) != 0: - raise RuntimeError( - "Local commits of dev-profile were not pushed to origin!\n" - f"(dev-profile HEAD is {len(commits_ahead)} commits ahead of " - "origin).\n " - "Please 'git push' your modifications or revert them.\n" - "We enforce this so a dev-profile version can always be " - "retrieved." - ) - logger.debug("Checking we are up to date with origin.") - commits_behind = [c for c in profile_repo.iter_commits("HEAD..origin/main")] - if len(commits_behind) != 0: - logger.warning( - "Your local dev-profile is not up to date with the origin " - "remote. It is fine as long as you know what you are doing, " - "but you should consider 'git pull' the latest changes.\n" - "(dev-profile HEAD is %d commits behind origin)", - len(commits_behind), + # sets the various URLs + urls = project.setdefault("urls", {}) + docurl = urls.get("documentation") + if (docurl is not None) and (branch_re.search(docurl) is not None): + replacement = ( + f"/v{version}" if version is not None else f"/{default_branch}" ) - # Actually add the dev-profile commit hash to pyproject.toml - data["profile"] = tomlkit.table() - data["profile"].add( - "repository_url", - tomlkit.item(profile_repo.remotes.origin.url).indent(4), - ) - data["profile"].add( - "commit_hash", - tomlkit.item(profile_repo.commit("HEAD").hexsha).indent(4), - ) - - if not update_urls: - return tomlkit.dumps(data) - - # matches all other occurrences we need to handle - branch_re = re.compile(r"/(" + "|".join(variants) + r")", re.VERBOSE) - - # sets the various URLs - url = data["project"].get("urls", {}).get("documentation") - if (url is not None) and (branch_re.search(url) is not None): - replacement = "/v%s" % version if version is not None else f"/{default_branch}" - data["project"]["urls"]["documentation"] = branch_re.sub(replacement, url) + urls["documentation"] = branch_re.sub(replacement, docurl) return tomlkit.dumps(data) @@ -397,10 +192,11 @@ def get_latest_tag_name( return None # create list of tags' names but ignore the first 'v' character in each name # also filter out non version tags + version_pattern_re = re.compile( + packaging.version.VERSION_PATTERN, re.VERBOSE | re.IGNORECASE + ) tag_names = [ - tag.name[1:] - for tag in latest_tags - if re.match(packaging.version.VERSION_PATTERN, tag.name[1:]) + tag.name[1:] for tag in latest_tags if version_pattern_re.match(tag.name) ] if not tag_names: # no tags were found. return None @@ -668,7 +464,6 @@ def release_package( tag_name: str, tag_comments: str, dry_run: bool = False, - profile: Profile | None = None, ) -> int | None: """Release a package. @@ -676,20 +471,16 @@ def release_package( such as ``README.md`` and ``pyproject.toml`` will be updated according to the release procedures. - - Arguments: - - gitpkg: gitlab package object - - tag_name: The name of the release tag - - tag_comments_list: New annotations for this tag in a form of list - - dry_run: If ``True``, nothing will be committed or pushed to GitLab - - profile: An instance of :class:`idiap_devtools.profile.Profile` used to - retrieve the specifiers to pin the package's dependencies in - ``pyproject.toml``. + Parameters + ---------- + gitpkg + gitlab package object + tag_name + The name of the release tag + tag_comments_list + New annotations for this tag in a form of list + dry_run + If ``True``, nothing will be committed or pushed to GitLab Returns ------- @@ -721,7 +512,6 @@ def release_package( version=version_number, default_branch=gitpkg.default_branch, update_urls=True, - profile=profile, ) if dry_run: d = _get_differences( @@ -733,7 +523,7 @@ def release_package( update_files_at_default_branch( gitpkg, {"README.md": readme_contents, "pyproject.toml": pyproject_contents}, - "Increased stable version to %s" % version_number, + f"Increased stable version to {version_number}", dry_run, ) @@ -777,7 +567,7 @@ def release_package( "README.md": readme_contents_orig, "pyproject.toml": pyproject_contents_latest, }, - "Increased latest version to %s [skip ci]" % next_version_number, + f"Increased latest version to {next_version_number} [skip ci]", dry_run, ) if dry_run: diff --git a/src/idiap_devtools/profile.py b/src/idiap_devtools/profile.py deleted file mode 100644 index b226971f5c104214510b1a7301359dcda4520950..0000000000000000000000000000000000000000 --- a/src/idiap_devtools/profile.py +++ /dev/null @@ -1,331 +0,0 @@ -# Copyright © 2022 Idiap Research Institute <contact@idiap.ch> -# -# SPDX-License-Identifier: BSD-3-Clause - -import io -import pathlib -import typing - -import packaging.requirements -import tomli -import xdg -import yaml - -from .logging import setup - -logger = setup(__name__) - -OLD_USER_CONFIGURATION = xdg.xdg_config_home() / "devtools.toml" -"""The previous default location for the user configuration file.""" - -USER_CONFIGURATION = xdg.xdg_config_home() / "idiap-devtools.toml" -"""The default location for the user configuration file.""" - - -def load(directory: pathlib.Path) -> dict[str, typing.Any]: - """Load a profile TOML file, returns a dictionary with contents.""" - with (directory / "profile.toml").open("rb") as f: - return tomli.load(f) - - -def get_profile_path(name: str | pathlib.Path) -> pathlib.Path | None: - """Return the local directory of the named profile. - - If the input name corresponds to an existing directory, then that is - returned. Otherwise, we lookup the said name inside the user - configuration. If one exists, then the path pointed by that variable is - returned. Otherwise, an exception is raised. - - - Arguments: - - name: The name of the local profile to return - can be either an - existing path, or any name from the user configuration file. - - - Returns - ------- - Either ``None``, if the profile cannot be found, or a verified path, if - one is found. - """ - path = pathlib.Path(name) - - if path.exists() and path.is_dir(): - logger.debug(f"Returning path to profile {str(path)}...") - return path - - # makes the user move the configuration file quickly! - if OLD_USER_CONFIGURATION.exists(): - raise RuntimeError( - f"Move your configuration from " - f"{str(OLD_USER_CONFIGURATION)} to {str(USER_CONFIGURATION)}, " - f"and then re-run this application." - ) - - # if you get to this point, then no local directory with that name exists - # check the user configuration for a specific key - if USER_CONFIGURATION.exists(): - logger.debug(f"Loading user-configuration from {str(USER_CONFIGURATION)}...") - with USER_CONFIGURATION.open("rb") as f: - usercfg = tomli.load(f) - else: - usercfg = {} - - if name == "default": - value = usercfg.get("profiles", {}).get("default", None) - if value is None: - return None - name = value - - value = usercfg.get("profiles", {}).get(name, None) - if value is None: - logger.warning( - f"Requested profile `{name}' is not an existing directory " - f"or an existing profile key (may be you forgot to clone " - f"the relevant repository or setup your configuration file?)" - ) - return None - - return pathlib.Path(value).expanduser() - - -class Profile: - """A class representing the development profile. - - Arguments: - - path: The name of the local profile to return - can be either an - existing path, or any name from the user configuration file. - """ - - data: dict[str, typing.Any] #: A readout of the ``profile.toml`` file - _basedir: pathlib.Path - - def __init__(self, name: str | pathlib.Path): - basedir = get_profile_path(name) - if basedir is None: - raise FileNotFoundError( - f"Cannot find `profile.toml' in the input " - f"profile path or key: `{name}' (resolved to `{basedir}')" - ) - self._basedir = basedir - logger.info( - f"Loading development profile from `{name}' " - f"(resolved to `{basedir}')..." - ) - with (self._basedir / "profile.toml").open("rb") as f: - self.data = tomli.load(f) - - def conda_config( - self, python: str, public: bool, stable: bool - ) -> typing.Any: # Using Any as type, as either flake8, mypy, or sphinx - # will complain about conda otherwise. Will anyway be fixed when - # resolving https://gitlab.idiap.ch/software/idiap-devtools/-/issues/3 - """Build the conda-configuration to use based on the profile. - - Arguments: - - python: The python version in the format "X.Y" (e.g. "3.11" or - "3.12") - - private: Set to ``True`` if we should use private channels/indexes - to lookup dependencies. Should be ``False`` otherwise - - stable: Set to ``True`` if we should only consider stable versions - of packages, as opposed to pre-release ones (beta packages). Set - to ``False`` otherwise. - - return_type: - conda_build.config.Config: A dictionary containing the merged - configuration, as produced by conda-build API's - get_or_merge_config() function. - """ - - baserc = self.data.get("conda", {}).get("baserc") - if baserc is None: - condarc_options: dict[str, typing.Any] = dict(show_channel_urls=True) - else: - f = io.BytesIO(self.data["conda"]["baserc"].encode()) - condarc_options = yaml.load(f, Loader=yaml.FullLoader) - - channel_data = self.data.get("conda", {}).get("channels") - privacy_key = "public" if public else "private" - stability_key = "stable" if stable else "beta" - if channel_data is not None: - channels = channel_data[privacy_key][stability_key] - else: - channels = ["conda-forge"] - - condarc_options["channels"] = channels - - # incorporate constraints, if there are any - constraints = self.data.get("conda", {}).get("constraints") - if constraints is not None: - constraints_path = self._basedir / pathlib.Path(constraints) - condarc_options["variant_config_files"] = str(constraints_path) - - # detect append-file, if any - copy_files = self.data.get("conda", {}).get("build-copy") - if copy_files is not None: - append_file = [k for k in copy_files if k.endswith("recipe_append.yaml")] - if append_file: - condarc_options["append_sections_file"] = str( - self._basedir / append_file[0] - ) - - condarc_options["python"] = python - - conda_build_copy = self.data.get("conda", {}).get("build-copy", []) - append_file = [k for k in conda_build_copy if k != constraints] - append_file = append_file[0] if append_file else None - - from .conda import make_conda_config - - return make_conda_config(condarc_options) - - def python_indexes(self, public: bool, stable: bool) -> list[str]: - """Return Python indexes to be used according to the current profile. - - Arguments: - - private: Set to ``True`` if we should use private channels/indexes - to lookup dependencies. Should be ``False`` otherwise - - stable: Set to ``True`` if we should only consider stable versions - of packages, as opposed to pre-release ones (beta packages). Set - to ``False`` otherwise. - """ - indexes = self.data.get("python", {}).get("indexes") - privacy_key = "public" if public else "private" - stability_key = "stable" if stable else "beta" - if indexes is not None: - return indexes[privacy_key][stability_key] - - return [] if stable else ["--pre"] - - def get( - self, key: str | typing.Iterable[str], default: typing.Any = None - ) -> typing.Any: - """Read the contents of a certain toml profile variable.""" - - if isinstance(key, str): - return self.data.get(key, default) - - # key is a tuple of strings, iterate over the dictionary - d = self.data - for level in key: - d = d.get(level) - if d is None: - return default - return d - - def get_path( - self, - key: str | typing.Iterable[str], - default: None | pathlib.Path = None, - ) -> pathlib.Path | None: - """Read the contents of path from the profile and resolves it. - - This function will search for a given profile key, consider it points - to a path (relative or absolute) and will return that resolved path to - the caller. - - Arguments: - - key: The key, pointing to the variable inside ``profile.toml`` that - contains the datafile to be _load_conda_packages - - default: The value to return to the caller by default, if the key - does not exist within the profile. - - - Returns - ------- - The selected profile file path, or the contents of ``default`` - otherwise. - """ - - path = self.get(key) - - if path is None: - return default - - if isinstance(path, dict): - raise KeyError(f"Key {key} does not correspond to a path") - - ppath = pathlib.Path(path) - - if not ppath.is_absolute(): - ppath = self._basedir / ppath - - return ppath - - def get_file_contents( - self, key: str | typing.Iterable[str], default: None | str = None - ) -> str | None: - """Read the contents of a file from the profile. - - This function will search for a given profile key, consider it points - to a filename (relative or absolute) and will read its contents, - returning them to the caller. - - Arguments: - - key: The key, pointing to the variable inside ``profile.toml`` that - contains the datafile to be _load_conda_packages - - default: The value to return to the caller by default, if the key - does not exist within the profile. - - - Returns - ------- - The contents of the selected profile file, or the contents of - ``default`` otherwise. - """ - - path = self.get_path(key) - return path.open().read() if path is not None else default - - def conda_constraints(self, python: str) -> dict[str, str] | None: - """Return a list of conda constraints given the current profile. - - Arguments: - - python: The python version in the format "X.Y" (e.g. "3.9" or - "3.10") - """ - content = self.get_file_contents(("conda", "constraints")) - - if content is None: - return None - - idx1 = content.find("# AUTOMATIC PARSING START") - idx2 = content.find("# AUTOMATIC PARSING END") - content = content[idx1:idx2] - - # filter out using conda-build specific markers - from conda_build.metadata import ns_cfg, select_lines - - config = self.conda_config(python, public=True, stable=True) - content = select_lines(content, ns_cfg(config), variants_in_place=False) - - package_pins = yaml.safe_load(content) - - package_names_map = package_pins.pop("package_names_map") - - return { - f"{package_names_map.get(p, p)}": f"{str(v[0]).split(' ')[0]}" - for p, v in package_pins.items() - } - - def python_constraints( - self, - ) -> list[packaging.requirements.Requirement] | None: - """Return a list of Python requirements given the current profile.""" - content = self.get_file_contents(("python", "constraints")) - - if content is None: - return None - - return [packaging.requirements.Requirement(k) for k in content.split()] diff --git a/src/idiap_devtools/scripts/gitlab/badges.py b/src/idiap_devtools/scripts/badges.py similarity index 97% rename from src/idiap_devtools/scripts/gitlab/badges.py rename to src/idiap_devtools/scripts/badges.py index bdd9ff1545b319c96e6e71c39d378f4211b25473..b4fdadfb74adcee74406ca3830104ae83a2a3549 100644 --- a/src/idiap_devtools/scripts/gitlab/badges.py +++ b/src/idiap_devtools/scripts/badges.py @@ -4,8 +4,8 @@ import click -from ...click import PreserveIndentCommand, verbosity_option -from ...logging import setup +from ..click import PreserveIndentCommand, verbosity_option +from ..logging import setup logger = setup(__name__.split(".", 1)[0]) @@ -127,8 +127,8 @@ def badges(package, update_readme, dry_run, server, **_) -> None: import gitlab - from ...gitlab import get_gitlab_instance - from ...gitlab.release import update_files_at_default_branch + from ..gitlab import get_gitlab_instance + from ..gitlab.release import update_files_at_default_branch if dry_run: click.secho("!!!! DRY RUN MODE !!!!", fg="yellow", bold=True) diff --git a/src/idiap_devtools/scripts/gitlab/changelog.py b/src/idiap_devtools/scripts/changelog.py similarity index 97% rename from src/idiap_devtools/scripts/gitlab/changelog.py rename to src/idiap_devtools/scripts/changelog.py index a464ad12c5ec2f7f622da15408a456f006aaac59..65bea518f3dae6abf4c0ec5064730f02efae765b 100644 --- a/src/idiap_devtools/scripts/gitlab/changelog.py +++ b/src/idiap_devtools/scripts/changelog.py @@ -6,8 +6,8 @@ import sys import click -from ...click import PreserveIndentCommand, verbosity_option -from ...logging import setup +from ..click import PreserveIndentCommand, verbosity_option +from ..logging import setup logger = setup(__name__.split(".", 1)[0]) @@ -105,8 +105,8 @@ def changelog(target, output, mode, since, **_) -> None: import datetime import pathlib - from ...gitlab import get_gitlab_instance - from ...gitlab.changelog import ( + from ..gitlab import get_gitlab_instance + from ..gitlab.changelog import ( get_last_tag_date, parse_date, write_tags_with_commits, diff --git a/src/idiap_devtools/scripts/cli.py b/src/idiap_devtools/scripts/cli.py index de8593b816adfd512c8ee69bce8aeed75092693c..7c33c7301d054e86b68dd2546517319a9c526600 100644 --- a/src/idiap_devtools/scripts/cli.py +++ b/src/idiap_devtools/scripts/cli.py @@ -5,11 +5,17 @@ import click from ..click import AliasedGroup -from .env import env -from .fullenv import fullenv -from .gitlab import gitlab -from .pixi import pixi -from .update_pins import update_pins +from ..logging import setup +from .badges import badges +from .changelog import changelog +from .getpath import getpath +from .jobs import jobs +from .lasttag import lasttag +from .release import release +from .runners import runners +from .settings import settings + +logger = setup(__name__.split(".", 1)[0]) @click.group( @@ -17,13 +23,24 @@ from .update_pins import update_pins context_settings=dict(help_option_names=["-?", "-h", "--help"]), ) @click.version_option() -def cli(): - """Idiap development tools - see available commands below.""" +def cli() -> None: + """Commands that interact directly with GitLab. + + Commands defined here are supposed to interact with gitlab, and + add/modify/remove resources on it directly. + + To avoid repetitive asking, create a configuration file as indicated + at :ref:`idiap-devtools.install.setup.gitlab` section of the user + guide. + """ pass -cli.add_command(env) -cli.add_command(fullenv) -cli.add_command(gitlab) -cli.add_command(pixi) -cli.add_command(update_pins) +cli.add_command(changelog) +cli.add_command(release) +cli.add_command(badges) +cli.add_command(runners) +cli.add_command(jobs) +cli.add_command(getpath) +cli.add_command(lasttag) +cli.add_command(settings) diff --git a/src/idiap_devtools/scripts/env.py b/src/idiap_devtools/scripts/env.py deleted file mode 100644 index 77ea04c994cb08a847a85931599a645ad131d98a..0000000000000000000000000000000000000000 --- a/src/idiap_devtools/scripts/env.py +++ /dev/null @@ -1,440 +0,0 @@ -# Copyright © 2022 Idiap Research Institute <contact@idiap.ch> -# -# SPDX-License-Identifier: BSD-3-Clause - -import pathlib -import sys -import typing - -import click - -from ..click import PreserveIndentCommand, validate_profile, verbosity_option -from ..logging import setup -from ..profile import Profile - -logger = setup(__name__.split(".", 1)[0]) - - -def _load_conda_packages( - meta: list[pathlib.Path], conda_config: typing.Any -) -> tuple[list[pathlib.Path], list[str], list[str]]: - """Load dependence packages by scanning conda recipes. - - Input entries in ``meta`` may correspond to various types of entries, out - of which, we will not ignore in this function: - - * A full path to a ``meta.yaml`` file that will be scanned - * A project directory containing a conda recipe at ``conda/meta.yaml`` - * The name of a conda package to install (condition: does not contain a - path separator nor exists as a file or directory in the filesystem) - - - Arguments: - - meta: List of directories, conda recipes and conda package names to parse. - - conda_config: Profile-dependent conda configuration to use for - determining packages to install and constraints. - - - Returns - ------- - A list of non-consumed elements from the ``meta`` list, the list of - parsed package names, and finally the list of dependencies from the - parsed recipes. - """ - - import os - - from .. import conda, utils - - consumed = [] - parsed_packages = [] - conda_packages = [] - - for m in meta: - if m.name == "meta.yaml": - # user has passed the full path to the file - # we can consume this from the input list - recipe_dir = str(m.parent) - logger.info(f"Parsing conda recipe at {recipe_dir}...") - pkg_name, pkg_deps = conda.parse_dependencies(recipe_dir, conda_config) - logger.info(f"Added {len(pkg_deps)} packages from package '{pkg_name}'") - parsed_packages.append(pkg_name) - conda_packages += pkg_deps - consumed.append(m) - - elif (m / "conda" / "meta.yaml").exists(): - # it is the root of a project - # may need to parse it for python packages later on - recipe_dir = str(m / "conda") - logger.info(f"Parsing conda recipe at {recipe_dir}...") - pkg_name, pkg_deps = conda.parse_dependencies(recipe_dir, conda_config) - logger.info(f"Added {len(pkg_deps)} packages from package '{pkg_name}'") - parsed_packages.append(pkg_name) - conda_packages += pkg_deps - - elif not m.exists() and os.sep not in str(m): - # it is a conda package name, add to list of packages to install - # we can consume this from the input list - logger.info(f"Adding conda package {m}...") - conda_packages.append(str(m)) - consumed.append(m) - - meta = [k for k in meta if k not in consumed] - - # we should install all packages that have not been parsed yet - conda_packages = [k for k in conda_packages if k not in parsed_packages] - - # now we sort and make it unique - conda_packages = utils.uniq(sorted(conda_packages)) - - logger.info( - f"Adding {len(conda_packages)} conda packages to installation plan", - ) - return meta, parsed_packages, conda_packages - - -def _load_python_packages( - the_profile: Profile, - python: str, - meta: list[pathlib.Path], - conda_pkgs: list[str], -) -> tuple[list[pathlib.Path], list[str], list[str]]: - """Load dependence packages by scanning Python recipes. - - Input entries in ``meta`` may correspond to various types of entries, out - of which, we will not ignore in this function: - - * A full path to a ``pyproject.toml`` file that will be scanned - * A project directory containing a Python project declaration at - ``pyproject.toml`` - - - Arguments: - - the_profile: The current development profile, that will be looked up - for conda-to-Python package name translations. - - python: The version of Python to load conda constraints for - - meta: List of directories, and Python project definitions to scan - - conda_pkgs: List of conda packages that either have been parsed, or - are dependencies of parsed recipes. We must **not** install Python - equivalents for those. - - - Returns - ------- - A list of non-consumed elements from the ``meta`` list, the list of - pure-Python dependencies from the parsed recipes, that are not at - ``conda_pkgs`` and have no conda equivalents, and finally, an extension - to the list of conda packages that can be installed that way. - """ - - from .. import python as pyutils - from .. import utils - - parsed_packages = [k.split(" ", 1)[0] for k in conda_pkgs] - to_python = the_profile.get(("conda", "to_python"), {}) - parsed_packages = [to_python.get(k, k) for k in parsed_packages] - - consumed = [] - python_packages = [] - - for m in meta: - if m.name == "pyproject.toml": - # user has passed the full path to the file - # we can consume this from the input list - logger.info(f"Parsing Python package at {str(m)}...") - pkg_name, pkg_deps = pyutils.dependencies_from_pyproject_toml(m) - logger.info( - f"Added {len(pkg_deps)} Python packages from package '{pkg_name}'", - ) - parsed_packages.append(pkg_name) - python_packages += pkg_deps - consumed.append(m) - - elif (m / "pyproject.toml").exists(): - # it is the root of a project - proj = m / "pyproject.toml" - logger.info(f"Parsing Python package at {str(proj)}...") - pkg_name, pkg_deps = pyutils.dependencies_from_pyproject_toml(proj) - logger.info( - f"Added {len(pkg_deps)} Python packages from package '{pkg_name}'", - ) - parsed_packages.append(pkg_name) - python_packages += pkg_deps - consumed.append(m) - - meta = [k for k in meta if k not in consumed] - - # if there are equivalent conda-pinned packages, we should prefer them - # instead of pure-Python versions without any constraints - conda_constraints = the_profile.conda_constraints(python) - if conda_constraints is None: - conda_constraints = {} - - constrained = [k for k in python_packages if k.specifier] - unconstrained = [k for k in python_packages if not k.specifier] - - has_conda = [ - f"{k.name} {conda_constraints[k.name]}" - for k in unconstrained - if k.name in conda_constraints - ] - no_conda = [k for k in unconstrained if k.name not in conda_constraints] - - # we should install all packages that have not been parsed yet, and have no - # conda equivalent via Python/pip - python_packages_str = [ - str(k) for k in constrained + no_conda if k.name not in parsed_packages - ] - - # now we sort and make it unique - python_packages_str = utils.uniq(sorted(python_packages_str)) - - has_conda = utils.uniq(sorted(has_conda)) - - logger.info( - f"Adding {len(python_packages_str)} Python and {len(has_conda)} conda " - f"packages to installation plan", - ) - return meta, python_packages_str, has_conda - - -def _simplify_conda_plan(deps: list[str]) -> list[str]: - """Simplifies the conda package plan by removing reduntant entries.""" - from .. import utils - - pins_striped = [k.split()[0] for k in deps if len(k.split()) > 1] - no_pins = [k for k in deps if len(k.split()) == 1] - - keep_no_pins = [k for k in no_pins if k not in pins_striped] - - full_pins = [k for k in deps if len(k.split()) > 1] - return utils.uniq(sorted(keep_no_pins + full_pins)) - - -def _add_missing_conda_pins( - the_profile: Profile, python: str, deps: list[str] -) -> list[str]: - """Add pins to unpinned packages, to respect the profile.""" - - from .. import utils - - pinned_packages = the_profile.conda_constraints(python) - - if pinned_packages is None: - return deps - - no_pins = [k for k in deps if len(k.split()) == 1 and k in pinned_packages] - - no_change = [k for k in deps if k not in no_pins] - - new_pins = [f"{k} {v}" for k, v in pinned_packages.items() if k in no_pins] - - return utils.uniq(sorted(no_change + new_pins)) - - -@click.command( - cls=PreserveIndentCommand, - epilog=""" -Examples: - - 1. Creates a conda environment installation plan for developing the currently - checked-out package, and the development profile in ``../profile``: - - .. code:: sh - - $ git clone <package> - $ cd <package> - $ conda activate base - (base) devtool env -vv . - (base) $ mamba env create -n dev -f environment.yaml - (base) $ conda activate dev - (dev) $ pip install --no-build-isolation --no-dependencies --editable . - - You may, of course, hand-edit the output file ``environment.yaml`` to - adjust for details, add conda or Python packages you'd like to complement - your work environment. An example would be adding debuggers such as - ``ipdb`` to the installation plan before calling ``mamba env create``. - - 2. By default, we use the native Python version of your conda installation - as the Python version to use for the newly created environment. You may - select a different one with `--python=X.Y'. You may also set the output - filename with ``--output=name.yaml``, if the default does not please you: - - .. code:: sh - - $ conda activate base - (base) devtool env -vv --python=3.12 --output=whatever-i-like.yaml . - - 3. To develop multiple packages you checked out, just add the meta package - files of all packages you wish to consider, then pip-install the packages - on teh top of the created environment, in reverse dependence order - (e.g. package A depends on B): - - .. code:: sh - - $ mkdir dev-dir - $ cd dev-dir - $ git clone <repo-of-B> src/B - $ git clone <repo-of-A> src/A - $ conda activate base - (base) $ devtool env -vv src/* - (base) $ mamba env create -n dev -f environment.yaml - (base) $ conda activate dev - (dev) $ pip install --no-build-isolation --no-dependencies --editable "src/B" - (dev) $ pip install --no-build-isolation --no-dependencies --editable "src/A" - -""", -) -@click.argument( - "meta", - nargs=-1, - required=True, - type=click.Path(path_type=pathlib.Path), -) -@click.option( - "-P", - "--profile", - default="default", - show_default=True, - callback=validate_profile, - help="Directory containing the development profile (and a file named " - "profile.toml), or the name of a configuration key pointing to the " - "development profile to use", -) -@click.option( - "-p", - "--python", - default=("%d.%d" % sys.version_info[:2]), - show_default=True, - help="Version of python to build the environment for", -) -@click.option( - "-u/-U", - "--public/--no-public", - default=True, - help="Set this to **include** private channels/indexes on your plan. " - "For conda packages in this case, you **must** execute this within the " - "Idiap intranet.", -) -@click.option( - "-s/-S", - "--stable/--no-stable", - default=False, - help="Set this to **exclude** beta channels from your build", -) -@click.option( - "-o", - "--output", - default="environment.yaml", - show_default=True, - help="The name of the environment plan file", - type=click.Path(path_type=pathlib.Path), -) -@verbosity_option(logger=logger) -def env( - meta, - profile, - python, - public, - stable, - output, - **_, -) -> None: - """Create a development environment for one or more projects. - - The environment is created by scanning conda's ``meta.yaml`` and Python - ``pyproject.toml`` files for all input projects. All input that is not an - existing file path, is considered a supplemental conda package to be - installed. The environment is dumped to disk in the form of a - conda-installable YAML environment. The user may edit this file to add - Python packages that may be of interest. - - To interpret ``meta.yaml`` files found on the input directories, this - command uses the conda render API to discover all profile- constrained and - unconstrained packages to add to the new environment. - """ - - import shutil - - import yaml - - # 1. loads profile data - the_profile = Profile(profile) - - # 2. loads all conda package data, reset "meta" to remove consumed entries - conda_config = the_profile.conda_config(python, public, stable) - leftover_meta, conda_parsed, conda_packages = _load_conda_packages( - meta, conda_config - ) - # 3. loads all python package data, reset "meta" to remove consumed entries - ( - leftover_meta, - python_packages, - extra_conda_packages, - ) = _load_python_packages( - the_profile, python, leftover_meta, conda_parsed + conda_packages - ) - - # At this point, there shouldn't be anything else to consume - if leftover_meta: - logger.error( - f"Ended parsing with unconsumed entries from the command-line: " - f"{' ,'.join(str(leftover_meta))}" - ) - - # Adds python on the required version - conda_packages.append(f"python {python}") - conda_packages += extra_conda_packages - - # Always append pip, if that is not the case already - # we need it for the own package installation later on - conda_packages.append("pip") - - # Performs "easy" simplification: if a package appears in two entries, - # however one of them is a pin, keep only the pin - conda_packages = _simplify_conda_plan(conda_packages) - - # Adds missing pins - conda_packages = _add_missing_conda_pins(the_profile, python, conda_packages) - - # Write package installation plan, in YAML format - data: dict[str, typing.Any] = dict(channels=conda_config.channels) - - if python_packages: - conda_packages.append( - dict( # type: ignore - pip=the_profile.python_indexes(public, stable) + python_packages - ) - ) - - data["dependencies"] = conda_packages - - # backup previous installation plan, if one exists - if output.exists(): - backup = output.parent / (output.name + "~") - shutil.copy(output, backup) - - with output.open("w") as f: - import math - - yaml.dump(data, f, width=math.inf) - - click.echo( - "Run the following commands to create and prepare your development environment:" - ) - install_cmds = [ - f"mamba env create --force -n dev -f {output}", - "conda activate dev", - ] - for k in meta: - install_cmds.append( - f"pip install --no-build-isolation --no-dependencies --editable {k}", - ) - for k in install_cmds: - click.secho(k, fg="yellow", bold=True) diff --git a/src/idiap_devtools/scripts/fullenv.py b/src/idiap_devtools/scripts/fullenv.py deleted file mode 100644 index d60977255e7d9bad01eed519b0f923f44ad99956..0000000000000000000000000000000000000000 --- a/src/idiap_devtools/scripts/fullenv.py +++ /dev/null @@ -1,152 +0,0 @@ -# Copyright © 2022 Idiap Research Institute <contact@idiap.ch> -# -# SPDX-License-Identifier: BSD-3-Clause - -import pathlib -import sys - -import click - -from ..click import PreserveIndentCommand, validate_profile, verbosity_option -from ..logging import setup - -logger = setup(__name__.split(".", 1)[0]) - - -@click.command( - cls=PreserveIndentCommand, - epilog=""" -Examples: - - 1. Creates a development environment with all constrained packages (assumes - the ``default`` profile is configured): - - .. code:: sh - - $ conda activate base - (base) $ devtool fullenv -vv - (base) $ mamba env create -n dev -f environment.yaml - (base) $ conda activate dev - - 2. Creates a development environment with a specific profile: - - .. code:: sh - - $ conda activate base - (base) $ devtool fullenv -vv -P ../profile - (base) $ mamba env create -n dev -f environment.yaml - (base) $ conda activate dev - - - .. tip:: - - You may hand-edit the output file ``environment.yaml`` to adjust for - details, add conda or Python packages you'd like to complement your work - environment. An example would be adding debuggers such as ``ipdb`` to - the installation plan before calling ``mamba env create``. - -""", -) -@click.option( - "-P", - "--profile", - default="default", - show_default=True, - callback=validate_profile, - help="Directory containing the development profile (and a file named " - "profile.toml), or the name of a configuration key pointing to the " - "development profile to use", -) -@click.option( - "-p", - "--python", - default=("%d.%d" % sys.version_info[:2]), - show_default=True, - help="Version of python to build the environment for", -) -@click.option( - "-Y", - "--only-python/--no-only-python", - default=False, - show_default=True, - help="Only installs Python packages, and not conda packages " - "(except for Python itself, and pip)", -) -@click.option( - "-o", - "--output", - default="environment.yaml", - show_default=True, - help="The name of the environment plan file", - type=click.Path(path_type=pathlib.Path), -) -@verbosity_option(logger=logger) -def fullenv( - profile, - python, - only_python, - output, - **_, -) -> None: - """Create a development environment with all constrained packages.""" - - import shutil - import typing - - import yaml - - from ..profile import Profile - - the_profile = Profile(profile) - - base_environment = dict(python=python, pip=None) - - if only_python: - conda_packages = None - else: - conda_packages = the_profile.conda_constraints(python) - - if conda_packages is not None: - conda_packages.update(base_environment) - else: - conda_packages = base_environment - - python_packages = the_profile.python_constraints() - if python_packages is None: - python_packages = [] - - # filter out all conda packages already in the list - conda_to_python = the_profile.get(("conda", "to_python"), {}) - python_to_conda = {v: k for k, v in conda_to_python.items() if k != "__ignore__"} - python_packages = [ - k - for k in python_packages - if python_to_conda.get(k.name, k.name) not in conda_packages - ] - - data: dict[str, typing.Any] = dict(channels=["conda-forge"]) - - data["dependencies"] = sorted( - [f"{k} {v}" if v is not None else k for k, v in conda_packages.items()] - ) - - if python_packages: - data["dependencies"].append(dict(pip=sorted([str(k) for k in python_packages]))) - - # backup previous installation plan, if one exists - if output.exists(): - backup = output.parent / (output.name + "~") - shutil.copy(output, backup) - - with output.open("w") as f: - yaml.dump(data, f) - - click.echo( - "Run the following commands to create and prepare your development environment:" - ) - install_cmds = [ - f"mamba env create --force -n dev -f {output}", - "conda activate dev", - ] - for k in install_cmds: - click.secho(k, fg="yellow", bold=True) diff --git a/src/idiap_devtools/scripts/gitlab/getpath.py b/src/idiap_devtools/scripts/getpath.py similarity index 74% rename from src/idiap_devtools/scripts/gitlab/getpath.py rename to src/idiap_devtools/scripts/getpath.py index 93b2a1ce721cb08443c384a2480ab51a31809241..1cbac577d0aaff8567f721cc72db58e3f2581cbf 100644 --- a/src/idiap_devtools/scripts/gitlab/getpath.py +++ b/src/idiap_devtools/scripts/getpath.py @@ -4,8 +4,8 @@ import click -from ...click import PreserveIndentCommand, verbosity_option -from ...logging import setup +from ..click import PreserveIndentCommand, verbosity_option +from ..logging import setup logger = setup(__name__.split(".", 1)[0]) @@ -15,19 +15,12 @@ logger = setup(__name__.split(".", 1)[0]) epilog=""" Examples: - 1. Get the file ``profile.toml`` from software/dev-profile's default branch: - - .. code:: sh - - devtool gitlab getpath software/dev-profile profile.toml - - - 2. Get the directory ``gitlab`` (and eventual sub-directories) from + 1. Get the directory ``gitlab`` (and eventual sub-directories) from software/dev-profile: .. code:: sh - devtool gitlab getpath software/dev-profile gitlab + devtool getpath software/dev-profile gitlab """, ) @@ -48,7 +41,7 @@ def getpath(package, path, output, ref, **_) -> None: Files are downloaded and stored. Directories are recursed and fully downloaded to the client. """ - from ...gitlab import download_path, get_gitlab_instance + from ..gitlab import download_path, get_gitlab_instance if "/" not in package: raise RuntimeError('PACKAGE should be specified as "group/name"') diff --git a/src/idiap_devtools/scripts/gitlab/__init__.py b/src/idiap_devtools/scripts/gitlab/__init__.py deleted file mode 100644 index ad63e2b3d0ac9520ca43ca2ae359766630e3fa6a..0000000000000000000000000000000000000000 --- a/src/idiap_devtools/scripts/gitlab/__init__.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright © 2022 Idiap Research Institute <contact@idiap.ch> -# -# SPDX-License-Identifier: BSD-3-Clause - -import click - -from ...click import AliasedGroup -from ...logging import setup -from .badges import badges -from .changelog import changelog -from .getpath import getpath -from .jobs import jobs -from .lasttag import lasttag -from .release import release -from .runners import runners -from .settings import settings - -logger = setup(__name__.split(".", 1)[0]) - - -@click.group(cls=AliasedGroup) -def gitlab() -> None: - """Commands that interact directly with GitLab. - - Commands defined here are supposed to interact with gitlab, and - add/modify/remove resources on it directly. - - To avoid repetitive asking, create a configuration file as indicated - at :ref:`idiap-devtools.install.setup.gitlab` section of the user - guide. - """ - pass - - -gitlab.add_command(changelog) -gitlab.add_command(release) -gitlab.add_command(badges) -gitlab.add_command(runners) -gitlab.add_command(jobs) -gitlab.add_command(getpath) -gitlab.add_command(lasttag) -gitlab.add_command(settings) diff --git a/src/idiap_devtools/scripts/gitlab/jobs.py b/src/idiap_devtools/scripts/jobs.py similarity index 93% rename from src/idiap_devtools/scripts/gitlab/jobs.py rename to src/idiap_devtools/scripts/jobs.py index 94ed08f9b1146f31890300f727fe0cf56ec8e86d..7c71fa6a1aa51048e0f914554ce9e7311d8abbe4 100644 --- a/src/idiap_devtools/scripts/gitlab/jobs.py +++ b/src/idiap_devtools/scripts/jobs.py @@ -4,8 +4,8 @@ import click -from ...click import PreserveIndentCommand, verbosity_option -from ...logging import setup +from ..click import PreserveIndentCommand, verbosity_option +from ..logging import setup logger = setup(__name__.split(".", 1)[0]) @@ -50,7 +50,7 @@ Examples: @verbosity_option(logger=logger) def jobs(status, tags, **_) -> None: """List jobs on a given runner identified by description.""" - from ...gitlab import get_gitlab_instance + from ..gitlab import get_gitlab_instance gl = get_gitlab_instance() diff --git a/src/idiap_devtools/scripts/gitlab/lasttag.py b/src/idiap_devtools/scripts/lasttag.py similarity index 90% rename from src/idiap_devtools/scripts/gitlab/lasttag.py rename to src/idiap_devtools/scripts/lasttag.py index e9dcfa206445bd5e41d391df1fda1709b1411d6d..b651b0f0299555a6f5d1bd1d98c39f657b206a0f 100644 --- a/src/idiap_devtools/scripts/gitlab/lasttag.py +++ b/src/idiap_devtools/scripts/lasttag.py @@ -4,8 +4,8 @@ import click -from ...click import PreserveIndentCommand, verbosity_option -from ...logging import setup +from ..click import PreserveIndentCommand, verbosity_option +from ..logging import setup logger = setup(__name__.split(".", 1)[0]) @@ -36,8 +36,8 @@ def lasttag(package, **_) -> None: """Return the last tag information on a given PACKAGE.""" import gitlab - from ...gitlab import get_gitlab_instance - from ...gitlab.changelog import parse_date + from ..gitlab import get_gitlab_instance + from ..gitlab.changelog import parse_date if "/" not in package: raise RuntimeError('PACKAGE should be specified as "group/name"') diff --git a/src/idiap_devtools/scripts/pixi.py b/src/idiap_devtools/scripts/pixi.py deleted file mode 100644 index 5038231f019199a5f4a256ce83e5d93a603ca5bd..0000000000000000000000000000000000000000 --- a/src/idiap_devtools/scripts/pixi.py +++ /dev/null @@ -1,242 +0,0 @@ -# Copyright © 2022 Idiap Research Institute <contact@idiap.ch> -# -# SPDX-License-Identifier: BSD-3-Clause - -import pathlib -import sys - -import click - -from ..click import PreserveIndentCommand, validate_profile, verbosity_option -from ..logging import setup - -logger = setup(__name__.split(".", 1)[0]) - - -@click.command( - cls=PreserveIndentCommand, - epilog=""" -Examples: - - 1. Creates a **draft** pixi configuration file for a project you just checked - out: - - .. code:: sh - - $ devtool pixi -vv . - $ pixi run python - ... - >>> - - 2. Creates a draft pixi configuration file for a project you checked out at - directory my-project: - - .. code:: sh - - $ devtool pixi -vv my-project - $ cd my-project - $ pixi run python - ... - >>> - - .. tip:: - - You may hand-edit the output file ``pixi.toml`` to adjust for details, - add conda or Python packages you'd like to complement your work - environment. An example would be adding debuggers such as ``pdbpp`` to - the installation plan. - -""", -) -@click.argument( - "project-dir", - nargs=1, - required=True, - type=click.Path(path_type=pathlib.Path), -) -@click.option( - "-P", - "--profile", - default="default", - show_default=True, - callback=validate_profile, - help="Directory containing the development profile (and a file named " - "profile.toml), or the name of a configuration key pointing to the " - "development profile to use", -) -@click.option( - "-p", - "--python", - default=("%d.%d" % sys.version_info[:2]), - show_default=True, - help="Version of python to build the environment for", -) -@verbosity_option(logger=logger) -def pixi( - project_dir, - profile, - python, - **_, -) -> None: - """Create a pixi recipe for a project.""" - - import shutil - - import packaging.requirements - - from ..profile import Profile - - the_profile = Profile(profile) - - python_to_conda = { - v: k - for k, v in the_profile.data["conda"]["to_python"].items() - if not k.startswith("__") - } - - version = the_profile.conda_constraints(python) - assert version is not None - - def _make_requirement_dict(requirements: list[str]) -> dict[str, str]: - retval: dict[str, str] = {} - for k in requirements: - pr = packaging.requirements.Requirement(k) - name = ( - pr.name if pr.name not in python_to_conda else python_to_conda[pr.name] - ) - if pr.name in version: - retval[name] = version[name] - if pr.specifier: - if name in retval: - retval[name] = ",".join((retval[name], str(pr.specifier))) - else: - retval[name] = str(pr.specifier) - retval.setdefault(name, "*") - return retval - - # loads the pyproject.toml file (easy) - pyproject = project_dir / "pyproject.toml" - if pyproject.exists(): - import tomli - - pyproject = tomli.load(pyproject.open("rb")) - else: - raise click.ClickException( - f"Cannot find `pyproject.toml` at directory `{str(project_dir)}`" - ) - - # build output TOML pixi file - config = {} - config["project"] = dict( - name=pyproject["project"]["name"], - authors=[ - f"{k['name']} <{k['email']}>" - for k in pyproject["project"].get("authors", []) - + pyproject["project"].get("maintainers", []) - ], - description=pyproject["project"]["description"], - # license=pyproject["project"]["license"]["text"], - readme="README.md", - homepage=pyproject["project"]["urls"]["homepage"], - repository=pyproject["project"]["urls"]["repository"], - documentation=pyproject["project"]["urls"]["documentation"], - ) - - conda_config = the_profile.conda_config(python=python, public=True, stable=True) - config["project"]["channels"] = conda_config.channels - config["project"]["platforms"] = ["linux-64", "osx-arm64"] - - config["dependencies"] = {"python": python + ".*"} - config["dependencies"].update( - _make_requirement_dict(pyproject.get("project", {}).get("dependencies", [])) - ) - - cmds = [] - - # setup standardized build procedure - config.setdefault("feature", {}).setdefault("build", {})["dependencies"] = ( - _make_requirement_dict(pyproject.get("build-system", {}).get("requires", [])) - ) - # add pip so that the build works - config["feature"]["build"]["dependencies"].update(_make_requirement_dict(["pip"])) - config["feature"]["build"]["tasks"] = dict( - build="pip install --no-build-isolation --no-dependencies --editable ." - ) - config.setdefault("environments", {}).setdefault("default", []).insert(0, "build") - cmds.append("To install, run: `pixi run build`") - - # adds optional features - for feature, deps in ( - pyproject.get("project", {}).get("optional-dependencies", {}).items() - ): - config.setdefault("feature", {}).setdefault(feature, {})["dependencies"] = ( - _make_requirement_dict(deps) - ) - - if "pre-commit" in config["feature"][feature]["dependencies"]: - config["feature"][feature]["tasks"] = { - "qa": "pre-commit run --all-files", - "qa-install": "pre-commit install", - } - # this feature can be separated from the rest - config.setdefault("environments", {}).setdefault("default", []).insert( - 0, feature - ) - cmds.append("To install pre-commit hook, run: `pixi run qa-install`") - cmds.append("To run quality-assurance, run: `pixi run qa`") - - # if ruff is part of pre-commit configuration, then also add that - # dependence to the qa stack - precommit_config = project_dir / ".pre-commit-config.yaml" - if ( - precommit_config.exists() - and "ruff" in precommit_config.open().read() - and "ruff" not in config["feature"][feature]["dependencies"] - ): - config["feature"][feature]["dependencies"]["ruff"] = "*" - config["feature"][feature]["tasks"]["ruff"] = "ruff check" - cmds.append("To run a simple ruff check, run: `pixi run ruff`") - - if "sphinx" in config["feature"][feature]["dependencies"]: - config["feature"][feature]["tasks"] = { - "doc": { - "cmd": "rm -rf doc/api && rm -rf html && sphinx-build -aEW doc html", - "depends_on": "build", - } - } - # this feature needs to have the package installed - config.setdefault("environments", {}).setdefault("default", []).insert( - 0, feature - ) - cmds.append("To do build docs, run: `pixi run doc`") - - if "pytest" in config["feature"][feature]["dependencies"]: - config["feature"][feature]["tasks"] = { - "test": { - "cmd": "pytest -sv tests/", - "depends_on": "build", - } - } - # this feature needs to have the package installed - config.setdefault("environments", {}).setdefault("default", []).insert( - 0, feature - ) - cmds.append("To do run test, run: `pixi run test`") - - # backup previous installation plan, if one exists - output = project_dir / "pixi.toml" - if output.exists(): - backup = output.parent / (output.name + "~") - shutil.copy(output, backup) - - with output.open("w") as f: - import tomlkit - - tomlkit.dump(config, f) - click.secho( - f"pixi configuration recorded at {str(output)}", - fg="yellow", - bold=True, - ) - for k in cmds: - click.secho(k, fg="yellow", bold=True) diff --git a/src/idiap_devtools/scripts/gitlab/release.py b/src/idiap_devtools/scripts/release.py similarity index 75% rename from src/idiap_devtools/scripts/gitlab/release.py rename to src/idiap_devtools/scripts/release.py index 0c95f6ec9e15a44e2527951c708f867879248682..c52e9467e5fd9c1d9414d6c72653dc489d3b6931 100644 --- a/src/idiap_devtools/scripts/gitlab/release.py +++ b/src/idiap_devtools/scripts/release.py @@ -6,11 +6,8 @@ import typing import click -from idiap_devtools.click import validate_profile -from idiap_devtools.profile import Profile, get_profile_path - -from ...click import PreserveIndentCommand, verbosity_option -from ...logging import setup +from ..click import PreserveIndentCommand, verbosity_option +from ..logging import setup logger = setup(__name__.split(".", 1)[0]) @@ -38,41 +35,9 @@ Examples: devtool gitlab release -vv --dry-run changelog.md - 3. You may also pin package dependencies upon the release, so that the - shipped package respects a particular development profile set of pins: - - .. code:: sh - - devtool gitlab release -vv --pin-dependencies changelog.md - - The `default` profile is used, if set on your configuration file. - Otherwise, you may specify it explicitly like: - - .. code:: sh - - devtool gitlab release -vv --profile=specific --pin-dependencies changelog.md - """, ) @click.argument("changelog", type=click.File("rt", lazy=False)) -@click.option( - "-P", - "--profile", - default="default", - show_default=True, - callback=validate_profile, - help="Directory containing the development profile (and a file named " - "profile.toml), or the name of a configuration key pointing to the " - "development profile to use", -) -@click.option( - "-p", - "--pin-dependencies/--no-pin-dependencies", - default=False, - help="If set, then pin dependencies from the dev-profile on the package " - "to be released. By default your default dev-profile is used. You may " - "override this using the --profile option", -) @click.option( "-d", "--dry-run/--no-dry-run", @@ -84,8 +49,6 @@ Examples: @verbosity_option(logger=logger) def release( changelog: typing.TextIO, - profile: str, - pin_dependencies: bool, dry_run: bool, **_, ) -> None: @@ -95,9 +58,7 @@ def release( ``changelog`` command), this script goes through all packages listed (and in order): - * Modifies ``pyproject.toml`` with the new release number and pins the - dependencies according to the specified profile's constraints (if one - was specified) + * Modifies ``pyproject.toml`` with the new release number * Sets-up the README links to point to the correct pipeline and documentation for the package * Commits, tags and pushes the git project adding the changelog @@ -108,11 +69,6 @@ def release( pipeline versions * Re-commits and pushes the whole with the option ``[ci skip]``. - N.B.: When the option ``pin-dependencies`` is set, the versions of the - dependencies in ``pyproject.toml`` will be pinned to those of the Python - ``constraints.txt`` file available in the select development profile - (choose using option ``--profile``). - The changelog is expected to have the following structure: .. code:: markdown @@ -144,8 +100,8 @@ def release( import packaging.version - from ...gitlab import get_gitlab_instance - from ...gitlab.release import ( + from ..gitlab import get_gitlab_instance + from ..gitlab.release import ( get_next_version, release_package, wait_for_pipeline_to_finish, @@ -170,18 +126,6 @@ def release( bold=True, ) - # loads profile data - if pin_dependencies: - the_profile = Profile(profile) - logger.info( - f"Pinning dependencies from profile `{get_profile_path(profile)}'...", - ) - else: - the_profile = None - logger.warning( - "Not pinning dependencies (use --pin-dependencies to change this).", - ) - for pkg_number, (header, line) in enumerate(pkgs): match = header_re.match(header) @@ -243,7 +187,6 @@ def release( tag_name=vtag, tag_comments=description_text, dry_run=dry_run, - profile=the_profile, ) if not dry_run: # now, wait for the pipeline to finish, before we can release the diff --git a/src/idiap_devtools/scripts/gitlab/runners.py b/src/idiap_devtools/scripts/runners.py similarity index 97% rename from src/idiap_devtools/scripts/gitlab/runners.py rename to src/idiap_devtools/scripts/runners.py index c1786717176336471746edec40ee8338b9c8927e..712df4691a7eff9981f8d75ca8954740eb8e9633 100644 --- a/src/idiap_devtools/scripts/gitlab/runners.py +++ b/src/idiap_devtools/scripts/runners.py @@ -6,8 +6,8 @@ import pathlib import click -from ...click import AliasedGroup, PreserveIndentCommand, verbosity_option -from ...logging import setup +from ..click import AliasedGroup, PreserveIndentCommand, verbosity_option +from ..logging import setup logger = setup(__name__.split(".", 1)[0]) @@ -64,8 +64,8 @@ def enable(name, targets, group, dry_run, **_) -> None: at. """ - from ...gitlab import get_gitlab_instance - from ...gitlab.runners import ( + from ..gitlab import get_gitlab_instance + from ..gitlab.runners import ( get_project, get_projects_from_file, get_projects_from_group, diff --git a/src/idiap_devtools/scripts/gitlab/settings.py b/src/idiap_devtools/scripts/settings.py similarity index 96% rename from src/idiap_devtools/scripts/gitlab/settings.py rename to src/idiap_devtools/scripts/settings.py index 56fbd72f1befa3ae7b41e6123ea1f24b4751b302..7b97ee52c86a3d90eb790ab89af639e2261328fc 100644 --- a/src/idiap_devtools/scripts/gitlab/settings.py +++ b/src/idiap_devtools/scripts/settings.py @@ -7,8 +7,8 @@ import typing import click -from ...click import PreserveIndentCommand, verbosity_option -from ...logging import setup +from ..click import PreserveIndentCommand, verbosity_option +from ..logging import setup logger = setup(__name__.split(".", 1)[0]) @@ -101,8 +101,8 @@ Examples: def settings(projects, avatar, description, group, archive, dry_run, **_) -> None: """Update project settings.""" - from ...gitlab import get_gitlab_instance - from ...gitlab.runners import ( + from ..gitlab import get_gitlab_instance + from ..gitlab.runners import ( get_project, get_projects_from_file, get_projects_from_group, diff --git a/src/idiap_devtools/scripts/update_pins.py b/src/idiap_devtools/scripts/update_pins.py deleted file mode 100644 index 962bc8ea4fac3fefa5935f0d621e7a2b8ca6273e..0000000000000000000000000000000000000000 --- a/src/idiap_devtools/scripts/update_pins.py +++ /dev/null @@ -1,228 +0,0 @@ -# Copyright © 2022 Idiap Research Institute <contact@idiap.ch> -# -# SPDX-License-Identifier: BSD-3-Clause - -import sys - -import click - -from ..click import PreserveIndentCommand, validate_profile, verbosity_option -from ..logging import setup - -logger = setup(__name__.split(".", 1)[0]) - - -@click.command( - cls=PreserveIndentCommand, - epilog=""" -Examples: - - 1. Updates the default constraints taking as base a Python 3.10 environment: - - .. code:: sh - - devtool update-pins --python=3.10 - - 2. Updates the default constraints using the default Python version - (installed on the base environment), and respecting a few provided - constraints (manual pins): - - .. code:: sh - - devtool update-pins --python=3.10 opencv=4.5.1 pytorch=1.9 - - 3. Updates the constraints on a checked-out profile directory: - - .. code:: sh - - devtool update-pins --python=3.10 --profile=../another-profile -""", -) -@click.argument("manual_pins", nargs=-1) -@click.option( - "-P", - "--profile", - default="default", - show_default=True, - callback=validate_profile, - help="Directory containing the development profile (and a file named " - "profile.toml), or the name of a configuration key pointing to the " - "development profile to use", -) -@click.option( - "-p", - "--python", - default=("%d.%d" % sys.version_info[:2]), - show_default=True, - help="Version of python to build the environment for", -) -@click.option( - "-p/-P", - "--only-pip/--no-only-pip", - default=False, - help="Set this to update **only** pip constraints. The pins will " - "then be copied from the conda-constraints to the pip one.", -) -@verbosity_option(logger=logger) -def update_pins(manual_pins, profile, python, only_pip, **_) -> None: - """Update pip/mamba/conda package constraints (requires conda). - - The update is done by checking-up conda-forge and trying to create - an environment with all packages listed on the current conda - constraints. Once an environment has been resolved, it is "copied" - to the Python (pip) constraints file, by excluding non-Python - packages. - """ - import subprocess - - from ..profile import Profile - from ..update_pins import ( - filter_python_packages, - load_packages_from_conda_build_config, - update_pip_constraints_only, - ) - - # 1. loads profile data - the_profile = Profile(profile) - - conda_config_path = the_profile.get_path(("conda", "constraints")) - - if conda_config_path is None: - click.secho( - f"No conda-constraints at profile `{profile}' - aborting", - bold=True, - fg="red", - ) - return None - - # 2. loads the current conda pins - packages, package_names_map = load_packages_from_conda_build_config( - conda_config_path, {"channels": []} - ) - - pip_constraints_path = the_profile.get_path(("python", "constraints")) - conda_to_python = the_profile.get(("conda", "to_python"), {}) - - if only_pip: - if pip_constraints_path is None: - click.secho( - f"No pip-constraints at profile `{profile}' - aborting", - bold=True, - fg="red", - ) - return None - - click.secho( - f"Copying pins from {str(conda_config_path)} to " - f"{str(pip_constraints_path)}...", - bold=True, - ) - return update_pip_constraints_only( - conda_config_path, pip_constraints_path, conda_to_python - ) - - reversed_package_names_map = {v: k for k, v in package_names_map.items()} - - # ask mamba to create an environment with the packages - try: - cmd = ( - [ - "mamba", - "create", - "--dry-run", - "--override-channels", - "-c", - "conda-forge", - "-n", - "temp_env", - f"python={python}", - ] - + packages - + list(manual_pins) - ) - click.secho( - f"Executing `{' '.join(cmd)}' to calculate a viable environment...", - bold=True, - ) - output = subprocess.run(cmd, capture_output=True, check=True) - - except subprocess.CalledProcessError as e: - click.secho(e.output.decode(), bold=True, fg="red") - raise e - - env_text = output.stdout.decode("utf-8") - click.secho(env_text, fg="magenta") - - resolved_packages = [] - for line in env_text.split("\n"): - line = line.strip() - if line.startswith("+ "): - values = line.split() - name, version = values[1], values[2] - resolved_packages.append((name, version)) - - # we only monitor a subset of packages - resolved_packages = sorted( - [(p, v) for (p, v) in resolved_packages if p in packages], - key=lambda x: (x[0], len(x[0])), - ) - - # write the new pinning - click.secho( - f"Saving {len(resolved_packages)} updated entries to " - f"`{conda_config_path}'...", - bold=True, - ) - - with conda_config_path.open("rt") as f: - content = f.read() - - start = """ -# AUTOMATIC PARSING START -# DO NOT MODIFY THIS COMMENT - -# list all packages with dashes or dots in their names, here:""" - idx1 = content.find(start) - idx2 = content.find("# AUTOMATIC PARSING END") - pins = "\n".join( - f'{reversed_package_names_map.get(name, name)}:\n - "{version}"' - for name, version in resolved_packages - ) - package_names_map_str = "\n".join( - f" {k}: {v}" for k, v in package_names_map.items() - ) - - new_content = f"""{start} -package_names_map: -{package_names_map_str} - - -{pins} - -""" - - content = content[:idx1] + new_content + content[idx2:] - with conda_config_path.open("w") as f: - f.write(content) - - if pip_constraints_path is None: - click.secho( - f"No pip-constraints at profile `{profile}' - not updating...", - bold=True, - ) - return None - - with pip_constraints_path.open("w") as f: - python_packages = filter_python_packages(resolved_packages, conda_to_python) - python_packages = sorted( - [(p, v) for (p, v) in python_packages], - key=lambda x: (x[0], len(x[0])), - ) - click.secho( - f"Saving {len(python_packages)} entries to `{pip_constraints_path}'...", - bold=True, - ) - constraints = [f"{name}=={version}\n" for name, version in python_packages] - f.writelines(constraints) - - return None diff --git a/src/idiap_devtools/update_pins.py b/src/idiap_devtools/update_pins.py deleted file mode 100644 index d545cdf73f4f7901f813c9fda7d37346089dbd31..0000000000000000000000000000000000000000 --- a/src/idiap_devtools/update_pins.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright © 2022 Idiap Research Institute <contact@idiap.ch> -# -# SPDX-License-Identifier: BSD-3-Clause - -import pathlib -import typing - -import click -import requests - - -def load_packages_from_conda_build_config( - conda_build_config: pathlib.Path, - condarc_options: dict[str, typing.Any], - with_pins: bool = False, -) -> tuple[list[str], dict[str, str]]: - """Load packages listed in a conda recipe.""" - - from conda_build.metadata import ns_cfg, select_lines - - from .conda import make_conda_config - - with pathlib.Path(conda_build_config).open() as f: - content = f.read() - - idx1 = content.find("# AUTOMATIC PARSING START") - idx2 = content.find("# AUTOMATIC PARSING END") - content = content[idx1:idx2] - - # filter out using conda-build specific markers - condarc_options["variant_config_files"] = [str(conda_build_config)] - config = make_conda_config(condarc_options) - content = select_lines(content, ns_cfg(config), variants_in_place=False) - - import yaml - - package_pins = yaml.safe_load(content) - - package_names_map = package_pins.pop("package_names_map") - - if with_pins: - # NB : in pins, need to strip the occasional " cuda*" suffix - # tensorflow=x.x.x cuda* -> tensorflow=x.x.x - packages = [ - f"{package_names_map.get(p, p)}={str(v[0]).split(' ')[0]}" - for p, v in package_pins.items() - ] - else: - packages = [package_names_map.get(p, p) for p in package_pins.keys()] - - return packages, package_names_map - - -def filter_python_packages(resolved_packages, conda_to_python: dict[str, str | None]): - """Filter the list of packages to return only Python packages available on - PyPI. - - This function will also perform name translation and de-duplication of - package names when possible. - - - Args: - - resolved_packages: list of tuples ``(package, version)``, returned by the - ``mamba create --dry-run`` subprocess, for the packages we care - about. - - - Returns - ------- - List of of packages and versions available on PyPI - """ - - keep_list = [] - - click.echo(f"Filtering {len(resolved_packages)} packages for PyPI availability") - - for p, v in resolved_packages: - if p in conda_to_python["__ignore__"]: - continue - - p = conda_to_python.get(p, p) - - try: - url = f"https://pypi.org/pypi/{p}/{v}/json" - r = requests.get(url) - if r.ok: - keep_list.append((p, v)) - else: - click.echo(f"{p}@{v} NOT found - ignoring") - except requests.exceptions.RequestException: - continue - - return keep_list - - -def update_pip_constraints_only( - conda_config_path: pathlib.Path, - pip_constraints_path: pathlib.Path, - conda_to_python: dict[str, typing.Any], -) -> None: - """Update pip constraints only.""" - - packages, _ = load_packages_from_conda_build_config( - conda_config_path, - {"channels": []}, - with_pins=True, - ) - package_pairs = [p.split("=", 1) for p in packages] - - with pip_constraints_path.open("wt") as f: - python_packages = filter_python_packages(package_pairs, conda_to_python) - python_packages = sorted( - [(p, v) for (p, v) in python_packages], - key=lambda x: (x[0], len(x[0])), - ) - click.echo( - f"Saving {len(python_packages)} entries to `{pip_constraints_path}'..." - ) - constraints = [f"{name}=={version}\n" for name, version in python_packages] - f.writelines(constraints) diff --git a/tests/test_release.py b/tests/test_release.py deleted file mode 100644 index 1d1f493d3816dceaadb81f3435fdc2662686767f..0000000000000000000000000000000000000000 --- a/tests/test_release.py +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright © 2023 Idiap Research Institute <contact@idiap.ch> -# -# SPDX-License-Identifier: BSD-3-Clause - -import pytest - -from idiap_devtools.gitlab import release -from packaging.requirements import Requirement - - -def test_pinning_no_constraints(): - """Pinning a simple packages list without pre-constraints.""" - constraints = [ - Requirement("pkg-a == 1.2.3"), # Strict constraint - Requirement("pkg-b >= 2.5"), # Greater or equal constraint - # pkg-c: package not in the constraints list - Requirement("pkg-d ~= 2.0"), # Compatible constraint - Requirement("pkg-e@ https://www.idiap.ch/dummy/pkg-e"), # URL constr. - Requirement("pkg-f[extra1] == 1.2.3"), # With extras - Requirement("pkg-g[extra2]@ https://www.idiap.ch/dummy/pkg-g"), - Requirement("pkg-h == 1.2.3; sys_platform == 'darwin'"), # With marker - Requirement( - "pkg-i@ https://www.idiap.ch/dummy/pkg-i ; sys_platform == 'darwin'" - ), - Requirement("pkg-z == 1.0.0"), # Constraint not in the packages list - ] - pkgs = [ - "pkg-a", - "pkg-b", - "pkg-c", - "pkg-d", - "pkg-e", - "pkg-f", - "pkg-g", - "pkg-h", - "pkg-i", - ] - - # Actual call. Modifies pkgs in-place. - release._pin_versions_of_packages_list( # noqa: SLF001 - packages_list=pkgs, - dependencies_versions=constraints, - ) - - expected_pkgs = [ - "pkg-a==1.2.3", - "pkg-b>=2.5", - "pkg-c", - "pkg-d~=2.0", - "pkg-e@ https://www.idiap.ch/dummy/pkg-e", - "pkg-f[extra1]==1.2.3", - "pkg-g[extra2]@ https://www.idiap.ch/dummy/pkg-g", - 'pkg-h==1.2.3; sys_platform == "darwin"', - 'pkg-i@ https://www.idiap.ch/dummy/pkg-i ; sys_platform == "darwin"', - ] - - assert pkgs == expected_pkgs - - -def test_pinning_multiple_times(): - """Pinning with a constraint present multiple times is not supported.""" - constraints = [ - Requirement("pkg-a == 1.2.3; sys_platform == 'darwin'"), - Requirement("pkg-a == 3.2.1; sys_platform != 'darwin'"), - ] - pkgs = ["pkg-a"] - - with pytest.raises(NotImplementedError): - release._pin_versions_of_packages_list(pkgs, constraints) # noqa: SLF001 - - -def test_pinning_with_constraints(): - """Pinning a packages list with any constraints already applied.""" - constraints = [Requirement("pkg-a == 1.2.3")] - pkgs = ["pkg-a == 2.0"] # Constraints can not be set in the packages list. - - with pytest.raises(ValueError): - release._pin_versions_of_packages_list(pkgs, constraints) # noqa: SLF001 - - constraints = [Requirement("pkg-a == 1.2.3")] - pkgs = ["pkg-a; sys_platform != 'darwin'"] # Neither can the markers - - with pytest.raises(ValueError): - release._pin_versions_of_packages_list(pkgs, constraints) # noqa: SLF001 - - constraints = [Requirement("pkg-a == 1.2.3")] - pkgs = ["pkg-a(extra)"] # Nor the extras - - with pytest.raises(ValueError): - release._pin_versions_of_packages_list(pkgs, constraints) # noqa: SLF001