pax_global_header00006660000000000000000000000064150550741530014517gustar00rootroot0000000000000052 comment=81228e369fc8472ca0f928ae51bde24eeeb19214 pint-xarray-0.6.0/000077500000000000000000000000001505507415300140005ustar00rootroot00000000000000pint-xarray-0.6.0/.codecov.yml000066400000000000000000000004511505507415300162230ustar00rootroot00000000000000codecov: ci: # by default, codecov doesn't recognize azure as a CI provider - dev.azure.com require_ci_to_pass: yes coverage: status: project: default: # Require 1% coverage, i.e., always succeed target: 1 patch: false changes: false comment: off pint-xarray-0.6.0/.gitattributes000066400000000000000000000001721505507415300166730ustar00rootroot00000000000000# SCM syntax highlighting & preventing 3-way merges pixi.lock merge=binary linguist-language=YAML linguist-generated=true pint-xarray-0.6.0/.github/000077500000000000000000000000001505507415300153405ustar00rootroot00000000000000pint-xarray-0.6.0/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000004541505507415300211440ustar00rootroot00000000000000 - [ ] Closes #xxxx - [ ] Tests added - [ ] Passes `pre-commit run --all-files` - [ ] User visible changes (including notable bug fixes) are documented in `whats-new.rst` - [ ] New functions/methods are listed in `api.rst` pint-xarray-0.6.0/.github/dependabot.yml000066400000000000000000000001661505507415300201730ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" pint-xarray-0.6.0/.github/release.yml000066400000000000000000000001261505507415300175020ustar00rootroot00000000000000changelog: exclude: authors: - dependabot[bot] - pre-commit-ci[bot] pint-xarray-0.6.0/.github/workflows/000077500000000000000000000000001505507415300173755ustar00rootroot00000000000000pint-xarray-0.6.0/.github/workflows/ci-additional.yml000066400000000000000000000016321505507415300226230ustar00rootroot00000000000000name: CI Additional on: push: branches: - main pull_request: branches: - main concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: doctests: name: Doctests runs-on: ubuntu-latest if: github.repository == 'xarray-contrib/pint-xarray' env: FORCE_COLOR: 3 steps: - name: checkout the repository uses: actions/checkout@v5 with: # need to fetch all tags to get a correct version fetch-depth: 0 # fetch all branches and tags - name: setup environment uses: prefix-dev/setup-pixi@fef5c9568ca6c4ff7707bf840ab0692ba3f08293 # 0.9.0 with: environments: "doctests" - name: import pint-xarray run: | pixi run -e doctests python -c 'import pint_xarray' - name: run doctests run: | pixi run -e doctests doctests pint-xarray-0.6.0/.github/workflows/ci.yml000066400000000000000000000047011505507415300205150ustar00rootroot00000000000000# adapted from xarray's ci name: CI on: push: branches: [main] pull_request: branches: [main] workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: detect-skip-ci-trigger: name: "Detect CI Trigger: [skip-ci]" if: github.event_name == 'push' || github.event_name == 'pull_request' runs-on: ubuntu-latest outputs: triggered: ${{ steps.detect-trigger.outputs.trigger-found }} steps: - uses: actions/checkout@v5 with: fetch-depth: 2 - uses: xarray-contrib/ci-trigger@v1 id: detect-trigger with: keyword: "[skip-ci]" ci: name: ${{ matrix.os }} ${{ matrix.env }} runs-on: ${{ matrix.os }} needs: detect-skip-ci-trigger defaults: run: shell: bash -l {0} env: FORCE_COLOR: 3 if: | always() && github.repository == 'xarray-contrib/pint-xarray' && ( github.event_name == 'workflow_dispatch' || needs.detect-skip-ci-trigger.outputs.triggered == 'false' ) strategy: fail-fast: false matrix: env: ["tests-py311", "tests-py312", "tests-py313"] os: ["ubuntu-latest", "macos-latest", "windows-latest"] steps: - name: checkout the repository uses: actions/checkout@v5 with: # need to fetch all tags to get a correct version fetch-depth: 0 # fetch all branches and tags - name: setup environment uses: prefix-dev/setup-pixi@fef5c9568ca6c4ff7707bf840ab0692ba3f08293 # 0.9.0 with: environments: "${{ matrix.env }}" - name: investigate env variables run: | echo PYTHON_VERSION=$(pixi run -e ${{ matrix.env }} python -c 'import sys; print(".".join(map(str, sys.version_info[:2])))') >> $GITHUB_ENV echo RUNNER_OS="${{ matrix.os }}" - name: import pint-xarray run: | pixi run -e ${{ matrix.env }} python -c 'import pint_xarray' - name: run tests if: success() id: status run: | pixi run -e ${{ matrix.env }} tests --cov-report=xml - name: Upload code coverage to Codecov uses: codecov/codecov-action@v5.5.0 with: token: "${{ secrets.CODECOV_TOKEN }}" files: ./coverage.xml flags: unittests env_vars: RUNNER_OS,PYTHON_VERSION name: codecov-umbrella fail_ci_if_error: false pint-xarray-0.6.0/.github/workflows/nightly.yml000066400000000000000000000047151505507415300216050ustar00rootroot00000000000000# adapted from xarray's nightly CI name: Nightly CI on: push: branches: [main] pull_request: branches: [main] schedule: - cron: "0 0 * * *" # Daily "At 00:00" UTC workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: detect-test-upstream-trigger: name: "Detect CI Trigger: [test-upstream]" if: | github.repository_owner == 'xarray-contrib' && (github.event_name == 'push' || github.event_name == 'pull_request') runs-on: ubuntu-latest outputs: triggered: ${{ steps.detect-trigger.outputs.trigger-found }} steps: - uses: actions/checkout@v5 with: fetch-depth: 2 - uses: xarray-contrib/ci-trigger@v1.2 id: detect-trigger with: keyword: "[test-upstream]" upstream-dev: name: upstream-dev runs-on: ubuntu-latest needs: detect-test-upstream-trigger if: | always() && github.repository_owner == 'xarray-contrib' && ( (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') || needs.detect-test-upstream-trigger.outputs.triggered == 'true' || ( github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'run-upstream') ) ) outputs: artifacts_availability: ${{ steps.status.outputs.ARTIFACTS_AVAILABLE }} env: FORCE_COLOR: 3 steps: - name: checkout the repository uses: actions/checkout@v5 with: # need to fetch all tags to get a correct version fetch-depth: 0 # fetch all branches and tags - name: remove lockfile run: | rm pixi.lock - name: setup environment uses: prefix-dev/setup-pixi@fef5c9568ca6c4ff7707bf840ab0692ba3f08293 # 0.9.0 with: environments: "nightly" locked: false frozen: false cache: false - name: import pint-xarray run: | pixi run -e nightly python -c 'import pint_xarray' - name: run tests if: success() id: status run: | pixi run -e nightly tests -rf --report-log=pytest-log.jsonl - name: report failures if: | failure() && steps.tests.outcome == 'failure' && github.event_name == 'schedule' uses: xarray-contrib/issue-from-pytest-log@v1 with: log-path: pytest-log.jsonl pint-xarray-0.6.0/.github/workflows/parse_logs.py000066400000000000000000000046161505507415300221140ustar00rootroot00000000000000# type: ignore import argparse import functools import json import pathlib import textwrap from dataclasses import dataclass from pytest import CollectReport, TestReport @dataclass class SessionStart: pytest_version: str outcome: str = "status" @classmethod def _from_json(cls, json): json_ = json.copy() json_.pop("$report_type") return cls(**json_) @dataclass class SessionFinish: exitstatus: str outcome: str = "status" @classmethod def _from_json(cls, json): json_ = json.copy() json_.pop("$report_type") return cls(**json_) def parse_record(record): report_types = { "TestReport": TestReport, "CollectReport": CollectReport, "SessionStart": SessionStart, "SessionFinish": SessionFinish, } cls = report_types.get(record["$report_type"]) if cls is None: raise ValueError(f"unknown report type: {record['$report_type']}") return cls._from_json(record) @functools.singledispatch def format_summary(report): return f"{report.nodeid}: {report}" @format_summary.register def _(report: TestReport): message = report.longrepr.chain[0][1].message return f"{report.nodeid}: {message}" @format_summary.register def _(report: CollectReport): message = report.longrepr.split("\n")[-1].removeprefix("E").lstrip() return f"{report.nodeid}: {message}" def format_report(reports, py_version): newline = "\n" summaries = newline.join(format_summary(r) for r in reports) message = textwrap.dedent( """\
Python {py_version} Test Summary ``` {summaries} ```
""" ).format(summaries=summaries, py_version=py_version) return message if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("filepath", type=pathlib.Path) args = parser.parse_args() py_version = args.filepath.stem.split("-")[1] print("Parsing logs ...") lines = args.filepath.read_text().splitlines() reports = [parse_record(json.loads(line)) for line in lines] failed = [report for report in reports if report.outcome == "failed"] message = format_report(failed, py_version=py_version) output_file = pathlib.Path("pytest-logs.txt") print(f"Writing output file to: {output_file.absolute()}") output_file.write_text(message) pint-xarray-0.6.0/.github/workflows/pypi.yaml000066400000000000000000000030471505507415300212460ustar00rootroot00000000000000name: Upload Package to PyPI on: release: types: - published jobs: build-artifacts: runs-on: ubuntu-latest if: github.repository == 'xarray-contrib/pint-xarray' steps: - uses: actions/checkout@v5 with: fetch-depth: 0 - uses: actions/setup-python@v5 name: Install Python with: python-version: "3.x" - name: Install dependencies run: | python -m pip install --upgrade pip python -m pip install build twine - name: Build tarball and wheels run: | git clean -xdf git restore -SW . python -m build --outdir dist/ . - name: Check built artifacts run: | python -m twine check --strict dist/* pwd if [ -f dist/pint-xarray-0.0.0.tar.gz ]; then echo "❌ INVALID VERSION NUMBER" exit 1 else echo "✅ Looks good" fi - uses: actions/upload-artifact@v4 with: name: releases path: dist upload-to-pypi: needs: build-artifacts if: github.event_name == 'release' runs-on: ubuntu-latest environment: name: pypi url: https://pypi.org/p/pint-xarray permissions: id-token: write steps: - uses: actions/download-artifact@v5 with: name: releases path: dist - name: Publish package to PyPI uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc with: verbose: true pint-xarray-0.6.0/.gitignore000066400000000000000000000035061505507415300157740ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ docs/generated/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # pixi environments .pixi/* !.pixi/config.toml pint-xarray-0.6.0/.pre-commit-config.yaml000066400000000000000000000025541505507415300202670ustar00rootroot00000000000000ci: autoupdate_schedule: weekly # https://pre-commit.com/ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer - id: check-docstring-first - repo: https://github.com/rbubley/mirrors-prettier rev: v3.6.2 hooks: - id: prettier args: ["--cache-location=.prettier_cache/cache"] - repo: https://github.com/ComPWA/taplo-pre-commit rev: v0.9.3 hooks: - id: taplo-format args: [--option, array_auto_collapse=false] - id: taplo-lint args: [--no-schema] - repo: https://github.com/abravalheri/validate-pyproject rev: v0.24.1 hooks: - id: validate-pyproject # https://github.com/python/black#version-control-integration - repo: https://github.com/psf/black-pre-commit-mirror rev: 25.1.0 hooks: - id: black-jupyter - repo: https://github.com/keewis/blackdoc rev: v0.4.1 hooks: - id: blackdoc additional_dependencies: ["black==25.1.0"] - id: blackdoc-autoupdate-black - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.12.10 hooks: - id: ruff args: [--fix] - repo: https://github.com/kynan/nbstripout rev: 0.8.1 hooks: - id: nbstripout args: [--extra-keys=metadata.kernelspec metadata.language_info.version] pint-xarray-0.6.0/.readthedocs.yaml000066400000000000000000000011331505507415300172250ustar00rootroot00000000000000version: 2 build: os: ubuntu-lts-latest tools: # just so RTD stops complaining python: "latest" jobs: post_checkout: - (git --no-pager log --pretty="tformat:%s" -1 | grep -vqF "[skip-rtd]") || exit 183 - git fetch --unshallow || true create_environment: - asdf plugin add pixi - asdf install pixi latest - asdf global pixi latest pre_install: - git update-index --assume-unchanged docs/conf.py install: - pixi install -e docs build: html: - pixi run -e docs build-docs-rtd sphinx: configuration: docs/conf.py pint-xarray-0.6.0/HOW_TO_RELEASE.rst000066400000000000000000000016301505507415300167310ustar00rootroot00000000000000Release process =============== 1. the release happens from `main` so make sure it is up-to-date: .. code:: sh git pull origin main 2. look at `whats-new.rst` and make sure it is complete and with references to issues and pull requests 3. open and merge a pull request with these changes 4. make sure the CI on main pass 5. check that the documentation build on readthedocs completed successfully 6. Fill in the release date and commit the release: .. code:: sh git commit -am "Release v0.X.Y" 7. Tag the release and push to main: .. code:: sh git tag -a v0.X.Y -m "v0.X.Y" git push origin --tags 8. Draft a release for the new tag on github. A CI will pick that up, build the project and push to PyPI. Be careful, this can't be undone. 9. Make sure readthedocs builds both `stable` and the new tag 10. Add a new section to `whats-new.rst` and push directly to main pint-xarray-0.6.0/LICENSE000066400000000000000000000261351505507415300150140ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. pint-xarray-0.6.0/README.md000066400000000000000000000041751505507415300152660ustar00rootroot00000000000000[![CI](https://github.com/xarray-contrib/pint-xarray/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/xarray-contrib/pint-xarray/actions/workflows/ci.yml) [![code coverage](https://codecov.io/gh/xarray-contrib/pint-xarray/branch/main/graph/badge.svg)](https://codecov.io/gh/xarray-contrib/pint-xarray) [![docs](https://readthedocs.org/projects/pint-xarray/badge/?version=latest)](https://pint-xarray.readthedocs.io) [![PyPI version](https://img.shields.io/pypi/v/pint-xarray.svg)](https://pypi.org/project/pint-xarray) [![codestyle](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/python/black) [![conda-forge](https://img.shields.io/conda/vn/conda-forge/pint-xarray)](https://github.com/conda-forge/pint-xarray-feedstock) # pint-xarray A convenience wrapper for using [pint](https://pint.readthedocs.io) with [xarray](https://xarray.pydata.org). ## Usage To convert the variables of a `Dataset` to quantities: ```python In [1]: import pint_xarray ...: import xarray as xr In [2]: ds = xr.Dataset({"a": ("x", [0, 1, 2]), "b": ("y", [-3, 5, 1], {"units": "m"})}) ...: ds Out[2]: Dimensions: (x: 3, y: 3) Dimensions without coordinates: x, y Data variables: a (x) int64 0 1 2 b (y) int64 -3 5 1 In [3]: q = ds.pint.quantify(a="s") ...: q Out[3]: Dimensions: (x: 3, y: 3) Dimensions without coordinates: x, y Data variables: a (x) int64 [s] 0 1 2 b (y) int64 [m] -3 5 1 ``` to convert to different units: ```python In [4]: c = q.pint.to({"a": "ms", "b": "km"}) ...: c Out[4]: Dimensions: (x: 3, y: 3) Dimensions without coordinates: x, y Data variables: a (x) float64 [ms] 0.0 1e+03 2e+03 b (y) float64 [km] -0.003 0.005 0.001 ``` to convert back to non-quantities: ```python In [5]: d = c.pint.dequantify() ...: d Out[5]: Dimensions: (x: 3, y: 3) Dimensions without coordinates: x, y Data variables: a (x) float64 0.0 1e+03 2e+03 b (y) float64 -0.003 0.005 0.001 ``` For more, see the [documentation](https://pint-xarray.readthedocs.io) pint-xarray-0.6.0/conftest.py000066400000000000000000000011031505507415300161720ustar00rootroot00000000000000import pytest @pytest.fixture(autouse=True) def add_standard_imports(doctest_namespace, tmpdir): import numpy as np import pandas as pd import pint import xarray as xr import pint_xarray ureg = pint.UnitRegistry(force_ndarray_like=True) doctest_namespace["np"] = np doctest_namespace["pd"] = pd doctest_namespace["xr"] = xr doctest_namespace["pint"] = pint doctest_namespace["ureg"] = ureg doctest_namespace["pint_xarray"] = pint_xarray # always seed numpy.random to make the examples deterministic np.random.seed(0) pint-xarray-0.6.0/docs/000077500000000000000000000000001505507415300147305ustar00rootroot00000000000000pint-xarray-0.6.0/docs/api.rst000066400000000000000000000036771505507415300162500ustar00rootroot00000000000000API reference ============= This page contains a auto-generated summary of ``pint-xarray``'s API. .. autosummary:: :toctree: generated/ pint_xarray.unit_registry pint_xarray.setup_registry Dataset ------- .. autosummary:: :toctree: generated/ :template: autosummary/accessor_attribute.rst xarray.Dataset.pint.loc .. autosummary:: :toctree: generated/ :template: autosummary/accessor_method.rst xarray.Dataset.pint.quantify xarray.Dataset.pint.dequantify xarray.Dataset.pint.interp xarray.Dataset.pint.interp_like xarray.Dataset.pint.reindex xarray.Dataset.pint.reindex_like xarray.Dataset.pint.drop_sel xarray.Dataset.pint.sel xarray.Dataset.pint.to xarray.Dataset.pint.chunk xarray.Dataset.pint.ffill xarray.Dataset.pint.bfill xarray.Dataset.pint.interpolate_na DataArray --------- .. autosummary:: :toctree: generated/ :template: autosummary/accessor_attribute.rst xarray.DataArray.pint.loc xarray.DataArray.pint.magnitude xarray.DataArray.pint.units xarray.DataArray.pint.dimensionality xarray.DataArray.pint.registry .. autosummary:: :toctree: generated/ :template: autosummary/accessor_method.rst xarray.DataArray.pint.quantify xarray.DataArray.pint.dequantify xarray.DataArray.pint.interp xarray.DataArray.pint.interp_like xarray.DataArray.pint.reindex xarray.DataArray.pint.reindex_like xarray.DataArray.pint.drop_sel xarray.DataArray.pint.sel xarray.DataArray.pint.to xarray.DataArray.pint.chunk xarray.DataArray.pint.ffill xarray.DataArray.pint.bfill xarray.DataArray.pint.interpolate_na Wrapping quantity-unaware functions ----------------------------------- .. autosummary:: :toctree: generated/ pint_xarray.expects Exceptions ---------- .. autosummary:: :toctree: generated/ pint_xarray.errors.PintExceptionGroup Testing ------- .. autosummary:: :toctree: generated/ pint_xarray.testing.assert_units_equal pint-xarray-0.6.0/docs/conf.py000066400000000000000000000070341505507415300162330ustar00rootroot00000000000000# Configuration file for the Sphinx documentation builder. # # This file only contains a selection of the most common options. For a full # list see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # # import os # import sys # sys.path.insert(0, os.path.abspath('.')) # -- Imports ----------------------------------------------------------------- import datetime as dt import sphinx_autosummary_accessors # need to import so accessors get registered import pint_xarray # noqa: F401 # -- Project information ----------------------------------------------------- year = dt.datetime.now().year project = "pint-xarray" author = f"{project} developers" copyright = f"{year}, {author}" github_url = "https://github.com/xarray-contrib/pint-xarray" # -- General configuration --------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ "sphinx.ext.intersphinx", "sphinx.ext.extlinks", "sphinx.ext.autosummary", "sphinx.ext.autodoc", "sphinx.ext.napoleon", "sphinx_autosummary_accessors", "IPython.sphinxext.ipython_directive", "IPython.sphinxext.ipython_console_highlighting", "nbsphinx", ] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates", sphinx_autosummary_accessors.templates_path] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = "sphinx_rtd_theme" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ["_static"] # -- Extension configuration ------------------------------------------------- # extlinks extlinks = { "issue": (f"{github_url}/issues/%s", "GH%s"), "pull": (f"{github_url}/pull/%s", "PR%s"), } # autosummary autosummary_generate = True # autodoc autodoc_typehints = "none" # napoleon napoleon_use_param = False napoleon_use_rtype = True napoleon_preprocess_types = True napoleon_type_aliases = { "dict-like": ":term:`dict-like `", "mapping": ":term:`mapping`", "hashable": ":term:`hashable`", # xarray "Dataset": "~xarray.Dataset", "DataArray": "~xarray.DataArray", # pint / pint-xarray "unit-like": ":term:`unit-like`", } # nbsphinx nbsphinx_timeout = 600 nbsphinx_execute = "always" # -- Options for intersphinx extension --------------------------------------- intersphinx_mapping = { "python": ("https://docs.python.org/3/", None), "xarray": ("https://docs.xarray.dev/en/stable", None), "pint": ("https://pint.readthedocs.io/en/stable", None), "pandas": ("https://pandas.pydata.org/pandas-docs/stable", None), } pint-xarray-0.6.0/docs/contributing.rst000066400000000000000000000015461505507415300201770ustar00rootroot00000000000000Contributing ============ ``pint-xarray`` is developed on `github `_. Commit message tags ------------------- By default, the upstream dev CI is disabled on pull request and push events. You can override this behavior per commit by adding a [test-upstream] tag to the first line of the commit message. Linters / Autoformatters ------------------------ In order to keep code consistent, we use - `Black `_ for standardized code formatting - `blackdoc `_ for standardized code formatting in documentation - `Flake8 `_ for general code quality - `isort `_ for standardized order in imports. See also `flake8-isort `_. pint-xarray-0.6.0/docs/conversion.rst000066400000000000000000000013501505507415300176460ustar00rootroot00000000000000.. currentmodule:: xarray Converting units ================ .. ipython:: python :suppress: import xarray as xr When working with :py:class:`Dataset` or :py:class:`DataArray` objects with units, we frequently might want to convert the units. Suppose we have: .. ipython:: In [1]: ds = xr.Dataset( ...: {"a": ("x", [4, 8, 12, 16])}, coords={"u": ("x", [10, 20, 30, 40])} ...: ).pint.quantify({"a": "m", "u": "s"}) ...: ds In [2]: da = ds.a ...: da To convert the data to different units, we can use the :py:meth:`Dataset.pint.to` and :py:meth:`DataArray.pint.to` methods: .. ipython:: In [3]: ds.pint.to(a="feet", u="ks") In [4]: da.pint.to({da.name: "nautical_mile", "u": "ms"}) pint-xarray-0.6.0/docs/creation.rst000066400000000000000000000077331505507415300173000ustar00rootroot00000000000000.. currentmodule:: xarray Creating and saving objects with units ====================================== Attaching units --------------- .. ipython:: python :suppress: import pint import pint_xarray import xarray as xr Usually, when loading data from disk we get a :py:class:`Dataset` or :py:class:`DataArray` with units in attributes: .. ipython:: In [1]: ds = xr.Dataset( ...: { ...: "a": (("lon", "lat"), [[11.84, 3.12, 9.7], [7.8, 9.3, 14.72]]), ...: "b": (("lon", "lat"), [[13, 2, 7], [5, 4, 9]], {"units": "m"}), ...: }, ...: coords={"lat": [10, 20, 30], "lon": [74, 76]}, ...: ) ...: ds In [2]: da = ds.b ...: da In order to get :py:class:`pint.Quantity` instances, we can use the :py:meth:`Dataset.pint.quantify` or :py:meth:`DataArray.pint.quantify` methods: .. ipython:: In [3]: ds.pint.quantify() We can also override the units of a variable: .. ipython:: In [4]: ds.pint.quantify(b="km") In [5]: da.pint.quantify("degree") Overriding works even if there is no ``units`` attribute, so we could use this to attach units to a normal :py:class:`Dataset`: .. ipython:: In [6]: temporary_ds = xr.Dataset({"a": ("x", [0, 5, 10])}, coords={"x": [1, 2, 3]}) ...: temporary_ds.pint.quantify({"a": "m"}) Of course, we could use :py:class:`pint.Unit` instances instead of strings to specify units, too. .. note:: Unit objects tied to different registries cannot interact with each other. In order to avoid this, :py:meth:`DataArray.pint.quantify` and :py:meth:`Dataset.pint.quantify` will make sure only a single registry is used per ``xarray`` object. If we wanted to change the units of the data of a :py:class:`DataArray`, we could do so using the :py:attr:`DataArray.name` attribute: .. ipython:: In [7]: da.pint.quantify({da.name: "J", "lat": "degree", "lon": "degree"}) However, `xarray`_ currently doesn't support `units in indexes`_, so the new units were set as attributes. To really observe the changes the ``quantify`` methods make, we have to first swap the dimensions: .. ipython:: In [8]: ds_with_units = ds.swap_dims({"lon": "x", "lat": "y"}).pint.quantify( ...: {"lat": "degree", "lon": "degree"} ...: ) ...: ds_with_units In [9]: da_with_units = da.swap_dims({"lon": "x", "lat": "y"}).pint.quantify( ...: {"lat": "degree", "lon": "degree"} ...: ) ...: da_with_units By default, :py:meth:`Dataset.pint.quantify` and :py:meth:`DataArray.pint.quantify` will use the unit registry at :py:obj:`pint_xarray.unit_registry` (the :py:func:`application registry `). If we want a different registry, we can either pass it as the ``unit_registry`` parameter: .. ipython:: In [10]: ureg = pint.UnitRegistry(force_ndarray_like=True) ...: # set up the registry In [11]: da.pint.quantify("degree", unit_registry=ureg) or overwrite the default registry: .. ipython:: In [12]: pint_xarray.unit_registry = ureg In [13]: da.pint.quantify("degree") .. note:: To properly work with ``xarray``, the ``force_ndarray_like`` or ``force_ndarray`` options have to be enabled on the custom registry. Without it, python scalars wrapped by :py:class:`pint.Quantity` may raise errors or have their units stripped. Saving with units ----------------- In order to not lose the units when saving to disk, we first have to call the :py:meth:`Dataset.pint.dequantify` and :py:meth:`DataArray.pint.dequantify` methods: .. ipython:: In [10]: ds_with_units.pint.dequantify() In [11]: da_with_units.pint.dequantify() This will get the string representation of a :py:class:`pint.Unit` instance and attach it as a ``units`` attribute. The data of the variable will now be whatever `pint`_ wrapped. .. _pint: https://pint.readthedocs.io/en/stable/ .. _xarray: https://docs.xarray.dev/en/stable/ .. _units in indexes: https://github.com/pydata/xarray/issues/1603 pint-xarray-0.6.0/docs/examples.rst000066400000000000000000000001101505507415300172700ustar00rootroot00000000000000Examples ======== .. toctree:: :maxdepth: 1 examples/plotting pint-xarray-0.6.0/docs/examples/000077500000000000000000000000001505507415300165465ustar00rootroot00000000000000pint-xarray-0.6.0/docs/examples/plotting.ipynb000066400000000000000000000071201505507415300214510ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "id": "0", "metadata": {}, "source": [ "# plotting quantified data" ] }, { "cell_type": "code", "execution_count": null, "id": "1", "metadata": {}, "outputs": [], "source": [ "# to be able to read unit attributes following the CF conventions\n", "import cf_xarray.units # noqa: F401 # must be imported before pint_xarray\n", "import xarray as xr\n", "\n", "import pint_xarray # noqa: F401\n", "from pint_xarray import unit_registry as ureg\n", "\n", "xr.set_options(display_expand_data=False)" ] }, { "cell_type": "markdown", "id": "2", "metadata": {}, "source": [ "## load the data" ] }, { "cell_type": "code", "execution_count": null, "id": "3", "metadata": {}, "outputs": [], "source": [ "ds = xr.tutorial.open_dataset(\"air_temperature\")\n", "data = ds.air\n", "data" ] }, { "cell_type": "markdown", "id": "4", "metadata": {}, "source": [ "## quantify the data" ] }, { "cell_type": "markdown", "id": "5", "metadata": {}, "source": [ "
\n", "Note: this example uses the data provided by the xarray.tutorial functions. As such, the units attributes follow the CF conventions, which pint does not understand by default. To still be able to read them we are using the registry provided by cf-xarray.\n", "
" ] }, { "cell_type": "code", "execution_count": null, "id": "6", "metadata": {}, "outputs": [], "source": [ "quantified = data.pint.quantify()\n", "quantified" ] }, { "cell_type": "markdown", "id": "7", "metadata": {}, "source": [ "## work with the data" ] }, { "cell_type": "code", "execution_count": null, "id": "8", "metadata": {}, "outputs": [], "source": [ "monthly_means = quantified.pint.to(\"degC\").sel(time=\"2013\").groupby(\"time.month\").mean()\n", "monthly_means" ] }, { "cell_type": "markdown", "id": "9", "metadata": {}, "source": [ "Most operations will preserve the units but there are some which will drop them (see the [duck array integration status](https://xarray.pydata.org/en/stable/user-guide/duckarrays.html#missing-features) page). To work around that there are unit-aware versions on the `.pint` accessor. For example, to select data use `.pint.sel` instead of `.sel`:" ] }, { "cell_type": "code", "execution_count": null, "id": "10", "metadata": {}, "outputs": [], "source": [ "monthly_means.sel(\n", " lat=ureg.Quantity(4350, \"angular_minute\"),\n", " lon=ureg.Quantity(12000, \"angular_minute\"),\n", ")" ] }, { "cell_type": "markdown", "id": "11", "metadata": {}, "source": [ "## plot\n", "\n", "`xarray`'s plotting functions will cast the data to `numpy.ndarray`, so we need to \"dequantify\" first." ] }, { "cell_type": "code", "execution_count": null, "id": "12", "metadata": {}, "outputs": [], "source": [ "monthly_means.pint.dequantify(format=\"~P\").plot.imshow(col=\"month\", col_wrap=4)" ] } ], "metadata": { "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3" } }, "nbformat": 4, "nbformat_minor": 5 } pint-xarray-0.6.0/docs/index.rst000066400000000000000000000015401505507415300165710ustar00rootroot00000000000000pint-xarray =========== A convenience wrapper for using `pint`_ in `xarray`_ objects. .. _pint: https://pint.readthedocs.io/en/stable .. _xarray: https://xarray.pydata.org/en/stable .. warning:: This package is experimental, and new versions might introduce backwards incompatible changes. Documentation ------------- **Getting Started**: - :doc:`installation` - :doc:`examples` .. toctree:: :maxdepth: 1 :caption: Getting Started :hidden: installation examples **User Guide**: - :doc:`terminology` - :doc:`creation` - :doc:`conversion` .. toctree:: :maxdepth: 1 :caption: User Guide :hidden: terminology creation conversion **Help & Reference**: - :doc:`whats-new` - :doc:`api` - :doc:`contributing` .. toctree:: :maxdepth: 1 :caption: Help & Reference :hidden: whats-new api contributing pint-xarray-0.6.0/docs/installation.rst000066400000000000000000000007121505507415300201630ustar00rootroot00000000000000Installation ------------ Install from ``conda-forge``: .. code:: sh conda install -c conda-forge pint-xarray or from ``PyPI``: .. code:: sh python -m pip install pint-xarray or from source, either directly from github: .. code:: sh python -m pip install git+https://github.com/xarray-contrib/pint-xarray or from a local copy: .. code:: sh git clone https://github.com/xarray-contrib/pint-xarray python -m pip install ./pint-xarray pint-xarray-0.6.0/docs/terminology.rst000066400000000000000000000004161505507415300200330ustar00rootroot00000000000000Terminology =========== .. glossary:: unit-like A `pint`_ unit definition, as accepted by :py:class:`pint.Unit`. May be a :py:class:`str`, a :py:class:`pint.Unit` instance or :py:obj:`None`. .. _pint: https://pint.readthedocs.io/en/stable pint-xarray-0.6.0/docs/whats-new.rst000066400000000000000000000175321505507415300174070ustar00rootroot00000000000000.. currentmodule:: xarray What's new ========== 0.6.0 (31 Aug 2025) ------------------- - Bump dependency versions (:pull:`313`): ============ ============== ============== dependency old minimum new minimum ============ ============== ============== python 3.10 3.11 xarray 2022.06.0 2023.07.0 numpy 1.23 1.26 pint 0.21 0.24 ============ ============== ============== By `Justus Magin `_. - Switch to using pixi for all dependency management (:pull:`314`). By `Justus Magin `_. - Added the :py:func:`pint_xarray.expects` decorator to allow wrapping quantity-unaware functions (:issue:`141`, :pull:`316`). By `Justus Magin `_ and `Tom Nicholas `_. - Follow the change in signature of :py:meth:`xarray.Index.equals` (:issue:`322`, :pull:`324`) By `Justus Magin `_. - Add units to the inline ``repr`` and define a custom ``repr`` (:issue:`308`, :pull:`325`) By `Justus Magin `_. - Collect multiple errors into a specific exception group (:pull:`329`) By `Justus Magin `_. 0.5.1 (10 Aug 2025) ------------------- - Pass ``sel`` options to the wrapped array (:pull:`304`, :issue:`303`) By `Bhavin Patel `_. - Support python 3.13 (:pull:`310`) By `Justus Magin `_. 0.5 (09 Jun 2025) ------------------ - drop support for python 3.9 (:pull:`266`) By `Justus Magin `_. - create a `PintIndex` to allow units on indexed coordinates (:pull:`163`, :issue:`162`) By `Justus Magin `_ and `Benoit Bovy `_. - fix :py:meth:`Dataset.pint.interp` and :py:meth:`DataArray.pint.interp` bug failing to pass through arguments (:pull:`270`, :issue:`267`) By `Martijn van der Marel `_ 0.4 (23 Jun 2024) ----------------- - adopt `SPEC0 `_ (:pull:`228`) This means that the supported versions change: ============ ============== ============== dependency old minimum new minimum ============ ============== ============== python 3.8 3.9 xarray 0.16.1 2022.06.0 numpy 1.17 1.23 pint 0.16 0.21 ============ ============== ============== By `Justus Magin `_. - add support for python 3.11 and 3.12 (:pull:`228`, :pull:`263`) By `Justus Magin `_. - ignore datetime units on attributes (:pull:`241`) By `Justus Magin `_. 0.3 (27 Jul 2022) ----------------- - drop support for python 3.7 (:pull:`153`) By `Justus Magin `_. - add support for python 3.10 (:pull:`155`) By `Justus Magin `_. - preserve :py:class:`pandas.MultiIndex` objects (:issue:`164`, :pull:`168`). By `Justus Magin `_. - fix "quantifying" dimension coordinates (:issue:`105`, :pull:`174`). By `Justus Magin `_. - allow using :py:meth:`DataArray.pint.quantify` and :py:meth:`Dataset.pint.quantify` as identity operators (:issue:`47`, :pull:`175`). By `Justus Magin `_. 0.2.1 (26 Jul 2021) ------------------- - allow special "no unit" values in :py:meth:`Dataset.pint.quantify` and :py:meth:`DataArray.pint.quantify` (:pull:`125`) By `Justus Magin `_. - convert the note about dimension coordinates saving their units in the attributes a warning (:issue:`124`, :pull:`126`) By `Justus Magin `_. - improve the documentation on the ``format`` parameter of :py:meth:`Dataset.pint.dequantify` and :py:meth:`DataArray.pint.dequantify` (:issue:`121`, :pull:`127`, :pull:`132`) By `Justus Magin `_. - use `cf-xarray `_'s unit registry in the plotting example (:issue:`107`, :pull:`128`). By `Justus Magin `_. 0.2 (May 10 2021) ----------------- - rewrite :py:meth:`Dataset.pint.quantify` and :py:meth:`DataArray.pint.quantify`, to use pint's ``UnitRegistry.parse_units`` instead of ``UnitRegistry.parse_expression`` (:issue:`40`) By `Tom Nicholas `_. - ensure the variables which causes the error is explicit if an error occurs in :py:meth:`Dataset.pint.quantify` and other methods (:pull:`43`, :issue:`91`) By `Tom Nicholas `_ and `Justus Magin `_. - refactor the internal conversion functions (:pull:`56`) By `Justus Magin `_. - allow converting indexes (except :py:class:`pandas.MultiIndex`) (:pull:`56`) By `Justus Magin `_. - document the reason for requiring the ``force_ndarray_like`` or ``force_ndarray`` options on unit registries (:pull:`59`) By `Justus Magin `_. - allow passing a format string to :py:meth:`Dataset.pint.dequantify` and :py:meth:`DataArray.pint.dequantify` (:pull:`49`) By `Justus Magin `_. - allow converting all data variables in a Dataset to the same units using :py:meth:`Dataset.pint.to` (:issue:`45`, :pull:`63`). By `Mika Pflüger `_. - update format of examples in docstrings (:pull:`64`). By `Mika Pflüger `_. - implement :py:meth:`Dataset.pint.sel` and :py:meth:`DataArray.pint.sel` (:pull:`60`). By `Justus Magin `_. - implement :py:attr:`Dataset.pint.loc` and :py:attr:`DataArray.pint.loc` (:pull:`79`). By `Justus Magin `_. - implement :py:meth:`Dataset.pint.drop_sel` and :py:meth:`DataArray.pint.drop_sel` (:pull:`73`). By `Justus Magin `_. - implement :py:meth:`Dataset.pint.chunk` and :py:meth:`DataArray.pint.chunk` (:pull:`83`). By `Justus Magin `_. - implement :py:meth:`Dataset.pint.reindex`, :py:meth:`Dataset.pint.reindex_like`, :py:meth:`DataArray.pint.reindex` and :py:meth:`DataArray.pint.reindex_like` (:pull:`69`). By `Justus Magin `_. - implement :py:meth:`Dataset.pint.interp`, :py:meth:`Dataset.pint.interp_like`, :py:meth:`DataArray.pint.interp` and :py:meth:`DataArray.pint.interp_like` (:pull:`72`, :pull:`76`, :pull:`97`). By `Justus Magin `_. - implement :py:meth:`Dataset.pint.ffill`, :py:meth:`Dataset.pint.bfill`, :py:meth:`DataArray.pint.ffill` and :py:meth:`DataArray.pint.bfill` (:pull:`78`). By `Justus Magin `_. - implement :py:meth:`Dataset.pint.interpolate_na` and :py:meth:`DataArray.pint.interpolate_na` (:pull:`82`). By `Justus Magin `_. - expose :py:func:`pint_xarray.setup_registry` as public API (:pull:`89`) By `Justus Magin `_. v0.1 (October 26 2020) ---------------------- - add initial draft of documentation (:pull:`13`, :pull:`20`) - implement :py:meth:`DataArray.pint.to` and :py:meth:`Dataset.pint.to` (:pull:`11`) - rewrite :py:meth:`DataArray.pint.quantify`, :py:meth:`Dataset.pint.quantify`, :py:meth:`DataArray.pint.dequantify` and :py:meth:`Dataset.pint.dequantify` (:pull:`17`) - expose :py:func:`pint_xarray.testing.assert_units_equal` as public API (:pull:`24`) - fix the :py:attr:`DataArray.pint.units`, :py:attr:`DataArray.pint.magnitude` and :py:attr:`DataArray.pint.dimensionality` properties and add docstrings for all three. (:pull:`31`) - use ``pint``'s application registry as a module-global registry (:pull:`32`) pint-xarray-0.6.0/licenses/000077500000000000000000000000001505507415300156055ustar00rootroot00000000000000pint-xarray-0.6.0/licenses/XARRAY_LICENSE000066400000000000000000000241121505507415300177000ustar00rootroot00000000000000Copyright 2014-2020, xarray developers Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: You must give any other recipients of the Work or Derivative Works a copy of this License; and You must cause any modified files to carry prominent notices stating that You changed the files; and You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. pint-xarray-0.6.0/pint_xarray/000077500000000000000000000000001505507415300163405ustar00rootroot00000000000000pint-xarray-0.6.0/pint_xarray/__init__.py000066400000000000000000000012771505507415300204600ustar00rootroot00000000000000from importlib.metadata import version import pint from pint_xarray import accessors, formatting, testing # noqa: F401 from pint_xarray._expects import expects from pint_xarray.accessors import default_registry as unit_registry from pint_xarray.accessors import setup_registry from pint_xarray.index import PintIndex try: __version__ = version("pint-xarray") except Exception: # pragma: no cover # Local copy or not installed with setuptools. # Disable minimum version checks on downstream libraries. __version__ = "999" pint.Quantity._repr_inline_ = formatting.inline_repr __all__ = [ "testing", "unit_registry", "setup_registry", "PintIndex", "expects", ] pint-xarray-0.6.0/pint_xarray/_expects.py000066400000000000000000000230061505507415300205250ustar00rootroot00000000000000import functools import inspect import itertools from inspect import Parameter import pint import pint.testing import xarray as xr from pint_xarray.accessors import get_registry from pint_xarray.conversion import extract_units from pint_xarray.itertools import zip_mappings variable_parameters = (Parameter.VAR_POSITIONAL, Parameter.VAR_KEYWORD) def _number_of_results(result): if isinstance(result, tuple): return len(result) elif result is None: return 0 else: return 1 def expects(*args_units, return_value=None, **kwargs_units): """ Decorator which ensures the inputs and outputs of the decorated function are expressed in the expected units. Arguments to the decorated function are checked for the specified units, converting to those units if necessary, and then stripped of their units before being passed into the undecorated function. Therefore the undecorated function should expect unquantified DataArrays, Datasets, or numpy-like arrays, but with the values expressed in specific units. Parameters ---------- func : callable Function to decorate, which accepts zero or more xarray.DataArrays or numpy-like arrays as inputs, and may optionally return one or more xarray.DataArrays or numpy-like arrays. *args_units : unit-like or mapping of hashable to unit-like, optional Units to expect for each positional argument given to func. The decorator will first check that arguments passed to the decorated function possess these specific units (or will attempt to convert the argument to these units), then will strip the units before passing the magnitude to the wrapped function. A value of None indicates not to check that argument for units (suitable for flags and other non-data arguments). return_value : unit-like or list of unit-like or mapping of hashable to unit-like \ or list of mapping of hashable to unit-like, optional The expected units of the returned value(s), either as a single unit or as a list of units. The decorator will attach these units to the variables returned from the function. A value of None indicates not to attach any units to that return value (suitable for flags and other non-data results). **kwargs_units : mapping of hashable to unit-like, optional Unit to expect for each keyword argument given to func. The decorator will first check that arguments passed to the decorated function possess these specific units (or will attempt to convert the argument to these units), then will strip the units before passing the magnitude to the wrapped function. A value of None indicates not to check that argument for units (suitable for flags and other non-data arguments). Returns ------- return_values : Any Return values of the wrapped function, either a single value or a tuple of values. These will be given units according to ``return_value``. Raises ------ TypeError If any of the units are not a valid type. ValueError If the number of arguments or return values does not match the number of units specified. Also thrown if any parameter does not have a unit specified. See Also -------- pint.wraps Examples -------- Decorating a function which takes one quantified input, but returns a non-data value (in this case a boolean). >>> @expects("deg C") ... def above_freezing(temp): ... return temp > 0 ... Decorating a function which allows any dimensions for the array, but also accepts an optional `weights` keyword argument, which must be dimensionless. >>> @expects(None, weights="dimensionless") ... def mean(da, weights=None): ... if weights: ... return da.weighted(weights=weights).mean() ... else: ... return da.mean() ... """ def outer(func): signature = inspect.signature(func) params_units = signature.bind(*args_units, **kwargs_units) missing_params = [ name for name, p in signature.parameters.items() if p.kind not in variable_parameters and name not in params_units.arguments ] if missing_params: raise ValueError( "Missing units for the following parameters: " + ", ".join(map(repr, missing_params)) ) n_expected_results = _number_of_results(return_value) @functools.wraps(func) def wrapper(*args, **kwargs): nonlocal return_value params = signature.bind(*args, **kwargs) # don't apply defaults, as those can't be quantities and thus must # already be in the correct units spec_units = dict( enumerate( itertools.chain.from_iterable( spec.values() if isinstance(spec, dict) else (spec,) for spec in params_units.arguments.values() if spec is not None ) ) ) params_units_ = dict( enumerate( itertools.chain.from_iterable( ( extract_units(param) if isinstance(param, (xr.DataArray, xr.Dataset)) else (param.units,) ) for name, param in params.arguments.items() if isinstance(param, (xr.DataArray, xr.Dataset, pint.Quantity)) ) ) ) ureg = get_registry( None, dict(spec_units) if spec_units else {}, dict(params_units_) if params_units else {}, ) errors = [] for name, (value, units) in zip_mappings( params.arguments, params_units.arguments ): try: if units is None: if isinstance(value, pint.Quantity) or ( isinstance(value, (xr.DataArray, xr.Dataset)) and value.pint.units ): raise TypeError( "Passed in a quantity where none was expected" ) continue if isinstance(value, pint.Quantity): params.arguments[name] = value.m_as(units) elif isinstance(value, (xr.DataArray, xr.Dataset)): params.arguments[name] = value.pint.to(units).pint.dequantify() else: raise TypeError( f"Attempting to convert non-quantity {value} to {units}." ) except ( TypeError, pint.errors.UndefinedUnitError, pint.errors.DimensionalityError, ) as e: e.add_note( f"expects: raised while trying to convert parameter {name}" ) errors.append(e) if errors: raise ExceptionGroup("Errors while converting parameters", errors) result = func(*params.args, **params.kwargs) n_results = _number_of_results(result) if return_value is not None and ( (isinstance(result, tuple) ^ isinstance(return_value, tuple)) or (n_results != n_expected_results) ): message = "mismatched number of return values:" if n_results != n_expected_results: message += f" expected {n_expected_results} but got {n_results}." elif isinstance(result, tuple) and not isinstance(return_value, tuple): message += ( " expected a single return value but got a 1-sized tuple." ) else: message += ( " expected a 1-sized tuple but got a single return value." ) raise ValueError(message) if result is None: return if not isinstance(result, tuple): result = (result,) if not isinstance(return_value, tuple): return_value = (return_value,) final_result = [] errors = [] for index, (value, units) in enumerate(zip(result, return_value)): if units is not None: try: if isinstance(value, (xr.Dataset, xr.DataArray)): value = value.pint.quantify(units) else: value = ureg.Quantity(value, units) except Exception as e: e.add_note( f"expects: raised while trying to convert return value {index}" ) errors.append(e) final_result.append(value) if errors: raise ExceptionGroup("Errors while converting return values", errors) if n_results == 1: return final_result[0] return tuple(final_result) return wrapper return outer pint-xarray-0.6.0/pint_xarray/accessors.py000066400000000000000000001611041505507415300207020ustar00rootroot00000000000000# TODO is it possible to import pint-xarray from within xarray if pint is present? import itertools import pint from pint import Unit from xarray import register_dataarray_accessor, register_dataset_accessor from xarray.core.dtypes import NA from pint_xarray import conversion from pint_xarray.conversion import no_unit_values from pint_xarray.errors import create_exception_group _default = object() def setup_registry(registry): """set up the given registry for use with pint_xarray Namely, it enables ``force_ndarray_like`` to make sure results are always duck arrays. Parameters ---------- registry : pint.UnitRegistry The registry to modify """ if not registry.force_ndarray and not registry.force_ndarray_like: registry.force_ndarray_like = True return registry default_registry = setup_registry(pint.get_application_registry()) # TODO could/should we overwrite xr.open_dataset and xr.open_mfdataset to make # them apply units upon loading??? # TODO could even override the decode_cf kwarg? # TODO docstrings # TODO type hints def is_dict_like(obj): return hasattr(obj, "keys") and hasattr(obj, "__getitem__") def zip_mappings(*mappings, fill_value=None): """zip mappings by combining values for common keys into a tuple Works like itertools.zip_longest, so if a key is missing from a mapping, it is replaced by ``fill_value``. Parameters ---------- *mappings : dict-like The mappings to zip fill_value The value to use if a key is missing from a mapping. Returns ------- zipped : dict-like The zipped mapping """ keys = set(itertools.chain.from_iterable(mapping.keys() for mapping in mappings)) # TODO: could this be made more efficient using itertools.groupby? zipped = { key: tuple(mapping.get(key, fill_value) for mapping in mappings) for key in keys } return zipped def units_to_str_or_none(mapping, unit_format): formatter = str if not unit_format else lambda v: unit_format.format(v) return { key: formatter(value) if isinstance(value, Unit) else value for key, value in mapping.items() } # based on xarray.core.utils.either_dict_or_kwargs # https://github.com/pydata/xarray/blob/v0.15.1/xarray/core/utils.py#L249-L268 def either_dict_or_kwargs(positional, keywords, method_name): if positional not in (_default, None): if not is_dict_like(positional): raise ValueError( f"the first argument to .{method_name} must be a dictionary" ) if keywords: raise ValueError( "cannot specify both keyword and positional " f"arguments to .{method_name}" ) return positional else: return keywords def get_registry(unit_registry, new_units, existing_units): units = itertools.chain(new_units.values(), existing_units.values()) registries = {unit._REGISTRY for unit in units if isinstance(unit, Unit)} if unit_registry is None: if not registries: unit_registry = default_registry elif len(registries) == 1: (unit_registry,) = registries registries.add(unit_registry) if len(registries) > 1 or unit_registry not in registries: raise ValueError( "using multiple unit registries in the same object is not supported" ) if not unit_registry.force_ndarray_like and not unit_registry.force_ndarray: raise ValueError( "invalid registry. Please enable 'force_ndarray_like' or 'force_ndarray'." ) return unit_registry def _decide_units(units, registry, unit_attribute): if units is _default and unit_attribute in (None, _default): # or warn and return None? raise ValueError("no units given") elif units in no_unit_values or isinstance(units, Unit): # TODO what happens if they pass in a Unit from a different registry return units elif units is _default: if unit_attribute in no_unit_values: return unit_attribute if isinstance(unit_attribute, Unit): units = unit_attribute else: units = registry.parse_units(unit_attribute) else: units = registry.parse_units(units) return units class DatasetLocIndexer: __slots__ = ("ds",) def __init__(self, ds): self.ds = ds def __getitem__(self, indexers): if not is_dict_like(indexers): raise NotImplementedError("pandas-style indexing is not supported, yet") dims = self.ds.dims indexer_units = conversion.extract_indexer_units(indexers) indexer_units = { name: indexer for name, indexer in indexer_units.items() if name in dims } # convert the indexes to the indexer's units try: converted = conversion.convert_units(self.ds, indexer_units) except ValueError as e: raise KeyError(*e.args) from e # index stripped_indexers = conversion.strip_indexer_units(indexers) stripped = conversion.strip_units(converted) converted_units = conversion.extract_units(converted) indexed = stripped.loc[stripped_indexers] return conversion.attach_units(indexed, converted_units) class DataArrayLocIndexer: __slots__ = ("da",) def __init__(self, da): self.da = da def __getitem__(self, indexers): if not is_dict_like(indexers): raise NotImplementedError("pandas-style indexing is not supported, yet") dims = self.da.dims indexer_units = conversion.extract_indexer_units(indexers) indexer_units = { name: indexer for name, indexer in indexer_units.items() if name in dims } # convert the indexes to the indexer's units try: converted = conversion.convert_units(self.da, indexer_units) except ValueError as e: raise KeyError(*e.args) from e # index stripped_indexers = conversion.strip_indexer_units(indexers) stripped = conversion.strip_units(converted) converted_units = conversion.extract_units(converted) indexed = stripped.loc[stripped_indexers] return conversion.attach_units(indexed, converted_units) def __setitem__(self, indexers, values): if not is_dict_like(indexers): raise NotImplementedError("pandas-style indexing is not supported, yet") dims = self.da.dims unit_attrs = conversion.extract_unit_attributes(self.da) index_units = { name: units for name, units in unit_attrs.items() if name in dims } # convert the indexers to the index units try: converted = conversion.convert_indexer_units(indexers, index_units) except ValueError as e: raise KeyError(*e.args) from e # index stripped_indexers = conversion.strip_indexer_units(converted) self.da.loc[stripped_indexers] = values @register_dataarray_accessor("pint") class PintDataArrayAccessor: """ Access methods for DataArrays with units using Pint. Methods and attributes can be accessed through the `.pint` attribute. """ def __init__(self, da): self.da = da def quantify(self, units=_default, unit_registry=None, **unit_kwargs): """ Attach units to the DataArray. Units can be specified as a pint.Unit or as a string, which will be parsed by the given unit registry. If no units are specified then the units will be parsed from the `'units'` entry of the DataArray's `.attrs`. Will raise a ValueError if the DataArray already contains a unit-aware array with a different unit. .. note:: Be aware that unless you're using ``dask`` this will load the data into memory. To avoid that, consider converting to ``dask`` first (e.g. using ``chunk``). .. note:: Also note that datetime units (i.e. ones that match ``{units} since {date}``) in unit attributes will be ignored, to avoid interfering with ``xarray``'s datetime encoding / decoding. Parameters ---------- units : unit-like or mapping of hashable to unit-like, optional Physical units to use for this DataArray. If a str or pint.Unit, will be used as the DataArray's units. If a dict-like, it should map a variable name to the desired unit (use the DataArray's name to refer to its data). If not provided, ``quantify`` will try to read them from ``DataArray.attrs['units']`` using pint's parser. The ``"units"`` attribute will be removed from all variables except from dimension coordinates. unit_registry : pint.UnitRegistry, optional Unit registry to be used for the units attached to this DataArray. If not given then a default registry will be created. **unit_kwargs Keyword argument form of units. Returns ------- quantified : DataArray DataArray whose wrapped array data will now be a Quantity array with the specified units. Notes ----- ``"none"`` and ``None`` can be used to mark variables that should not be quantified. Examples -------- >>> da = xr.DataArray( ... data=[0.4, 0.9, 1.7, 4.8, 3.2, 9.1], ... dims=["wavelength"], ... coords={"wavelength": [1e-4, 2e-4, 4e-4, 6e-4, 1e-3, 2e-3]}, ... ) >>> da.pint.quantify(units="Hz") Size: 48B Coordinates: * wavelength (wavelength) float64 48B 0.0001 0.0002 0.0004 0.0006 0.001 0.002 Don't quantify the data: >>> da = xr.DataArray( ... data=[0.4, 0.9], ... dims=["wavelength"], ... attrs={"units": "Hz"}, ... ) >>> da.pint.quantify(units=None) Size: 16B array([0.4, 0.9]) Dimensions without coordinates: wavelength Quantify with the same unit: >>> q = da.pint.quantify() >>> q Size: 16B Dimensions without coordinates: wavelength >>> q.pint.quantify("Hz") Size: 16B Dimensions without coordinates: wavelength """ if units is None or isinstance(units, (str, pint.Unit)): if self.da.name in unit_kwargs: raise ValueError( f"ambiguous values given for {repr(self.da.name)}:" f" {repr(units)} and {repr(unit_kwargs[self.da.name])}" ) unit_kwargs[self.da.name] = units units = None units = either_dict_or_kwargs(units, unit_kwargs, "quantify") registry = get_registry(unit_registry, units, conversion.extract_units(self.da)) unit_attrs = conversion.extract_unit_attributes(self.da) possible_new_units = zip_mappings(units, unit_attrs, fill_value=_default) new_units = {} invalid_units = {} for name, (unit, attr) in possible_new_units.items(): if unit not in (_default, None) or attr not in (_default, None): try: new_units[name] = _decide_units(unit, registry, attr) except (ValueError, pint.UndefinedUnitError) as e: if unit not in (_default, None): type = "parameter" reported_unit = unit else: type = "attribute" reported_unit = attr invalid_units[name] = (reported_unit, type, e) if invalid_units: raise create_exception_group(invalid_units, "parse") existing_units = { name: unit for name, unit in conversion.extract_units(self.da).items() if isinstance(unit, Unit) } overwritten_units = { name: (old, new) for name, (old, new) in zip_mappings( existing_units, new_units, fill_value=_default ).items() if old is not _default and new is not _default and old != new } if overwritten_units: errors = { name: ( new, ValueError( f"Cannot attach unit {repr(new)} to quantity: data " f"already has units {repr(old)}" ), ) for name, (old, new) in overwritten_units.items() } raise create_exception_group(errors, "attach") return self.da.pipe(conversion.strip_unit_attributes).pipe( conversion.attach_units, new_units ) def dequantify(self, format=None): r""" Convert the units of the DataArray to string attributes. Will replace ``.attrs['units']`` on each variable with a string representation of the ``pint.Unit`` instance. Parameters ---------- format : str, default: None The format specification (as accepted by pint) used for the string representations. If ``None``, the registry's default (:py:attr:`pint.UnitRegistry.default_format`) is used instead. Returns ------- dequantified : DataArray DataArray whose array data is unitless, and of the type that was previously wrapped by `pint.Quantity`. See Also -------- :doc:`pint:user/formatting` pint's string formatting guide Examples -------- >>> da = xr.DataArray([0, 1], dims="x") >>> q = da.pint.quantify("m / s") >>> q Size: 16B Dimensions without coordinates: x >>> q.pint.dequantify(format="P") Size: 16B array([0, 1]) Dimensions without coordinates: x Attributes: units: meter/second >>> q.pint.dequantify(format="~P") Size: 16B array([0, 1]) Dimensions without coordinates: x Attributes: units: m/s Use the registry's default format >>> pint_xarray.unit_registry.default_format = "~L" >>> q.pint.dequantify() Size: 16B array([0, 1]) Dimensions without coordinates: x Attributes: units: \frac{\mathrm{m}}{\mathrm{s}} """ units = conversion.extract_unit_attributes(self.da) units.update(conversion.extract_units(self.da)) unit_format = f"{{:{format}}}" if isinstance(format, str) else format units = units_to_str_or_none(units, unit_format) return ( self.da.pipe(conversion.strip_units) .pipe(conversion.strip_unit_attributes) .pipe(conversion.attach_unit_attributes, units) ) @property def magnitude(self): """the magnitude of the data or the data itself if not a quantity.""" data = self.da.data return getattr(data, "magnitude", data) @property def units(self): """the units of the data or :py:obj:`None` if not a quantity. Setting the units is possible, but only if the data is not already a quantity. """ return getattr(self.da.data, "units", None) @units.setter def units(self, units): self.da.data = conversion.array_attach_units(self.da.data, units) @property def dimensionality(self): """get the dimensionality of the data or :py:obj:`None` if not a quantity.""" return getattr(self.da.data, "dimensionality", None) @property def registry(self): # TODO is this a bad idea? (see GH issue #1071 in pint) return getattr(self.da.data, "_REGISTRY", None) @registry.setter def registry(self, _): raise AttributeError("Don't try to change the registry once created") def to(self, units=None, **unit_kwargs): """convert the quantities in a DataArray Parameters ---------- units : unit-like or mapping of hashable to unit-like, optional The units to convert to. If a unit name or ``pint.Unit`` object, convert the DataArray's data. If a dict-like, it has to map a variable name to a unit name or ``pint.Unit`` object. **unit_kwargs The kwargs form of ``units``. Can only be used for variable names that are strings and valid python identifiers. Returns ------- object : DataArray A new object with converted units. Examples -------- >>> da = xr.DataArray( ... data=np.linspace(0, 1, 5) * ureg.m, ... coords={"u": ("x", np.arange(5) * ureg.s)}, ... dims="x", ... name="arr", ... ) >>> da Size: 40B Coordinates: u (x) int64 40B [s] 0 1 2 3 4 Dimensions without coordinates: x Convert the data >>> da.pint.to("mm") Size: 40B Coordinates: u (x) int64 40B [s] 0 1 2 3 4 Dimensions without coordinates: x >>> da.pint.to(ureg.mm) Size: 40B Coordinates: u (x) int64 40B [s] 0 1 2 3 4 Dimensions without coordinates: x >>> da.pint.to({da.name: "mm"}) Size: 40B Coordinates: u (x) int64 40B [s] 0 1 2 3 4 Dimensions without coordinates: x Convert coordinates >>> da.pint.to({"u": ureg.ms}) Size: 40B Coordinates: u (x) float64 40B [ms] 0.0 1e+03 2e+03 3e+03 4e+03 Dimensions without coordinates: x >>> da.pint.to(u="ms") Size: 40B Coordinates: u (x) float64 40B [ms] 0.0 1e+03 2e+03 3e+03 4e+03 Dimensions without coordinates: x Convert both simultaneously >>> da.pint.to("mm", u="ms") Size: 40B Coordinates: u (x) float64 40B [ms] 0.0 1e+03 2e+03 3e+03 4e+03 Dimensions without coordinates: x >>> da.pint.to({"arr": ureg.mm, "u": ureg.ms}) Size: 40B Coordinates: u (x) float64 40B [ms] 0.0 1e+03 2e+03 3e+03 4e+03 Dimensions without coordinates: x >>> da.pint.to(arr="mm", u="ms") Size: 40B Coordinates: u (x) float64 40B [ms] 0.0 1e+03 2e+03 3e+03 4e+03 Dimensions without coordinates: x """ if isinstance(units, (str, pint.Unit)): unit_kwargs[self.da.name] = units units = None elif units is not None and not is_dict_like(units): raise ValueError( "units must be either a string, a pint.Unit object or a dict-like," f" but got {units!r}" ) units = either_dict_or_kwargs(units, unit_kwargs, "to") return conversion.convert_units(self.da, units) def chunk(self, chunks, name_prefix="xarray-", token=None, lock=False): """unit-aware version of chunk Like :py:meth:`xarray.DataArray.chunk`, but chunking a quantity will change the wrapped type to ``dask``. .. note:: It is recommended to only use this when chunking in-memory arrays. To rechunk please use :py:meth:`xarray.DataArray.chunk`. See Also -------- xarray.DataArray.chunk xarray.Dataset.pint.chunk """ units = conversion.extract_units(self.da) stripped = conversion.strip_units(self.da) chunked = stripped.chunk( chunks, name_prefix=name_prefix, token=token, lock=lock ) return conversion.attach_units(chunked, units) def reindex( self, indexers=None, method=None, tolerance=None, copy=True, fill_value=NA, **indexers_kwargs, ): """unit-aware version of reindex Like :py:meth:`xarray.DataArray.reindex`, except the object's indexes are converted to the units of the indexers first. .. note:: ``tolerance`` and ``fill_value`` are not supported, yet. They will be passed through to ``DataArray.reindex`` unmodified. See Also -------- xarray.Dataset.pint.reindex xarray.DataArray.pint.reindex_like xarray.DataArray.reindex """ indexers = either_dict_or_kwargs(indexers, indexers_kwargs, "reindex") dims = self.da.dims indexer_units = conversion.extract_indexer_units(indexers) indexer_units = { name: indexer for name, indexer in indexer_units.items() if name in dims } # TODO: handle tolerance # TODO: handle fill_value # convert the indexes to the indexer's units converted = conversion.convert_units(self.da, indexer_units) converted_units = conversion.extract_units(converted) stripped = conversion.strip_units(converted) # index stripped_indexers = conversion.strip_indexer_units(indexers) indexed = stripped.reindex( stripped_indexers, method=method, tolerance=tolerance, copy=copy, fill_value=fill_value, ) return conversion.attach_units(indexed, converted_units) def reindex_like( self, other, method=None, tolerance=None, copy=True, fill_value=NA ): """unit-aware version of reindex_like Like :py:meth:`xarray.DataArray.reindex_like`, except the object's indexes are converted to the units of the indexers first. .. note:: ``tolerance`` and ``fill_value`` are not supported, yet. They will be passed through to ``DataArray.reindex_like`` unmodified. See Also -------- xarray.Dataset.pint.reindex_like xarray.DataArray.pint.reindex xarray.DataArray.reindex_like """ indexer_units = conversion.extract_units(other) converted = conversion.convert_units(self.da, indexer_units) units = conversion.extract_units(converted) stripped = conversion.strip_units(converted) stripped_other = conversion.strip_units(other) # TODO: handle tolerance # TODO: handle fill_value reindexed = stripped.reindex_like( stripped_other, method=method, tolerance=tolerance, copy=copy, fill_value=fill_value, ) return conversion.attach_units(reindexed, units) def interp( self, coords=None, method="linear", assume_sorted=False, kwargs=None, **coords_kwargs, ): """unit-aware version of interp Like :py:meth:`xarray.DataArray.interp`, except the object's indexes are converted to the units of the indexers first. .. note:: ``method``, ``assume_sorted`` and ``kwargs`` are passed unmodified to ``DataArray.interp``. See Also -------- xarray.Dataset.pint.interp xarray.DataArray.pint.interp_like xarray.DataArray.interp """ indexers = either_dict_or_kwargs(coords, coords_kwargs, "interp") dims = self.da.dims indexer_units = conversion.extract_indexer_units(indexers) indexer_units = { name: indexer for name, indexer in indexer_units.items() if name in dims } # convert the indexes to the indexer's units converted = conversion.convert_units(self.da, indexer_units) units = conversion.extract_units(converted) stripped = conversion.strip_units(converted) # index stripped_indexers = conversion.strip_indexer_units(indexers) interpolated = stripped.interp( stripped_indexers, method=method, assume_sorted=assume_sorted, kwargs=kwargs, ) return conversion.attach_units(interpolated, units) def interp_like(self, other, method="linear", assume_sorted=False, kwargs=None): """unit-aware version of interp_like Like :py:meth:`xarray.DataArray.interp_like`, except the object's indexes are converted to the units of the indexers first. .. note:: ``method``, ``assume_sorted`` and ``kwargs`` are passed unmodified to ``DataArray.interp``. See Also -------- xarray.Dataset.pint.interp_like xarray.DataArray.pint.interp xarray.DataArray.interp_like """ indexer_units = conversion.extract_units(other) converted = conversion.convert_units(self.da, indexer_units) units = conversion.extract_units(converted) stripped = conversion.strip_units(converted) stripped_other = conversion.strip_units(other) interpolated = stripped.interp_like( stripped_other, method=method, assume_sorted=assume_sorted, kwargs=kwargs, ) return conversion.attach_units(interpolated, units) def sel( self, indexers=None, method=None, tolerance=None, drop=False, **indexers_kwargs ): """unit-aware version of sel Like :py:meth:`xarray.DataArray.sel`, except the object's indexes are converted to the units of the indexers first. .. note:: ``tolerance`` is not supported, yet. It will be passed through to ``DataArray.sel`` unmodified. See Also -------- xarray.Dataset.pint.sel xarray.DataArray.sel xarray.Dataset.sel """ indexers = either_dict_or_kwargs(indexers, indexers_kwargs, "sel") dims = self.da.dims indexer_units = conversion.extract_indexer_units(indexers) indexer_units = { name: indexer for name, indexer in indexer_units.items() if name in dims } # TODO: handle tolerance # convert the indexes to the indexer's units try: converted = conversion.convert_units(self.da, indexer_units) except ValueError as e: raise KeyError(*e.args) from e # index stripped_indexers = conversion.strip_indexer_units(indexers) stripped = conversion.strip_units(converted) converted_units = conversion.extract_units(converted) indexed = stripped.sel( stripped_indexers, method=method, tolerance=tolerance, drop=drop, ) return conversion.attach_units(indexed, converted_units) @property def loc(self): """Unit-aware attribute for indexing .. note:: Position based indexing (e.g. ``ds.loc[1, 2:]``) is not supported, yet See Also -------- xarray.DataArray.loc """ return DataArrayLocIndexer(self.da) def drop_sel(self, labels=None, *, errors="raise", **labels_kwargs): """unit-aware version of drop_sel Just like :py:meth:`xarray.DataArray.drop_sel`, except the indexers are converted to the units of the object's indexes first. See Also -------- xarray.Dataset.pint.drop_sel xarray.DataArray.drop_sel xarray.Dataset.drop_sel """ indexers = either_dict_or_kwargs(labels, labels_kwargs, "drop_sel") dims = self.da.dims unit_attrs = conversion.extract_unit_attributes(self.da) index_units = { name: units for name, units in unit_attrs.items() if name in dims } # convert the indexers to the indexes units try: converted_indexers = conversion.convert_indexer_units(indexers, index_units) except ValueError as e: raise KeyError(*e.args) from e # index stripped_indexers = conversion.strip_indexer_units(converted_indexers) indexed = self.da.drop_sel( stripped_indexers, errors=errors, ) return indexed def ffill(self, dim, limit=None): """unit-aware version of ffill Like :py:meth:`xarray.DataArray.ffill` but without stripping the data units. See Also -------- xarray.DataArray.ffill xarray.DataArray.pint.bfill """ units = conversion.extract_units(self.da) stripped = conversion.strip_units(self.da) filled = stripped.ffill(dim=dim, limit=limit) return conversion.attach_units(filled, units) def bfill(self, dim, limit=None): """unit-aware version of bfill Like :py:meth:`xarray.DataArray.bfill` but without stripping the data units. See Also -------- xarray.DataArray.bfill xarray.DataArray.pint.ffill """ units = conversion.extract_units(self.da) stripped = conversion.strip_units(self.da) filled = stripped.bfill(dim=dim, limit=limit) return conversion.attach_units(filled, units) def interpolate_na( self, dim=None, method="linear", limit=None, use_coordinate=True, max_gap=None, keep_attrs=None, **kwargs, ): """unit-aware version of interpolate_na Like :py:meth:`xarray.DataArray.interpolate_na` but without stripping the units on data or coordinates. .. note:: ``max_gap`` is not supported, yet, and will be passed through to ``DataArray.interpolate_na`` unmodified. See Also -------- xarray.Dataset.pint.interpolate_na xarray.DataArray.interpolate_na """ units = conversion.extract_units(self.da) stripped = conversion.strip_units(self.da) interpolated = stripped.interpolate_na( dim=dim, method=method, limit=limit, use_coordinate=use_coordinate, max_gap=max_gap, keep_attrs=keep_attrs, **kwargs, ) return conversion.attach_units(interpolated, units) @register_dataset_accessor("pint") class PintDatasetAccessor: """ Access methods for DataArrays with units using Pint. Methods and attributes can be accessed through the `.pint` attribute. """ def __init__(self, ds): self.ds = ds def quantify(self, units=_default, unit_registry=None, **unit_kwargs): """ Attach units to the variables of the Dataset. Units can be specified as a ``pint.Unit`` or as a string, which will be parsed by the given unit registry. If no units are specified then the units will be parsed from the ``"units"`` entry of the Dataset variable's ``.attrs``. Will raise a ValueError if any of the variables already contain a unit-aware array with a different unit. .. note:: Be aware that unless you're using ``dask`` this will load the data into memory. To avoid that, consider converting to ``dask`` first (e.g. using ``chunk``). .. note:: Also note that datetime units (i.e. ones that match ``{units} since {date}``) in unit attributes will be ignored, to avoid interfering with ``xarray``'s datetime encoding / decoding. Parameters ---------- units : mapping of hashable to unit-like, optional Physical units to use for particular DataArrays in this Dataset. It should map variable names to units (unit names or ``pint.Unit`` objects). If not provided, ``quantify`` will try to read them from ``Dataset[var].attrs['units']`` using pint's parser. The ``"units"`` attribute will be removed from all variables except from dimension coordinates. unit_registry : pint.UnitRegistry, optional Unit registry to be used for the units attached to each DataArray in this Dataset. If not given then a default registry will be created. **unit_kwargs Keyword argument form of ``units``. Returns ------- quantified : Dataset Dataset whose variables will now contain Quantity arrays with units. Notes ----- ``"none"`` and ``None`` can be used to mark variables that should not be quantified. Examples -------- >>> ds = xr.Dataset( ... {"a": ("x", [0, 3, 2], {"units": "m"}), "b": ("x", [5, -2, 1])}, ... coords={"x": [0, 1, 2], "u": ("x", [-1, 0, 1], {"units": "s"})}, ... ) >>> ds.pint.quantify() Size: 96B Dimensions: (x: 3) Coordinates: * x (x) int64 24B 0 1 2 u (x) int64 24B [s] -1 0 1 Data variables: a (x) int64 24B [m] 0 3 2 b (x) int64 24B 5 -2 1 >>> ds.pint.quantify({"b": "dm"}) Size: 96B Dimensions: (x: 3) Coordinates: * x (x) int64 24B 0 1 2 u (x) int64 24B [s] -1 0 1 Data variables: a (x) int64 24B [m] 0 3 2 b (x) int64 24B [dm] 5 -2 1 Don't quantify specific variables: >>> ds.pint.quantify({"a": None}) Size: 96B Dimensions: (x: 3) Coordinates: * x (x) int64 24B 0 1 2 u (x) int64 24B [s] -1 0 1 Data variables: a (x) int64 24B 0 3 2 b (x) int64 24B 5 -2 1 Quantify with the same unit: >>> q = ds.pint.quantify() >>> q Size: 96B Dimensions: (x: 3) Coordinates: * x (x) int64 24B 0 1 2 u (x) int64 24B [s] -1 0 1 Data variables: a (x) int64 24B [m] 0 3 2 b (x) int64 24B 5 -2 1 >>> q.pint.quantify({"a": "m"}) Size: 96B Dimensions: (x: 3) Coordinates: * x (x) int64 24B 0 1 2 u (x) int64 24B [s] -1 0 1 Data variables: a (x) int64 24B [m] 0 3 2 b (x) int64 24B 5 -2 1 """ units = either_dict_or_kwargs(units, unit_kwargs, "quantify") registry = get_registry(unit_registry, units, conversion.extract_units(self.ds)) unit_attrs = conversion.extract_unit_attributes(self.ds) possible_new_units = zip_mappings(units, unit_attrs, fill_value=_default) new_units = {} invalid_units = {} for name, (unit, attr) in possible_new_units.items(): if unit is not _default or attr not in (None, _default): try: new_units[name] = _decide_units(unit, registry, attr) except (ValueError, pint.UndefinedUnitError) as e: if unit is not _default: type = "parameter" reported_unit = unit else: type = "attribute" reported_unit = attr invalid_units[name] = (reported_unit, type, e) if invalid_units: raise create_exception_group(invalid_units, "parse") existing_units = { name: unit for name, unit in conversion.extract_units(self.ds).items() if isinstance(unit, Unit) } overwritten_units = { name: (old, new) for name, (old, new) in zip_mappings( existing_units, new_units, fill_value=_default ).items() if old is not _default and new is not _default and old != new } if overwritten_units: errors = { name: ( new, ValueError( f"Cannot attach unit {repr(new)} to quantity: data " f"already has units {repr(old)}" ), ) for name, (old, new) in overwritten_units.items() } raise create_exception_group(errors, "attach") return self.ds.pipe(conversion.strip_unit_attributes).pipe( conversion.attach_units, new_units ) def dequantify(self, format=None): r""" Convert units from the Dataset to string attributes. Will replace ``.attrs['units']`` on each variable with a string representation of the ``pint.Unit`` instance. Parameters ---------- format : str, default: None The format specification (as accepted by pint's unit formatter) used for the string representations. If ``None``, the registry's default (:py:attr:`pint.UnitRegistry.default_format`) is used instead. Returns ------- dequantified : Dataset Dataset whose data variables are unitless, and of the type that was previously wrapped by ``pint.Quantity``. See Also -------- :doc:`pint:user/formatting` pint's string formatting guide Examples -------- >>> ds = xr.Dataset({"a": ("x", [0, 1]), "b": ("y", [2, 3, 4])}) >>> q = ds.pint.quantify({"a": "m / s", "b": "s"}) >>> q Size: 40B Dimensions: (x: 2, y: 3) Dimensions without coordinates: x, y Data variables: a (x) int64 16B [m/s] 0 1 b (y) int64 24B [s] 2 3 4 >>> d = q.pint.dequantify(format="P") >>> d.a Size: 16B array([0, 1]) Dimensions without coordinates: x Attributes: units: meter/second >>> d.b Size: 24B array([2, 3, 4]) Dimensions without coordinates: y Attributes: units: second >>> d = q.pint.dequantify(format="~P") >>> d.a Size: 16B array([0, 1]) Dimensions without coordinates: x Attributes: units: m/s >>> d.b Size: 24B array([2, 3, 4]) Dimensions without coordinates: y Attributes: units: s Use the registry's default format >>> pint_xarray.unit_registry.default_format = "~L" >>> d = q.pint.dequantify() >>> d.a Size: 16B array([0, 1]) Dimensions without coordinates: x Attributes: units: \frac{\mathrm{m}}{\mathrm{s}} >>> d.b Size: 24B array([2, 3, 4]) Dimensions without coordinates: y Attributes: units: \mathrm{s} """ units = conversion.extract_unit_attributes(self.ds) units.update(conversion.extract_units(self.ds)) unit_format = f"{{:{format}}}" if isinstance(format, str) else format units = units_to_str_or_none(units, unit_format) return ( self.ds.pipe(conversion.strip_units) .pipe(conversion.strip_unit_attributes) .pipe(conversion.attach_unit_attributes, units) ) def to(self, units=None, **unit_kwargs): """convert the quantities in a Dataset Parameters ---------- units : unit-like or mapping of hashable to unit-like, optional The units to convert to. If a unit name or ``pint.Unit`` object, convert all the object's data variables. If a dict-like, it maps variable names to unit names or ``pint.Unit`` objects. **unit_kwargs The kwargs form of ``units``. Can only be used for variable names that are strings and valid python identifiers. Returns ------- object : Dataset A new object with converted units. Examples -------- >>> ds = xr.Dataset( ... data_vars={ ... "a": ("x", np.linspace(0, 1, 5) * ureg.m), ... "b": ("x", np.linspace(-1, 0, 5) * ureg.kg), ... }, ... coords={"u": ("x", np.arange(5) * ureg.s)}, ... ) >>> ds Size: 120B Dimensions: (x: 5) Coordinates: u (x) int64 40B [s] 0 1 2 3 4 Dimensions without coordinates: x Data variables: a (x) float64 40B [m] 0.0 0.25 0.5 0.75 1.0 b (x) float64 40B [kg] -1.0 -0.75 -0.5 -0.25 0.0 Convert the data >>> ds.pint.to({"a": "mm", "b": ureg.g}) Size: 120B Dimensions: (x: 5) Coordinates: u (x) int64 40B [s] 0 1 2 3 4 Dimensions without coordinates: x Data variables: a (x) float64 40B [mm] 0.0 250.0 500.0 750.0 1e+03 b (x) float64 40B [g] -1e+03 -750.0 -500.0 -250.0 0.0 >>> ds.pint.to(a=ureg.mm, b="g") Size: 120B Dimensions: (x: 5) Coordinates: u (x) int64 40B [s] 0 1 2 3 4 Dimensions without coordinates: x Data variables: a (x) float64 40B [mm] 0.0 250.0 500.0 750.0 1e+03 b (x) float64 40B [g] -1e+03 -750.0 -500.0 -250.0 0.0 Convert coordinates >>> ds.pint.to({"u": ureg.ms}) Size: 120B Dimensions: (x: 5) Coordinates: u (x) float64 40B [ms] 0.0 1e+03 2e+03 3e+03 4e+03 Dimensions without coordinates: x Data variables: a (x) float64 40B [m] 0.0 0.25 0.5 0.75 1.0 b (x) float64 40B [kg] -1.0 -0.75 -0.5 -0.25 0.0 >>> ds.pint.to(u="ms") Size: 120B Dimensions: (x: 5) Coordinates: u (x) float64 40B [ms] 0.0 1e+03 2e+03 3e+03 4e+03 Dimensions without coordinates: x Data variables: a (x) float64 40B [m] 0.0 0.25 0.5 0.75 1.0 b (x) float64 40B [kg] -1.0 -0.75 -0.5 -0.25 0.0 Convert both simultaneously >>> ds.pint.to(a=ureg.mm, b=ureg.g, u="ms") Size: 120B Dimensions: (x: 5) Coordinates: u (x) float64 40B [ms] 0.0 1e+03 2e+03 3e+03 4e+03 Dimensions without coordinates: x Data variables: a (x) float64 40B [mm] 0.0 250.0 500.0 750.0 1e+03 b (x) float64 40B [g] -1e+03 -750.0 -500.0 -250.0 0.0 >>> ds.pint.to({"a": "mm", "b": "g", "u": ureg.ms}) Size: 120B Dimensions: (x: 5) Coordinates: u (x) float64 40B [ms] 0.0 1e+03 2e+03 3e+03 4e+03 Dimensions without coordinates: x Data variables: a (x) float64 40B [mm] 0.0 250.0 500.0 750.0 1e+03 b (x) float64 40B [g] -1e+03 -750.0 -500.0 -250.0 0.0 Convert homogeneous data >>> ds = xr.Dataset( ... data_vars={ ... "a": ("x", np.linspace(0, 1, 5) * ureg.kg), ... "b": ("x", np.linspace(-1, 0, 5) * ureg.mg), ... }, ... coords={"u": ("x", np.arange(5) * ureg.s)}, ... ) >>> ds Size: 120B Dimensions: (x: 5) Coordinates: u (x) int64 40B [s] 0 1 2 3 4 Dimensions without coordinates: x Data variables: a (x) float64 40B [kg] 0.0 0.25 0.5 0.75 1.0 b (x) float64 40B [mg] -1.0 -0.75 -0.5 -0.25 0.0 >>> ds.pint.to("g") Size: 120B Dimensions: (x: 5) Coordinates: u (x) int64 40B [s] 0 1 2 3 4 Dimensions without coordinates: x Data variables: a (x) float64 40B [g] 0.0 250.0 500.0 750.0 1e+03 b (x) float64 40B [g] -0.001 -0.00075 -0.0005 -0.00025 0.0 """ if isinstance(units, (str, pint.Unit)): unit_kwargs.update( {name: units for name in self.ds.keys() if name not in unit_kwargs} ) units = None elif units is not None and not is_dict_like(units): raise ValueError( "units must be either a string, a pint.Unit object or a dict-like," f" but got {units!r}" ) units = either_dict_or_kwargs(units, unit_kwargs, "to") return conversion.convert_units(self.ds, units) def chunk(self, chunks, name_prefix="xarray-", token=None, lock=False): """unit-aware version of chunk Like :py:meth:`xarray.Dataset.chunk`, but chunking a quantity will change the wrapped type to ``dask``. .. note:: It is recommended to only use this when chunking in-memory arrays. To rechunk please use :py:meth:`xarray.Dataset.chunk`. See Also -------- xarray.Dataset.chunk xarray.DataArray.pint.chunk """ units = conversion.extract_units(self.ds) stripped = conversion.strip_units(self.ds) chunked = stripped.chunk( chunks, name_prefix=name_prefix, token=token, lock=lock ) return conversion.attach_units(chunked, units) def reindex( self, indexers=None, method=None, tolerance=None, copy=True, fill_value=NA, **indexers_kwargs, ): """unit-aware version of reindex Like :py:meth:`xarray.Dataset.reindex`, except the object's indexes are converted to the units of the indexers first. .. note:: ``tolerance`` and ``fill_value`` are not supported, yet. They will be passed through to ``Dataset.reindex`` unmodified. See Also -------- xarray.DataArray.pint.reindex xarray.Dataset.pint.reindex_like xarray.Dataset.reindex """ indexers = either_dict_or_kwargs(indexers, indexers_kwargs, "reindex") dims = self.ds.dims indexer_units = conversion.extract_indexer_units(indexers) indexer_units = { name: indexer for name, indexer in indexer_units.items() if name in dims } # TODO: handle tolerance # TODO: handle fill_value # convert the indexes to the indexer's units converted = conversion.convert_units(self.ds, indexer_units) converted_units = conversion.extract_units(converted) stripped = conversion.strip_units(converted) # index stripped_indexers = conversion.strip_indexer_units(indexers) indexed = stripped.reindex( stripped_indexers, method=method, tolerance=tolerance, copy=copy, fill_value=fill_value, ) return conversion.attach_units(indexed, converted_units) def reindex_like( self, other, method=None, tolerance=None, copy=True, fill_value=NA ): """unit-aware version of reindex_like Like :py:meth:`xarray.Dataset.reindex_like`, except the object's indexes are converted to the units of the indexers first. .. note:: ``tolerance`` and ``fill_value`` are not supported, yet. They will be passed through to ``Dataset.reindex_like`` unmodified. See Also -------- xarray.DataArray.pint.reindex_like xarray.Dataset.pint.reindex xarray.Dataset.reindex_like """ indexer_units = conversion.extract_units(other) converted = conversion.convert_units(self.ds, indexer_units) units = conversion.extract_units(converted) stripped = conversion.strip_units(converted) stripped_other = conversion.strip_units(other) # TODO: handle tolerance # TODO: handle fill_value reindexed = stripped.reindex_like( stripped_other, method=method, tolerance=tolerance, copy=copy, fill_value=fill_value, ) return conversion.attach_units(reindexed, units) def interp( self, coords=None, method="linear", assume_sorted=False, kwargs=None, **coords_kwargs, ): """unit-aware version of interp Like :py:meth:`xarray.Dataset.interp`, except the object's indexes are converted to the units of the indexers first. .. note:: ``method``, ``assume_sorted`` and ``kwargs`` are passed unmodified to ``DataArray.interp``. See Also -------- xarray.DataArray.pint.interp xarray.Dataset.pint.interp_like xarray.Dataset.interp """ indexers = either_dict_or_kwargs(coords, coords_kwargs, "interp") dims = self.ds.dims indexer_units = conversion.extract_indexer_units(indexers) indexer_units = { name: indexer for name, indexer in indexer_units.items() if name in dims } # convert the indexes to the indexer's units converted = conversion.convert_units(self.ds, indexer_units) units = conversion.extract_units(converted) stripped = conversion.strip_units(converted) # index stripped_indexers = conversion.strip_indexer_units(indexers) interpolated = stripped.interp( stripped_indexers, method=method, assume_sorted=assume_sorted, kwargs=kwargs, ) return conversion.attach_units(interpolated, units) def interp_like(self, other, method="linear", assume_sorted=False, kwargs=None): """unit-aware version of interp_like Like :py:meth:`xarray.Dataset.interp_like`, except the object's indexes are converted to the units of the indexers first. .. note:: ``method``, ``assume_sorted`` and ``kwargs`` are passed unmodified to ``DataArray.interp``. See Also -------- xarray.DataArray.pint.interp_like xarray.Dataset.pint.interp xarray.Dataset.interp_like """ indexer_units = conversion.extract_units(other) converted = conversion.convert_units(self.ds, indexer_units) units = conversion.extract_units(converted) stripped = conversion.strip_units(converted) stripped_other = conversion.strip_units(other) interpolated = stripped.interp_like( stripped_other, method=method, assume_sorted=assume_sorted, kwargs=kwargs, ) return conversion.attach_units(interpolated, units) def sel( self, indexers=None, method=None, tolerance=None, drop=False, **indexers_kwargs ): """unit-aware version of sel Like :py:meth:`xarray.Dataset.sel`, except the object's indexes are converted to the units of the indexers first. .. note:: ``tolerance`` is not supported, yet. It will be passed through to ``Dataset.sel`` unmodified. See Also -------- xarray.DataArray.pint.sel xarray.Dataset.sel xarray.DataArray.sel """ indexers = either_dict_or_kwargs(indexers, indexers_kwargs, "sel") dims = self.ds.dims indexer_units = conversion.extract_indexer_units(indexers) indexer_units = { name: indexer for name, indexer in indexer_units.items() if name in dims } # TODO: handle tolerance # convert the indexes to the indexer's units try: converted = conversion.convert_units(self.ds, indexer_units) except ValueError as e: raise KeyError(*e.args) from e # index stripped_indexers = conversion.strip_indexer_units(indexers) stripped = conversion.strip_units(converted) converted_units = conversion.extract_units(converted) indexed = stripped.sel( stripped_indexers, method=method, tolerance=tolerance, drop=drop, ) return conversion.attach_units(indexed, converted_units) @property def loc(self): """Unit-aware attribute for indexing Only supports ``__getitem__``. .. note:: Position based indexing (e.g. ``ds.loc[1, 2:]``) is not supported, yet See Also -------- xarray.Dataset.loc """ return DatasetLocIndexer(self.ds) def drop_sel(self, labels=None, *, errors="raise", **labels_kwargs): """unit-aware version of drop_sel Just like :py:meth:`xarray.Dataset.drop_sel`, except the indexers are converted to the units of the object's indexes first. See Also -------- xarray.DataArray.pint.drop_sel xarray.Dataset.drop_sel xarray.DataArray.drop_sel """ indexers = either_dict_or_kwargs(labels, labels_kwargs, "drop_sel") dims = self.ds.dims unit_attrs = conversion.extract_unit_attributes(self.ds) index_units = { name: units for name, units in unit_attrs.items() if name in dims } # convert the indexers to the indexes units try: converted_indexers = conversion.convert_indexer_units(indexers, index_units) except ValueError as e: raise KeyError(*e.args) from e # index stripped_indexers = conversion.strip_indexer_units(converted_indexers) indexed = self.ds.drop_sel( stripped_indexers, errors=errors, ) return indexed def ffill(self, dim, limit=None): """unit-aware version of ffill Like :py:meth:`xarray.Dataset.ffill` but without stripping the data units. See Also -------- xarray.Dataset.ffill xarray.Dataset.pint.bfill """ units = conversion.extract_units(self.ds) stripped = conversion.strip_units(self.ds) filled = stripped.ffill(dim=dim, limit=limit) return conversion.attach_units(filled, units) def bfill(self, dim, limit=None): """unit-aware version of bfill Like :py:meth:`xarray.Dataset.bfill` but without stripping the data units. See Also -------- xarray.Dataset.bfill xarray.Dataset.pint.ffill """ units = conversion.extract_units(self.ds) stripped = conversion.strip_units(self.ds) filled = stripped.bfill(dim=dim, limit=limit) return conversion.attach_units(filled, units) def interpolate_na( self, dim=None, method="linear", limit=None, use_coordinate=True, max_gap=None, keep_attrs=None, **kwargs, ): """unit-aware version of interpolate_na Like :py:meth:`xarray.Dataset.interpolate_na` but without stripping the units on data or coordinates. .. note:: ``max_gap`` is not supported, yet, and will be passed through to ``Dataset.interpolate_na`` unmodified. See Also -------- xarray.DataArray.pint.interpolate_na xarray.Dataset.interpolate_na """ units = conversion.extract_units(self.ds) stripped = conversion.strip_units(self.ds) interpolated = stripped.interpolate_na( dim=dim, method=method, limit=limit, use_coordinate=use_coordinate, max_gap=max_gap, keep_attrs=keep_attrs, **kwargs, ) return conversion.attach_units(interpolated, units) pint-xarray-0.6.0/pint_xarray/compat.py000066400000000000000000000007211505507415300201750ustar00rootroot00000000000000import xarray as xr try: from xarray import call_on_dataset except ImportError: def call_on_dataset(func, obj, name, *args, **kwargs): if isinstance(obj, xr.DataArray): ds = obj.to_dataset(name=name) else: ds = obj result = func(ds, *args, **kwargs) if isinstance(obj, xr.DataArray) and isinstance(result, xr.Dataset): result = result.get(name).rename(obj.name) return result pint-xarray-0.6.0/pint_xarray/conversion.py000066400000000000000000000367261505507415300211150ustar00rootroot00000000000000import itertools import re import pint from xarray import Coordinates, DataArray, Dataset, IndexVariable, Variable from pint_xarray.compat import call_on_dataset from pint_xarray.errors import create_exception_group from pint_xarray.index import PintIndex no_unit_values = ("none", None) unit_attribute_name = "units" slice_attributes = ("start", "stop", "step") temporary_name = "" time_units_re = r"\w+" datetime_re = r"\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?)?" datetime_units_re = re.compile(rf"{time_units_re} since {datetime_re}") def is_datetime_unit(unit): return isinstance(unit, str) and datetime_units_re.match(unit) is not None def array_attach_units(data, unit): """attach a unit to the data Parameters ---------- data : array-like The data to attach units to. unit : pint.Unit The desired unit. Returns ------- quantity : pint.Quantity """ if unit in no_unit_values: return data if not isinstance(unit, pint.Unit): raise ValueError(f"cannot use {unit!r} as a unit") if isinstance(data, pint.Quantity): if data.units == unit: return data raise ValueError( f"Cannot attach unit {unit!r} to quantity: data " f"already has units {data.units}" ) registry = unit._REGISTRY return registry.Quantity(data, unit) def array_convert_units(data, unit): """convert the units of an array This is roughly the same as ``data.to(unit)``. Parameters ---------- data : quantity or array-like The data to convert. If it is not a quantity, it is assumed to be dimensionless. unit : str or pint.Unit The unit to convert to. If a string ``data`` has to be a quantity. Returns ------- result : pint.Quantity The converted data """ if unit is None: return data if not isinstance(unit, (str, pint.Unit)): raise ValueError(f"cannot use {unit!r} as a unit") elif isinstance(unit, str) and not isinstance(data, pint.Quantity): raise ValueError(f"cannot convert a non-quantity using {unit!r} as unit") registry = data._REGISTRY if isinstance(unit, str) else unit._REGISTRY if not isinstance(data, pint.Quantity): data = registry.Quantity(data, "dimensionless") return data.to(unit) def array_extract_units(data): """extract the units of an array If ``data`` is not a quantity, the units are ``None`` """ try: return data.units except AttributeError: return None def array_strip_units(data): """strip the units of a quantity""" try: return data.magnitude except AttributeError: return data def attach_units_variable(variable, units): if isinstance(variable, IndexVariable): new_obj = variable.copy() if units is not None: new_obj.attrs[unit_attribute_name] = units elif isinstance(variable, Variable): new_data = array_attach_units(variable.data, units) new_obj = variable.copy(data=new_data) else: raise ValueError(f"invalid type: {variable!r}") return new_obj def dataset_from_variables(variables, coordinate_names, indexes, attrs): data_vars = { name: var for name, var in variables.items() if name not in coordinate_names } coords = {name: var for name, var in variables.items() if name in coordinate_names} new_coords = Coordinates(coords, indexes=indexes) return Dataset(data_vars=data_vars, coords=new_coords, attrs=attrs) def attach_units_index(index, index_vars, units): if all(unit is None for unit in units.values()): # skip non-quantity indexed variables return index if isinstance(index, PintIndex) and index.units != units: raise ValueError( f"cannot attach units to quantified index: {index.units} != {units}" ) return PintIndex(index=index, units=units) def attach_units_dataset(obj, units): attached = {} rejected_vars = {} indexed_variables = obj.xindexes.variables for name, var in obj.variables.items(): if name in indexed_variables: continue unit = units.get(name) try: converted = attach_units_variable(var, unit) attached[name] = converted except ValueError as e: rejected_vars[name] = (unit, e) indexes, index_vars = obj.xindexes.copy_indexes() for idx, idx_vars in obj.xindexes.group_by_index(): idx_units = {name: units.get(name) for name in idx_vars.keys()} try: attached_idx = attach_units_index(idx, idx_vars, idx_units) indexes.update({k: attached_idx for k in idx_vars}) index_vars.update(attached_idx.create_variables(idx_vars)) except ValueError as e: rejected_vars[name] = (units, e) attached.update(index_vars) if rejected_vars: raise ValueError(rejected_vars) reordered = {name: attached[name] for name in obj.variables.keys()} return dataset_from_variables(reordered, obj._coord_names, indexes, obj.attrs) def attach_units(obj, units): if not isinstance(obj, (DataArray, Dataset)): raise ValueError(f"cannot attach units to {obj!r}: unknown type") if isinstance(obj, DataArray): units = units.copy() if obj.name in units: units[temporary_name] = units.get(obj.name) try: new_obj = call_on_dataset( attach_units_dataset, obj, name=temporary_name, units=units ) except ValueError as e: (rejected_vars,) = e.args if temporary_name in rejected_vars: rejected_vars[obj.name] = rejected_vars.pop(temporary_name) raise create_exception_group(rejected_vars, "attach") from None return new_obj def attach_unit_attributes(obj, units, attr="units"): new_obj = obj.copy() if isinstance(obj, DataArray): for name, var in itertools.chain([(obj.name, new_obj)], new_obj.coords.items()): unit = units.get(name) if unit is None: continue var.attrs[attr] = unit elif isinstance(obj, Dataset): for name, var in new_obj.variables.items(): unit = units.get(name) if unit is None: continue var.attrs[attr] = unit else: raise ValueError(f"cannot attach unit attributes to {obj!r}: unknown type") return new_obj def convert_units_variable(variable, units): if isinstance(variable, IndexVariable): if variable.level_names: # don't try to convert MultiIndexes return variable if units is not None: quantity = array_attach_units( variable.data, variable.attrs.get(unit_attribute_name) ) converted = array_convert_units(quantity, units) new_obj = variable.copy(data=array_strip_units(converted)) new_obj.attrs[unit_attribute_name] = array_extract_units(converted) else: new_obj = variable elif isinstance(variable, Variable): converted = array_convert_units(variable.data, units) new_obj = variable.copy(data=converted) else: raise ValueError(f"unknown type: {variable}") return new_obj def convert_units_index(index, index_vars, units): if not isinstance(index, PintIndex): raise ValueError("cannot convert non-quantified index") converted_vars = {} failed = {} for name, var in index_vars.items(): unit = units.get(name) try: converted = convert_units_variable(var, unit) converted_vars[name] = strip_units_variable(converted) except (ValueError, pint.errors.PintTypeError) as e: failed[name] = e if failed: # raise exception group raise ValueError("failed to convert index variables:", failed) # TODO: figure out how to pull out `options` converted_index = index.index.from_variables(converted_vars, options={}) return PintIndex(index=converted_index, units=units) def convert_units_dataset(obj, units): converted = {} failed = {} indexed_variables = obj.xindexes.variables for name, var in obj.variables.items(): if name in indexed_variables: continue unit = units.get(name) try: converted[name] = convert_units_variable(var, unit) except (ValueError, pint.errors.PintTypeError) as e: failed[name] = e indexes, index_vars = obj.xindexes.copy_indexes() for idx, idx_vars in obj.xindexes.group_by_index(): idx_units = {name: units.get(name) for name in idx_vars.keys()} if all(unit is None for unit in idx_units.values()): continue try: converted_index = convert_units_index(idx, idx_vars, idx_units) indexes.update({k: converted_index for k in idx_vars}) index_vars.update(converted_index.create_variables()) except (ValueError, pint.errors.PintTypeError) as e: names = tuple(idx_vars) failed[names] = e converted.update(index_vars) if failed: raise ValueError(failed) reordered = {name: converted[name] for name in obj.variables.keys()} return dataset_from_variables(reordered, obj._coord_names, indexes, obj.attrs) def convert_units(obj, units): if not isinstance(obj, (DataArray, Dataset)): raise ValueError(f"cannot convert object: {obj!r}: unknown type") if isinstance(obj, DataArray): units = units.copy() if obj.name in units: units[temporary_name] = units.pop(obj.name) try: new_obj = call_on_dataset( convert_units_dataset, obj, name=temporary_name, units=units ) except ValueError as e: (failed,) = e.args if temporary_name in failed: failed[obj.name] = failed.pop(temporary_name) raise create_exception_group(failed, "convert") from None return new_obj def extract_units_dataset(obj): return {name: array_extract_units(var.data) for name, var in obj.variables.items()} def extract_units(obj): if not isinstance(obj, (DataArray, Dataset)): raise ValueError(f"unknown type: {type(obj)}") unit_attributes = extract_unit_attributes(obj) units = call_on_dataset(extract_units_dataset, obj, name=temporary_name) if temporary_name in units: units[obj.name] = units.pop(temporary_name) units_ = unit_attributes.copy() units_.update({k: v for k, v in units.items() if v is not None}) return units_ def extract_unit_attributes_dataset(obj, attr="units"): all_units = {name: var.attrs.get(attr, None) for name, var in obj.variables.items()} return { name: unit for name, unit in all_units.items() if not is_datetime_unit(unit) } def extract_unit_attributes(obj, attr="units"): if not isinstance(obj, (DataArray, Dataset)): raise ValueError( f"cannot retrieve unit attributes from unknown type: {type(obj)}" ) units = call_on_dataset( extract_unit_attributes_dataset, obj, name=temporary_name, attr=attr ) if temporary_name in units: units[obj.name] = units.pop(temporary_name) return units def strip_units_variable(var): if not isinstance(var.data, pint.Quantity): return var data = array_strip_units(var.data) return var.copy(data=data) def strip_units_dataset(obj): variables = {name: strip_units_variable(var) for name, var in obj.variables.items()} indexes = { name: (index.index if isinstance(index, PintIndex) else index) for name, index in obj.xindexes.items() } return dataset_from_variables(variables, obj._coord_names, indexes, obj.attrs) def strip_units(obj): if not isinstance(obj, (DataArray, Dataset)): raise ValueError("cannot strip units from {obj!r}: unknown type") return call_on_dataset(strip_units_dataset, obj, name=temporary_name) def strip_unit_attributes_dataset(obj, attr="units"): new_obj = obj.copy() for var in new_obj.variables.values(): if is_datetime_unit(var.attrs.get(attr, "")): continue var.attrs.pop(attr, None) return new_obj def strip_unit_attributes(obj, attr="units"): if not isinstance(obj, (DataArray, Dataset)): raise ValueError(f"cannot strip unit attributes from unknown type: {type(obj)}") return call_on_dataset( strip_unit_attributes_dataset, obj, name=temporary_name, attr=attr ) def slice_extract_units(indexer): elements = {name: getattr(indexer, name) for name in slice_attributes} extracted_units = [ array_extract_units(value) for name, value in elements.items() if value is not None ] none_values = [_ is None for _ in extracted_units] if not extracted_units or all(none_values): # empty slice (slice(None)) or slice without units return None dimensionalities = { str(getattr(units, "dimensionality", "dimensionless")) for units in extracted_units } if len(dimensionalities) > 1: raise ValueError(f"incompatible units in {indexer}: {dimensionalities}") units = [_ for _ in extracted_units if _ is not None] if len(set(units)) == 1: return units[0] else: units_ = units[0] registry = units_._REGISTRY return registry.Quantity(1, units_).to_base_units().units def convert_units_slice(indexer, units): attrs = {name: getattr(indexer, name) for name in slice_attributes} converted = { name: array_convert_units(value, units) if value is not None else None for name, value in attrs.items() } args = [converted[name] for name in slice_attributes] return slice(*args) def convert_indexer_units(indexers, units): def convert(indexer, units): if isinstance(indexer, slice): return convert_units_slice(indexer, units) elif isinstance(indexer, DataArray): return convert_units(indexer, {None: units}) elif isinstance(indexer, Variable): return convert_units_variable(indexer, units) else: return array_convert_units(indexer, units) converted = {} invalid = {} for name, indexer in indexers.items(): indexer_units = units.get(name) try: converted[name] = convert(indexer, indexer_units) except (ValueError, pint.errors.PintTypeError) as e: invalid[name] = e if invalid: raise create_exception_group(invalid, "convert_indexers") return converted def extract_indexer_units(indexers): def extract(indexer): if isinstance(indexer, slice): return slice_extract_units(indexer) elif isinstance(indexer, (DataArray, Variable)): return array_extract_units(indexer.data) else: return array_extract_units(indexer) return {name: extract(indexer) for name, indexer in indexers.items()} def strip_indexer_units(indexers): def strip(indexer): if isinstance(indexer, slice): return slice( array_strip_units(indexer.start), array_strip_units(indexer.stop), array_strip_units(indexer.step), ) elif isinstance(indexer, DataArray): return strip_units(indexer) elif isinstance(indexer, Variable): return strip_units_variable(indexer) else: return array_strip_units(indexer) return {name: strip(indexer) for name, indexer in indexers.items()} pint-xarray-0.6.0/pint_xarray/errors.py000066400000000000000000000027751505507415300202410ustar00rootroot00000000000000from collections.abc import Hashable from typing import Any class PintExceptionGroup(ExceptionGroup, ValueError): """Exception group for errors related to unit operations Raised whenever there's the possibility of multiple errors. """ pass def _add_note(e: Exception, note: str) -> Exception: e.add_note(note) return e def create_exception_group(mapping: dict[Hashable, Any], op: str) -> ExceptionGroup: match op: case "attach": message = "Cannot attach units" errors = [ _add_note(e, f"cannot attach units to variable {key!r}: {unit}") for key, (unit, e) in mapping.items() ] case "parse": message = "Cannot parse units" errors = [ _add_note(e, f"invalid units for variable {key!r}: {unit} ({type})") for key, (unit, type, e) in mapping.items() ] case "convert": message = "Cannot convert variables" errors = [ _add_note(e, f"incompatible units for variable {key!r}") for key, e in mapping.items() ] case "convert_indexers": message = "Cannot convert indexers" errors = [ _add_note(e, f"incompatible units for indexer for {key!r}") for key, e in mapping.items() ] case _: # pragma: no cover raise ValueError("invalid op") return PintExceptionGroup(message, errors) pint-xarray-0.6.0/pint_xarray/formatting.py000066400000000000000000000162451505507415300210740ustar00rootroot00000000000000from itertools import zip_longest import numpy as np from xarray.core.options import OPTIONS # vendored from xarray.core.formatting def maybe_truncate(obj, maxlen=500): s = str(obj) if len(s) > maxlen: s = s[: (maxlen - 3)] + "..." return s # vendored from xarray.core.formatting def pretty_print(x, numchars: int): """Given an object `x`, call `str(x)` and format the returned string so that it is numchars long, padding with trailing spaces or truncating with ellipses as necessary """ s = maybe_truncate(x, numchars) return s + " " * max(numchars - len(s), 0) # vendored from xarray.core.formatting def _get_indexer_at_least_n_items(shape, n_desired, from_end): assert 0 < n_desired <= np.prod(shape) cum_items = np.cumprod(shape[::-1]) n_steps = np.argmax(cum_items >= n_desired) stop = int(np.ceil(float(n_desired) / np.r_[1, cum_items][n_steps])) indexer = ( ((-1 if from_end else 0),) * (len(shape) - 1 - n_steps) + ((slice(-stop, None) if from_end else slice(stop)),) + (slice(None),) * n_steps ) return indexer # vendored from xarray.core.formatting def first_n_items(array, n_desired): """Returns the first n_desired items of an array""" # Unfortunately, we can't just do array.flat[:n_desired] here because it # might not be a numpy.ndarray. Moreover, access to elements of the array # could be very expensive (e.g. if it's only available over DAP), so go out # of our way to get them in a single call to __getitem__ using only slices. if n_desired < 1: raise ValueError("must request at least one item") if array.size == 0: # work around for https://github.com/numpy/numpy/issues/5195 return [] if n_desired < array.size: indexer = _get_indexer_at_least_n_items(array.shape, n_desired, from_end=False) array = array[indexer] return np.asarray(array).flat[:n_desired] # vendored from xarray.core.formatting def last_n_items(array, n_desired): """Returns the last n_desired items of an array""" # Unfortunately, we can't just do array.flat[-n_desired:] here because it # might not be a numpy.ndarray. Moreover, access to elements of the array # could be very expensive (e.g. if it's only available over DAP), so go out # of our way to get them in a single call to __getitem__ using only slices. if (n_desired == 0) or (array.size == 0): return [] if n_desired < array.size: indexer = _get_indexer_at_least_n_items(array.shape, n_desired, from_end=True) array = array[indexer] return np.asarray(array).flat[-n_desired:] # based on xarray.core.formatting.format_item def format_item(x, quote_strings=True): """Returns a succinct summary of an object as a string""" if isinstance(x, (str, bytes)): return repr(x) if quote_strings else x elif isinstance(x, float): return f"{x:.4}" elif hasattr(x, "dtype") and np.issubdtype(x.dtype, np.floating): return f"{x.item():.4}" else: return str(x) # based on xarray.core.formatting.format_item def format_items(x): """Returns a succinct summaries of all items in a sequence as strings""" x = np.asarray(x) formatted = [format_item(xi) for xi in x] return formatted def summarize_attr(key, value, col_width=None): """Summary for __repr__ - use ``X.attrs[key]`` for full value.""" # Indent key and add ':', then right-pad if col_width is not None k_str = f" {key}:" if col_width is not None: k_str = pretty_print(k_str, col_width) # Replace tabs and newlines, so we print on one line in known width v_str = str(value).replace("\t", "\\t").replace("\n", "\\n") # Finally, truncate to the desired display width return maybe_truncate(f"{k_str} {v_str}", OPTIONS["display_width"]) # adapted from xarray.core.formatting def _diff_mapping_repr(a_mapping, b_mapping, title, summarizer, col_width=None): def extra_items_repr(extra_keys, mapping, ab_side): extra_repr = [summarizer(k, mapping[k], col_width) for k in extra_keys] if extra_repr: header = f"{title} only on the {ab_side} object:" return [header] + extra_repr else: return [] a_keys = set(a_mapping) b_keys = set(b_mapping) summary = [] diff_items = [] for k in a_keys & b_keys: compatible = a_mapping[k] == b_mapping[k] if not compatible: temp = [ summarizer(k, vars[k], col_width) for vars in (a_mapping, b_mapping) ] diff_items += [ab_side + s[1:] for ab_side, s in zip(("L", "R"), temp)] if diff_items: summary += [f"Differing {title.lower()}:"] + diff_items summary += extra_items_repr(a_keys - b_keys, a_mapping, "left") summary += extra_items_repr(b_keys - a_keys, b_mapping, "right") return "\n".join(summary) # vendored from xarray.core.formatting def format_array_flat(array, max_width: int): """Return a formatted string for as many items in the flattened version of array that will fit within max_width characters. """ # every item will take up at least two characters, but we always want to # print at least first and last items max_possibly_relevant = min( max(array.size, 1), max(int(np.ceil(max_width / 2.0)), 2) ) relevant_front_items = format_items( first_n_items(array, (max_possibly_relevant + 1) // 2) ) relevant_back_items = format_items(last_n_items(array, max_possibly_relevant // 2)) # interleave relevant front and back items: # [a, b, c] and [y, z] -> [a, z, b, y, c] relevant_items = sum( zip_longest(relevant_front_items, reversed(relevant_back_items)), () )[:max_possibly_relevant] cum_len = np.cumsum([len(s) + 1 for s in relevant_items]) - 1 if (array.size > 2) and ( (max_possibly_relevant < array.size) or (cum_len > max_width).any() ): padding = " ... " count = min( array.size, max(np.argmax(cum_len + len(padding) - 1 > max_width), 2) ) else: count = array.size padding = "" if (count <= 1) else " " num_front = (count + 1) // 2 num_back = count - num_front # note that num_back is 0 <--> array.size is 0 or 1 # <--> relevant_back_items is [] pprint_str = "".join( [ " ".join(relevant_front_items[:num_front]), padding, " ".join(relevant_back_items[-num_back:]), ] ) # As a final check, if it's still too long even with the limit in values, # replace the end with an ellipsis # NB: this will still returns a full 3-character ellipsis when max_width < 3 if len(pprint_str) > max_width: pprint_str = pprint_str[: max(max_width - 3, 0)] + "..." return pprint_str def inline_repr(quantity, max_width): magnitude = quantity.magnitude units = quantity.units units_repr = f"{units:~P}" if isinstance(magnitude, np.ndarray): data_repr = format_array_flat(magnitude, max_width - len(units_repr) - 3) else: data_repr = maybe_truncate(repr(magnitude), max_width - len(units_repr) - 3) return f"[{units_repr}] {data_repr}" pint-xarray-0.6.0/pint_xarray/index.py000066400000000000000000000101751505507415300200250ustar00rootroot00000000000000import inspect from xarray import Variable from xarray.core.indexes import Index, PandasIndex from pint_xarray import conversion class PintIndex(Index): def __init__(self, *, index, units): """create a unit-aware MetaIndex Parameters ---------- index : xarray.Index The wrapped index object. units : mapping of hashable to unit-like The units of the indexed coordinates """ if not isinstance(units, dict): raise TypeError( "Index units have to be a dict of coordinate names to units." ) self.index = index self.units = units def _replace(self, new_index): return self.__class__(index=new_index, units=self.units) def create_variables(self, variables=None): index_vars = self.index.create_variables(variables) index_vars_units = {} for name, var in index_vars.items(): data = conversion.array_attach_units(var.data, self.units[name]) var_units = Variable(var.dims, data, attrs=var.attrs, encoding=var.encoding) index_vars_units[name] = var_units return index_vars_units @classmethod def from_variables(cls, variables, options): if len(variables) != 1: raise ValueError("can only create a default index from single variables") units = options.pop("units", None) index = PandasIndex.from_variables(variables, options=options) return cls(index=index, units={index.index.name: units}) @classmethod def concat(cls, indexes, dim, positions): raise NotImplementedError() @classmethod def stack(cls, variables, dim): raise NotImplementedError() def unstack(self): raise NotImplementedError() def sel(self, labels, **options): converted_labels = conversion.convert_indexer_units(labels, self.units) stripped_labels = conversion.strip_indexer_units(converted_labels) return self.index.sel(stripped_labels, **options) def isel(self, indexers): subset = self.index.isel(indexers) if subset is None: return None return self._replace(subset) def join(self, other, how="inner"): raise NotImplementedError() def reindex_like(self, other): raise NotImplementedError() def equals(self, other, *, exclude=None): if not isinstance(other, PintIndex): return False # for now we require exactly matching units to avoid the potentially # expensive conversion if self.units != other.units: return False # TODO: # - remove try-except once we can drop xarray<2025.06.0 # - remove compat once we can require a version of xarray that completed # the deprecation cycle try: from xarray.core.indexes import _wrap_index_equals equals = _wrap_index_equals(self.index) kwargs = {"exclude": exclude} except ImportError: # pragma: no cover equals = self.index.equals signature = inspect.signature(self.index.equals) if "exclude" in signature.parameters: kwargs = {"exclude": exclude} else: kwargs = {} # Last to avoid the potentially expensive comparison return equals(other.index, **kwargs) def roll(self, shifts): return self._replace(self.index.roll(shifts)) def rename(self, name_dict, dims_dict): return self._replace(self.index.rename(name_dict, dims_dict)) def __getitem__(self, indexer): return self._replace(self.index[indexer]) def _repr_inline_(self, max_width): name = self.__class__.__name__ wrapped_name = self.index.__class__.__name__ formatted_units = {n: f"{u:~P}" for n, u in self.units.items()} return f"{name}({wrapped_name}, units={formatted_units})" def __repr__(self): formatted_units = {n: f"{u:~P}" for n, u in self.units.items()} summary = f"<{self.__class__.__name__} (units={formatted_units})>" return "\n".join([summary, repr(self.index)]) pint-xarray-0.6.0/pint_xarray/itertools.py000066400000000000000000000014161505507415300207400ustar00rootroot00000000000000import itertools from functools import reduce def separate(predicate, iterable): evaluated = ((predicate(el), el) for el in iterable) key = lambda x: x[0] grouped = itertools.groupby(sorted(evaluated, key=key), key=key) groups = {label: [el for _, el in group] for label, group in grouped} return groups[False], groups[True] def unique(iterable): return list(dict.fromkeys(iterable)) def zip_mappings(*mappings): def common_keys(a, b): all_keys = unique(itertools.chain(a.keys(), b.keys())) intersection = set(a.keys()).intersection(b.keys()) return [key for key in all_keys if key in intersection] keys = list(reduce(common_keys, mappings)) for key in keys: yield key, tuple(m[key] for m in mappings) pint-xarray-0.6.0/pint_xarray/testing.py000066400000000000000000000016271505507415300203750ustar00rootroot00000000000000from pint_xarray import conversion, formatting def assert_units_equal(a, b): """assert that the units of two xarray objects are equal Raises an :py:exc:`AssertionError` if the units of both objects are not equal. ``units`` attributes and attached unit objects are compared separately. Parameters ---------- a, b : DataArray or Dataset The objects to compare """ __tracebackhide__ = True units_a = conversion.extract_units(a) units_b = conversion.extract_units(b) assert units_a == units_b, formatting._diff_mapping_repr( units_a, units_b, "Units", formatting.summarize_attr ) unit_attrs_a = conversion.extract_unit_attributes(a) unit_attrs_b = conversion.extract_unit_attributes(b) assert unit_attrs_a == unit_attrs_b, formatting._diff_mapping_repr( unit_attrs_a, unit_attrs_b, "Unit attrs", formatting.summarize_attr ) pint-xarray-0.6.0/pint_xarray/tests/000077500000000000000000000000001505507415300175025ustar00rootroot00000000000000pint-xarray-0.6.0/pint_xarray/tests/__init__.py000066400000000000000000000000001505507415300216010ustar00rootroot00000000000000pint-xarray-0.6.0/pint_xarray/tests/test_accessors.py000066400000000000000000002120611505507415300231020ustar00rootroot00000000000000import numpy as np import pandas as pd import pint import pytest import xarray as xr from numpy.testing import assert_array_equal from pint import Unit, UnitRegistry from pint_xarray import accessors, conversion from pint_xarray.errors import PintExceptionGroup from pint_xarray.index import PintIndex from pint_xarray.tests.utils import ( assert_equal, assert_identical, assert_units_equal, requires_bottleneck, requires_dask_array, requires_scipy, ) pytestmark = [ pytest.mark.filterwarnings("error::pint.UnitStrippedWarning"), ] # make sure scalars are converted to 0d arrays so quantities can # always be treated like ndarrays from pint_xarray import unit_registry Quantity = unit_registry.Quantity nan = np.nan def assert_all_str_or_none(mapping): __tracebackhide__ = True compared = { key: isinstance(value, str) or value is None for key, value in mapping.items() } not_passing = {key: value for key, value in mapping.items() if not compared[key]} check = all(compared.values()) assert check, f"Not all values are str or None: {not_passing}" @pytest.fixture def example_unitless_da(): array = np.linspace(0, 10, 20) x = np.arange(20) u = np.linspace(0, 1, 20) da = xr.DataArray( data=array, dims="x", coords={"x": ("x", x), "u": ("x", u, {"units": "hour"})}, attrs={"units": "m"}, ) return da @pytest.fixture() def example_quantity_da(): array = np.linspace(0, 10, 20) * unit_registry.m x = np.arange(20) u = np.linspace(0, 1, 20) * unit_registry.hour return xr.DataArray(data=array, dims="x", coords={"x": ("x", x), "u": ("x", u)}) class TestQuantifyDataArray: def test_attach_units_from_str(self, example_unitless_da): orig = example_unitless_da result = orig.pint.quantify("s") assert_array_equal(result.data.magnitude, orig.data) # TODO better comparisons for when you can't access the unit_registry? assert str(result.data.units) == "second" def test_attach_units_given_registry(self, example_unitless_da): orig = example_unitless_da ureg = UnitRegistry(force_ndarray=True) result = orig.pint.quantify("m", unit_registry=ureg) assert_array_equal(result.data.magnitude, orig.data) assert result.data.units == ureg.Unit("m") def test_attach_units_from_attrs(self, example_unitless_da): orig = example_unitless_da result = orig.pint.quantify() assert_array_equal(result.data.magnitude, orig.data) assert str(result.data.units) == "meter" remaining_attrs = conversion.extract_unit_attributes(result) assert {k: v for k, v in remaining_attrs.items() if v is not None} == {} def test_attach_units_from_str_attr_no_unit(self, example_unitless_da): orig = example_unitless_da orig.attrs["units"] = "none" result = orig.pint.quantify("m") assert_array_equal(result.data.magnitude, orig.data) assert str(result.data.units) == "meter" def test_attach_units_given_unit_objs(self, example_unitless_da): orig = example_unitless_da ureg = UnitRegistry(force_ndarray=True) result = orig.pint.quantify(ureg.Unit("m"), unit_registry=ureg) assert_array_equal(result.data.magnitude, orig.data) assert result.data.units == ureg.Unit("m") @pytest.mark.parametrize("no_unit_value", conversion.no_unit_values) def test_override_units(self, example_unitless_da, no_unit_value): orig = example_unitless_da result = orig.pint.quantify(no_unit_value, u=no_unit_value) with pytest.raises(AttributeError): result.data.units with pytest.raises(AttributeError): result["u"].data.units def test_error_when_changing_units(self, example_quantity_da): da = example_quantity_da with pytest.RaisesGroup( pytest.RaisesExc(ValueError, match="already has units"), match="Cannot attach units", check=lambda eg: isinstance(eg, PintExceptionGroup), ): da.pint.quantify("s") def test_attach_no_units(self): arr = xr.DataArray([1, 2, 3], dims="x") quantified = arr.pint.quantify() assert_identical(quantified, arr) assert_units_equal(quantified, arr) def test_attach_no_new_units(self): da = xr.DataArray(unit_registry.Quantity([1, 2, 3], "m"), dims="x") quantified = da.pint.quantify() assert_identical(quantified, da) assert_units_equal(quantified, da) def test_attach_same_units(self): da = xr.DataArray(unit_registry.Quantity([1, 2, 3], "m"), dims="x") quantified = da.pint.quantify("m") assert_identical(quantified, da) assert_units_equal(quantified, da) def test_error_when_changing_units_dimension_coordinates(self): arr = xr.DataArray( [1, 2, 3], dims="x", coords={"x": ("x", [-1, 0, 1], {"units": unit_registry.Unit("m")})}, ) with pytest.RaisesGroup( pytest.RaisesExc(ValueError, match="already has units"), match="Cannot attach units", check=lambda eg: isinstance(eg, PintExceptionGroup), ): arr.pint.quantify({"x": "s"}) def test_dimension_coordinate_array(self): ds = xr.Dataset(coords={"x": ("x", [10], {"units": "m"})}) arr = ds.x # does not actually quantify because `arr` wraps a IndexVariable # but we still get a `Unit` in the attrs q = arr.pint.quantify() assert isinstance(q.attrs["units"], Unit) def test_dimension_coordinate_array_already_quantified(self): ds = xr.Dataset(coords={"x": ("x", [10], {"units": unit_registry.Unit("m")})}) arr = ds.x with pytest.RaisesGroup( pytest.RaisesExc(ValueError, match="already has units"), match="Cannot attach units", check=lambda eg: isinstance(eg, PintExceptionGroup), ): arr.pint.quantify({"x": "s"}) def test_dimension_coordinate_array_already_quantified_same_units(self): x = unit_registry.Quantity([10], "m") coords = xr.Coordinates( {"x": x}, indexes={ "x": PintIndex.from_variables( {"x": xr.Variable("x", x.magnitude)}, options={"units": x.units}, ), }, ) ds = xr.Dataset(coords=coords) arr = ds.x quantified = arr.pint.quantify({"x": "m"}) assert_identical(quantified, arr) assert_units_equal(quantified, arr) def test_error_on_nonsense_units(self, example_unitless_da): da = example_unitless_da with pytest.RaisesGroup( pytest.RaisesExc( pint.UndefinedUnitError, match=rf"{da.name}: .+ \(parameter\)" ), match="Cannot parse units", check=lambda eg: isinstance(eg, PintExceptionGroup), ): da.pint.quantify(units="aecjhbav") def test_error_on_nonsense_units_attrs(self, example_unitless_da): da = example_unitless_da da.attrs["units"] = "aecjhbav" with pytest.RaisesGroup( pytest.RaisesExc( pint.UndefinedUnitError, match=rf"{da.name}: .+ \(attribute\)" ), match="Cannot parse units", check=lambda eg: isinstance(eg, PintExceptionGroup), ): da.pint.quantify() def test_parse_integer_inverse(self): # Regression test for issue #40 da = xr.DataArray([10], attrs={"units": "m^-1"}) result = da.pint.quantify() assert result.pint.units == Unit("1 / meter") @pytest.mark.parametrize("formatter", ("", "P", "C")) @pytest.mark.parametrize("modifier", ("", "~")) def test_units_to_str_or_none(formatter, modifier): unit_format = f"{{:{modifier}{formatter}}}" unit_attrs = {None: "m", "a": "s", "b": "degC", "c": "degF", "d": "degK"} units = {key: unit_registry.Unit(value) for key, value in unit_attrs.items()} expected = {key: unit_format.format(value) for key, value in units.items()} actual = accessors.units_to_str_or_none(units, unit_format) assert expected == actual assert units == {key: unit_registry.Unit(value) for key, value in actual.items()} expected = {None: None} assert expected == accessors.units_to_str_or_none(expected, unit_format) class TestDequantifyDataArray: def test_strip_units(self, example_quantity_da): result = example_quantity_da.pint.dequantify() assert isinstance(result.data, np.ndarray) assert isinstance(result.coords["x"].data, np.ndarray) def test_attrs_reinstated(self, example_quantity_da): da = example_quantity_da result = da.pint.dequantify() units = conversion.extract_units(da) attrs = conversion.extract_unit_attributes(result) assert units == attrs assert_all_str_or_none(attrs) def test_roundtrip_data(self, example_unitless_da): orig = example_unitless_da quantified = orig.pint.quantify() result = quantified.pint.dequantify() assert_equal(result, orig) def test_multiindex(self): mindex = pd.MultiIndex.from_product([["a", "b"], [1, 2]], names=("lat", "lon")) da = xr.DataArray( np.arange(len(mindex)), dims="multi", coords={"multi": mindex} ) result = da.pint.dequantify() xr.testing.assert_identical(da, result) assert isinstance(result.indexes["multi"], pd.MultiIndex) class TestPropertiesDataArray: def test_magnitude_getattr(self, example_quantity_da): da = example_quantity_da actual = da.pint.magnitude assert not isinstance(actual, Quantity) def test_magnitude_getattr_unitless(self, example_unitless_da): da = example_unitless_da xr.testing.assert_duckarray_equal(da.pint.magnitude, da.data) def test_units_getattr(self, example_quantity_da): da = example_quantity_da actual = da.pint.units assert isinstance(actual, Unit) assert actual == unit_registry.m def test_units_setattr(self, example_quantity_da): da = example_quantity_da with pytest.raises(ValueError): da.pint.units = "s" def test_units_getattr_unitless(self, example_unitless_da): da = example_unitless_da assert da.pint.units is None def test_units_setattr_unitless(self, example_unitless_da): da = example_unitless_da da.pint.units = unit_registry.s assert da.pint.units == unit_registry.s @pytest.fixture() def example_unitless_ds(): users = np.linspace(0, 10, 20) funds = np.logspace(0, 10, 20) t = np.arange(20) ds = xr.Dataset( data_vars={"users": (["t"], users), "funds": (["t"], funds)}, coords={"t": t} ) ds["users"].attrs["units"] = "" ds["funds"].attrs["units"] = "pound" return ds @pytest.fixture() def example_quantity_ds(): users = np.linspace(0, 10, 20) * unit_registry.dimensionless funds = np.logspace(0, 10, 20) * unit_registry.pound t = np.arange(20) ds = xr.Dataset( data_vars={"users": (["t"], users), "funds": (["t"], funds)}, coords={"t": t} ) return ds class TestQuantifyDataSet: def test_attach_units_from_str(self, example_unitless_ds): orig = example_unitless_ds result = orig.pint.quantify() assert_array_equal(result["users"].data.magnitude, orig["users"].data) assert str(result["users"].data.units) == "dimensionless" def test_attach_units_given_registry(self, example_unitless_ds): orig = example_unitless_ds orig["users"].attrs.clear() result = orig.pint.quantify( {"users": "dimensionless"}, unit_registry=unit_registry ) assert_array_equal(result["users"].data.magnitude, orig["users"].data) assert str(result["users"].data.units) == "dimensionless" def test_attach_units_from_attrs(self, example_unitless_ds): orig = example_unitless_ds orig["users"].attrs.clear() result = orig.pint.quantify({"users": "dimensionless"}) assert_array_equal(result["users"].data.magnitude, orig["users"].data) assert str(result["users"].data.units) == "dimensionless" remaining_attrs = conversion.extract_unit_attributes(result) assert {k: v for k, v in remaining_attrs.items() if v is not None} == {} def test_attach_units_given_unit_objs(self, example_unitless_ds): orig = example_unitless_ds orig["users"].attrs.clear() dimensionless = unit_registry.Unit("dimensionless") result = orig.pint.quantify({"users": dimensionless}) assert_array_equal(result["users"].data.magnitude, orig["users"].data) assert str(result["users"].data.units) == "dimensionless" def test_attach_units_from_str_attr_no_unit(self, example_unitless_ds): orig = example_unitless_ds orig["users"].attrs["units"] = "none" result = orig.pint.quantify({"users": "m"}) assert_array_equal(result["users"].data.magnitude, orig["users"].data) assert str(result["users"].data.units) == "meter" @pytest.mark.parametrize("no_unit_value", conversion.no_unit_values) def test_override_units(self, example_unitless_ds, no_unit_value): orig = example_unitless_ds result = orig.pint.quantify({"users": no_unit_value}) assert ( getattr(result["users"].data, "units", "not a quantity") == "not a quantity" ) def test_error_when_already_units(self, example_quantity_ds): with pytest.RaisesGroup( pytest.RaisesExc(ValueError, match="already has units"), match="Cannot attach units", check=lambda eg: isinstance(eg, PintExceptionGroup), ): example_quantity_ds.pint.quantify({"funds": "kg"}) def test_attach_no_units(self): ds = xr.Dataset({"a": ("x", [1, 2, 3])}) quantified = ds.pint.quantify() assert_identical(quantified, ds) assert_units_equal(quantified, ds) def test_attach_no_new_units(self): ds = xr.Dataset({"a": ("x", unit_registry.Quantity([1, 2, 3], "m"))}) quantified = ds.pint.quantify() assert_identical(quantified, ds) assert_units_equal(quantified, ds) def test_attach_same_units(self): ds = xr.Dataset({"a": ("x", unit_registry.Quantity([1, 2, 3], "m"))}) quantified = ds.pint.quantify({"a": "m"}) assert_identical(quantified, ds) assert_units_equal(quantified, ds) def test_error_when_changing_units_dimension_coordinates(self): ds = xr.Dataset( coords={"x": ("x", [-1, 0, 1], {"units": unit_registry.Unit("m")})}, ) with pytest.RaisesGroup( pytest.RaisesExc(ValueError, match="already has units"), match="Cannot attach units", check=lambda eg: isinstance(eg, PintExceptionGroup), ): ds.pint.quantify({"x": "s"}) def test_error_on_nonsense_units(self, example_unitless_ds): ds = example_unitless_ds with pytest.RaisesGroup( pytest.RaisesExc( pint.UndefinedUnitError, match=r"'users': .+ \(parameter\)" ), match="Cannot parse units", check=lambda eg: isinstance(eg, PintExceptionGroup), ): ds.pint.quantify(units={"users": "aecjhbav"}) def test_error_on_nonsense_units_attrs(self, example_unitless_ds): ds = example_unitless_ds ds.users.attrs["units"] = "aecjhbav" with pytest.RaisesGroup( pytest.RaisesExc( pint.UndefinedUnitError, match=r"'users': .+ \(attribute\)" ), match="Cannot parse units", check=lambda eg: isinstance(eg, PintExceptionGroup), ): ds.pint.quantify() def test_error_indicates_problematic_variable(self, example_unitless_ds): ds = example_unitless_ds with pytest.RaisesGroup( pytest.RaisesExc( pint.UndefinedUnitError, match=r"'users': aecjhbav \(parameter\)" ), match="Cannot parse units", check=lambda eg: isinstance(eg, PintExceptionGroup), ): ds.pint.quantify(units={"users": "aecjhbav"}) def test_existing_units(self, example_quantity_ds): ds = example_quantity_ds.copy() ds.t.attrs["units"] = unit_registry.Unit("m") with pytest.raises(ValueError, match="Cannot attach"): ds.pint.quantify({"funds": "kg"}) def test_existing_units_dimension(self, example_quantity_ds): ds = example_quantity_ds.copy() ds.t.attrs["units"] = unit_registry.Unit("m") with pytest.raises(ValueError, match="Cannot attach"): ds.pint.quantify({"t": "s"}) class TestDequantifyDataSet: def test_strip_units(self, example_quantity_ds): result = example_quantity_ds.pint.dequantify() assert all( isinstance(var.data, np.ndarray) for var in result.variables.values() ) def test_attrs_reinstated(self, example_quantity_ds): ds = example_quantity_ds result = ds.pint.dequantify() units = conversion.extract_units(ds) # workaround for Unit("dimensionless") != str(Unit("dimensionless")) units = { key: str(value) if isinstance(value, Unit) else value for key, value in units.items() } attrs = conversion.extract_unit_attributes(result) assert units == attrs assert_all_str_or_none(attrs) def test_roundtrip_data(self, example_unitless_ds): orig = example_unitless_ds quantified = orig.pint.quantify() result = quantified.pint.dequantify() assert_equal(result, orig) result = quantified.pint.dequantify().pint.quantify() assert_equal(quantified, result) @pytest.mark.parametrize( ["obj", "units", "expected", "error"], ( pytest.param( xr.Dataset( {"a": ("x", Quantity([0, 1], "m")), "b": ("x", Quantity([2, 4], "s"))} ), {"a": "mm", "b": "ms"}, xr.Dataset( { "a": ("x", Quantity([0, 1000], "mm")), "b": ("x", Quantity([2000, 4000], "ms")), } ), None, id="Dataset-compatible units-data", ), pytest.param( xr.Dataset( {"a": ("x", Quantity([0, 1], "km")), "b": ("x", Quantity([2, 4], "cm"))} ), "m", xr.Dataset( { "a": ("x", Quantity([0, 1000], "m")), "b": ("x", Quantity([0.02, 0.04], "m")), } ), None, id="Dataset-compatible units-data-str", ), pytest.param( xr.Dataset( {"a": ("x", Quantity([0, 1], "m")), "b": ("x", Quantity([2, 4], "s"))} ), {"a": "ms", "b": "mm"}, None, ValueError, id="Dataset-incompatible units-data", ), pytest.param( xr.Dataset(coords=xr.Coordinates({"x": Quantity([2, 4], "s")}, indexes={})), {"x": "ms"}, xr.Dataset( coords=xr.Coordinates({"x": Quantity([2000, 4000], "ms")}, indexes={}) ), None, id="Dataset-compatible units-dims-no index", ), pytest.param( xr.Dataset(coords=xr.Coordinates({"x": Quantity([2, 4], "s")}, indexes={})), {"x": "mm"}, None, ValueError, id="Dataset-incompatible units-dims-no index", ), pytest.param( xr.DataArray(Quantity([0, 1], "m"), dims="x"), {None: "mm"}, xr.DataArray(Quantity([0, 1000], "mm"), dims="x"), None, id="DataArray-compatible units-data", ), pytest.param( xr.DataArray(Quantity([0, 1], "m"), dims="x"), "mm", xr.DataArray(Quantity([0, 1000], "mm"), dims="x"), None, id="DataArray-compatible units-data-str", ), pytest.param( xr.DataArray(Quantity([0, 1], "m"), dims="x", name="a"), {"a": "mm"}, xr.DataArray(Quantity([0, 1000], "mm"), dims="x", name="a"), None, id="DataArray-compatible units-data-by name", ), pytest.param( xr.DataArray(Quantity([0, 1], "m"), dims="x"), {None: "ms"}, None, ValueError, id="DataArray-incompatible units-data", ), pytest.param( xr.DataArray( [0, 1], dims="x", coords=xr.Coordinates({"x": Quantity([2, 4], "s")}, indexes={}), ), {"x": "ms"}, xr.DataArray( [0, 1], dims="x", coords=xr.Coordinates({"x": Quantity([2000, 4000], "ms")}, indexes={}), ), None, id="DataArray-compatible units-dims-no index", ), pytest.param( xr.DataArray( [0, 1], dims="x", coords=xr.Coordinates({"x": Quantity([2, 4], "s")}, indexes={}), ), {"x": "mm"}, None, ValueError, id="DataArray-incompatible units-dims-no index", ), ), ) def test_to(obj, units, expected, error): if error is not None: with pytest.raises(error): obj.pint.to(units) else: actual = obj.pint.to(units) assert_units_equal(actual, expected) assert_identical(actual, expected) @pytest.mark.parametrize( ["obj", "indexers", "expected", "error"], ( pytest.param( xr.Dataset( { "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), } ), {"x": Quantity([10, 30], "dm"), "y": Quantity([60], "s")}, xr.Dataset( { "x": ("x", [10, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60], {"units": unit_registry.Unit("s")}), } ), None, id="Dataset-identical units", ), pytest.param( xr.Dataset( { "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), } ), {"x": Quantity([1, 3], "m"), "y": Quantity([1], "min")}, xr.Dataset( { "x": ("x", [1, 3], {"units": unit_registry.Unit("m")}), "y": ("y", [1], {"units": unit_registry.Unit("min")}), } ), None, id="Dataset-compatible units", ), pytest.param( xr.Dataset( { "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), } ), {"x": Quantity([1, 3], "s"), "y": Quantity([1], "m")}, None, KeyError, id="Dataset-incompatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([10, 30], "dm"), "y": Quantity([60], "s")}, xr.DataArray( [[0], [4]], dims=("x", "y"), coords={ "x": ("x", [10, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60], {"units": unit_registry.Unit("s")}), }, ), None, id="DataArray-identical units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([1, 3], "m"), "y": Quantity([1], "min")}, xr.DataArray( [[0], [4]], dims=("x", "y"), coords={ "x": ("x", [1, 3], {"units": unit_registry.Unit("m")}), "y": ("y", [1], {"units": unit_registry.Unit("min")}), }, ), None, id="DataArray-compatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([10, 30], "s"), "y": Quantity([60], "m")}, None, KeyError, id="DataArray-incompatible units", ), ), ) def test_sel(obj, indexers, expected, error): obj_ = obj.pint.quantify() if error is not None: with pytest.raises(error): obj_.pint.sel(indexers) else: expected_ = expected.pint.quantify() actual = obj_.pint.sel(indexers) assert_units_equal(actual, expected_) assert_identical(actual, expected_) @pytest.mark.parametrize( ["obj", "indexers", "expected", "error"], ( pytest.param( xr.Dataset( { "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), } ), {"x": Quantity([10, 30], "dm"), "y": Quantity([60], "s")}, xr.Dataset( { "x": ("x", [10, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60], {"units": unit_registry.Unit("s")}), } ), None, id="Dataset-identical units", ), pytest.param( xr.Dataset( { "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), } ), {"x": Quantity([1, 3], "m"), "y": Quantity([1], "min")}, xr.Dataset( { "x": ("x", [1, 3], {"units": unit_registry.Unit("m")}), "y": ("y", [1], {"units": unit_registry.Unit("min")}), } ), None, id="Dataset-compatible units", ), pytest.param( xr.Dataset( { "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), } ), {"x": Quantity([1, 3], "s"), "y": Quantity([1], "m")}, None, KeyError, id="Dataset-incompatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([10, 30], "dm"), "y": Quantity([60], "s")}, xr.DataArray( [[0], [4]], dims=("x", "y"), coords={ "x": ("x", [10, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60], {"units": unit_registry.Unit("s")}), }, ), None, id="DataArray-identical units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([1, 3], "m"), "y": Quantity([1], "min")}, xr.DataArray( [[0], [4]], dims=("x", "y"), coords={ "x": ("x", [1, 3], {"units": unit_registry.Unit("m")}), "y": ("y", [1], {"units": unit_registry.Unit("min")}), }, ), None, id="DataArray-compatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([10, 30], "s"), "y": Quantity([60], "m")}, None, KeyError, id="DataArray-incompatible units", ), ), ) def test_loc(obj, indexers, expected, error): obj_ = obj.pint.quantify() if error is not None: with pytest.raises(error): obj_.pint.loc[indexers] else: expected_ = expected.pint.quantify() actual = obj_.pint.loc[indexers] assert_units_equal(actual, expected_) assert_identical(actual, expected_) @pytest.mark.parametrize( ["obj", "indexers", "values", "expected", "error"], ( pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([10, 30], "dm"), "y": Quantity([60], "s")}, [[-1], [-2]], xr.DataArray( [[-1, 1], [2, 3], [-2, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), None, id="coords-identical units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([1, 3], "m"), "y": Quantity([1], "min")}, [[-1], [-2]], xr.DataArray( [[-1, 1], [2, 3], [-2, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), None, id="coords-compatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([1, 3], "s"), "y": Quantity([1], "m")}, [[-1], [-2]], None, KeyError, id="coords-incompatible units", ), pytest.param( xr.DataArray( Quantity([[0, 1], [2, 3], [4, 5]], "m"), dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([10, 30], "dm"), "y": Quantity([60], "s")}, Quantity([[-1], [-2]], "m"), xr.DataArray( Quantity([[-1, 1], [2, 3], [-2, 5]], "m"), dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), None, id="data-identical units", ), pytest.param( xr.DataArray( Quantity([[0, 1], [2, 3], [4, 5]], "m"), dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([10, 30], "dm"), "y": Quantity([60], "s")}, Quantity([[-1], [-2]], "km"), xr.DataArray( Quantity([[-1000, 1], [2, 3], [-2000, 5]], "m"), dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), None, id="data-compatible units", ), pytest.param( xr.DataArray( Quantity([[0, 1], [2, 3], [4, 5]], "m"), dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([10, 30], "dm"), "y": Quantity([60], "s")}, Quantity([[-1], [-2]], "s"), None, pint.DimensionalityError, id="data-incompatible units", ), ), ) def test_loc_setitem(obj, indexers, values, expected, error): if error is not None: with pytest.raises(error): obj.pint.loc[indexers] = values else: obj.pint.loc[indexers] = values assert_units_equal(obj, expected) assert_identical(obj, expected) @pytest.mark.parametrize( ["obj", "indexers", "expected", "error"], ( pytest.param( xr.Dataset( { "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), } ), {"x": Quantity([10, 30], "dm"), "y": Quantity([60], "s")}, xr.Dataset( { "x": ("x", [20], {"units": unit_registry.Unit("dm")}), "y": ("y", [120], {"units": unit_registry.Unit("s")}), } ), None, id="Dataset-identical units", ), pytest.param( xr.Dataset( { "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), } ), {"x": Quantity([1, 3], "m"), "y": Quantity([1], "min")}, xr.Dataset( { "x": ("x", [20], {"units": unit_registry.Unit("dm")}), "y": ("y", [120], {"units": unit_registry.Unit("s")}), } ), None, id="Dataset-compatible units", ), pytest.param( xr.Dataset( { "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), } ), {"x": Quantity([1, 3], "s"), "y": Quantity([1], "m")}, None, KeyError, id="Dataset-incompatible units", ), pytest.param( xr.Dataset( { "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), } ), {"x": Quantity([10, 30], "m"), "y": Quantity([60], "min")}, None, KeyError, id="Dataset-compatible units-not found", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([10, 30], "dm"), "y": Quantity([60], "s")}, xr.DataArray( [[3]], dims=("x", "y"), coords={ "x": ("x", [20], {"units": unit_registry.Unit("dm")}), "y": ("y", [120], {"units": unit_registry.Unit("s")}), }, ), None, id="DataArray-identical units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([1, 3], "m"), "y": Quantity([1], "min")}, xr.DataArray( [[3]], dims=("x", "y"), coords={ "x": ("x", [20], {"units": unit_registry.Unit("dm")}), "y": ("y", [120], {"units": unit_registry.Unit("s")}), }, ), None, id="DataArray-compatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([10, 30], "s"), "y": Quantity([60], "m")}, None, KeyError, id="DataArray-incompatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={ "x": ("x", [10, 20, 30], {"units": unit_registry.Unit("dm")}), "y": ("y", [60, 120], {"units": unit_registry.Unit("s")}), }, ), {"x": Quantity([10, 30], "m"), "y": Quantity([60], "min")}, None, KeyError, id="DataArray-compatible units-not found", ), ), ) def test_drop_sel(obj, indexers, expected, error): if error is not None: with pytest.raises(error): obj.pint.drop_sel(indexers) else: actual = obj.pint.drop_sel(indexers) assert_units_equal(actual, expected) assert_identical(actual, expected) @requires_dask_array @pytest.mark.parametrize( "obj", ( pytest.param( xr.Dataset( {"a": ("x", np.linspace(0, 1, 11))}, coords={"u": ("x", np.arange(11))}, ), id="Dataset-no units", ), pytest.param( xr.Dataset( { "a": ( "x", Quantity(np.linspace(0, 1, 11), "m"), ) }, coords={ "u": ( "x", Quantity(np.arange(11), "m"), ) }, ), id="Dataset-units", ), pytest.param( xr.DataArray( np.linspace(0, 1, 11), coords={ "u": ( "x", np.arange(11), ) }, dims="x", ), id="DataArray-no units", ), pytest.param( xr.DataArray( Quantity(np.linspace(0, 1, 11), "m"), coords={ "u": ( "x", Quantity(np.arange(11), "m"), ) }, dims="x", ), id="DataArray-units", ), ), ) def test_chunk(obj): actual = obj.pint.chunk({"x": 2}) expected = ( obj.pint.dequantify().chunk({"x": 2}).pint.quantify(unit_registry=unit_registry) ) assert_units_equal(actual, expected) assert_identical(actual, expected) @pytest.mark.parametrize( ["obj", "units", "indexers", "expected", "expected_units", "error"], ( pytest.param( xr.Dataset({"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}), {"x": "dm", "y": "s"}, {"x": Quantity([10, 30, 50], "dm"), "y": Quantity([0, 120, 240], "s")}, xr.Dataset({"x": ("x", [10, 30, 50]), "y": ("y", [0, 120, 240])}), {"x": "dm", "y": "s"}, None, id="Dataset-identical units", ), pytest.param( xr.Dataset({"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}), {"x": "dm", "y": "s"}, {"x": Quantity([0, 1, 3, 5], "m"), "y": Quantity([0, 2, 4], "min")}, xr.Dataset({"x": ("x", [0, 1, 3, 5]), "y": ("y", [0, 2, 4])}), {"x": "m", "y": "min"}, None, id="Dataset-compatible units", ), pytest.param( xr.Dataset({"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}), {"x": "dm", "y": "s"}, {"x": Quantity([1, 3], "s"), "y": Quantity([1], "m")}, None, {}, ValueError, id="Dataset-incompatible units", ), pytest.param( xr.Dataset( { "a": (("x", "y"), np.array([[0, 1], [2, 3], [4, 5]])), "x": [10, 20, 30], "y": [60, 120], } ), {"a": "kg"}, { "x": [15, 25], "y": [75, 105], }, xr.Dataset( { "a": (("x", "y"), np.array([[np.nan, np.nan], [np.nan, np.nan]])), "x": [15, 25], "y": [75, 105], } ), {"a": "kg"}, None, id="Dataset-data units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}, ), {"x": "dm", "y": "s"}, {"x": Quantity([10, 30, 50], "dm"), "y": Quantity([0, 240], "s")}, xr.DataArray( [[np.nan, np.nan], [np.nan, np.nan], [np.nan, np.nan]], dims=("x", "y"), coords={"x": ("x", [10, 30, 50]), "y": ("y", [0, 240])}, ), {"x": "dm", "y": "s"}, None, id="DataArray-identical units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}, ), {"x": "dm", "y": "s"}, {"x": Quantity([1, 3, 5], "m"), "y": Quantity([0, 2], "min")}, xr.DataArray( [[np.nan, 1], [np.nan, 5], [np.nan, np.nan]], dims=("x", "y"), coords={"x": ("x", [1, 3, 5]), "y": ("y", [0, 2])}, ), {"x": "m", "y": "min"}, None, id="DataArray-compatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}, ), {"x": "dm", "y": "s"}, {"x": Quantity([10, 30], "s"), "y": Quantity([60], "m")}, None, {}, ValueError, id="DataArray-incompatible units", ), pytest.param( xr.DataArray( np.array([[0, 1], [2, 3], [4, 5]]), dims=("x", "y"), coords={"x": [10, 20, 30], "y": [60, 120]}, ), {None: "kg"}, {"x": [15, 25], "y": [75, 105]}, xr.DataArray( [[np.nan, np.nan], [np.nan, np.nan]], dims=("x", "y"), coords={"x": [15, 25], "y": [75, 105]}, ), {None: "kg"}, None, id="DataArray-data units", ), ), ) def test_reindex(obj, units, indexers, expected, expected_units, error): obj_ = obj.pint.quantify(units) if error is not None: with pytest.raises(error): obj.pint.reindex(indexers) else: expected_ = expected.pint.quantify(expected_units) actual = obj_.pint.reindex(indexers) assert_units_equal(actual, expected_) assert_identical(actual, expected_) @pytest.mark.parametrize( ["obj", "units", "other", "other_units", "expected", "expected_units", "error"], ( pytest.param( xr.Dataset({"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [10, 30, 50]), "y": ("y", [0, 120, 240])}), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [10, 30, 50]), "y": ("y", [0, 120, 240])}), {"x": "dm", "y": "s"}, None, id="Dataset-identical units", ), pytest.param( xr.Dataset({"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [0, 1, 3, 5]), "y": ("y", [0, 2, 4])}), {"x": "m", "y": "min"}, xr.Dataset({"x": ("x", [0, 1, 3, 5]), "y": ("y", [0, 2, 4])}), {"x": "m", "y": "min"}, None, id="Dataset-compatible units", ), pytest.param( xr.Dataset({"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [1, 3]), "y": ("y", [1])}), {"x": "s", "y": "m"}, None, {}, ValueError, id="Dataset-incompatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}, ), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [10, 30, 50]), "y": ("y", [0, 240])}), {"x": "dm", "y": "s"}, xr.DataArray( [[np.nan, np.nan], [np.nan, np.nan], [np.nan, np.nan]], dims=("x", "y"), coords={"x": ("x", [10, 30, 50]), "y": ("y", [0, 240])}, ), {"x": "dm", "y": "s"}, None, id="DataArray-identical units", ), pytest.param( xr.Dataset( { "a": (("x", "y"), [[0, 1], [2, 3], [4, 5]]), "x": [10, 20, 30], "y": [60, 120], } ), {"a": "kg"}, xr.Dataset({"x": [15, 25], "y": [75, 105]}), {}, xr.Dataset( { "a": (("x", "y"), [[np.nan, np.nan], [np.nan, np.nan]]), "x": [15, 25], "y": [75, 105], } ), {"a": "kg"}, None, id="Dataset-data units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}, ), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [1, 3, 5]), "y": ("y", [0, 2])}), {"x": "m", "y": "min"}, xr.DataArray( [[np.nan, 1], [np.nan, 5], [np.nan, np.nan]], dims=("x", "y"), coords={"x": ("x", [1, 3, 5]), "y": ("y", [0, 2])}, ), {"x": "m", "y": "min"}, None, id="DataArray-compatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}, ), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [10, 30]), "y": ("y", [60])}), {"x": "s", "y": "m"}, None, {}, ValueError, id="DataArray-incompatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": [10, 20, 30], "y": [60, 120]}, ), {"a": "kg"}, xr.Dataset({"x": [15, 25], "y": [75, 105]}), {}, xr.DataArray( [[np.nan, np.nan], [np.nan, np.nan]], dims=("x", "y"), coords={"x": [15, 25], "y": [75, 105]}, ), {"a": "kg"}, None, id="DataArray-data units", ), ), ) def test_reindex_like(obj, units, other, other_units, expected, expected_units, error): obj_ = obj.pint.quantify(units) other_ = other.pint.quantify(other_units) if error is not None: with pytest.raises(error): obj_.pint.reindex_like(other_) else: expected_ = expected.pint.quantify(expected_units) actual = obj_.pint.reindex_like(other_) assert_units_equal(actual, expected_) assert_identical(actual, expected_) @requires_scipy @pytest.mark.parametrize( ["obj", "units", "indexers", "expected", "expected_units", "error", "kwargs"], ( pytest.param( xr.Dataset({"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}), {"x": "dm", "y": "s"}, {"x": Quantity([10, 30, 50], "dm"), "y": Quantity([0, 120, 240], "s")}, xr.Dataset({"x": ("x", [10, 30, 50]), "y": ("y", [0, 120, 240])}), {"x": "dm", "y": "s"}, None, None, id="Dataset-identical units", ), pytest.param( xr.Dataset({"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}), {"x": "dm", "y": "s"}, {"x": Quantity([0, 1, 3, 5], "m"), "y": Quantity([0, 2, 4], "min")}, xr.Dataset({"x": ("x", [0, 1, 3, 5]), "y": ("y", [0, 2, 4])}), {"x": "m", "y": "min"}, None, None, id="Dataset-compatible units", ), pytest.param( xr.Dataset({"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}), {"x": "dm", "y": "s"}, {"x": Quantity([1, 3], "s"), "y": Quantity([1], "m")}, None, {}, ValueError, None, id="Dataset-incompatible units", ), pytest.param( xr.Dataset( { "a": (("x", "y"), np.array([[0, 1], [2, 3], [4, 5]])), "x": [10, 20, 30], "y": [60, 120], } ), {"a": "kg"}, { "x": [15, 25], "y": [75, 105], }, xr.Dataset( { "a": (("x", "y"), np.array([[1.25, 1.75], [3.25, 3.75]])), "x": [15, 25], "y": [75, 105], } ), {"a": "kg"}, None, None, id="Dataset-data units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}, ), {"x": "dm", "y": "s"}, {"x": Quantity([10, 30, 50], "dm"), "y": Quantity([0, 240], "s")}, xr.DataArray( [[np.nan, np.nan], [np.nan, np.nan], [np.nan, np.nan]], dims=("x", "y"), coords={"x": ("x", [10, 30, 50]), "y": ("y", [0, 240])}, ), {"x": "dm", "y": "s"}, None, None, id="DataArray-identical units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}, ), {"x": "dm", "y": "s"}, {"x": Quantity([1, 3, 5], "m"), "y": Quantity([0, 2], "min")}, xr.DataArray( [[np.nan, 1], [np.nan, 5], [np.nan, np.nan]], dims=("x", "y"), coords={"x": ("x", [1, 3, 5]), "y": ("y", [0, 2])}, ), {"x": "m", "y": "min"}, None, None, id="DataArray-compatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}, ), {"x": "dm", "y": "s"}, {"x": Quantity([10, 30], "s"), "y": Quantity([60], "m")}, None, {}, ValueError, None, id="DataArray-incompatible units", ), pytest.param( xr.DataArray( np.array([[0, 1], [2, 3], [4, 5]]), dims=("x", "y"), coords={"x": [10, 20, 30], "y": [60, 120]}, ), {None: "kg"}, {"x": [15, 25], "y": [75, 105]}, xr.DataArray( [[1.25, 1.75], [3.25, 3.75]], dims=("x", "y"), coords={"x": [15, 25], "y": [75, 105]}, ), {None: "kg"}, None, None, id="DataArray-data units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}, ), {"x": "dm", "y": "s"}, {"x": Quantity([1, 3, 5], "m"), "y": Quantity([0, 2], "min")}, xr.DataArray( [[0, 1], [0, 5], [0, 0]], dims=("x", "y"), coords={"x": ("x", [1, 3, 5]), "y": ("y", [0, 2])}, ), {"x": "m", "y": "min"}, None, {"bounds_error": False, "fill_value": 0}, id="DataArray-other parameters", ), ), ) def test_interp(obj, units, indexers, expected, expected_units, error, kwargs): obj_ = obj.pint.quantify(units) if error is not None: with pytest.raises(error): obj_.pint.interp(indexers, kwargs=kwargs) else: expected_ = expected.pint.quantify(expected_units) actual = obj_.pint.interp(indexers, kwargs=kwargs) assert_units_equal(actual, expected_) assert_identical(actual, expected_) @requires_scipy @pytest.mark.parametrize( ["obj", "units", "other", "other_units", "expected", "expected_units", "error"], ( pytest.param( xr.Dataset({"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [10, 30, 50]), "y": ("y", [0, 120, 240])}), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [10, 30, 50]), "y": ("y", [0, 120, 240])}), {"x": "dm", "y": "s"}, None, id="Dataset-identical units", ), pytest.param( xr.Dataset({"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [0, 1, 3, 5]), "y": ("y", [0, 2, 4])}), {"x": "m", "y": "min"}, xr.Dataset({"x": ("x", [0, 1, 3, 5]), "y": ("y", [0, 2, 4])}), {"x": "m", "y": "min"}, None, id="Dataset-compatible units", ), pytest.param( xr.Dataset({"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [1, 3]), "y": ("y", [1])}), {"x": "s", "y": "m"}, None, {}, ValueError, id="Dataset-incompatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}, ), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [10, 30, 50]), "y": ("y", [0, 240])}), {"x": "dm", "y": "s"}, xr.DataArray( [[np.nan, np.nan], [np.nan, np.nan], [np.nan, np.nan]], dims=("x", "y"), coords={"x": ("x", [10, 30, 50]), "y": ("y", [0, 240])}, ), {"x": "dm", "y": "s"}, None, id="DataArray-identical units", ), pytest.param( xr.Dataset( { "a": (("x", "y"), [[0, 1], [2, 3], [4, 5]]), "x": [10, 20, 30], "y": [60, 120], } ), {"a": "kg"}, xr.Dataset({"x": [15, 25], "y": [75, 105]}), {}, xr.Dataset( { "a": (("x", "y"), [[1.25, 1.75], [3.25, 3.75]]), "x": [15, 25], "y": [75, 105], } ), {"a": "kg"}, None, id="Dataset-data units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}, ), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [1, 3, 5]), "y": ("y", [0, 2])}), {"x": "m", "y": "min"}, xr.DataArray( [[np.nan, 1], [np.nan, 5], [np.nan, np.nan]], dims=("x", "y"), coords={"x": ("x", [1, 3, 5]), "y": ("y", [0, 2])}, ), {"x": "m", "y": "min"}, None, id="DataArray-compatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": ("x", [10, 20, 30]), "y": ("y", [60, 120])}, ), {"x": "dm", "y": "s"}, xr.Dataset({"x": ("x", [10, 30]), "y": ("y", [60])}), {"x": "s", "y": "m"}, None, {}, ValueError, id="DataArray-incompatible units", ), pytest.param( xr.DataArray( [[0, 1], [2, 3], [4, 5]], dims=("x", "y"), coords={"x": [10, 20, 30], "y": [60, 120]}, ), {"a": "kg"}, xr.Dataset({"x": [15, 25], "y": [75, 105]}), {}, xr.DataArray( [[1.25, 1.75], [3.25, 3.75]], dims=("x", "y"), coords={"x": [15, 25], "y": [75, 105]}, ), {"a": "kg"}, None, id="DataArray-data units", ), ), ) def test_interp_like(obj, units, other, other_units, expected, expected_units, error): obj_ = obj.pint.quantify(units) other_ = other.pint.quantify(other_units) if error is not None: with pytest.raises(error): obj_.pint.interp_like(other_) else: expected_ = expected.pint.quantify(expected_units) actual = obj_.pint.interp_like(other_) assert_units_equal(actual, expected_) assert_identical(actual, expected_) @requires_bottleneck @pytest.mark.parametrize( ["obj", "expected"], ( pytest.param( xr.Dataset( {"a": ("x", [nan, 0, nan, 1, nan, nan, 2, nan])}, coords={"u": ("x", [nan, 0, nan, 1, nan, nan, 2, nan])}, ), xr.Dataset( {"a": ("x", [nan, 0, 0, 1, 1, 1, 2, 2])}, coords={"u": ("x", [nan, 0, nan, 1, nan, nan, 2, nan])}, ), id="Dataset-no units", ), pytest.param( xr.Dataset( { "a": ( "x", Quantity([nan, 0, nan, 1, nan, nan, 2, nan], "m"), ) }, coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, 2, nan], "m"), ) }, ), xr.Dataset( {"a": ("x", Quantity([nan, 0, 0, 1, 1, 1, 2, 2], "m"))}, coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, 2, nan], "m"), ) }, ), id="Dataset-units", ), pytest.param( xr.DataArray( [nan, 0, nan, 1, nan, nan, 2, nan], coords={ "u": ( "x", [nan, 0, nan, 1, nan, nan, 2, nan], ) }, dims="x", ), xr.DataArray( [nan, 0, 0, 1, 1, 1, 2, 2], coords={ "u": ( "x", [nan, 0, nan, 1, nan, nan, 2, nan], ) }, dims="x", ), id="DataArray-no units", ), pytest.param( xr.DataArray( Quantity([nan, 0, nan, 1, nan, nan, 2, nan], "m"), coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, 2, nan], "m"), ) }, dims="x", ), xr.DataArray( Quantity([nan, 0, 0, 1, 1, 1, 2, 2], "m"), coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, 2, nan], "m"), ) }, dims="x", ), id="DataArray-units", ), ), ) def test_ffill(obj, expected): actual = obj.pint.ffill(dim="x") assert_identical(actual, expected) assert_units_equal(actual, expected) @requires_bottleneck @pytest.mark.parametrize( ["obj", "expected"], ( pytest.param( xr.Dataset( {"a": ("x", [nan, 0, nan, 1, nan, nan, 2, nan])}, coords={"u": ("x", [nan, 0, nan, 1, nan, nan, 2, nan])}, ), xr.Dataset( {"a": ("x", [0, 0, 1, 1, 2, 2, 2, nan])}, coords={"u": ("x", [nan, 0, nan, 1, nan, nan, 2, nan])}, ), id="Dataset-no units", ), pytest.param( xr.Dataset( { "a": ( "x", Quantity([nan, 0, nan, 1, nan, nan, 2, nan], "m"), ) }, coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, 2, nan], "m"), ) }, ), xr.Dataset( {"a": ("x", Quantity([0, 0, 1, 1, 2, 2, 2, nan], "m"))}, coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, 2, nan], "m"), ) }, ), id="Dataset-units", ), pytest.param( xr.DataArray( [nan, 0, nan, 1, nan, nan, 2, nan], coords={ "u": ( "x", [nan, 0, nan, 1, nan, nan, 2, nan], ) }, dims="x", ), xr.DataArray( [0, 0, 1, 1, 2, 2, 2, nan], coords={ "u": ( "x", [nan, 0, nan, 1, nan, nan, 2, nan], ) }, dims="x", ), id="DataArray-no units", ), pytest.param( xr.DataArray( Quantity([nan, 0, nan, 1, nan, nan, 2, nan], "m"), coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, 2, nan], "m"), ) }, dims="x", ), xr.DataArray( Quantity([0, 0, 1, 1, 2, 2, 2, nan], "m"), coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, 2, nan], "m"), ) }, dims="x", ), id="DataArray-units", ), ), ) def test_bfill(obj, expected): actual = obj.pint.bfill(dim="x") assert_identical(actual, expected) assert_units_equal(actual, expected) @pytest.mark.parametrize( ["obj", "expected"], ( pytest.param( xr.Dataset( {"a": ("x", [nan, 0, nan, 1, nan, nan, nan, 2, nan])}, coords={"u": ("x", [nan, 0, nan, 1, nan, nan, nan, 2, nan])}, ), xr.Dataset( {"a": ("x", [nan, 0, 0.5, 1, 1.25, 1.5, 1.75, 2, nan])}, coords={"u": ("x", [nan, 0, nan, 1, nan, nan, nan, 2, nan])}, ), id="Dataset-no units", ), pytest.param( xr.Dataset( { "a": ( "x", Quantity([nan, 0, nan, 1, nan, nan, nan, 2, nan], "m"), ) }, coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, nan, 2, nan], "m"), ) }, ), xr.Dataset( {"a": ("x", Quantity([nan, 0, 0.5, 1, 1.25, 1.5, 1.75, 2, nan], "m"))}, coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, nan, 2, nan], "m"), ) }, ), id="Dataset-units", ), pytest.param( xr.DataArray( [nan, 0, nan, 1, nan, nan, nan, 2, nan], coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, nan, 2, nan], "m"), ) }, dims="x", ), xr.DataArray( [nan, 0, 0.5, 1, 1.25, 1.5, 1.75, 2, nan], coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, nan, 2, nan], "m"), ) }, dims="x", ), id="DataArray-units", ), pytest.param( xr.DataArray( Quantity([nan, 0, nan, 1, nan, nan, nan, 2, nan], "m"), coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, nan, 2, nan], "m"), ) }, dims="x", ), xr.DataArray( Quantity([nan, 0, 0.5, 1, 1.25, 1.5, 1.75, 2, nan], "m"), coords={ "u": ( "x", Quantity([nan, 0, nan, 1, nan, nan, nan, 2, nan], "m"), ) }, dims="x", ), id="DataArray-units", ), ), ) def test_interpolate_na(obj, expected): actual = obj.pint.interpolate_na(dim="x") assert_identical(actual, expected) assert_units_equal(actual, expected) pint-xarray-0.6.0/pint_xarray/tests/test_conversion.py000066400000000000000000000710551505507415300233100ustar00rootroot00000000000000import numpy as np import pandas as pd import pint import pytest from tlz.dicttoolz import dissoc from xarray import Coordinates, DataArray, Dataset, Variable from xarray.core.indexes import PandasIndex from pint_xarray import conversion from pint_xarray.errors import PintExceptionGroup from pint_xarray.index import PintIndex from pint_xarray.tests.utils import ( assert_array_equal, assert_array_units_equal, assert_identical, assert_indexer_units_equal, assert_indexers_equal, ) unit_registry = pint.UnitRegistry() Quantity = unit_registry.Quantity Unit = unit_registry.Unit pytestmark = pytest.mark.filterwarnings("error::pint.UnitStrippedWarning") def filter_none_values(mapping): return {k: v for k, v in mapping.items() if v is not None} def to_quantity(v, u): if u is None: return v return Quantity(v, u) def convert_quantity(q, u): if u is None: return q if not isinstance(q, Quantity): q = Quantity(q) return q.to(u) def strip_quantity(q): try: return q.magnitude except AttributeError: return q class TestArrayFunctions: @pytest.mark.parametrize( ["unit", "data", "expected", "match"], ( pytest.param( 1.2, np.array([0, 1]), None, "cannot use .+ as a unit", id="not a unit" ), pytest.param( 1, np.array([0, 1]), None, "cannot use .+ as a unit", id="no unit (1)" ), pytest.param( None, np.array([0, 1]), np.array([0, 1]), None, id="no unit (None)" ), pytest.param( "m", np.array([0, 1]), None, "cannot use .+ as a unit", id="string" ), pytest.param( Unit("m"), np.array([0, 1]), Quantity([0, 1], "m"), None, id="unit object", ), pytest.param( Unit("m"), Quantity(np.array([0, 1]), "s"), None, "already has units", id="unit object on quantity", ), pytest.param( Unit("m"), Quantity(np.array([0, 1]), "m"), Quantity(np.array([0, 1]), "m"), None, id="unit object on quantity with same unit", ), pytest.param( Unit("mm"), Quantity(np.array([0, 1]), "m"), None, "already has units", id="unit object on quantity with similar unit", ), ), ) def test_array_attach_units(self, data, unit, expected, match): if match is not None: with pytest.raises(ValueError, match=match): conversion.array_attach_units(data, unit) return actual = conversion.array_attach_units(data, unit) assert_array_units_equal(expected, actual) assert_array_equal(expected, actual) @pytest.mark.parametrize( ["unit", "data", "expected", "error", "match"], ( pytest.param( 1.2, np.array([0, 1, 2]), None, ValueError, "cannot use .+ as a unit", id="not a unit-ndarray", ), pytest.param( 1, np.array([0, 1, 2]), None, ValueError, "cannot use .+ as a unit", id="no unit (1)-ndarray", ), pytest.param( None, np.array([0, 1, 2]), np.array([0, 1, 2]), None, None, id="no unit (None)-ndarray", ), pytest.param( "mm", np.array([0, 1, 2]), None, ValueError, "cannot convert a non-quantity using .+ as unit", id="string-ndarray", ), pytest.param( Unit("deg"), np.array([0, np.pi / 2, np.pi]), Quantity([0, 90, 180], "deg"), None, None, id="dimensionless-ndarray", ), pytest.param( Unit("mm"), np.array([0, np.pi / 2, np.pi]), None, pint.DimensionalityError, None, id="unit-ndarray", ), pytest.param( "mm", Quantity([0, 1, 2], "m"), Quantity([0, 1000, 2000], "mm"), None, None, id="string-quantity", ), pytest.param( unit_registry.mm, Quantity([0, 1, 2], "m"), Quantity([0, 1000, 2000], "mm"), None, None, id="unit object", ), pytest.param( "s", Quantity([0, 1, 2], "m"), None, pint.DimensionalityError, None, id="quantity-incompatible unit", ), ), ) def test_array_convert_units(self, data, unit, expected, error, match): if error is not None: with pytest.raises(error, match=match): conversion.array_convert_units(data, unit) return actual = conversion.array_convert_units(data, unit) assert_array_equal(expected, actual) @pytest.mark.parametrize( ["data", "expected"], ( pytest.param(np.array([0, 1]), None, id="array_like"), pytest.param(Quantity([1, 2], "m"), Unit("m"), id="quantity"), ), ) def test_array_extract_units(self, data, expected): actual = conversion.array_extract_units(data) assert expected == actual @pytest.mark.parametrize( ["data", "expected"], ( pytest.param(np.array([1, 2]), np.array([1, 2]), id="array_like"), pytest.param(Quantity([1, 2], "m"), np.array([1, 2]), id="quantity"), ), ) def test_array_strip_units(self, data, expected): actual = conversion.array_strip_units(data) assert_array_equal(expected, actual) class TestXarrayFunctions: @pytest.mark.parametrize("type", ("Dataset", "DataArray")) @pytest.mark.parametrize( "units", ( pytest.param({}, id="empty units"), pytest.param({"a": None, "b": None, "u": None, "x": None}, id="no units"), pytest.param( {"a": unit_registry.m, "b": unit_registry.m, "u": None, "x": None}, id="data units", ), pytest.param( {"a": None, "b": None, "u": unit_registry.s, "x": None}, id="coord units", ), pytest.param( {"a": None, "b": None, "u": None, "x": unit_registry.m}, id="dim units" ), ), ) def test_attach_units(self, type, units): a = np.linspace(-1, 1, 5) b = np.linspace(0, 1, 5) x = np.linspace(0, 100, 5) u = np.arange(5) q_a = to_quantity(a, units.get("a")) q_b = to_quantity(b, units.get("b")) q_x = to_quantity(x, units.get("x")) q_u = to_quantity(u, units.get("u")) index = PandasIndex(x, dim="x") if units.get("x") is not None: index = PintIndex(index=index, units={"x": units.get("x")}) obj = Dataset({"a": ("x", a), "b": ("x", b)}, coords={"u": ("x", u), "x": x}) coords = Coordinates( coords={"u": Variable("x", q_u), "x": Variable("x", q_x)}, indexes={"x": index}, ) expected = Dataset( {"a": ("x", q_a), "b": ("x", q_b)}, coords=coords, ) if type == "DataArray": obj = obj["a"] expected = expected["a"] actual = conversion.attach_units(obj, units) assert_identical(actual, expected) if units.get("x") is None: assert not isinstance(actual.xindexes["x"], PintIndex) else: assert isinstance(actual.xindexes["x"], PintIndex) assert actual.xindexes["x"].units == {"x": units.get("x")} @pytest.mark.parametrize("type", ("DataArray", "Dataset")) def test_attach_unit_attributes(self, type): units = {"a": "K", "b": "hPa", "u": "m", "x": "s"} obj = Dataset( data_vars={"a": ("x", []), "b": ("x", [])}, coords={"x": [], "u": ("x", [])}, ) expected = Dataset( {"a": ("x", [], {"units": "K"}), "b": ("x", [], {"units": "hPa"})}, coords={"x": ("x", [], {"units": "s"}), "u": ("x", [], {"units": "m"})}, ) if type == "DataArray": obj = obj["a"] expected = expected["a"] actual = conversion.attach_unit_attributes(obj, units) assert_identical(actual, expected) @pytest.mark.parametrize("type", ("DataArray", "Dataset")) @pytest.mark.parametrize( ["variant", "units", "error", "suberrors"], ( pytest.param("none", {}, None, {}, id="none-no units"), pytest.param( "none", {"a": Unit("g"), "b": Unit("Pa"), "u": Unit("ms"), "x": Unit("mm")}, PintExceptionGroup, { "a": (pint.DimensionalityError, "'a'"), "b": (pint.DimensionalityError, "'b'"), "u": (pint.DimensionalityError, "'u'"), "x": (ValueError, "'x'"), }, id="none-with units", ), pytest.param("data", {}, None, {}, id="data-no units"), pytest.param( "data", {"a": Unit("g"), "b": Unit("Pa")}, None, {}, id="data-compatible units", ), pytest.param( "data", {"a": Unit("s"), "b": Unit("m")}, PintExceptionGroup, { "a": (pint.DimensionalityError, "'a'"), "b": (pint.DimensionalityError, "'b'"), }, id="data-incompatible units", ), pytest.param("dims", {}, None, {}, id="dims-no units"), pytest.param( "dims", {"x": Unit("mm")}, None, {}, id="dims-compatible units" ), pytest.param( "dims", {"x": Unit("ms")}, PintExceptionGroup, {"x": (ValueError, "'x'")}, id="dims-incompatible units", ), pytest.param("coords", {}, None, {}, id="coords-no units"), pytest.param( "coords", {"u": Unit("ms")}, None, {"u": (pint.DimensionalityError, "'u'")}, id="coords-compatible units", ), pytest.param( "coords", {"u": Unit("mm")}, PintExceptionGroup, { "u": ( pint.DimensionalityError, "incompatible units for variable 'u'", ) }, id="coords-incompatible units", ), ), ) def test_convert_units(self, type, variant, units, error, suberrors): variants = { "none": {"a": None, "b": None, "u": None, "x": None}, "data": {"a": Unit("kg"), "b": Unit("hPa"), "u": None, "x": None}, "coords": {"a": None, "b": None, "u": Unit("s"), "x": None}, "dims": {"a": None, "b": None, "u": None, "x": Unit("m")}, } a = np.linspace(-1, 1, 3) b = np.linspace(1, 2, 3) u = np.linspace(0, 100, 3) x = np.arange(3) original_units = variants.get(variant) q_a = to_quantity(a, original_units.get("a")) q_b = to_quantity(b, original_units.get("b")) q_u = to_quantity(u, original_units.get("u")) q_x = to_quantity(x, original_units.get("x")) x_index = PandasIndex(pd.Index(x), "x") if original_units.get("x") is not None: x_index = PintIndex(index=x_index, units={"x": original_units.get("x")}) obj = Dataset( { "a": ("x", q_a), "b": ("x", q_b), }, coords=Coordinates( {"u": ("x", q_u), "x": ("x", q_x)}, indexes={"x": x_index}, ), ) if type == "DataArray": obj = obj["a"] suberrors = dissoc(suberrors, "b") if error is not None: matchers = [ pytest.RaisesExc(err, match=match) for err, match in suberrors.values() ] with pytest.RaisesGroup( *matchers, match="Cannot convert variables", check=lambda eg: isinstance(eg, PintExceptionGroup), ): conversion.convert_units(obj, units) return expected_a = convert_quantity(q_a, units.get("a", original_units.get("a"))) expected_b = convert_quantity(q_b, units.get("b", original_units.get("b"))) expected_u = convert_quantity(q_u, units.get("u", original_units.get("u"))) expected_x = convert_quantity(q_x, units.get("x")) expected_index = PandasIndex(pd.Index(strip_quantity(expected_x)), "x") if units.get("x") is not None: expected_index = PintIndex( index=expected_index, units={"x": units.get("x")} ) expected = Dataset( { "a": ("x", expected_a), "b": ("x", expected_b), }, coords=Coordinates( {"u": ("x", expected_u), "x": ("x", expected_x)}, indexes={"x": expected_index}, ), ) if type == "DataArray": expected = expected["a"] actual = conversion.convert_units(obj, units) assert conversion.extract_units(actual) == conversion.extract_units(expected) assert_identical(actual, expected) @pytest.mark.parametrize( "units", ( pytest.param({"a": None, "b": None, "u": None, "x": None}, id="none"), pytest.param( {"a": Unit("kg"), "b": Unit("hPa"), "u": None, "x": None}, id="data" ), pytest.param({"a": None, "b": None, "u": Unit("s"), "x": None}, id="coord"), pytest.param({"a": None, "b": None, "u": None, "x": Unit("m")}, id="dims"), ), ) @pytest.mark.parametrize("type", ("DataArray", "Dataset")) def test_extract_units(self, type, units): a = np.linspace(-1, 1, 2) b = np.linspace(0, 1, 2) u = np.linspace(0, 100, 2) x = np.arange(2) index = PandasIndex(x, "x") if units.get("x") is not None: index = PintIndex(index=index, units={"x": units.get("x")}) obj = Dataset( { "a": ("x", to_quantity(a, units.get("a"))), "b": ("x", to_quantity(b, units.get("b"))), }, coords=Coordinates( { "u": ("x", to_quantity(u, units.get("u"))), "x": ("x", to_quantity(x, units.get("x"))), }, indexes={"x": index}, ), ) if type == "DataArray": obj = obj["a"] units = units.copy() del units["b"] assert conversion.extract_units(obj) == units @pytest.mark.parametrize( ["obj", "expected"], ( pytest.param( DataArray( coords={ "x": ("x", [], {"units": "m"}), "u": ("x", [], {"units": "s"}), }, attrs={"units": "hPa"}, dims="x", ), {"x": "m", "u": "s", None: "hPa"}, id="DataArray", ), pytest.param( Dataset( data_vars={ "a": ("x", [], {"units": "K"}), "b": ("x", [], {"units": "hPa"}), }, coords={ "x": ("x", [], {"units": "m"}), "u": ("x", [], {"units": "s"}), }, ), {"a": "K", "b": "hPa", "x": "m", "u": "s"}, id="Dataset", ), pytest.param( Dataset(coords={"t": ("t", [], {"units": "seconds since 2000-01-01"})}), {}, id="datetime_unit", ), ), ) def test_extract_unit_attributes(self, obj, expected): actual = conversion.extract_unit_attributes(obj) assert expected == actual @pytest.mark.parametrize( ["obj", "expected"], ( pytest.param( DataArray( dims="x", data=Quantity([0, 4, 3], "kg"), coords=Coordinates( { "u": ("x", Quantity([2, 3, 4], "s")), "x": Quantity([0, 1, 2], "m"), }, indexes={}, ), ), {None: None, "u": None, "x": None}, id="DataArray", ), pytest.param( Dataset( data_vars={ "a": ("x", Quantity([3, 2, 5], "Pa")), "b": ("x", Quantity([0, 2, -1], "kg")), }, coords=Coordinates( { "u": ("x", Quantity([2, 3, 4], "s")), "x": Quantity([0, 1, 2], "m"), }, indexes={}, ), ), {"a": None, "b": None, "u": None, "x": None}, id="Dataset", ), ), ) def test_strip_units(self, obj, expected): actual = conversion.strip_units(obj) assert conversion.extract_units(actual) == expected @pytest.mark.parametrize( ["obj", "expected"], ( pytest.param( DataArray( coords={ "x": ("x", [], {"units": "m"}), "u": ("x", [], {"units": "s"}), }, attrs={"units": "hPa"}, dims="x", ), {"x": "m", "u": "s", None: "hPa"}, id="DataArray", ), pytest.param( Dataset( data_vars={ "a": ("x", [], {"units": "K"}), "b": ("x", [], {"units": "hPa"}), }, coords={ "x": ("x", [], {"units": "m"}), "u": ("x", [], {"units": "s"}), }, ), {"a": "K", "b": "hPa", "x": "m", "u": "s"}, id="Dataset", ), pytest.param( Dataset(coords={"t": ("t", [], {"units": "seconds since 2000-01-01"})}), {}, id="datetime_unit", ), ), ) def test_strip_unit_attributes(self, obj, expected): actual = conversion.strip_unit_attributes(obj) expected = {} assert ( filter_none_values(conversion.extract_unit_attributes(actual)) == expected ) class TestIndexerFunctions: @pytest.mark.parametrize( ["indexers", "units", "expected", "error", "suberrors"], ( pytest.param( {"x": 1}, {"x": None}, {"x": 1}, None, None, id="scalar-no units" ), pytest.param( {"x": 1}, {"x": "dimensionless"}, None, PintExceptionGroup, {"x": (ValueError, "'x'")}, id="scalar-dimensionless", ), pytest.param( {"x": Quantity(1, "m")}, {"x": Unit("dm")}, {"x": Quantity(10, "dm")}, None, None, id="scalar-units", ), pytest.param( {"x": np.array([1, 2])}, {"x": None}, {"x": np.array([1, 2])}, None, None, id="array-no units", ), pytest.param( {"x": Quantity([1, 2], "m")}, {"x": Unit("dm")}, {"x": Quantity([10, 20], "dm")}, None, None, id="array-units", ), pytest.param( {"x": Variable("x", [1, 2])}, {"x": None}, {"x": Variable("x", [1, 2])}, None, None, id="Variable-no units", ), pytest.param( {"x": Variable("x", Quantity([1, 2], "m"))}, {"x": Unit("dm")}, {"x": Variable("x", Quantity([10, 20], "dm"))}, None, None, id="Variable-units", ), pytest.param( {"x": DataArray([1, 2], dims="x")}, {"x": None}, {"x": DataArray([1, 2], dims="x")}, None, None, id="DataArray-no units", ), pytest.param( {"x": DataArray(Quantity([1, 2], "m"), dims="x")}, {"x": Unit("dm")}, {"x": DataArray(Quantity([10, 20], "dm"), dims="x")}, None, None, id="DataArray-units", ), pytest.param( {"x": slice(None)}, {"x": None}, {"x": slice(None)}, None, None, id="empty slice-no units", ), pytest.param( {"x": slice(1, None)}, {"x": None}, {"x": slice(1, None)}, None, None, id="slice-no units", ), pytest.param( {"x": slice(Quantity(1, "m"), Quantity(2, "m"))}, {"x": Unit("m")}, {"x": slice(Quantity(1, "m"), Quantity(2, "m"))}, None, None, id="slice-identical units", ), pytest.param( {"x": slice(Quantity(1, "m"), Quantity(2000, "mm"))}, {"x": Unit("dm")}, {"x": slice(Quantity(10, "dm"), Quantity(20, "dm"))}, None, None, id="slice-compatible units", ), pytest.param( {"x": slice(Quantity(1, "m"), Quantity(2, "m"))}, {"x": Unit("ms")}, None, PintExceptionGroup, {"x": (pint.DimensionalityError, "'x'")}, id="slice-incompatible units", ), pytest.param( {"x": slice(1000, Quantity(2000, "ms"))}, {"x": Unit("s")}, None, PintExceptionGroup, {"x": (pint.DimensionalityError, "'x'")}, id="slice-incompatible units-mixed", ), ), ) def test_convert_indexer_units(self, indexers, units, expected, error, suberrors): if error is not None: matchers = [ pytest.RaisesExc(err, match=match) for err, match in suberrors.values() ] with pytest.RaisesGroup( *matchers, match="Cannot convert indexers", check=lambda eg: isinstance(eg, PintExceptionGroup), ): conversion.convert_indexer_units(indexers, units) else: actual = conversion.convert_indexer_units(indexers, units) assert_indexers_equal(actual, expected) assert_indexer_units_equal(actual, expected) @pytest.mark.parametrize( ["indexers", "expected"], ( pytest.param({"x": 1}, {"x": None}, id="scalar-no units"), pytest.param({"x": Quantity(1, "m")}, {"x": Unit("m")}, id="scalar-units"), pytest.param({"x": np.array([1, 2])}, {"x": None}, id="array-no units"), pytest.param( {"x": Quantity([1, 2], "s")}, {"x": Unit("s")}, id="array-units" ), pytest.param( {"x": Variable("x", [1, 2])}, {"x": None}, id="Variable-no units" ), pytest.param( {"x": Variable("x", Quantity([1, 2], "m"))}, {"x": Unit("m")}, id="Variable-units", ), pytest.param( {"x": DataArray([1, 2], dims="x")}, {"x": None}, id="DataArray-no units" ), pytest.param( {"x": DataArray(Quantity([1, 2], "s"), dims="x")}, {"x": Unit("s")}, id="DataArray-units", ), pytest.param({"x": slice(None)}, {"x": None}, id="empty slice-no units"), pytest.param({"x": slice(1, None)}, {"x": None}, id="slice-no units"), pytest.param( {"x": slice(Quantity(1, "m"), Quantity(2, "m"))}, {"x": Unit("m")}, id="slice-identical units", ), pytest.param( {"x": slice(Quantity(1, "m"), Quantity(2000, "mm"))}, {"x": Unit("m")}, id="slice-compatible units", ), pytest.param( {"x": slice(Quantity(1, "m"), Quantity(2, "ms"))}, ValueError, id="slice-incompatible units", ), pytest.param( {"x": slice(1, Quantity(2, "ms"))}, ValueError, id="slice-incompatible units-mixed", ), pytest.param( {"x": slice(1, Quantity(2, "rad"))}, {"x": Unit("rad")}, id="slice-incompatible units-mixed-dimensionless", ), ), ) def test_extract_indexer_units(self, indexers, expected): if isinstance(expected, type) and issubclass(expected, Exception): with pytest.raises(expected): conversion.extract_indexer_units(indexers) else: actual = conversion.extract_indexer_units(indexers) assert actual == expected @pytest.mark.parametrize( ["indexers", "expected"], ( pytest.param({"x": 1}, {"x": 1}, id="scalar-no units"), pytest.param({"x": Quantity(1, "m")}, {"x": 1}, id="scalar-units"), pytest.param( {"x": np.array([1, 2])}, {"x": np.array([1, 2])}, id="array-no units", ), pytest.param( {"x": Quantity([1, 2], "s")}, {"x": np.array([1, 2])}, id="array-units" ), pytest.param( {"x": Variable("x", [1, 2])}, {"x": Variable("x", [1, 2])}, id="Variable-no units", ), pytest.param( {"x": Variable("x", Quantity([1, 2], "m"))}, {"x": Variable("x", [1, 2])}, id="Variable-units", ), pytest.param( {"x": DataArray([1, 2], dims="x")}, {"x": DataArray([1, 2], dims="x")}, id="DataArray-no units", ), pytest.param( {"x": DataArray(Quantity([1, 2], "s"), dims="x")}, {"x": DataArray([1, 2], dims="x")}, id="DataArray-units", ), pytest.param( {"x": slice(None)}, {"x": slice(None)}, id="empty slice-no units" ), pytest.param( {"x": slice(1, None)}, {"x": slice(1, None)}, id="slice-no units" ), pytest.param( {"x": slice(Quantity(1, "m"), Quantity(2, "m"))}, {"x": slice(1, 2)}, id="slice-units", ), ), ) def test_strip_indexer_units(self, indexers, expected): actual = conversion.strip_indexer_units(indexers) assert_indexers_equal(actual, expected) pint-xarray-0.6.0/pint_xarray/tests/test_expects.py000066400000000000000000000221611505507415300225700ustar00rootroot00000000000000import re import pint import pytest import xarray as xr import pint_xarray from pint_xarray.testing import assert_units_equal ureg = pint_xarray.unit_registry class TestExpects: @pytest.mark.parametrize( ["values", "units", "expected"], ( ((ureg.Quantity(1, "m"), 2), ("mm", None, None), 500), ((ureg.Quantity(1, "m"), ureg.Quantity(0.5, "s")), ("mm", "ms", None), 2), ( (xr.DataArray(4).pint.quantify("km"), 2), ("m", None, None), xr.DataArray(2000), ), ( ( xr.DataArray([4, 2, 0]).pint.quantify("cm"), xr.DataArray([4, 2, 1]).pint.quantify("mg"), ), ("m", "g", None), xr.DataArray([10, 10, 0]), ), ( (ureg.Quantity(16, "m"), 2, ureg.Quantity(4, "s")), ("mm", None, "ms"), 2, ), ), ) def test_args(self, values, units, expected): @pint_xarray.expects(*units) def func(a, b, c=1): return a / (b * c) actual = func(*values) if isinstance(actual, xr.DataArray): xr.testing.assert_identical(actual, expected) elif isinstance(actual, pint.Quantity): pint.testing.assert_equal(actual, expected) else: assert actual == expected @pytest.mark.parametrize( ["value", "units", "error", "message", "multiple"], ( ( ureg.Quantity(1, "m"), (None, None), TypeError, "Passed in a quantity where none was expected", True, ), (1, ("m", None), TypeError, "Attempting to convert non-quantity", True), ( 1, (None,), ValueError, "Missing units for the following parameters: 'b'", False, ), ( ureg.Quantity(1, "m"), ("nonsense_unit", None), pint.errors.UndefinedUnitError, "'nonsense_unit' is not defined in the unit registry", True, ), ), ) def test_args_error(self, value, units, error, message, multiple): if multiple: root_error = ExceptionGroup root_message = "Errors while converting parameters" else: root_error = error root_message = message with pytest.raises(root_error, match=root_message) as excinfo: @pint_xarray.expects(*units) def func(a, b=1): return a * b func(value) if not multiple: return group = excinfo.value assert len(group.exceptions) == 1, f"Found {len(group.exceptions)} exceptions" exc = group.exceptions[0] assert isinstance( exc, error ), f"Unexpected exception type: {type(exc)}, expected {error}" if not re.search(message, str(exc)): raise AssertionError(f"exception {exc!r} did not match pattern {message!r}") @pytest.mark.parametrize( ["values", "units", "expected"], ( ( {"a": ureg.Quantity(1, "m"), "b": 2}, {"a": "mm", "b": None, "c": None}, 1000, ), ( {"a": 2, "b": ureg.Quantity(100, "cm")}, {"a": None, "b": "m", "c": None}, 4, ), ( {"a": ureg.Quantity(1, "m"), "b": ureg.Quantity(0.5, "s")}, {"a": "mm", "b": "ms", "c": None}, 4, ), ( {"a": xr.DataArray(4).pint.quantify("km"), "b": 2}, {"a": "m", "b": None, "c": None}, xr.DataArray(4000), ), ( { "a": xr.DataArray([4, 2, 0]).pint.quantify("cm"), "b": xr.DataArray([4, 2, 1]).pint.quantify("mg"), }, {"a": "m", "b": "g", "c": None}, xr.DataArray([20, 20, 0]), ), ), ) def test_kwargs(self, values, units, expected): @pint_xarray.expects(**units) def func(a, b, c=2): return a / b * c actual = func(**values) if isinstance(actual, xr.DataArray): xr.testing.assert_identical(actual, expected) elif isinstance(actual, pint.Quantity): pint.testing.assert_equal(actual, expected) else: assert actual == expected @pytest.mark.parametrize( ["values", "return_value_units", "expected"], ( ((1, 2), ("m", "s"), (ureg.Quantity(1, "m"), ureg.Quantity(2, "s"))), ((1, 2), "m / s", ureg.Quantity(0.5, "m / s")), ((1, 2), None, 0.5), ( (xr.DataArray(2), 2), ("m", "s"), (xr.DataArray(2).pint.quantify("m"), ureg.Quantity(2, "s")), ), ( (xr.DataArray(2), 2), "kg / m^2", xr.DataArray(1).pint.quantify("kg / m^2"), ), ), ) def test_return_value(self, values, return_value_units, expected): multiple = isinstance(return_value_units, tuple) @pint_xarray.expects(a=None, b=None, return_value=return_value_units) def func(a, b): if multiple: return a, b else: return a / b actual = func(*values) if isinstance(actual, xr.DataArray): xr.testing.assert_identical(actual, expected) elif isinstance(actual, pint.Quantity): pint.testing.assert_equal(actual, expected) else: assert actual == expected def test_return_value_none(self): @pint_xarray.expects(None) def func(a): return None actual = func(1) assert actual is None def test_return_value_none_error(self): @pint_xarray.expects(return_value="Hz") def func(): return None with pytest.raises( ValueError, match="mismatched number of return values: expected 1 but got 0.", ): func() @pytest.mark.parametrize( [ "return_value_units", "multiple_units", "error", "multiple_errors", "message", ], ( ( ("m", "s"), False, ValueError, False, "mismatched number of return values", ), ( "m", True, ValueError, False, "mismatched number of return values: expected 1 but got 2", ), ( ("m",), True, ValueError, False, "mismatched number of return values: expected 1 but got 2", ), (1, False, TypeError, True, "units must be of type"), (("m",), False, ValueError, False, ".*expected a 1-sized tuple.*"), ("m", 1, ValueError, False, ".*expected a single return value.*"), ), ) def test_return_value_error( self, return_value_units, multiple_units, error, multiple_errors, message ): if multiple_errors: root_error = ExceptionGroup root_message = "Errors while converting return values" else: root_error = error root_message = message with pytest.raises(root_error, match=root_message) as excinfo: @pint_xarray.expects(a=None, b=None, return_value=return_value_units) def func(a, b): if not isinstance(multiple_units, bool) and multiple_units == 1: print("return 1-tuple") return (a / b,) elif multiple_units: return a, b else: return a / b func(1, 2) if not multiple_errors: return group = excinfo.value assert len(group.exceptions) == 1, f"Found {len(group.exceptions)} exceptions" exc = group.exceptions[0] assert isinstance( exc, error ), f"Unexpected exception type: {type(exc)}, expected {error}" if not re.search(message, str(exc)): raise AssertionError(f"exception {exc!r} did not match pattern {message!r}") def test_datasets(self): @pint_xarray.expects({"m": "kg", "a": "m / s^2"}, return_value={"f": "newtons"}) def second_law(ds): f_da = ds["m"] * ds["a"] return f_da.to_dataset(name="f") ds = xr.Dataset({"m": 0.1, "a": 10}).pint.quantify( {"m": "tons", "a": "feet / second^2"} ) expected = xr.Dataset({"f": ds["m"] * ds["a"]}).pint.to("newtons") actual = second_law(ds) assert_units_equal(actual, expected) xr.testing.assert_allclose(actual, expected) pint-xarray-0.6.0/pint_xarray/tests/test_formatting.py000066400000000000000000000010511505507415300232620ustar00rootroot00000000000000import pint import pytest # only need to register _repr_inline_ import pint_xarray # noqa: F401 unit_registry = pint.UnitRegistry(force_ndarray_like=True) @pytest.mark.parametrize( ("length", "expected"), ( (40, "[N] 7.1 5.4 9.8 21.4 15.3"), (20, "[N] 7.1 5.4 ... 15.3"), (10, "[N] 7.1..."), (7, "[N] ..."), (3, "[N] ..."), ), ) def test_inline_repr(length, expected): quantity = unit_registry.Quantity([7.1, 5.4, 9.8, 21.4, 15.3], "N") assert quantity._repr_inline_(length) == expected pint-xarray-0.6.0/pint_xarray/tests/test_index.py000066400000000000000000000215651505507415300222330ustar00rootroot00000000000000import numpy as np import pandas as pd import pytest import xarray as xr from xarray.core.indexes import IndexSelResult, PandasIndex from pint_xarray import unit_registry as ureg from pint_xarray.index import PintIndex def indexer_equal(first, second): if type(first) is not type(second): return False if isinstance(first, np.ndarray): return np.all(first == second) else: return first == second @pytest.mark.parametrize( "base_index", [ PandasIndex(pd.Index([1, 2, 3]), dim="x"), PandasIndex(pd.Index([0.1, 0.2, 0.3]), dim="x"), PandasIndex(pd.Index([1j, 2j, 3j]), dim="y"), ], ) @pytest.mark.parametrize("units", [ureg.Unit("m"), ureg.Unit("s")]) def test_init(base_index, units): index = PintIndex(index=base_index, units={base_index.dim: units}) assert index.index.equals(base_index) assert index.units == {base_index.dim: units} def test_init_error(): base_index = PandasIndex(pd.Index([1, 2, 3]), dim="x") with pytest.raises(TypeError, match="dict of coordinate names to units"): PintIndex(index=base_index, units=ureg.Unit("s")) def test_replace(): old_index = PandasIndex([1, 2, 3], dim="x") new_index = PandasIndex([0.1, 0.2, 0.3], dim="x") old = PintIndex(index=old_index, units={"x": ureg.Unit("m")}) new = old._replace(new_index) assert new.index.equals(new_index) assert new.units == old.units # no mutation assert old.index.equals(old_index) @pytest.mark.parametrize( ["wrapped_index", "units", "expected"], ( pytest.param( PandasIndex(pd.Index([1, 2, 3]), dim="x"), {"x": ureg.Unit("m")}, {"x": xr.Variable("x", ureg.Quantity([1, 2, 3], "m"))}, ), pytest.param( PandasIndex(pd.Index([1j, 2j, 3j]), dim="y"), {"y": ureg.Unit("ms")}, {"y": xr.Variable("y", ureg.Quantity([1j, 2j, 3j], "ms"))}, ), ), ) def test_create_variables(wrapped_index, units, expected): index = PintIndex(index=wrapped_index, units=units) actual = index.create_variables() assert list(actual.keys()) == list(expected.keys()) assert all([actual[k].equals(expected[k]) for k in expected.keys()]) @pytest.mark.parametrize( ["labels", "expected"], ( ({"x": ureg.Quantity(1, "m")}, IndexSelResult(dim_indexers={"x": 0})), ({"x": ureg.Quantity(3000, "mm")}, IndexSelResult(dim_indexers={"x": 2})), ({"x": ureg.Quantity(0.002, "km")}, IndexSelResult(dim_indexers={"x": 1})), ( {"x": ureg.Quantity([0.002, 0.004], "km")}, IndexSelResult(dim_indexers={"x": np.array([1, 3])}), ), ( {"x": slice(ureg.Quantity(2, "m"), ureg.Quantity(3000, "mm"))}, IndexSelResult(dim_indexers={"x": slice(1, 3)}), ), ), ) def test_sel(labels, expected): index = PintIndex( index=PandasIndex(pd.Index([1, 2, 3, 4]), dim="x"), units={"x": ureg.Unit("m")} ) actual = index.sel(labels) assert isinstance(actual, IndexSelResult) assert list(actual.dim_indexers.keys()) == list(expected.dim_indexers.keys()) assert all( [ indexer_equal(actual.dim_indexers[k], expected.dim_indexers[k]) for k in expected.dim_indexers.keys() ] ) @pytest.mark.parametrize( ["labels", "expected"], ( ( {"x": ureg.Quantity(1.1, "m")}, IndexSelResult(dim_indexers={"x": np.array(0)}), ), ( {"x": ureg.Quantity(3100, "mm")}, IndexSelResult(dim_indexers={"x": np.array(2)}), ), ( {"x": ureg.Quantity(0.0021, "km")}, IndexSelResult(dim_indexers={"x": np.array(1)}), ), ( {"x": ureg.Quantity([0.0021, 0.0041], "km")}, IndexSelResult(dim_indexers={"x": np.array([1, 3])}), ), ), ) def test_sel_nearest(labels, expected): index = PintIndex( index=PandasIndex(pd.Index([1, 2, 3, 4]), dim="x"), units={"x": ureg.Unit("m")} ) actual = index.sel(labels, method="nearest") assert isinstance(actual, IndexSelResult) assert actual.dim_indexers.keys() == expected.dim_indexers.keys() assert all( indexer_equal(actual.dim_indexers[k], expected.dim_indexers[k]) for k in expected.dim_indexers.keys() ) @pytest.mark.parametrize( "indexers", ({"y": 0}, {"y": [1, 2]}, {"y": slice(0, None, 2)}, {"y": xr.Variable("y", [1])}), ) def test_isel(indexers): wrapped_index = PandasIndex(pd.Index([1, 2, 3, 4]), dim="y") index = PintIndex(index=wrapped_index, units={"y": ureg.Unit("s")}) actual = index.isel(indexers) wrapped_ = wrapped_index.isel(indexers) if wrapped_ is not None: expected = PintIndex( index=wrapped_index.isel(indexers), units={"y": ureg.Unit("s")} ) else: expected = None assert (actual is None and expected is None) or actual.equals(expected) @pytest.mark.parametrize( ["other", "expected"], ( ( PintIndex( index=PandasIndex(pd.Index([1, 2, 3, 4]), dim="x"), units={"x": ureg.Unit("cm")}, ), True, ), (PandasIndex(pd.Index([1, 2, 3, 4]), dim="x"), False), ( PintIndex( index=PandasIndex(pd.Index([1, 2, 3, 4]), dim="x"), units={"x": ureg.Unit("m")}, ), False, ), ( PintIndex( index=PandasIndex(pd.Index([1, 2, 3, 4]), dim="y"), units={"y": ureg.Unit("cm")}, ), False, ), ( PintIndex( index=PandasIndex(pd.Index([1, 3, 3, 4]), dim="x"), units={"x": ureg.Unit("cm")}, ), False, ), ), ) def test_equals(other, expected): index = PintIndex( index=PandasIndex(pd.Index([1, 2, 3, 4]), dim="x"), units={"x": ureg.Unit("cm")} ) actual = index.equals(other) assert actual == expected @pytest.mark.filterwarnings("error") def test_align_equals_warning(): index1 = PintIndex( index=PandasIndex(pd.Index([1, 2]), dim="x"), units={"x": ureg.Unit("m")}, ) index2 = PintIndex( index=PandasIndex(pd.Index([0, 1, 2]), dim="y"), units={"y": ureg.Unit("m")}, ) ds = xr.Dataset( {"a": (["y", "x"], [[-1, 1], [0, 2], [1, 3]])}, coords=xr.Coordinates( {"x": [1, 2], "y": [0, 1, 2]}, indexes={"x": index1, "y": index2} ), ) # trigger comparison ds["a"] * ds["x"] * ds["y"] @pytest.mark.parametrize( ["shifts", "expected_index"], ( ({"x": 0}, PandasIndex(pd.Index([-2, -1, 0, 1, 2]), dim="x")), ({"x": 1}, PandasIndex(pd.Index([2, -2, -1, 0, 1]), dim="x")), ({"x": 2}, PandasIndex(pd.Index([1, 2, -2, -1, 0]), dim="x")), ({"x": -1}, PandasIndex(pd.Index([-1, 0, 1, 2, -2]), dim="x")), ({"x": -2}, PandasIndex(pd.Index([0, 1, 2, -2, -1]), dim="x")), ), ) def test_roll(shifts, expected_index): index = PintIndex( index=PandasIndex(pd.Index([-2, -1, 0, 1, 2]), dim="x"), units={"x": ureg.Unit("m")}, ) actual = index.roll(shifts) expected = index._replace(expected_index) assert actual.equals(expected) @pytest.mark.parametrize("dims_dict", ({"y": "x"}, {"y": "z"})) @pytest.mark.parametrize("name_dict", ({"y2": "y3"}, {"y2": "y1"})) def test_rename(name_dict, dims_dict): wrapped_index = PandasIndex(pd.Index([1, 2], name="y2"), dim="y") index = PintIndex(index=wrapped_index, units={"y": ureg.Unit("m")}) actual = index.rename(name_dict, dims_dict) expected = PintIndex( index=wrapped_index.rename(name_dict, dims_dict), units=index.units ) assert actual.equals(expected) @pytest.mark.parametrize("indexer", ([0], slice(0, 2))) def test_getitem(indexer): wrapped_index = PandasIndex(pd.Index([1, 2], name="y2"), dim="y") index = PintIndex(index=wrapped_index, units={"y": ureg.Unit("m")}) actual = index[indexer] expected = PintIndex(index=wrapped_index[indexer], units=index.units) assert actual.equals(expected) @pytest.mark.parametrize("wrapped_index", (PandasIndex(pd.Index([1, 2]), dim="x"),)) def test_repr_inline(wrapped_index): index = PintIndex(index=wrapped_index, units={"x": ureg.Unit("m")}) # TODO: parametrize actual = index._repr_inline_(90) assert "PintIndex" in actual assert wrapped_index.__class__.__name__ in actual assert "units" in actual @pytest.mark.parametrize("wrapped_index", (PandasIndex(pd.Index([1, 2]), dim="x"),)) def test_repr(wrapped_index): index = PintIndex(index=wrapped_index, units={"x": ureg.Unit("m")}) # TODO: parametrize actual = repr(index) assert "=7.5.0 constrains: - openmp_impl 9999 license: BSD-3-Clause license_family: BSD purls: [] size: 23621 timestamp: 1650670423406 - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-2_gnu.conda build_number: 8 sha256: 1a62cd1f215fe0902e7004089693a78347a30ad687781dfda2289cab000e652d md5: 37e16618af5c4851a3f3d66dd0e11141 depends: - libgomp >=7.5.0 - libwinpthread >=12.0.0.r2.ggc561118da constrains: - openmp_impl 9999 - msys2-conda-epoch <0.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 49468 timestamp: 1718213032772 - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 md5: aaa2a381ccc56eac91d63b6c1240312f depends: - cpython - python-gil license: MIT license_family: MIT purls: [] size: 8191 timestamp: 1744137672556 - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda sha256: 6c4456a138919dae9edd3ac1a74b6fbe5fd66c05675f54df2f8ab8c8d0cc6cea md5: 1fd9696649f65fd6611fcdb4ffec738a depends: - python >=3.10 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/alabaster?source=hash-mapping size: 18684 timestamp: 1733750512696 - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda sha256: d1b50686672ebe7041e44811eda563e45b94a8354db67eca659040392ac74d63 md5: cc2613bfa71dec0eb2113ee21ac9ccbf depends: - exceptiongroup >=1.0.2 - idna >=2.8 - python >=3.9 - sniffio >=1.1 - typing_extensions >=4.5 - python constrains: - trio >=0.26.1 - uvloop >=0.21 license: MIT license_family: MIT purls: - pkg:pypi/anyio?source=hash-mapping size: 134857 timestamp: 1754315087747 - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda sha256: 8f032b140ea4159806e4969a68b4a3c0a7cab1ad936eb958a2b5ffe5335e19bf md5: 54898d0f524c9dee622d44bbb081a8ab depends: - python >=3.9 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/appnope?source=hash-mapping size: 10076 timestamp: 1733332433806 - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda sha256: 93b14414b3b3ed91e286e1cbe4e7a60c4e1b1c730b0814d1e452a8ac4b9af593 md5: 8f587de4bcf981e26228f268df374a9b depends: - python >=3.9 constrains: - astroid >=2,<4 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/asttokens?source=hash-mapping size: 28206 timestamp: 1733250564754 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda sha256: 99c53ffbcb5dc58084faf18587b215f9ac8ced36bbfb55fa807c00967e419019 md5: a10d11958cadc13fdb43df75f8b1903f depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/attrs?source=hash-mapping size: 57181 timestamp: 1741918625732 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.0-h0fbd49f_19.conda sha256: 02bb7d2b21f60591944d97c2299be53c9c799085d0a1fb15620d5114cf161c3a md5: 24139f2990e92effbeb374a0eb33fdb1 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-cal >=0.9.2,<0.9.3.0a0 - aws-c-http >=0.10.4,<0.10.5.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 122970 timestamp: 1753305744902 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.9.0-h9eee66f_19.conda sha256: 743df69276ea22058299cc028a6bcb2a4bd172ba08de48c702baf4d49fb61c45 md5: 7b554506535c66852c5090a14801dfb9 depends: - __osx >=11.0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-cal >=0.9.2,<0.9.3.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - aws-c-http >=0.10.4,<0.10.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 106630 timestamp: 1753305735994 - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.9.0-hd9a66b3_19.conda sha256: d38536adcc9b2907381e0f12cf9f92a831d5991819329d9bf93bcc5dd226417d md5: 6bed5e0b1d39b4e99598112aff67b968 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - aws-c-cal >=0.9.2,<0.9.3.0a0 - aws-c-http >=0.10.4,<0.10.5.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - aws-c-io >=0.21.2,<0.21.3.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 115951 timestamp: 1753305747891 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.2-he7b75e1_1.conda sha256: 30ecca069fdae0aa6a8bb64c47eb5a8d9a7bef7316181e8cbb08b7cb47d8b20f md5: c04d1312e7feec369308d656c18e7f3e depends: - __glibc >=2.17,<3.0.a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - libgcc >=14 - openssl >=3.5.1,<4.0a0 license: Apache-2.0 license_family: Apache purls: [] size: 50942 timestamp: 1752240577225 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.2-hd08b81e_1.conda sha256: 0cff81daf70f64bb8bf51f0883727d253c0462085f6bfe3d6c619479fbaec329 md5: f8d75a83ced3f7296fed525502eac257 depends: - __osx >=11.0 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: Apache purls: [] size: 41154 timestamp: 1752240791193 - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.2-hef2a5b8_1.conda sha256: cd396607f5ffdbdae6995ea135904f6efe7eaac19346aec07359684424819a16 md5: 096193e01d32724a835517034a6926a2 depends: - aws-c-common >=0.12.4,<0.12.5.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache purls: [] size: 49125 timestamp: 1752241167516 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.4-hb03c661_0.conda sha256: 6c9e1b9e82750c39ac0251dcfbeebcbb00a1af07c0d7e3fb1153c4920da316eb md5: ae5621814cb99642c9308977fe90ed0d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: Apache-2.0 license_family: Apache purls: [] size: 236420 timestamp: 1752193614294 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.4-h6caf38d_0.conda sha256: d94c508308340b5b8294d2c382737b72b77e9df688610fa034d0a009a9339d73 md5: 7a3edd3d065687fe3aa9a04a515fd2bf depends: - __osx >=11.0 license: Apache-2.0 license_family: Apache purls: [] size: 221313 timestamp: 1752193769784 - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.4-hfd05255_0.conda sha256: c818a09c4d9fe228bb6c94a02c0b05f880ead16ca9f0f59675ae862479ea631a md5: dcac61b0681b4a2c8e74772415f9e490 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache purls: [] size: 235039 timestamp: 1752193765837 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-h92c474e_6.conda sha256: 154d4a699f4d8060b7f2cec497a06e601cbd5c8cde6736ced0fb7e161bc6f1bb md5: 3490e744cb8b9d5a3b9785839d618a17 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 22116 timestamp: 1752240005329 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.1-habbe1e8_6.conda sha256: 633c7ee0e80c24fa6354b2e1c940af6d7f746c9badc3da94681a1a660faeca39 md5: 35c95aad3ab99e0a428c2e02e8b8e282 depends: - __osx >=11.0 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 21037 timestamp: 1752240015504 - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.1-ha8a2810_6.conda sha256: 760d399e54d5f9e86fdc76633e15e00e1b60fc90b15a446b9dce6f79443dcfd7 md5: f00789373bfeb808ca267a34982352de depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 22931 timestamp: 1752240036957 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.5-h149bd38_3.conda sha256: 74b7e5d727505efdb1786d9f4e0250484d23934a1d87f234dacacac97e440136 md5: f9bff8c2a205ee0f28b0c61dad849a98 depends: - libgcc >=14 - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-checksums >=0.2.7,<0.2.8.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 57675 timestamp: 1753199060663 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.5-hd1b68e1_3.conda sha256: d1021dfd8a5726af35b73207d90320dd60e85c257af4b4534fecfb34d31751a4 md5: dc140e52c81171b62d306476b6738220 depends: - __osx >=11.0 - libcxx >=19 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-checksums >=0.2.7,<0.2.8.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 51020 timestamp: 1753199075045 - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.5-hccb7587_3.conda sha256: c03c5c77ab447765ab2cfec6d231bafde6a07fc8de19cbb632ca7f849ec8fe29 md5: cf4d3c01bd6b17c38a4de30ff81d4716 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-checksums >=0.2.7,<0.2.8.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 56295 timestamp: 1753199087984 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.4-h37a7233_0.conda sha256: 6794d020d75cafa15e7677508c4bea5e8bca6233a5c7eb6c34397367ee37024c md5: d828cb0be64d51e27eebe354a2907a98 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-cal >=0.9.2,<0.9.3.0a0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-compression >=0.3.1,<0.3.2.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 224186 timestamp: 1753205774708 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.4-h09a8a51_0.conda sha256: 54233587cfd6559e98b2d82c90c3721c059d1dd22518993967fb794e1b8d2d14 md5: 73e8d2fb68c060de71369ebd5a9b8621 depends: - __osx >=11.0 - aws-c-compression >=0.3.1,<0.3.2.0a0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-cal >=0.9.2,<0.9.3.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 170412 timestamp: 1753205794763 - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.4-h04b3cea_0.conda sha256: 31e65a30b1c99fff0525cc27b5854dc3e3d18a78c13245ea20114f1a503cbd13 md5: ec4a2bd790833c3ca079d0e656e3c261 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-cal >=0.9.2,<0.9.3.0a0 - aws-c-compression >=0.3.1,<0.3.2.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 206269 timestamp: 1753205802777 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.21.2-h6252d9a_1.conda sha256: 01ab3fd74ccd1cd3ebdde72898e0c3b9ab23151b9cd814ac627e3efe88191d8e md5: cf5e9b21384fdb75b15faf397551c247 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - s2n >=1.5.23,<1.5.24.0a0 - aws-c-cal >=0.9.2,<0.9.3.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 180168 timestamp: 1753465862916 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.21.2-hc6344be_1.conda sha256: e872cc4ad2ebb2aee84c1bb8f86e1fb2b5505d8932f560f8dcac6d6436ebca88 md5: 5b427cbf0259d0a50268901824df6331 depends: - __osx >=11.0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-cal >=0.9.2,<0.9.3.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 175631 timestamp: 1753465863221 - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.21.2-h20b9e97_1.conda sha256: 47d3d3cfa9d0628e297a574fb8e124ba32bf2779e8a8b2de26c8c2b30dcad27a md5: 9b9b649cde9d96dd54b3899a130da1e6 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - aws-c-cal >=0.9.2,<0.9.3.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 181441 timestamp: 1753465872617 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.3-h19deb91_3.conda sha256: 4f1b36a50f9d74267cc73740af252f1d6f2da21a6dbef3c0086df1a78c81ed6f md5: 1680d64986f8263978c3624f677656c8 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-http >=0.10.4,<0.10.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 216117 timestamp: 1753306261844 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.13.3-h625c29d_3.conda sha256: 129cfcd2132dcc019f85d6259671ed13c0d5d3dfd287ea684bf625503fb8c3b5 md5: 8937dc148e22c1c15d2f181e6b6eee5e depends: - __osx >=11.0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-http >=0.10.4,<0.10.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 150189 timestamp: 1753306324109 - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.13.3-h6b158f5_3.conda sha256: e860df2e337dc0f1deb39f90420233a14de2f38529b7c0add526227a2eef0620 md5: 16ff5efd5b9219df333171ec891952c1 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-http >=0.10.4,<0.10.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 206091 timestamp: 1753306348261 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.8.6-h800fcd2_2.conda sha256: 886345904f41cdcd8ca4a540161d471d18de60871ffcce42242a4812fc90dcea md5: 50e0900a33add0c715f17648de6be786 depends: - libgcc >=14 - __glibc >=2.17,<3.0.a0 - aws-c-http >=0.10.4,<0.10.5.0a0 - openssl >=3.5.1,<4.0a0 - aws-c-cal >=0.9.2,<0.9.3.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-checksums >=0.2.7,<0.2.8.0a0 - aws-c-auth >=0.9.0,<0.9.1.0a0 - aws-c-io >=0.21.2,<0.21.3.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 137514 timestamp: 1753335820784 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.8.6-h6ded10d_2.conda sha256: cd3e9f1ef88e6f77909ddad68d99a620546a94d26ce36c6802a8c04905221cd0 md5: 19821ae3d32c9d446a899562b35ef89e depends: - __osx >=11.0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-checksums >=0.2.7,<0.2.8.0a0 - aws-c-http >=0.10.4,<0.10.5.0a0 - aws-c-auth >=0.9.0,<0.9.1.0a0 - aws-c-cal >=0.9.2,<0.9.3.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 117740 timestamp: 1753335826708 - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.8.6-h46905be_2.conda sha256: d91eee836c22436bef1b08ae3137181a9fe92c51803e8710e5e0ac039126f69c md5: d15a4df142dbd6e39825cdf32025f7e4 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - aws-c-http >=0.10.4,<0.10.5.0a0 - aws-checksums >=0.2.7,<0.2.8.0a0 - aws-c-cal >=0.9.2,<0.9.3.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-auth >=0.9.0,<0.9.1.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 128957 timestamp: 1753335843139 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h92c474e_1.conda sha256: a9e071a584be0257b2ec6ab6e1f203e9d6b16d2da2233639432727ffbf424f3d md5: 4ab554b102065910f098f88b40163835 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 59146 timestamp: 1752240966518 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-habbe1e8_1.conda sha256: cab7f54744619b88679c577c9ec8d56957bc8f6829e9966a7e50857fbc6c756d md5: 9d77627725afb71b57f38355ee9e2829 depends: - __osx >=11.0 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 53149 timestamp: 1752240972623 - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-ha8a2810_1.conda sha256: b8c7637ad8069ace0f79cc510275b01787c9d478888d4e548980ef2ca61f19c5 md5: afbb1a7d671fc81c97daeac8ff6c54e0 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 56289 timestamp: 1752240989872 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-h92c474e_2.conda sha256: 7168007329dfb1c063cd5466b33a1f2b8a28a00f587a0974d97219432361b4db md5: 248831703050fe9a5b2680a7589fdba9 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 76748 timestamp: 1752241068761 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.7-habbe1e8_2.conda sha256: 648c3d23df53b4cea1d551e4e54a544284be5436af5453296ed8184d970efc3a md5: f3f6fef7c8d8ce7f80df37e4aaaf6b93 depends: - __osx >=11.0 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 74030 timestamp: 1752241089866 - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.7-ha8a2810_2.conda sha256: 2c2f5b176fb8c0f15c6bc5edea0b2dd3d56b58e8b1124eb0f592665cec5dfc35 md5: d6342b48cb2f43df847ee39e0858813a depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 92982 timestamp: 1752241099189 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.33.1-hb4fd278_2.conda sha256: 530384aec79a46adbe59e9c20f0c8ec14227aaf4ea2d2b53a30bca8dcbe35309 md5: 81c545e27e527ca1be0cc04b74c20386 depends: - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - libgcc >=14 - aws-c-cal >=0.9.2,<0.9.3.0a0 - aws-c-http >=0.10.4,<0.10.5.0a0 - aws-c-s3 >=0.8.6,<0.8.7.0a0 - aws-c-event-stream >=0.5.5,<0.5.6.0a0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-mqtt >=0.13.3,<0.13.4.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - aws-c-auth >=0.9.0,<0.9.1.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 406263 timestamp: 1753342146233 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.33.1-h54a40e1_2.conda sha256: d7775289c810ecbc08af600cde88980c2f13824d1a721241b83ee9c8e1e044e0 md5: b7e3cbbb712ee459d98dfbc9e4c06941 depends: - __osx >=11.0 - libcxx >=19 - aws-c-event-stream >=0.5.5,<0.5.6.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - aws-c-cal >=0.9.2,<0.9.3.0a0 - aws-c-auth >=0.9.0,<0.9.1.0a0 - aws-c-mqtt >=0.13.3,<0.13.4.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-s3 >=0.8.6,<0.8.7.0a0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-http >=0.10.4,<0.10.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 264367 timestamp: 1753342194778 - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.33.1-h89ba1a2_2.conda sha256: aedc57a2378dabab4c03d2eb08637b3bf7b79d4ee1f6b0ec50e609c09d066193 md5: 128131da6b7bb941fb7ca887bd173238 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - aws-c-mqtt >=0.13.3,<0.13.4.0a0 - aws-c-cal >=0.9.2,<0.9.3.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-s3 >=0.8.6,<0.8.7.0a0 - aws-c-http >=0.10.4,<0.10.5.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - aws-c-io >=0.21.2,<0.21.3.0a0 - aws-c-event-stream >=0.5.5,<0.5.6.0a0 - aws-c-auth >=0.9.0,<0.9.1.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 298036 timestamp: 1753342177582 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.606-h31ade35_1.conda sha256: f2a6c653c4803e0edb11054d21395d53624ef9ad330d09c692a4dae638c399a4 md5: e33b3d2a2d44ba0fb35373d2343b71dd depends: - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - libcurl >=8.14.1,<9.0a0 - libzlib >=1.3.1,<2.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-c-event-stream >=0.5.5,<0.5.6.0a0 - aws-crt-cpp >=0.33.1,<0.33.2.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 3367142 timestamp: 1752920616764 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.606-ha924a42_1.conda sha256: cce2eeb369bae036eb99ba4eb66f82187d73434d9710c98915af74a2846b2c1c md5: 6788043d79ceef0cc3116ac2c28bda2e depends: - libcxx >=19 - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 - libcurl >=8.14.1,<9.0a0 - aws-c-event-stream >=0.5.5,<0.5.6.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 - aws-crt-cpp >=0.33.1,<0.33.2.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 3011508 timestamp: 1752898681577 - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.606-h14334ec_1.conda sha256: 7be170087968a3ae5dbb0b7e10a0841a8345bfd87d0faac055610c56e9af7383 md5: 6566c917f808b15f59141b3b6c6ff054 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - aws-c-event-stream >=0.5.5,<0.5.6.0a0 - aws-crt-cpp >=0.33.1,<0.33.2.0a0 - libzlib >=1.3.1,<2.0a0 - aws-c-common >=0.12.4,<0.12.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 3314035 timestamp: 1752898687572 - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.0-h3a458e0_0.conda sha256: bd28c90012b063a1733d85a19f83e046f9839ea000e77ecbcac8a87b47d4fb53 md5: c09adf9bb0f9310cf2d7af23a4fbf1ff depends: - __glibc >=2.17,<3.0.a0 - libcurl >=8.14.1,<9.0a0 - libgcc >=14 - libstdcxx >=14 - openssl >=3.5.1,<4.0a0 license: MIT license_family: MIT purls: [] size: 348296 timestamp: 1752514821753 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.0-ha1c5762_0.conda sha256: 026c0df08f3526bb0ae52077cc2a0e6c73203e4967a10dcfdeaa149c630a7ae7 md5: 1eb62b0153d7996610beec69708a174b depends: - __osx >=11.0 - libcurl >=8.14.1,<9.0a0 - libcxx >=19 - openssl >=3.5.1,<4.0a0 license: MIT license_family: MIT purls: [] size: 290818 timestamp: 1752514986414 - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.12.0-ha729027_0.conda sha256: 734857814400585dca2bee2a4c2e841bc89c143bf0dcc11b4c7270cea410650c md5: 3dab8d6fa3d10fe4104f1fbe59c10176 depends: - __glibc >=2.17,<3.0.a0 - azure-core-cpp >=1.16.0,<1.16.1.0a0 - libgcc >=14 - libstdcxx >=14 - openssl >=3.5.1,<4.0a0 license: MIT license_family: MIT purls: [] size: 241853 timestamp: 1753212593417 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.12.0-hd83eed2_0.conda sha256: b1cc54a52c735f6f791671763580501bb7ad016e4bcca005f8acea2f619b8709 md5: 78ac8ce287aef15f819c2927e0fc29c6 depends: - __osx >=11.0 - azure-core-cpp >=1.16.0,<1.16.1.0a0 - libcxx >=19 - openssl >=3.5.1,<4.0a0 license: MIT license_family: MIT purls: [] size: 162705 timestamp: 1753212949473 - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.14.0-hb1c9500_1.conda sha256: 83cea4a570a457cc18571c92d7927e6cc4ea166f0f819f0b510d4e2c8daf112d md5: 30da390c211967189c58f83ab58a6f0c depends: - __glibc >=2.17,<3.0.a0 - azure-core-cpp >=1.16.0,<1.16.1.0a0 - azure-storage-common-cpp >=12.10.0,<12.10.1.0a0 - libgcc >=14 - libstdcxx >=14 license: MIT license_family: MIT purls: [] size: 577592 timestamp: 1753219590665 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.14.0-he094cc7_1.conda sha256: df570ea362bb446bd4cf1353405daad1898887a7ab0d35af3250bed332a9895a md5: 496217fd6aaa6d43646252a586c1445c depends: - __osx >=11.0 - azure-core-cpp >=1.16.0,<1.16.1.0a0 - azure-storage-common-cpp >=12.10.0,<12.10.1.0a0 - libcxx >=19 license: MIT license_family: MIT purls: [] size: 425677 timestamp: 1753219837256 - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.10.0-hebae86a_2.conda sha256: 071536dc90aa0ea22a5206fbac5946c70beec34315ab327c4379983e7da60196 md5: 0d93ce986d13e46a8fc91c289597d78f depends: - __glibc >=2.17,<3.0.a0 - azure-core-cpp >=1.16.0,<1.16.1.0a0 - libgcc >=14 - libstdcxx >=14 - libxml2 >=2.13.8,<2.14.0a0 - openssl >=3.5.1,<4.0a0 license: MIT license_family: MIT purls: [] size: 148875 timestamp: 1753211824276 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.10.0-h12fd690_2.conda sha256: 9b0fa0c2acbd69de6fce19c180439af8ed748a3facdc5e5eaa9b543371078497 md5: 9be5f38d5306ac1069fcf3818549d56c depends: - __osx >=11.0 - azure-core-cpp >=1.16.0,<1.16.1.0a0 - libcxx >=19 - libxml2 >=2.13.8,<2.14.0a0 - openssl >=3.5.1,<4.0a0 license: MIT license_family: MIT purls: [] size: 120171 timestamp: 1753211997430 - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-h8b27e44_3.conda sha256: aec2e2362a605e37a38c4b34f191e98dd33fdc64ce4feebd60bd0b4d877ab36b md5: 7b738aea4f1b8ae2d1118156ad3ae993 depends: - __glibc >=2.17,<3.0.a0 - azure-core-cpp >=1.16.0,<1.16.1.0a0 - azure-storage-blobs-cpp >=12.14.0,<12.14.1.0a0 - azure-storage-common-cpp >=12.10.0,<12.10.1.0a0 - libgcc >=14 - libstdcxx >=14 license: MIT license_family: MIT purls: [] size: 299871 timestamp: 1753226720130 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-h30213e0_3.conda sha256: efa7abc4fded5b028f3f0e80dd271286255c3e746bf201f270556bbf13b01258 md5: ee25593a451954f56a58eda1ad4bda07 depends: - __osx >=11.0 - azure-core-cpp >=1.16.0,<1.16.1.0a0 - azure-storage-blobs-cpp >=12.14.0,<12.14.1.0a0 - azure-storage-common-cpp >=12.10.0,<12.10.1.0a0 - libcxx >=19 license: MIT license_family: MIT purls: [] size: 197289 timestamp: 1753227070997 - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda sha256: 1c656a35800b7f57f7371605bc6507c8d3ad60fbaaec65876fce7f73df1fc8ac md5: 0a01c169f0ab0f91b26e77a3301fbfe4 depends: - python >=3.9 - pytz >=2015.7 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/babel?source=hash-mapping size: 6938256 timestamp: 1738490268466 - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda sha256: d2124c0ea13527c7f54582269b3ae19541141a3740d6d779e7aa95aa82eaf561 md5: de0fd9702fd4c1186e930b8c35af6b6b depends: - python >=3.10 - soupsieve >=1.2 - typing-extensions license: MIT license_family: MIT purls: - pkg:pypi/beautifulsoup4?source=compressed-mapping size: 88278 timestamp: 1756094375546 - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda sha256: a05971bb80cca50ce9977aad3f7fc053e54ea7d5321523efc7b9a6e12901d3cd md5: f0b4c8e370446ef89797608d60a564b3 depends: - python >=3.9 - webencodings - python constrains: - tinycss >=1.1.0,<1.5 license: Apache-2.0 AND MIT purls: - pkg:pypi/bleach?source=hash-mapping size: 141405 timestamp: 1737382993425 - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda sha256: 0aba699344275b3972bd751f9403316edea2ceb942db12f9f493b63c74774a46 md5: a30e9406c873940383555af4c873220d depends: - bleach ==6.2.0 pyh29332c3_4 - tinycss2 license: Apache-2.0 AND MIT purls: [] size: 4213 timestamp: 1737382993425 - conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda sha256: e7af5d1183b06a206192ff440e08db1c4e8b2ca1f8376ee45fb2f3a85d4ee45d md5: 2c2fae981fd2afd00812c92ac47d023d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - snappy >=1.2.1,<1.3.0a0 - zstd >=1.5.6,<1.6.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 48427 timestamp: 1733513201413 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.6-h7dd00d9_1.conda sha256: c3fe902114b9a3ac837e1a32408cc2142c147ec054c1038d37aec6814343f48a md5: 925acfb50a750aa178f7a0aced77f351 depends: - __osx >=11.0 - libcxx >=18 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - snappy >=1.2.1,<1.3.0a0 - zstd >=1.5.6,<1.6.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 33602 timestamp: 1733513285902 - conda: https://conda.anaconda.org/conda-forge/win-64/blosc-1.21.6-hfd34d9b_1.conda sha256: 9303a7a0e03cf118eab3691013f6d6cbd1cbac66efbc70d89b20f5d0145257c0 md5: 357d7be4146d5fec543bfaa96a8a40de depends: - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - snappy >=1.2.1,<1.3.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - zstd >=1.5.6,<1.6.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 49840 timestamp: 1733513605730 - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.8.0-pyhd8ed1ab_0.conda sha256: 3a0af5b0c30d1e50cda6fea8c7783f3ea925e83f427b059fa81b2f36cde72e28 md5: 30698cfea774ec175babb8ff08dbc07a depends: - contourpy >=1.2 - jinja2 >=2.9 - narwhals >=1.13 - numpy >=1.16 - packaging >=16.8 - pandas >=1.2 - pillow >=7.1.0 - python >=3.10 - pyyaml >=3.10 - tornado >=6.2 - xyzservices >=2021.09.1 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/bokeh?source=hash-mapping size: 5020661 timestamp: 1756543232734 - conda: https://conda.anaconda.org/conda-forge/linux-64/bottleneck-1.5.0-py311h9f3472d_0.conda sha256: 7347dd1a05a32d170d118c8ce3e83c5c3ae25c127c185dfe5f7197649e143cce md5: da427253d97fedfd285d06bc065f1400 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - numpy >=1.21,<3 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/bottleneck?source=hash-mapping size: 146114 timestamp: 1747241540048 - conda: https://conda.anaconda.org/conda-forge/linux-64/bottleneck-1.5.0-py312hc0a28a1_0.conda sha256: d9a84dff9cc1c86931af44f8b2b0755fe2fe9f69b77959edc81f15b444a519c2 md5: 5e23f83f7c767d9efda9358b877e39e3 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - numpy >=1.21,<3 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/bottleneck?source=hash-mapping size: 143315 timestamp: 1747241575976 - conda: https://conda.anaconda.org/conda-forge/linux-64/bottleneck-1.5.0-py313ha014f3b_0.conda sha256: 9dddd51a6bf587e13f7bc42749447bd31a60e2f2404489d7a238f52580b73ac2 md5: 01e16a997460be5678aac9e5b4c5262c depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - numpy >=1.21,<3 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/bottleneck?source=hash-mapping size: 143133 timestamp: 1747241614243 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bottleneck-1.5.0-py311h18599de_0.conda sha256: d1dbdad098ad9db404cee27aea2b41d9cac415ed8ca6149d42d5c245077c7d36 md5: 9eda32bf99a5069650de46c8cbf674f5 depends: - __osx >=11.0 - numpy >=1.21,<3 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/bottleneck?source=hash-mapping size: 127052 timestamp: 1747241817408 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bottleneck-1.5.0-py312he0011b7_0.conda sha256: a1cf2320668772bd75549c0a6026dc240b01a699485d1baa68de5dc819903986 md5: e0a2f1a440d92ad19f802999c64cfe76 depends: - __osx >=11.0 - numpy >=1.21,<3 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/bottleneck?source=hash-mapping size: 123986 timestamp: 1747241785786 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bottleneck-1.5.0-py313h46657e6_0.conda sha256: ee7c56da7c6ae2d65028e7e193afdc99b78e86f339dde17d7420335d84a9b992 md5: efe0ddc14f8ba4a14c0a598873db00e7 depends: - __osx >=11.0 - numpy >=1.21,<3 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/bottleneck?source=hash-mapping size: 124543 timestamp: 1747241733380 - conda: https://conda.anaconda.org/conda-forge/win-64/bottleneck-1.5.0-py311h0a17f05_0.conda sha256: 393343582d03dab9f8fc4e19fd6ad9c35a56e3f31425fe94e65c20a29b3aff99 md5: 46b9b29f236a767600d0f531556b4d76 depends: - numpy >=1.21,<3 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/bottleneck?source=hash-mapping size: 132452 timestamp: 1747241858398 - conda: https://conda.anaconda.org/conda-forge/win-64/bottleneck-1.5.0-py312h1a27103_0.conda sha256: 676d08671e37ab164c0fe40d3c7fce4796681e6d0a875f7a55d48a2f813910d6 md5: 2f7d83507417e7e720461f924522f8f2 depends: - numpy >=1.21,<3 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/bottleneck?source=hash-mapping size: 129934 timestamp: 1747242114884 - conda: https://conda.anaconda.org/conda-forge/win-64/bottleneck-1.5.0-py313h8e081ca_0.conda sha256: 77c15abb765fd8ae95141c9e0951e8a5aaa12c0429ce98fa988f618cc4f6a3ee md5: 538c73512a191f9bdd17331d31f34ed4 depends: - numpy >=1.21,<3 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/bottleneck?source=hash-mapping size: 130085 timestamp: 1747242544099 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb03c661_4.conda sha256: 294526a54fa13635341729f250d0b1cf8f82cad1e6b83130304cbf3b6d8b74cc md5: eaf3fbd2aa97c212336de38a51fe404e depends: - __glibc >=2.17,<3.0.a0 - brotli-bin 1.1.0 hb03c661_4 - libbrotlidec 1.1.0 hb03c661_4 - libbrotlienc 1.1.0 hb03c661_4 - libgcc >=14 license: MIT purls: [] size: 19883 timestamp: 1756599394934 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-h6caf38d_4.conda sha256: 8aa8ee52b95fdc3ef09d476cbfa30df722809b16e6dca4a4f80e581012035b7b md5: ce8659623cea44cc812bc0bfae4041c5 depends: - __osx >=11.0 - brotli-bin 1.1.0 h6caf38d_4 - libbrotlidec 1.1.0 h6caf38d_4 - libbrotlienc 1.1.0 h6caf38d_4 license: MIT purls: [] size: 20003 timestamp: 1756599758165 - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-hfd05255_4.conda sha256: df2a43cc4a99bd184cb249e62106dfa9f55b3d06df9b5fc67072b0336852ff65 md5: 441706c019985cf109ced06458e6f742 depends: - brotli-bin 1.1.0 hfd05255_4 - libbrotlidec 1.1.0 hfd05255_4 - libbrotlienc 1.1.0 hfd05255_4 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT purls: [] size: 20233 timestamp: 1756599828380 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda sha256: 444903c6e5c553175721a16b7c7de590ef754a15c28c99afbc8a963b35269517 md5: ca4ed8015764937c81b830f7f5b68543 depends: - __glibc >=2.17,<3.0.a0 - libbrotlidec 1.1.0 hb03c661_4 - libbrotlienc 1.1.0 hb03c661_4 - libgcc >=14 license: MIT purls: [] size: 19615 timestamp: 1756599385418 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-h6caf38d_4.conda sha256: e57d402b02c9287b7c02d9947d7b7b55a4f7d73341c210c233f6b388d4641e08 md5: ab57f389f304c4d2eb86d8ae46d219c3 depends: - __osx >=11.0 - libbrotlidec 1.1.0 h6caf38d_4 - libbrotlienc 1.1.0 h6caf38d_4 license: MIT purls: [] size: 17373 timestamp: 1756599741779 - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-hfd05255_4.conda sha256: e92c783502d95743b49b650c9276e9c56c7264da55429a5e45655150a6d1b0cf md5: ef022c8941d7dcc420c8533b0e419733 depends: - libbrotlidec 1.1.0 hfd05255_4 - libbrotlienc 1.1.0 hfd05255_4 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT purls: [] size: 21425 timestamp: 1756599802301 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311h1ddb823_4.conda sha256: 318d4985acbf46457d254fbd6f0df80cc069890b5fc0013b3546d88eee1b1a1f md5: 7138a06a7b0d11a23cfae323e6010a08 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 constrains: - libbrotlicommon 1.1.0 hb03c661_4 license: MIT purls: - pkg:pypi/brotli?source=compressed-mapping size: 354304 timestamp: 1756599521587 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h1289d80_4.conda sha256: 52a9ac412512b418ecdb364ba21c0f3dc96f0abbdb356b3cfbb980020b663d9b md5: fd0e7746ed0676f008daacb706ce69e4 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 constrains: - libbrotlicommon 1.1.0 hb03c661_4 license: MIT purls: - pkg:pypi/brotli?source=compressed-mapping size: 354149 timestamp: 1756599553574 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h7033f15_4.conda sha256: b1941426e564d326097ded7af8b525540be219be7a88ca961d58a8d4fc116db2 md5: bc8624c405856b1d047dd0a81829b08c depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 constrains: - libbrotlicommon 1.1.0 hb03c661_4 license: MIT purls: - pkg:pypi/brotli?source=compressed-mapping size: 353639 timestamp: 1756599425945 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311hf719da1_4.conda sha256: 64645da991de052f0e522486cf97f8457fb37ed5c30d67655d3a32d2b9f56167 md5: 4cd43bb7ba1a3cb4cd7a2e335f6d3c32 depends: - __osx >=11.0 - libcxx >=19 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 constrains: - libbrotlicommon 1.1.0 h6caf38d_4 license: MIT purls: - pkg:pypi/brotli?source=compressed-mapping size: 340889 timestamp: 1756599941690 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312h6b01ec3_4.conda sha256: e45f24660a89c734c3d54f185ecdc359e52a5604d7e0b371e35dce042fa3cf3a md5: 0d50ab05d6d8fa7a38213c809637ba6d depends: - __osx >=11.0 - libcxx >=19 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 constrains: - libbrotlicommon 1.1.0 h6caf38d_4 license: MIT purls: - pkg:pypi/brotli?source=hash-mapping size: 341750 timestamp: 1756600036931 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313hb4b7877_4.conda sha256: a6402a7186ace5c3eb21ed4ce50eda3592c44ce38ab4e9a7ddd57d72b1e61fb3 md5: 9518cd948fc334d66119c16a2106a959 depends: - __osx >=11.0 - libcxx >=19 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 constrains: - libbrotlicommon 1.1.0 h6caf38d_4 license: MIT purls: - pkg:pypi/brotli?source=compressed-mapping size: 341104 timestamp: 1756600117644 - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h3e6a449_4.conda sha256: d524edc172239fec70ad946e3b2fa1b9d7eea145ad80e9e66da25a4d815770ea md5: 21d3a7fa95d27938158009cd08e461f2 depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - libbrotlicommon 1.1.0 hfd05255_4 license: MIT purls: - pkg:pypi/brotli?source=hash-mapping size: 323289 timestamp: 1756600106141 - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py312hbb81ca0_4.conda sha256: f3c7c9b0a41c0ec0c231b92fe944e1ab9e64cf0b4ae9d82e25994d3233baa20c md5: 3bb5cbb24258cc7ab83126976d36e711 depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - libbrotlicommon 1.1.0 hfd05255_4 license: MIT purls: - pkg:pypi/brotli?source=hash-mapping size: 323090 timestamp: 1756599941278 - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py313hfe59770_4.conda sha256: 0e98ebafd586c4da7d848f9de94770cb27653ba9232a2badb28f8a01f6e48fb5 md5: 477bf04a8a3030368068ccd39b8c5532 depends: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - libbrotlicommon 1.1.0 hfd05255_4 license: MIT purls: - pkg:pypi/brotli?source=compressed-mapping size: 323459 timestamp: 1756600051044 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d md5: 62ee74e96c5ebb0af99386de58cf9553 depends: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 license: bzip2-1.0.6 license_family: BSD purls: [] size: 252783 timestamp: 1720974456583 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab depends: - __osx >=11.0 license: bzip2-1.0.6 license_family: BSD purls: [] size: 122909 timestamp: 1720974522888 - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b md5: 276e7ffe9ffe39688abc665ef0f45596 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: bzip2-1.0.6 license_family: BSD purls: [] size: 54927 timestamp: 1720974860185 - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda sha256: f8003bef369f57396593ccd03d08a8e21966157269426f71e943f96e4b579aeb md5: f7f0d6cc2dc986d42ac2689ec88192be depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: MIT license_family: MIT purls: [] size: 206884 timestamp: 1744127994291 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda sha256: b4bb55d0806e41ffef94d0e3f3c97531f322b3cb0ca1f7cdf8e47f62538b7a2b md5: f8cd1beb98240c7edb1a95883360ccfa depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] size: 179696 timestamp: 1744128058734 - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.5-h2466b09_0.conda sha256: b52214a0a5632a12587d8dac6323f715bcc890f884efba5a2ce01c48c64ec6dc md5: b1f84168da1f0b76857df7e5817947a9 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT purls: [] size: 194147 timestamp: 1744128507613 - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda sha256: 3b82f62baad3fd33827b01b0426e8203a2786c8f452f633740868296bcbe8485 md5: c9e0c0f82f6e63323827db462b40ede8 depends: - __win license: ISC purls: [] size: 154489 timestamp: 1754210967212 - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda sha256: 837b795a2bb39b75694ba910c13c15fa4998d4bb2a622c214a6a5174b2ae53d1 md5: 74784ee3d225fc3dca89edb635b4e5cc depends: - __unix license: ISC purls: [] size: 154402 timestamp: 1754210968730 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda sha256: a1ad5b0a2a242f439608f22a538d2175cac4444b7b3f4e2b8c090ac337aaea40 md5: 11f59985f49df4620890f3e746ed7102 depends: - python >=3.9 license: ISC purls: - pkg:pypi/certifi?source=compressed-mapping size: 158692 timestamp: 1754231530168 - conda: https://conda.anaconda.org/conda-forge/noarch/cf-xarray-0.10.7-pyhd8ed1ab_0.conda sha256: c519ef2a5a7f04ecd74913bca6d53213edf7a2cd6b96342470c0ef18c4f79647 md5: 96deb7ddc65ed6907b3344ae2b058433 depends: - cf_xarray >=0.10.7,<0.10.8.0a0 - python >=3.11 license: Apache-2.0 license_family: APACHE purls: [] size: 10305 timestamp: 1755110480289 - conda: https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.10.7-pyhd8ed1ab_0.conda sha256: 263369102f08fe83c443db7a6650b47a14b928b9703f4aff79b069ada9fff645 md5: 8b42d5d0805c11575d78a6543863f869 depends: - python >=3.11 - xarray >=2023.09.0 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/cf-xarray?source=hash-mapping size: 65337 timestamp: 1755110470207 - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda sha256: bc47aa39c8254e9e487b8bcd74cfa3b4a3de3648869eb1a0b89905986b668e35 md5: 55553ecd5328336368db611f350b7039 depends: - __glibc >=2.17,<3.0.a0 - libffi >=3.4,<4.0a0 - libgcc >=13 - pycparser - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: MIT license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 302115 timestamp: 1725560701719 - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 md5: a861504bbea4161a9170b85d4d2be840 depends: - __glibc >=2.17,<3.0.a0 - libffi >=3.4,<4.0a0 - libgcc >=13 - pycparser - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: MIT license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 294403 timestamp: 1725560714366 - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hfab6e84_0.conda sha256: 73cd6199b143a8a6cbf733ce124ed57defc1b9a7eab9b10fd437448caf8eaa45 md5: ce6386a5892ef686d6d680c345c40ad1 depends: - __glibc >=2.17,<3.0.a0 - libffi >=3.4,<4.0a0 - libgcc >=13 - pycparser - python >=3.13.0rc1,<3.14.0a0 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 295514 timestamp: 1725560706794 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py311h3a79f62_0.conda sha256: 253605b305cc4548b8f97eb7c2e146697e0c7672b099c4862ec5ca7e8e995307 md5: a42272c5dbb6ffbc1a5af70f24c7b448 depends: - __osx >=11.0 - libffi >=3.4,<4.0a0 - pycparser - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: MIT license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 288211 timestamp: 1725560745212 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f md5: 19a5456f72f505881ba493979777b24e depends: - __osx >=11.0 - libffi >=3.4,<4.0a0 - pycparser - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: MIT license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 281206 timestamp: 1725560813378 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313hc845a76_0.conda sha256: 50650dfa70ccf12b9c4a117d7ef0b41895815bb7328d830d667a6ba3525b60e8 md5: 6d24d5587a8615db33c961a4ca0a8034 depends: - __osx >=11.0 - libffi >=3.4,<4.0a0 - pycparser - python >=3.13.0rc1,<3.14.0a0 - python >=3.13.0rc1,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 282115 timestamp: 1725560759157 - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py311he736701_0.conda sha256: 9689fbd8a31fdf273f826601e90146006f6631619767a67955048c7ad7798a1d md5: e1c69be23bd05471a6c623e91680ad59 depends: - pycparser - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 297627 timestamp: 1725561079708 - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py312h4389bb4_0.conda sha256: ac007bf5fd56d13e16d95eea036433012f2e079dc015505c8a79efebbad1fcbc md5: 08310c1a22ef957d537e547f8d484f92 depends: - pycparser - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 288142 timestamp: 1725560896359 - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py313ha7868ed_0.conda sha256: b19f581fe423858f1f477c52e10978be324c55ebf2e418308d30d013f4a476ff md5: 519a29d7ac273f8c165efc0af099da42 depends: - pycparser - python >=3.13.0rc1,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 291828 timestamp: 1725561211547 - conda: https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py313h29aa505_2.conda sha256: 8cc3a1ce59dabdc875f39a96392444bf50c49aee94fe443a53c24a5792c65382 md5: 1363e8db910e403edc8fd486f8470ec6 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - numpy >=1.23,<3 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - pkg:pypi/cftime?source=compressed-mapping size: 237570 timestamp: 1756511905402 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cftime-1.6.4-py313h2732efb_2.conda sha256: 25314a5f7b0173f4f3d6429b6b985bed7a7c6adc797cdc7c1266d60a53d987a1 md5: 550a36cc5dcb02c359b4e2b8485df8d8 depends: - __osx >=11.0 - numpy >=1.23,<3 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - pkg:pypi/cftime?source=compressed-mapping size: 192061 timestamp: 1756512120915 - conda: https://conda.anaconda.org/conda-forge/win-64/cftime-1.6.4-py313h0591002_2.conda sha256: 597bd757c476d5fbb12a912aa412c91c3fe9083acb21533b21a285314175b4ae md5: d3ec69b574b1de36801309918d7aecf5 depends: - numpy >=1.23,<3 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: - pkg:pypi/cftime?source=compressed-mapping size: 170801 timestamp: 1756512177895 - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda sha256: 838d5a011f0e7422be6427becba3de743c78f3874ad2743c341accbba9bb2624 md5: 7e7d5ef1b9ed630e4a1c358d6bc62284 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/charset-normalizer?source=hash-mapping size: 51033 timestamp: 1754767444665 - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda sha256: 8aee789c82d8fdd997840c952a586db63c6890b00e88c4fb6e80a38edd5f51c0 md5: 94b550b8d3a614dbd326af798c7dfb40 depends: - __unix - python >=3.10 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/click?source=hash-mapping size: 87749 timestamp: 1747811451319 - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh7428d3b_0.conda sha256: 20c2d8ea3d800485245b586a28985cba281dd6761113a49d7576f6db92a0a891 md5: 3a59475037bc09da916e4062c5cad771 depends: - __win - colorama - python >=3.10 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/click?source=hash-mapping size: 88117 timestamp: 1747811467132 - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda sha256: 21ecead7268241007bf65691610cd7314da68c1f88113092af690203b5780db5 md5: 364ba6c9fb03886ac979b482f39ebb92 depends: - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/cloudpickle?source=hash-mapping size: 25870 timestamp: 1736947650712 - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 md5: 962b9857ee8e7018c22f2776ffa0b2d7 depends: - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/colorama?source=hash-mapping size: 27011 timestamp: 1733218222191 - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda sha256: 576a44729314ad9e4e5ebe055fbf48beb8116b60e58f9070278985b2b634f212 md5: 2da13f2b299d8e1995bafbbe9689a2f7 depends: - python >=3.9 - python license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/comm?source=hash-mapping size: 14690 timestamp: 1753453984907 - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_2.conda sha256: cb35e53fc4fc2ae59c85303b0668d05fa3be9cd9f8b27a127882f47aa795895b md5: bb6a0f88cf345f7e7a143d349dae6d9f depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - numpy >=1.25 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: BSD-3-Clause purls: - pkg:pypi/contourpy?source=hash-mapping size: 296784 timestamp: 1756544804579 - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_2.conda sha256: cedae3c71ad59b6796d182f9198e881738b7a2c7b70f18427d7788f3173befb2 md5: bce621e43978c245261c76b45edeaa3d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - numpy >=1.25 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: BSD-3-Clause purls: - pkg:pypi/contourpy?source=hash-mapping size: 295534 timestamp: 1756544766129 - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313h7037e92_2.conda sha256: 5c31b1113f9e5a21bb6c2434795e10c8ee52e82dbc533fa4ec3041b5a28ea7fa md5: 6c8b4c12099023fcd85e520af74fd755 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - numpy >=1.25 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause purls: - pkg:pypi/contourpy?source=hash-mapping size: 296706 timestamp: 1756544800085 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py311h57a9ea7_2.conda sha256: 3d85887270eb5f9f82025c93956cef6ff12a1aab49dbf7cba5ca4ee0544d4182 md5: 66103afd2e02f1a416930dc352ae327b depends: - __osx >=11.0 - libcxx >=19 - numpy >=1.25 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: BSD-3-Clause purls: - pkg:pypi/contourpy?source=hash-mapping size: 259587 timestamp: 1756545016847 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312ha0dd364_2.conda sha256: 95c3f2a595be008ec861ea6bddbf6e2abdfbc115b0e01112b3ae64c7ae641b9e md5: bb1a2ab9b69fe1bb11d6ad9f1b39c0c4 depends: - __osx >=11.0 - libcxx >=19 - numpy >=1.25 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: BSD-3-Clause purls: - pkg:pypi/contourpy?source=hash-mapping size: 259025 timestamp: 1756544906767 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py313hc50a443_2.conda sha256: 7979594ebdb0e5e5b5d374af67e68a8f614d9a6de55417dad0b6b246a2399962 md5: 5b18003b1d9e2b7806a19b9d464c7a50 depends: - __osx >=11.0 - libcxx >=19 - numpy >=1.25 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: BSD-3-Clause purls: - pkg:pypi/contourpy?source=hash-mapping size: 260411 timestamp: 1756545032560 - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py311h3fd045d_2.conda sha256: 620d21eedddae5c2f8edb8c549c46a7204356ceff6b2d6c5560e4b5ce59a757d md5: 327d9807b7aa0889a859070c550731d4 depends: - numpy >=1.25 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause purls: - pkg:pypi/contourpy?source=hash-mapping size: 225470 timestamp: 1756544991146 - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py312hf90b1b7_2.conda sha256: 3561cb1fddacd7903c036659fe48615320e045fc3f58952bcabcb44fcd1f92d1 md5: 0236aece459ee53593a3feed0c6bcc94 depends: - numpy >=1.25 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause purls: - pkg:pypi/contourpy?source=hash-mapping size: 225375 timestamp: 1756544999757 - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py313hf069bd2_2.conda sha256: 71b1ab5b48a91a1ab767f8c55d35529ad5769fabd40663fd68ac936c5f860349 md5: bf5d8f5f80b6472bdc82970c513fbd50 depends: - numpy >=1.25 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause purls: - pkg:pypi/contourpy?source=hash-mapping size: 225780 timestamp: 1756544971020 - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py311h3778330_0.conda sha256: 260a003be89c82074188980fdfd8e124fc0209c29d1ab9a92a1dc8d2fa240c16 md5: e9cbe50bfe64007c7943ec3e349327e9 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - tomli license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping size: 392184 timestamp: 1756505914663 - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py312h8a5da7c_0.conda sha256: 90686783b8afd9fd88283bc03b2cce114511ff6074b0d3c60ce7aabb67db8dc5 md5: 388d3fcdd451c6f9f31c00067826ce2e depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - tomli license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping size: 381233 timestamp: 1756505784537 - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py313h3dea7bd_0.conda sha256: 16497a8c438db84f5f597b3e407929275bc92370a97abaa2ab2fe07540a902a3 md5: 75fc30961c06fb9b0543aef067efe2fd depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - tomli license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping size: 389163 timestamp: 1756505873520 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.6-py311h2fe624c_0.conda sha256: 84736c7b86bb65c9566474607ae5426d3d071d22e7408d406aee4531ec1bda51 md5: 9bd370e2fddb6b6fcb7cb77e11ff22c4 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?source=hash-mapping size: 390704 timestamp: 1756505997958 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.6-py312h6daa0e5_0.conda sha256: a80658451eea5c327c4cdf451e6a0c6223fb40eb85514e5b49c8d40b10e006ad md5: 262047760f18fdfafa48070e06ce35ee depends: - __osx >=11.0 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 - tomli license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping size: 380016 timestamp: 1756505955614 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.6-py313ha0c97b7_0.conda sha256: 5744802348afcd6b912d05f9311ef2df49ed271c199ff8ecdcccfe32b42c6a75 md5: 838682f9b482f0975f527fa10cffece0 depends: - __osx >=11.0 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 - tomli license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping size: 388281 timestamp: 1756506217368 - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.10.6-py311h3f79411_0.conda sha256: 22fd895a2acc48ba974782816172c26220c9dfef697cdf86546fc32f8d213a5b md5: 77e0672d8ff3b157513528829d0c9be0 depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - tomli - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping size: 417541 timestamp: 1756506120395 - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.10.6-py312h05f76fc_0.conda sha256: f1002a5ded5ed2af022e98eae308929beb2fdcda18ef22f1014288b581a94c10 md5: 9fb90caf8b5e9b9b359ab75e7ef9abcf depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - tomli - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping size: 407100 timestamp: 1756506126774 - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.10.6-py313hd650c13_0.conda sha256: 3d60c0fb1111e62ffe045f0570d0c9b4c4af53e80823768d5abade9dd49d9c3f md5: 785101f8fc35dfc9dae14441e917c234 depends: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - tomli - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping size: 414319 timestamp: 1756505969280 - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda noarch: generic sha256: 058c8156ff880b1180a36b94307baad91f9130d0e3019ad8c7ade035852016fb md5: 0401f31e3c9e48cebf215472aa3e7104 depends: - python >=3.13,<3.14.0a0 - python_abi * *_cp313 license: Python-2.0 purls: [] size: 47560 timestamp: 1750062514868 - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda sha256: 9827efa891e507a91a8a2acf64e210d2aff394e1cde432ad08e1f8c66b12293c md5: 44600c4667a319d67dbe0681fc0bc833 depends: - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/cycler?source=hash-mapping size: 13399 timestamp: 1733332563512 - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.1-py311h9ecbd09_0.conda sha256: fd5a8c7e613c3c538ca775951fd814ab10cfcdaed79e193c3bf7eb59c87cd114 md5: 69a0a85acdcc5e6d0f1cc915c067ad4c depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - toolz >=0.10.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/cytoolz?source=hash-mapping size: 394232 timestamp: 1734107375850 - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.1-py312h66e93f0_0.conda sha256: 63a64d4e71148c4efd8db17b4a19b8965990d1e08ed2e24b84bc36b6c166a705 md5: 6198b134b1c08173f33653896974d477 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - toolz >=0.10.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/cytoolz?source=hash-mapping size: 394309 timestamp: 1734107344014 - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.1-py313h536fd9c_0.conda sha256: 4ed6220a9db0c0fbef44b0b6c642e8f20e4d60a52628fc4d995f8c0db5ad942e md5: e886bb6a3c24f8b9dd4fcd1d617a1f64 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - toolz >=0.10.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/cytoolz?source=hash-mapping size: 388205 timestamp: 1734107369698 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cytoolz-1.0.1-py311h917b07b_0.conda sha256: e555f5ca8fec8315c318a061bdcec24d58e3a0e51d2e9cfee4a858868ca972af md5: 29bb5e1effb961954ba06e414b913b90 depends: - __osx >=11.0 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 - toolz >=0.10.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/cytoolz?source=hash-mapping size: 342319 timestamp: 1734107577755 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cytoolz-1.0.1-py312hea69d52_0.conda sha256: 0df5e51c5598d5c098ac79c249f42f04bd6cb77969bc91a832c1ee763e40f55a md5: e674d71e573746c29e99659a00391809 depends: - __osx >=11.0 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 - toolz >=0.10.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/cytoolz?source=hash-mapping size: 338844 timestamp: 1734107464832 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cytoolz-1.0.1-py313h90d716c_0.conda sha256: 64b25c54c22472b2e7a9beb0b25b8c5a3204342aa607e3c1c6284371ab234d62 md5: 5f77429b9e4626f1476d1bed341530ed depends: - __osx >=11.0 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 - toolz >=0.10.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/cytoolz?source=hash-mapping size: 338133 timestamp: 1734107491773 - conda: https://conda.anaconda.org/conda-forge/win-64/cytoolz-1.0.1-py311he736701_0.conda sha256: 7746ffe3a0849abbd724da6955950142ec7eedbc66053be8d3802b7885562951 md5: fc78ccf75bba016a930accedee7ed9af depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - toolz >=0.10.0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/cytoolz?source=hash-mapping size: 322872 timestamp: 1734107800020 - conda: https://conda.anaconda.org/conda-forge/win-64/cytoolz-1.0.1-py312h4389bb4_0.conda sha256: e657e468fdae72302951bba92f94bcb31566a237e5f979a7dd205603a0750b59 md5: fba0567971249f5d0cce4d35b1184c75 depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - toolz >=0.10.0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/cytoolz?source=hash-mapping size: 316347 timestamp: 1734107735311 - conda: https://conda.anaconda.org/conda-forge/win-64/cytoolz-1.0.1-py313ha7868ed_0.conda sha256: 277d5b23f52e02453e9dab28e9335caa16fcaa54bb4e7dd771a86d3c95e580a5 md5: a66eb40fddbf2a2e64b8e4c7128ff1db depends: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - toolz >=0.10.0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/cytoolz?source=hash-mapping size: 315372 timestamp: 1734107736055 - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2025.7.0-pyhe01879c_0.conda sha256: 03cf80a89674166ec5aabbc63dbe6a317f09e2b585ace2c1296ded91033d5f72 md5: e764bbc4315343e806bc55d73d102335 depends: - python >=3.10 - dask-core >=2025.7.0,<2025.7.1.0a0 - distributed >=2025.7.0,<2025.7.1.0a0 - cytoolz >=0.11.0 - lz4 >=4.3.2 - numpy >=1.24 - pandas >=2.0 - bokeh >=3.1.0 - jinja2 >=2.10.3 - pyarrow >=14.0.1 - python constrains: - openssl !=1.1.1e license: BSD-3-Clause license_family: BSD purls: [] size: 11522 timestamp: 1752542237166 - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda sha256: 039130562a81522460f6638cabaca153798d865c24bb87781475e8fd5708d590 md5: 3293644021329a96c606c3d95e180991 depends: - python >=3.10 - click >=8.1 - cloudpickle >=3.0.0 - fsspec >=2021.9.0 - packaging >=20.0 - partd >=1.4.0 - pyyaml >=5.3.1 - toolz >=0.10.0 - importlib-metadata >=4.13.0 - python license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/dask?source=hash-mapping size: 1058723 timestamp: 1752524171028 - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_0.conda sha256: 26c56e7f93cde8be5b1b3ec3404f95d2874946f6fe0182f6720e5c3232e006ed md5: c6286f4df7bec3d3712d617a358149b4 depends: - python - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - libgcc >=14 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - pkg:pypi/debugpy?source=compressed-mapping size: 2868365 timestamp: 1754523414483 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_0.conda sha256: 214010d0ef5ec170cc24a28277c11893ecca0f78f0ba6ba6b90e8031ca8fff15 md5: b8a25de90e021082a106f01be64c9c5b depends: - python - python 3.13.* *_cp313 - __osx >=11.0 - libcxx >=19 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - pkg:pypi/debugpy?source=hash-mapping size: 2755818 timestamp: 1754523422224 - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_0.conda sha256: 5829816abc09896825c1f587cbfbf5548b1e0aa39758fbb10a65d53889dfeac8 md5: 5fe037380ae0b46e412141e4ddea31a0 depends: - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - pkg:pypi/debugpy?source=hash-mapping size: 4000318 timestamp: 1754523432925 - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda sha256: c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017 md5: 9ce473d1d1be1cc3810856a48b3fab32 depends: - python >=3.9 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/decorator?source=hash-mapping size: 14129 timestamp: 1740385067843 - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be md5: 961b3a227b437d82ad7054484cfa71b2 depends: - python >=3.6 license: PSF-2.0 license_family: PSF purls: - pkg:pypi/defusedxml?source=hash-mapping size: 24062 timestamp: 1615232388757 - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2025.7.0-pyhe01879c_0.conda sha256: d8c43144fe7dd9d8496491a6bf60996ceb0bbe291e234542e586dba979967df8 md5: b94b2b0dc755b7f1fd5d1984e46d932c depends: - python >=3.10 - click >=8.0 - cloudpickle >=3.0.0 - cytoolz >=0.11.2 - dask-core >=2025.7.0,<2025.7.1.0a0 - jinja2 >=2.10.3 - locket >=1.0.0 - msgpack-python >=1.0.2 - packaging >=20.0 - psutil >=5.8.0 - pyyaml >=5.4.1 - sortedcontainers >=2.0.5 - tblib >=1.6.0 - toolz >=0.11.2 - tornado >=6.2.0 - urllib3 >=1.26.5 - zict >=3.0.0 - python constrains: - openssl !=1.1.1e license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/distributed?source=hash-mapping size: 847541 timestamp: 1752539128419 - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda sha256: fa5966bb1718bbf6967a85075e30e4547901410cc7cb7b16daf68942e9a94823 md5: 24c1ca34138ee57de72a943237cde4cc depends: - python >=3.9 license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 purls: - pkg:pypi/docutils?source=hash-mapping size: 402700 timestamp: 1733217860944 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda sha256: ce61f4f99401a4bd455b89909153b40b9c823276aefcbb06f2044618696009ca md5: 72e42d28960d875c7654614f8b50939a depends: - python >=3.9 - typing_extensions >=4.6.0 license: MIT and PSF-2.0 purls: - pkg:pypi/exceptiongroup?source=hash-mapping size: 21284 timestamp: 1746947398083 - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda sha256: 9abc6c128cd40733e9b24284d0462e084d4aff6afe614f0754aa8533ebe505e4 md5: a71efeae2c160f6789900ba2631a2c90 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/execnet?source=hash-mapping size: 38835 timestamp: 1733231086305 - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda sha256: 7510dd93b9848c6257c43fdf9ad22adf62e7aa6da5f12a6a757aed83bcfedf05 md5: 81d30c08f9a3e556e8ca9e124b044d14 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/executing?source=hash-mapping size: 29652 timestamp: 1745502200340 - pypi: https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl name: flexcache version: "0.3" sha256: d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32 requires_dist: - typing-extensions - pytest ; extra == 'test' - pytest-mpl ; extra == 'test' - pytest-cov ; extra == 'test' - pytest-subtests ; extra == 'test' requires_python: ">=3.9" - conda: https://conda.anaconda.org/conda-forge/noarch/flexcache-0.3-pyhd8ed1ab_1.conda sha256: acdb7b73d84268773fcc8192965994554411edc488ec3447925a62154e9d3baa md5: f1e618f2f783427019071b14a111b30d depends: - python >=3.9 - typing-extensions license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/flexcache?source=hash-mapping size: 16674 timestamp: 1733663669958 - pypi: https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl name: flexparser version: "0.4" sha256: 3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846 requires_dist: - typing-extensions - pytest ; extra == 'test' - pytest-mpl ; extra == 'test' - pytest-cov ; extra == 'test' - pytest-subtests ; extra == 'test' requires_python: ">=3.9" - conda: https://conda.anaconda.org/conda-forge/noarch/flexparser-0.4-pyhd8ed1ab_1.conda sha256: 9bdad0cd9fb6d67e48798c03930d634ea2d33a894d30439d3d7bdffd3c21af7b md5: 6dc4e43174cd552452fdb8c423e90e69 depends: - python >=3.9 - typing-extensions - typing_extensions license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/flexparser?source=hash-mapping size: 28686 timestamp: 1733663636245 - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.2-py313h3dea7bd_0.conda sha256: 1e2cac4460fd14b52324ce569428e0f2610fbc831c7271bdced3de4c92e62ae5 md5: f3968013ee183bd2bce0e0433abd4384 depends: - __glibc >=2.17,<3.0.a0 - brotli - libgcc >=14 - munkres - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - pkg:pypi/fonttools?source=hash-mapping size: 2944885 timestamp: 1756328908380 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.59.2-py313ha0c97b7_0.conda sha256: 2e5b6aa525762a1935e1b30f56a1934772f8b5d6aedceb48a464656313cd860f md5: 8c978e51603fc2ce103a9501d355cfb8 depends: - __osx >=11.0 - brotli - munkres - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - pkg:pypi/fonttools?source=hash-mapping size: 2859733 timestamp: 1756329109430 - conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.59.2-py313hd650c13_0.conda sha256: b04bce7cf6582f007577537286e960bd2ee4eaa7e8fe6f65b323c7aa7417cd6a md5: 03fa681733db4d9afdffea33adbd318d depends: - brotli - munkres - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: - pkg:pypi/fonttools?source=hash-mapping size: 2490458 timestamp: 1756328983115 - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda sha256: 7ef7d477c43c12a5b4cddcf048a83277414512d1116aba62ebadfa7056a7d84f md5: 9ccd736d31e0c6e41f54e704e5312811 depends: - libfreetype 2.13.3 ha770c72_1 - libfreetype6 2.13.3 h48d6fc4_1 license: GPL-2.0-only OR FTL purls: [] size: 172450 timestamp: 1745369996765 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.13.3-hce30654_1.conda sha256: 6b63c72ea51a41d41964841404564c0729fdddd3e952e2715839fd759b7cfdfc md5: e684de4644067f1956a580097502bf03 depends: - libfreetype 2.13.3 hce30654_1 - libfreetype6 2.13.3 h1d14073_1 license: GPL-2.0-only OR FTL purls: [] size: 172220 timestamp: 1745370149658 - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.13.3-h57928b3_1.conda sha256: 0bcc9c868d769247c12324f957c97c4dbee7e4095485db90d9c295bcb3b1bb43 md5: 633504fe3f96031192e40e3e6c18ef06 depends: - libfreetype 2.13.3 h57928b3_1 - libfreetype6 2.13.3 h0b5ce68_1 license: GPL-2.0-only OR FTL purls: [] size: 184162 timestamp: 1745370242683 - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda sha256: f734d98cd046392fbd9872df89ac043d72ac15f6a2529f129d912e28ab44609c md5: a31ce802cd0ebfce298f342c02757019 depends: - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/fsspec?source=compressed-mapping size: 145357 timestamp: 1752608821935 - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a md5: d411fc29e338efb48c5fd4576d71d881 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 license: BSD-3-Clause license_family: BSD purls: [] size: 119654 timestamp: 1726600001928 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 md5: 57a511a5905caa37540eb914dfcbf1fb depends: - __osx >=11.0 - libcxx >=17 license: BSD-3-Clause license_family: BSD purls: [] size: 82090 timestamp: 1726600145480 - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 md5: ff862eebdfeb2fd048ae9dc92510baca depends: - gflags >=2.2.2,<2.3.0a0 - libgcc-ng >=12 - libstdcxx-ng >=12 license: BSD-3-Clause license_family: BSD purls: [] size: 143452 timestamp: 1718284177264 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 depends: - __osx >=11.0 - gflags >=2.2.2,<2.3.0a0 - libcxx >=16 license: BSD-3-Clause license_family: BSD purls: [] size: 112215 timestamp: 1718284365403 - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda sha256: f64b68148c478c3bfc8f8d519541de7d2616bf59d44485a5271041d40c061887 md5: 4b69232755285701bc86a5afe4d9933a depends: - python >=3.9 - typing_extensions license: MIT license_family: MIT purls: - pkg:pypi/h11?source=hash-mapping size: 37697 timestamp: 1745526482242 - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 depends: - python >=3.10 - hyperframe >=6.1,<7 - hpack >=4.1,<5 - python license: MIT license_family: MIT purls: - pkg:pypi/h2?source=compressed-mapping size: 95967 timestamp: 1756364871835 - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda sha256: 0d09b6dc1ce5c4005ae1c6a19dc10767932ef9a5e9c755cfdbb5189ac8fb0684 md5: bd77f8da987968ec3927990495dc22e4 depends: - libgcc-ng >=12 - libjpeg-turbo >=3.0.0,<4.0a0 - libstdcxx-ng >=12 - libzlib >=1.2.13,<2.0.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 756742 timestamp: 1695661547874 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda sha256: c3b01e3c3fe4ca1c4d28c287eaa5168a4f2fd3ffd76690082ac919244c22fa90 md5: ff5d749fd711dc7759e127db38005924 depends: - libcxx >=15.0.7 - libjpeg-turbo >=3.0.0,<4.0a0 - libzlib >=1.2.13,<2.0.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 762257 timestamp: 1695661864625 - conda: https://conda.anaconda.org/conda-forge/win-64/hdf4-4.2.15-h5557f11_7.conda sha256: 52fa5dde69758c19c69ab68a3d7ebfb2c9042e3a55d405c29a59d3b0584fd790 md5: 84344a916a73727c1326841007b52ca8 depends: - libjpeg-turbo >=3.0.0,<4.0a0 - libzlib >=1.2.13,<2.0.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: [] size: 779637 timestamp: 1695662145568 - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda sha256: 4f173af9e2299de7eee1af3d79e851bca28ee71e7426b377e841648b51d48614 md5: c74d83614aec66227ae5199d98852aaf depends: - __glibc >=2.17,<3.0.a0 - libaec >=1.1.4,<2.0a0 - libcurl >=8.14.1,<9.0a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.1,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 3710057 timestamp: 1753357500665 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_he65715a_103.conda sha256: 8948a63fc4a56536ce7b2716b781616c3909507300d26e9f265a3c13d59708a0 md5: fcc9aca330f13d071bfc4de3d0942d78 depends: - __osx >=11.0 - libaec >=1.1.4,<2.0a0 - libcurl >=8.14.1,<9.0a0 - libcxx >=19 - libgfortran - libgfortran5 >=14.3.0 - libgfortran5 >=15.1.0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.1,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 3308443 timestamp: 1753356976982 - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-1.14.6-nompi_he30205f_103.conda sha256: 0a90263b97e9860cec6c2540160ff1a1fff2a609b3d96452f8716ae63489dac5 md5: f1f7aaf642cefd2190582550eaca4658 depends: - libaec >=1.1.4,<2.0a0 - libcurl >=8.14.1,<9.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.1,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: [] size: 2031491 timestamp: 1753357255237 - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba md5: 0a802cb9888dd14eeefc611f05c40b6e depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/hpack?source=hash-mapping size: 30731 timestamp: 1737618390337 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 md5: 8e6923fc12f1fe8f8c4e5c9f343256ac depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/hyperframe?source=hash-mapping size: 17397 timestamp: 1737618427549 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 md5: 5eb22c1d7b3fc4abb50d92d621583137 depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] size: 11857802 timestamp: 1720853997952 - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 md5: 39a4f67be3286c86d696df570b1201b7 depends: - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/idna?source=hash-mapping size: 49765 timestamp: 1733211921194 - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 sha256: c2bfd7043e0c4c12d8b5593de666c1e81d67b83c474a0a79282cc5c4ef845460 md5: 7de5386c8fea29e76b303f37dde4c352 depends: - python >=3.4 license: MIT license_family: MIT purls: - pkg:pypi/imagesize?source=hash-mapping size: 10164 timestamp: 1656939625410 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda sha256: c18ab120a0613ada4391b15981d86ff777b5690ca461ea7e9e49531e8f374745 md5: 63ccfdc3a3ce25b027b8767eb722fca8 depends: - python >=3.9 - zipp >=3.20 - python license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/importlib-metadata?source=hash-mapping size: 34641 timestamp: 1747934053147 - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda sha256: 0ec8f4d02053cd03b0f3e63168316530949484f80e16f5e2fb199a1d117a89ca md5: 6837f3eff7dcea42ecd714ce1ac2b108 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/iniconfig?source=hash-mapping size: 11474 timestamp: 1733223232820 - conda: https://conda.anaconda.org/conda-forge/noarch/ipdb-0.13.13-pyhd8ed1ab_1.conda sha256: 33275d537122e67df200203d541170db8b55886667d30cc7262cc1e463b04406 md5: 044c5249ad8ea18a414d07baa1f369ea depends: - decorator - ipython - python >=3.9 - toml >=0.10.2 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/ipdb?source=hash-mapping size: 18713 timestamp: 1734884952029 - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh3521513_0.conda sha256: 3dd6fcdde5e40a3088c9ecd72c29c6e5b1429b99e927f41c8cee944a07062046 md5: 953007d45edeb098522ac860aade4fcf depends: - __win - comm >=0.1.1 - debugpy >=1.6.5 - ipython >=7.23.1 - jupyter_client >=8.0.0 - jupyter_core >=4.12,!=5.0.* - matplotlib-inline >=0.1 - nest-asyncio >=1.4 - packaging >=22 - psutil >=5.7 - python >=3.9 - pyzmq >=25 - tornado >=6.2 - traitlets >=5.4.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/ipykernel?source=hash-mapping size: 121976 timestamp: 1754353094360 - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda sha256: cfc2c4e31dfedbb3d124d0055f55fda4694538fb790d52cd1b37af5312833e36 md5: b0cc25825ce9212b8bee37829abad4d6 depends: - __linux - comm >=0.1.1 - debugpy >=1.6.5 - ipython >=7.23.1 - jupyter_client >=8.0.0 - jupyter_core >=4.12,!=5.0.* - matplotlib-inline >=0.1 - nest-asyncio >=1.4 - packaging >=22 - psutil >=5.7 - python >=3.9 - pyzmq >=25 - tornado >=6.2 - traitlets >=5.4.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/ipykernel?source=hash-mapping size: 121367 timestamp: 1754352984703 - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh92f572d_0.conda sha256: ec80ed5f68c96dd46ff1b533b28d2094b6f07e2ec8115c8c60803920fdd6eb13 md5: f208c1a85786e617a91329fa5201168c depends: - __osx - appnope - comm >=0.1.1 - debugpy >=1.6.5 - ipython >=7.23.1 - jupyter_client >=8.0.0 - jupyter_core >=4.12,!=5.0.* - matplotlib-inline >=0.1 - nest-asyncio >=1.4 - packaging >=22 - psutil >=5.7 - python >=3.9 - pyzmq >=25 - tornado >=6.2 - traitlets >=5.4.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/ipykernel?source=hash-mapping size: 121397 timestamp: 1754353050327 - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.5.0-pyh6be1c34_0.conda sha256: 658c547dafb10cd0989f2cdf72f8ee9fe8f66240307b64555ee43f6908e9d0ad md5: aec1868dd4cbe028b2c8cb11377895a6 depends: - __win - colorama - decorator - exceptiongroup - ipython_pygments_lexers - jedi >=0.16 - matplotlib-inline - pickleshare - prompt-toolkit >=3.0.41,<3.1.0 - pygments >=2.4.0 - python >=3.11 - stack_data - traitlets >=5.13.0 - typing_extensions >=4.6 - python license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/ipython?source=hash-mapping size: 630157 timestamp: 1756474536497 - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.5.0-pyhfa0c392_0.conda sha256: e9ca009d3aab9d8a85f0241d6ada2c7fbc84072008e95f803fa59da3294aa863 md5: c0916cc4b733577cd41df93884d857b0 depends: - __unix - pexpect >4.3 - decorator - exceptiongroup - ipython_pygments_lexers - jedi >=0.16 - matplotlib-inline - pickleshare - prompt-toolkit >=3.0.41,<3.1.0 - pygments >=2.4.0 - python >=3.11 - stack_data - traitlets >=5.13.0 - typing_extensions >=4.6 - python license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/ipython?source=hash-mapping size: 630826 timestamp: 1756474504536 - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104 md5: bd80ba060603cc228d9d81c257093119 depends: - pygments - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/ipython-pygments-lexers?source=hash-mapping size: 13993 timestamp: 1737123723464 - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda sha256: 92c4d217e2dc68983f724aa983cca5464dcb929c566627b26a2511159667dba8 md5: a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 depends: - parso >=0.8.3,<0.9.0 - python >=3.9 license: Apache-2.0 AND MIT purls: - pkg:pypi/jedi?source=hash-mapping size: 843646 timestamp: 1733300981994 - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda sha256: f1ac18b11637ddadc05642e8185a851c7fab5998c6f5470d716812fae943b2af md5: 446bd6c8cb26050d528881df495ce646 depends: - markupsafe >=2.0 - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/jinja2?source=hash-mapping size: 112714 timestamp: 1741263433881 - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda sha256: ac377ef7762e49cb9c4f985f1281eeff471e9adc3402526eea78e6ac6589cf1d md5: 341fd940c242cf33e832c0402face56f depends: - attrs >=22.2.0 - jsonschema-specifications >=2023.3.6 - python >=3.9 - referencing >=0.28.4 - rpds-py >=0.7.1 - python license: MIT license_family: MIT purls: - pkg:pypi/jsonschema?source=compressed-mapping size: 81688 timestamp: 1755595646123 - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda sha256: 66fbad7480f163509deec8bd028cd3ea68e58022982c838683586829f63f3efa md5: 41ff526b1083fde51fbdc93f29282e0e depends: - python >=3.9 - referencing >=0.31.0 - python license: MIT license_family: MIT purls: - pkg:pypi/jsonschema-specifications?source=hash-mapping size: 19168 timestamp: 1745424244298 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a md5: 4ebae00eae9705b0c3d6d1018a81d047 depends: - importlib-metadata >=4.8.3 - jupyter_core >=4.12,!=5.0.* - python >=3.9 - python-dateutil >=2.8.2 - pyzmq >=23.0 - tornado >=6.2 - traitlets >=5.3 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/jupyter-client?source=hash-mapping size: 106342 timestamp: 1733441040958 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda sha256: 56a7a7e907f15cca8c4f9b0c99488276d4cb10821d2d15df9245662184872e81 md5: b7d89d860ebcda28a5303526cdee68ab depends: - __unix - platformdirs >=2.5 - python >=3.8 - traitlets >=5.3 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/jupyter-core?source=hash-mapping size: 59562 timestamp: 1748333186063 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh5737063_0.conda sha256: 928c2514c2974fda78447903217f01ca89a77eefedd46bf6a2fe97072df57e8d md5: 324e60a0d3f39f268e899709575ea3cd depends: - __win - cpython - platformdirs >=2.5 - python >=3.8 - pywin32 >=300 - traitlets >=5.3 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/jupyter-core?source=hash-mapping size: 59972 timestamp: 1748333368923 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0 md5: fd312693df06da3578383232528c468d depends: - pygments >=2.4.1,<3 - python >=3.9 constrains: - jupyterlab >=4.0.8,<5.0.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/jupyterlab-pygments?source=hash-mapping size: 18711 timestamp: 1733328194037 - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 md5: b38117a3c920364aff79f870c984b4a3 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: LGPL-2.1-or-later purls: [] size: 134088 timestamp: 1754905959823 - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py313hc8edb43_1.conda sha256: 1a046c37e54239efc2768ce4a2fbaf721314cda3ef8358e85c8e544b5e4b133a md5: 87215c60837a8494bf3453d08b404eed depends: - python - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/kiwisolver?source=hash-mapping size: 77227 timestamp: 1756467528380 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.9-py313hf88c9ab_1.conda sha256: 18e99c68458ddb014eb37b959a61be5c3a3a802534e5c33b14130e7ec0c18481 md5: 109f613ee5f40f67e379e3fd17e97c19 depends: - python - libcxx >=19 - python 3.13.* *_cp313 - __osx >=11.0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/kiwisolver?source=hash-mapping size: 68324 timestamp: 1756467625109 - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.9-py313h1a38498_1.conda sha256: 774b67a7d93c373db620ada8353fc5ab28a976f8b4a7e53d4dd9a522f3d82100 md5: 70f93375919f715a9dd2ca9517e57728 depends: - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/kiwisolver?source=hash-mapping size: 73810 timestamp: 1756467536678 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 md5: 3f43953b7d3fb3aaa1d0d0723d91e368 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.3.1,<4.0a0 license: MIT license_family: MIT purls: [] size: 1370023 timestamp: 1719463201255 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b md5: c6dc8a0fdec13a0565936655c33069a1 depends: - __osx >=11.0 - libcxx >=16 - libedit >=3.1.20191231,<3.2.0a0 - libedit >=3.1.20191231,<4.0a0 - openssl >=3.3.1,<4.0a0 license: MIT license_family: MIT purls: [] size: 1155530 timestamp: 1719463474401 - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda sha256: 18e8b3430d7d232dad132f574268f56b3eb1a19431d6d5de8c53c29e6c18fa81 md5: 31aec030344e962fbd7dbbbbd68e60a9 depends: - openssl >=3.3.1,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT purls: [] size: 712034 timestamp: 1719463874284 - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 md5: 000e85703f0fd9594c81710dd5066471 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libjpeg-turbo >=3.0.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 license: MIT license_family: MIT purls: [] size: 248046 timestamp: 1739160907615 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda sha256: 310a62c2f074ebd5aa43b3cd4b00d46385ce680fa2132ecee255a200e2d2f15f md5: 92a61fd30b19ebd5c1621a5bfe6d8b5f depends: - __osx >=11.0 - libjpeg-turbo >=3.0.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 license: MIT license_family: MIT purls: [] size: 212125 timestamp: 1739161108467 - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.17-hbcf6048_0.conda sha256: 7712eab5f1a35ca3ea6db48ead49e0d6ac7f96f8560da8023e61b3dbe4f3b25d md5: 3538827f77b82a837fa681a4579e37a1 depends: - libjpeg-turbo >=3.0.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT purls: [] size: 510641 timestamp: 1739161381270 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda sha256: 1a620f27d79217c1295049ba214c2f80372062fd251b569e9873d4a953d27554 md5: 0be7c6e070c19105f966d3758448d018 depends: - __glibc >=2.17,<3.0.a0 constrains: - binutils_impl_linux-64 2.44 license: GPL-3.0-only license_family: GPL purls: [] size: 676044 timestamp: 1752032747103 - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda sha256: 412381a43d5ff9bbed82cd52a0bbca5b90623f62e41007c9c42d3870c60945ff md5: 9344155d33912347b37f0ae6c410a835 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 license: Apache-2.0 license_family: Apache purls: [] size: 264243 timestamp: 1745264221534 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda sha256: 12361697f8ffc9968907d1a7b5830e34c670e4a59b638117a2cdfed8f63a38f8 md5: a74332d9b60b62905e3d30709df08bf1 depends: - __osx >=11.0 - libcxx >=18 license: Apache-2.0 license_family: Apache purls: [] size: 188306 timestamp: 1745264362794 - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h6470a55_1.conda sha256: 868a3dff758cc676fa1286d3f36c3e0101cca56730f7be531ab84dc91ec58e9d md5: c1b81da6d29a14b542da14a36c9fbf3f depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] size: 164701 timestamp: 1745264384716 - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda sha256: dcd1429a1782864c452057a6c5bc1860f2b637dc20a2b7e6eacd57395bbceff8 md5: 83b160d4da3e1e847bf044997621ed63 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 constrains: - libabseil-static =20250512.1=cxx17* - abseil-cpp =20250512.1 license: Apache-2.0 license_family: Apache purls: [] size: 1310612 timestamp: 1750194198254 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250512.1-cxx17_hd41c47c_0.conda sha256: 7f0ee9ae7fa2cf7ac92b0acf8047c8bac965389e48be61bf1d463e057af2ea6a md5: 360dbb413ee2c170a0a684a33c4fc6b8 depends: - __osx >=11.0 - libcxx >=18 constrains: - libabseil-static =20250512.1=cxx17* - abseil-cpp =20250512.1 license: Apache-2.0 license_family: Apache purls: [] size: 1174081 timestamp: 1750194620012 - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20250512.1-cxx17_habfad5f_0.conda sha256: 78790771f44e146396d9ae92efbe1022168295afd8d174f653a1fa16f0f0fa32 md5: d6a4cd236fc1c69a1cfc9698fb5e391f depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.42.34438 constrains: - libabseil-static =20250512.1=cxx17* - abseil-cpp =20250512.1 license: Apache-2.0 license_family: Apache purls: [] size: 1615210 timestamp: 1750194549591 - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda sha256: 410ab78fe89bc869d435de04c9ffa189598ac15bb0fe1ea8ace8fb1b860a2aa3 md5: 01ba04e414e47f95c03d6ddd81fd37be depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 license: BSD-2-Clause license_family: BSD purls: [] size: 36825 timestamp: 1749993532943 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.4-h51d1e36_0.conda sha256: 0ea6b73b3fb1511615d9648186a7409e73b7a8d9b3d890d39df797730e3d1dbb md5: 8ed0f86b7a5529b98ec73b43a53ce800 depends: - __osx >=11.0 - libcxx >=18 license: BSD-2-Clause license_family: BSD purls: [] size: 30173 timestamp: 1749993648288 - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.4-h20038f6_0.conda sha256: 0be89085effce9fdcbb6aea7acdb157b18793162f68266ee0a75acf615d4929b md5: 85a2bed45827d77d5b308cb2b165404f depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-2-Clause license_family: BSD purls: [] size: 33847 timestamp: 1749993666162 - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-21.0.0-hb116c0f_1_cpu.conda build_number: 1 sha256: c04ea51c2a8670265f25ceae09e69db87489b1461ff18e789d5e368b45b3dbe0 md5: c100b9a4d6c72c691543af69f707df51 depends: - __glibc >=2.17,<3.0.a0 - aws-crt-cpp >=0.33.1,<0.33.2.0a0 - aws-sdk-cpp >=1.11.606,<1.11.607.0a0 - azure-core-cpp >=1.16.0,<1.16.1.0a0 - azure-identity-cpp >=1.12.0,<1.12.1.0a0 - azure-storage-blobs-cpp >=12.14.0,<12.14.1.0a0 - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 - bzip2 >=1.0.8,<2.0a0 - glog >=0.7.1,<0.8.0a0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libbrotlidec >=1.1.0,<1.2.0a0 - libbrotlienc >=1.1.0,<1.2.0a0 - libgcc >=14 - libgoogle-cloud >=2.39.0,<2.40.0a0 - libgoogle-cloud-storage >=2.39.0,<2.40.0a0 - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - orc >=2.2.0,<2.2.1.0a0 - snappy >=1.2.2,<1.3.0a0 - zstd >=1.5.7,<1.6.0a0 constrains: - apache-arrow-proc =*=cpu - arrow-cpp <0.0a0 - parquet-cpp <0.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 6508107 timestamp: 1754309354037 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-21.0.0-h20b3f57_1_cpu.conda build_number: 1 sha256: 5b792b97a8ba23694ad57f2d1d40c9afa4da71d952b1451d5e68592b8f813e79 md5: abe3b0c459ef2962f214542e57b9f9ce depends: - __osx >=11.0 - aws-crt-cpp >=0.33.1,<0.33.2.0a0 - aws-sdk-cpp >=1.11.606,<1.11.607.0a0 - azure-core-cpp >=1.16.0,<1.16.1.0a0 - azure-identity-cpp >=1.12.0,<1.12.1.0a0 - azure-storage-blobs-cpp >=12.14.0,<12.14.1.0a0 - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 - bzip2 >=1.0.8,<2.0a0 - glog >=0.7.1,<0.8.0a0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libbrotlidec >=1.1.0,<1.2.0a0 - libbrotlienc >=1.1.0,<1.2.0a0 - libcxx >=19 - libgoogle-cloud >=2.39.0,<2.40.0a0 - libgoogle-cloud-storage >=2.39.0,<2.40.0a0 - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - orc >=2.2.0,<2.2.1.0a0 - snappy >=1.2.2,<1.3.0a0 - zstd >=1.5.7,<1.6.0a0 constrains: - apache-arrow-proc =*=cpu - arrow-cpp <0.0a0 - parquet-cpp <0.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 3875563 timestamp: 1754306669846 - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-21.0.0-h1f0de8a_1_cpu.conda build_number: 1 sha256: 69f65f8f2d52069d10f56977d94a319e011fd454d6363c6f7ad0ba04fd78608f md5: 044b0593fa1a4da73ff0bf8f733fff13 depends: - aws-crt-cpp >=0.33.1,<0.33.2.0a0 - aws-sdk-cpp >=1.11.606,<1.11.607.0a0 - bzip2 >=1.0.8,<2.0a0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libbrotlidec >=1.1.0,<1.2.0a0 - libbrotlienc >=1.1.0,<1.2.0a0 - libcrc32c >=1.1.2,<1.2.0a0 - libcurl >=8.14.1,<9.0a0 - libgoogle-cloud >=2.39.0,<2.40.0a0 - libgoogle-cloud-storage >=2.39.0,<2.40.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - orc >=2.2.0,<2.2.1.0a0 - snappy >=1.2.2,<1.3.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 constrains: - parquet-cpp <0.0a0 - apache-arrow-proc =*=cpu - arrow-cpp <0.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 3952816 timestamp: 1754308784286 - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-21.0.0-h635bf11_1_cpu.conda build_number: 1 sha256: a6cea060290460f05d01824fbff1a0bf222d2a167f41f34de20061e2156bb238 md5: 7d771db734f9878398a067622320f215 depends: - __glibc >=2.17,<3.0.a0 - libarrow 21.0.0 hb116c0f_1_cpu - libarrow-compute 21.0.0 he319acf_1_cpu - libgcc >=14 - libstdcxx >=14 license: Apache-2.0 license_family: APACHE purls: [] size: 658917 timestamp: 1754309565936 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-21.0.0-h926bc74_1_cpu.conda build_number: 1 sha256: 5aec27316a9b0a7a72a8a3a13debf118c96b52afe46b92ba0df4e21a4a474e43 md5: f5cb8b474cdffc96f24a9db6bc3a54e8 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libarrow 21.0.0 h20b3f57_1_cpu - libarrow-compute 21.0.0 hd5cd9ca_1_cpu - libcxx >=19 - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 502258 timestamp: 1754306915406 - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-21.0.0-h7d8d6a5_1_cpu.conda build_number: 1 sha256: f05b926fb5d2627af17a9bae21a9d6bd39d8cdb601341303c0153d5a90ccd38a md5: 1ca5bed722e8093e8688d02079fd55dc depends: - libarrow 21.0.0 h1f0de8a_1_cpu - libarrow-compute 21.0.0 h5929ab8_1_cpu - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: [] size: 456712 timestamp: 1754309147611 - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-21.0.0-he319acf_1_cpu.conda build_number: 1 sha256: 4cf9660007a0560a65cb0b00a9b75a33f6a82eb19b25b1399116c2b9f912fcc4 md5: 68f79e6ccb7b59caf81d4b4dc05c819e depends: - __glibc >=2.17,<3.0.a0 - libarrow 21.0.0 hb116c0f_1_cpu - libgcc >=14 - libre2-11 >=2024.7.2 - libstdcxx >=14 - libutf8proc >=2.10.0,<2.11.0a0 - re2 license: Apache-2.0 license_family: APACHE purls: [] size: 3130682 timestamp: 1754309430821 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-21.0.0-hd5cd9ca_1_cpu.conda build_number: 1 sha256: dc760ebe3248510ddbca1f8f0b47c8818effa5f37bb80a34d7b05f293136b44b md5: 39e68dea5090ed410f811f66dafb995d depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libarrow 21.0.0 h20b3f57_1_cpu - libcxx >=19 - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 - libre2-11 >=2024.7.2 - libutf8proc >=2.10.0,<2.11.0a0 - re2 license: Apache-2.0 license_family: APACHE purls: [] size: 2054589 timestamp: 1754306758491 - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-21.0.0-h5929ab8_1_cpu.conda build_number: 1 sha256: 69ec9c06506c44b814af3ba317c0344e16c8587c8093c039ffdef6fe8ec95b22 md5: 68fb423c9583960b2b22ad60de6f8713 depends: - libarrow 21.0.0 h1f0de8a_1_cpu - libre2-11 >=2024.7.2 - libutf8proc >=2.10.0,<2.11.0a0 - re2 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: [] size: 1771695 timestamp: 1754308915135 - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-21.0.0-h635bf11_1_cpu.conda build_number: 1 sha256: d52007f40895a97b8156cf825fe543315e5d6bbffe8886726c5baf80d7e6a7ef md5: 176c605545e097e18ef944a5de4ba448 depends: - __glibc >=2.17,<3.0.a0 - libarrow 21.0.0 hb116c0f_1_cpu - libarrow-acero 21.0.0 h635bf11_1_cpu - libarrow-compute 21.0.0 he319acf_1_cpu - libgcc >=14 - libparquet 21.0.0 h790f06f_1_cpu - libstdcxx >=14 license: Apache-2.0 license_family: APACHE purls: [] size: 632505 timestamp: 1754309654508 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-21.0.0-h926bc74_1_cpu.conda build_number: 1 sha256: 9ed01974909255b073d33c325fa73c63b1ed5312fd012e79e293e97556de08cc md5: 586de8d683807eac1138c670412320f1 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libarrow 21.0.0 h20b3f57_1_cpu - libarrow-acero 21.0.0 h926bc74_1_cpu - libarrow-compute 21.0.0 hd5cd9ca_1_cpu - libcxx >=19 - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - libparquet 21.0.0 h3402b2e_1_cpu - libprotobuf >=6.31.1,<6.31.2.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 503817 timestamp: 1754307039308 - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-21.0.0-h7d8d6a5_1_cpu.conda build_number: 1 sha256: 0769891179d7b720fe67b2927026993fd24c09741c660a4479f6ef005d8af7ec md5: eb65c566afc088bf28f4f015bc70a79a depends: - libarrow 21.0.0 h1f0de8a_1_cpu - libarrow-acero 21.0.0 h7d8d6a5_1_cpu - libarrow-compute 21.0.0 h5929ab8_1_cpu - libparquet 21.0.0 h24c48c9_1_cpu - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: [] size: 444452 timestamp: 1754309308586 - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-21.0.0-h3f74fd7_1_cpu.conda build_number: 1 sha256: fc63adbd275c979bed2f019aa5dbf6df3add635f79736cbc09436af7d2199fdb md5: 60dbe0df270e9680eb470add5913c32b depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libarrow 21.0.0 hb116c0f_1_cpu - libarrow-acero 21.0.0 h635bf11_1_cpu - libarrow-dataset 21.0.0 h635bf11_1_cpu - libgcc >=14 - libprotobuf >=6.31.1,<6.31.2.0a0 - libstdcxx >=14 license: Apache-2.0 license_family: APACHE purls: [] size: 514834 timestamp: 1754309685145 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-21.0.0-hb375905_1_cpu.conda build_number: 1 sha256: 054345ca3ce0adcafa77e7cea8b6a35773e97b54e58855e28f5b2d4b233ba157 md5: cb117c14b892aa032e3c9da72753e6ed depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libarrow 21.0.0 h20b3f57_1_cpu - libarrow-acero 21.0.0 h926bc74_1_cpu - libarrow-dataset 21.0.0 h926bc74_1_cpu - libcxx >=19 - libprotobuf >=6.31.1,<6.31.2.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 436811 timestamp: 1754307093598 - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-21.0.0-hf865cc0_1_cpu.conda build_number: 1 sha256: a108554fd7895eb245b52f4eb65ae377e9562a9938bef90774e74f71d1b8a1ef md5: 11889d3dcf0a07e372702463c7eb4a94 depends: - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libarrow 21.0.0 h1f0de8a_1_cpu - libarrow-acero 21.0.0 h7d8d6a5_1_cpu - libarrow-dataset 21.0.0 h7d8d6a5_1_cpu - libprotobuf >=6.31.1,<6.31.2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: [] size: 354156 timestamp: 1754309358342 - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda build_number: 34 sha256: 08a394ba934f68f102298259b150eb5c17a97c30c6da618e1baab4247366eab3 md5: 064c22bac20fecf2a99838f9b979374c depends: - libopenblas >=0.3.30,<0.3.31.0a0 - libopenblas >=0.3.30,<1.0a0 constrains: - mkl <2025 - blas 2.134 openblas - liblapacke 3.9.0 34*_openblas - libcblas 3.9.0 34*_openblas - liblapack 3.9.0 34*_openblas license: BSD-3-Clause license_family: BSD purls: [] size: 19306 timestamp: 1754678416811 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda build_number: 34 sha256: 5de3c3bfcdc8ba05da1a7815c9953fe392c2065d9efdc2491f91df6d0d1d9e76 md5: cdb3e1ca1661dbf19f9aad7dad524996 depends: - libopenblas >=0.3.30,<0.3.31.0a0 - libopenblas >=0.3.30,<1.0a0 constrains: - blas 2.134 openblas - mkl <2025 - liblapacke 3.9.0 34*_openblas - libcblas 3.9.0 34*_openblas - liblapack 3.9.0 34*_openblas license: BSD-3-Clause license_family: BSD purls: [] size: 19533 timestamp: 1754678956963 - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda build_number: 34 sha256: d7865fcc7d29b22e4111ababec49083851a84bb3025748eed65184be765b6e7d md5: a64dcde5f27b8e0e413ddfc56151664c depends: - mkl >=2024.2.2,<2025.0a0 constrains: - libcblas 3.9.0 34*_mkl - liblapacke 3.9.0 34*_mkl - blas 2.134 mkl - liblapack 3.9.0 34*_mkl license: BSD-3-Clause license_family: BSD purls: [] size: 70548 timestamp: 1754682440057 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb03c661_4.conda sha256: 2338a92d1de71f10c8cf70f7bb9775b0144a306d75c4812276749f54925612b6 md5: 1d29d2e33fe59954af82ef54a8af3fe1 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: MIT purls: [] size: 69333 timestamp: 1756599354727 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-h6caf38d_4.conda sha256: 023b609ecc35bfee7935d65fcc5aba1a3ba6807cbba144a0730198c0914f7c79 md5: 231cffe69d41716afe4525c5c1cc5ddd depends: - __osx >=11.0 license: MIT purls: [] size: 68938 timestamp: 1756599687687 - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-hfd05255_4.conda sha256: 65d0aaf1176761291987f37c8481be132060cc3dbe44b1550797bc27d1a0c920 md5: 58aec7a295039d8614175eae3a4f8778 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT purls: [] size: 71243 timestamp: 1756599708777 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb03c661_4.conda sha256: fcec0d26f67741b122f0d5eff32f0393d7ebd3ee6bb866ae2f17f3425a850936 md5: 5cb5a1c9a94a78f5b23684bcb845338d depends: - __glibc >=2.17,<3.0.a0 - libbrotlicommon 1.1.0 hb03c661_4 - libgcc >=14 license: MIT purls: [] size: 33406 timestamp: 1756599364386 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-h6caf38d_4.conda sha256: 7f1cf83a00a494185fc087b00c355674a0f12e924b1b500d2c20519e98fdc064 md5: cb7e7fe96c9eee23a464afd57648d2cd depends: - __osx >=11.0 - libbrotlicommon 1.1.0 h6caf38d_4 license: MIT purls: [] size: 29015 timestamp: 1756599708339 - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-hfd05255_4.conda sha256: aa03aff197ed503e38145d0d0f17c30382ac1c6d697535db24c98c272ef57194 md5: bf0ced5177fec8c18a7b51d568590b7c depends: - libbrotlicommon 1.1.0 hfd05255_4 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT purls: [] size: 33430 timestamp: 1756599740173 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb03c661_4.conda sha256: d42c7f0afce21d5279a0d54ee9e64a2279d35a07a90e0c9545caae57d6d7dc57 md5: 2e55011fa483edb8bfe3fd92e860cd79 depends: - __glibc >=2.17,<3.0.a0 - libbrotlicommon 1.1.0 hb03c661_4 - libgcc >=14 license: MIT purls: [] size: 289680 timestamp: 1756599375485 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-h6caf38d_4.conda sha256: a2f2c1c2369360147c46f48124a3a17f5122e78543275ff9788dc91a1d5819dc md5: 4ce5651ae5cd6eebc5899f9bfe0eac3c depends: - __osx >=11.0 - libbrotlicommon 1.1.0 h6caf38d_4 license: MIT purls: [] size: 275791 timestamp: 1756599724058 - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-hfd05255_4.conda sha256: a593cde3e728a1e0486a19537846380e3ce90ae9d6c22c1412466a49474eeeed md5: 37f4669f8ac2f04d826440a8f3f42300 depends: - libbrotlicommon 1.1.0 hfd05255_4 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT purls: [] size: 245418 timestamp: 1756599770744 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda build_number: 34 sha256: edde454897c7889c0323216516abb570a593de728c585b14ef41eda2b08ddf3a md5: 148b531b5457ad666ed76ceb4c766505 depends: - libblas 3.9.0 34_h59b9bed_openblas constrains: - liblapacke 3.9.0 34*_openblas - blas 2.134 openblas - liblapack 3.9.0 34*_openblas license: BSD-3-Clause license_family: BSD purls: [] size: 19313 timestamp: 1754678426220 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda build_number: 34 sha256: 6639f6c6b2e76cb1be62cd6d9033bda7dc3fab2e5a80f5be4b5c522c27dcba17 md5: e15018d609b8957c146dcb6c356dd50c depends: - libblas 3.9.0 34_h10e41b3_openblas constrains: - liblapack 3.9.0 34*_openblas - blas 2.134 openblas - liblapacke 3.9.0 34*_openblas license: BSD-3-Clause license_family: BSD purls: [] size: 19521 timestamp: 1754678970336 - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda build_number: 34 sha256: e9f31d44e668822f6420bfaeda4aa74cd6c60d3671cf0b00262867f36ad5a8c1 md5: 25a019872ff471af70fd76d9aaaf1313 depends: - libblas 3.9.0 34_h5709861_mkl constrains: - liblapacke 3.9.0 34*_mkl - blas 2.134 mkl - liblapack 3.9.0 34*_mkl license: BSD-3-Clause license_family: BSD purls: [] size: 70700 timestamp: 1754682490395 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 md5: c965a5aa0d5c1c37ffc62dff36e28400 depends: - libgcc-ng >=9.4.0 - libstdcxx-ng >=9.4.0 license: BSD-3-Clause license_family: BSD purls: [] size: 20440 timestamp: 1633683576494 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 md5: 32bd82a6a625ea6ce090a81c3d34edeb depends: - libcxx >=11.1.0 license: BSD-3-Clause license_family: BSD purls: [] size: 18765 timestamp: 1633683992603 - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 sha256: 75e60fbe436ba8a11c170c89af5213e8bec0418f88b7771ab7e3d9710b70c54e md5: cd4cc2d0c610c8cb5419ccc979f2d6ce depends: - vc >=14.1,<15.0a0 - vs2015_runtime >=14.16.27012 license: BSD-3-Clause license_family: BSD purls: [] size: 25694 timestamp: 1633684287072 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda sha256: b6c5cf340a4f80d70d64b3a29a7d9885a5918d16a5cb952022820e6d3e79dc8b md5: 45f6713cb00f124af300342512219182 depends: - __glibc >=2.17,<3.0.a0 - krb5 >=1.21.3,<1.22.0a0 - libgcc >=13 - libnghttp2 >=1.64.0,<2.0a0 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.0,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT purls: [] size: 449910 timestamp: 1749033146806 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.14.1-h73640d1_0.conda sha256: 0055b68137309db41ec34c938d95aec71d1f81bd9d998d5be18f32320c3ccba0 md5: 1af57c823803941dfc97305248a56d57 depends: - __osx >=11.0 - krb5 >=1.21.3,<1.22.0a0 - libnghttp2 >=1.64.0,<2.0a0 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.0,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT purls: [] size: 403456 timestamp: 1749033320430 - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.14.1-h88aaa65_0.conda sha256: b2cface2cf35d8522289df7fffc14370596db6f6dc481cc1b6ca313faeac19d8 md5: 836b9c08f34d2017dbcaec907c6a1138 depends: - krb5 >=1.21.3,<1.22.0a0 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: curl license_family: MIT purls: [] size: 368346 timestamp: 1749033492826 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.0-hf598326_0.conda sha256: c5402b30a8cfea36b0840000d35f552bce38165998bcf889c3b906f2e5381b7b md5: 6ac838f95f65ad0e7e479ab25c6ce805 depends: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] size: 569673 timestamp: 1756606338415 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda sha256: 8420748ea1cc5f18ecc5068b4f24c7a023cc9b20971c99c824ba10641fb95ddf md5: 64f0c503da58ec25ebd359e4d990afa8 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: MIT license_family: MIT purls: [] size: 72573 timestamp: 1747040452262 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.24-h5773f1b_0.conda sha256: 417d52b19c679e1881cce3f01cad3a2d542098fa2d6df5485aac40f01aede4d1 md5: 3baf58a5a87e7c2f4d243ce2f8f2fe5c depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] size: 54790 timestamp: 1747040549847 - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.24-h76ddb4d_0.conda sha256: 65347475c0009078887ede77efe60db679ea06f2b56f7853b9310787fe5ad035 md5: 08d988e266c6ae77e03d164b83786dc4 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT purls: [] size: 156292 timestamp: 1747040812624 - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 md5: c277e0a4d549b03ac1e9d6cbbe3d017b depends: - ncurses - __glibc >=2.17,<3.0.a0 - libgcc >=13 - ncurses >=6.5,<7.0a0 license: BSD-2-Clause license_family: BSD purls: [] size: 134676 timestamp: 1738479519902 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 md5: 44083d2d2c2025afca315c7a172eab2b depends: - ncurses - __osx >=11.0 - ncurses >=6.5,<7.0a0 license: BSD-2-Clause license_family: BSD purls: [] size: 107691 timestamp: 1738479560845 - conda: 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 purls: [] size: 112766 timestamp: 1702146165126 - conda: 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 purls: [] size: 107458 timestamp: 1702146414478 - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 md5: a1cfcc585f0c42bf8d5546bb1dfb668d depends: - libgcc-ng >=12 - openssl >=3.1.1,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 427426 timestamp: 1685725977222 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 md5: 1a109764bff3bdc7bdd84088347d71dc depends: - openssl >=3.1.1,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 368167 timestamp: 1685726248899 - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda sha256: af03882afb7a7135288becf340c2f0cf8aa8221138a9a7b108aaeb308a486da1 md5: 25efbd786caceef438be46da78a7b5ef depends: - openssl >=3.1.1,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: [] size: 410555 timestamp: 1685726568668 - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda sha256: da2080da8f0288b95dd86765c801c6e166c4619b910b11f9a8446fb852438dc2 md5: 4211416ecba1866fab0c6470986c22d6 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - expat 2.7.1.* license: MIT license_family: MIT purls: [] size: 74811 timestamp: 1752719572741 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda sha256: 8fbb17a56f51e7113ed511c5787e0dec0d4b10ef9df921c4fd1cccca0458f648 md5: b1ca5f21335782f71a8bd69bdc093f67 depends: - __osx >=11.0 constrains: - expat 2.7.1.* license: MIT license_family: MIT purls: [] size: 65971 timestamp: 1752719657566 - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda sha256: 8432ca842bdf8073ccecf016ccc9140c41c7114dc4ec77ca754551c01f780845 md5: 3608ffde260281fa641e70d6e34b1b96 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - expat 2.7.1.* license: MIT license_family: MIT purls: [] size: 141322 timestamp: 1752719767870 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab md5: ede4673863426c0883c0063d853bbd85 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: MIT license_family: MIT purls: [] size: 57433 timestamp: 1743434498161 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda sha256: c6a530924a9b14e193ea9adfe92843de2a806d1b7dbfd341546ece9653129e60 md5: c215a60c2935b517dcda8cad4705734d depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] size: 39839 timestamp: 1743434670405 - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda sha256: d3b0b8812eab553d3464bbd68204f007f1ebadf96ce30eb0cbc5159f72e353f5 md5: 85d8fa5e55ed8f93f874b3b23ed54ec6 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT purls: [] size: 44978 timestamp: 1743435053850 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda sha256: 7be9b3dac469fe3c6146ff24398b685804dfc7a1de37607b84abd076f57cc115 md5: 51f5be229d83ecd401fb369ab96ae669 depends: - libfreetype6 >=2.13.3 license: GPL-2.0-only OR FTL purls: [] size: 7693 timestamp: 1745369988361 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.13.3-hce30654_1.conda sha256: 1f8c16703fe333cdc2639f7cdaf677ac2120843453222944a7c6c85ec342903c md5: d06282e08e55b752627a707d58779b8f depends: - libfreetype6 >=2.13.3 license: GPL-2.0-only OR FTL purls: [] size: 7813 timestamp: 1745370144506 - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.13.3-h57928b3_1.conda sha256: e5bc7d0a8d11b7b234da4fcd9d78f297f7dec3fec8bd06108fd3ac7b2722e32e md5: 410ba2c8e7bdb278dfbb5d40220e39d2 depends: - libfreetype6 >=2.13.3 license: GPL-2.0-only OR FTL purls: [] size: 8159 timestamp: 1745370227235 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda sha256: 7759bd5c31efe5fbc36a7a1f8ca5244c2eabdbeb8fc1bee4b99cf989f35c7d81 md5: 3c255be50a506c50765a93a6644f32fe depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libpng >=1.6.47,<1.7.0a0 - libzlib >=1.3.1,<2.0a0 constrains: - freetype >=2.13.3 license: GPL-2.0-only OR FTL purls: [] size: 380134 timestamp: 1745369987697 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.13.3-h1d14073_1.conda sha256: c278df049b1a071841aa0aca140a338d087ea594e07dcf8a871d2cfe0e330e75 md5: b163d446c55872ef60530231879908b9 depends: - __osx >=11.0 - libpng >=1.6.47,<1.7.0a0 - libzlib >=1.3.1,<2.0a0 constrains: - freetype >=2.13.3 license: GPL-2.0-only OR FTL purls: [] size: 333529 timestamp: 1745370142848 - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.13.3-h0b5ce68_1.conda sha256: 61308653e7758ff36f80a60d598054168a1389ddfbac46d7864c415fafe18e69 md5: a84b7d1a13060a9372bea961a8131dbc depends: - libpng >=1.6.47,<1.7.0a0 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - freetype >=2.13.3 license: GPL-2.0-only OR FTL purls: [] size: 337007 timestamp: 1745370226578 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda sha256: 144e35c1c2840f2dc202f6915fc41879c19eddbb8fa524e3ca4aa0d14018b26f md5: f406dcbb2e7bef90d793e50e79a2882b depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 constrains: - libgcc-ng ==15.1.0=*_4 - libgomp 15.1.0 h767d61c_4 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 824153 timestamp: 1753903866511 - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.1.0-h1383e82_4.conda sha256: c169606e148f8df3375fdc9fe76ee3f44b8ffc2515e8131ede8f2d75cf7d6f0c md5: 59fe76f0ff39b512ff889459b9fc3054 depends: - _openmp_mutex >=4.5 - libwinpthread >=12.0.0.r4.gg4f2fc60ca constrains: - msys2-conda-epoch <0.0a0 - libgcc-ng ==15.1.0=*_4 - libgomp 15.1.0 h1383e82_4 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 668220 timestamp: 1753904114303 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda sha256: 76ceac93ed98f208363d6e9c75011b0ff7b97b20f003f06461a619557e726637 md5: 28771437ffcd9f3417c66012dc49a3be depends: - libgcc 15.1.0 h767d61c_4 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 29249 timestamp: 1753903872571 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda sha256: 2fe41683928eb3c57066a60ec441e605a69ce703fc933d6d5167debfeba8a144 md5: 53e876bc2d2648319e94c33c57b9ec74 depends: - libgfortran5 15.1.0 hcea5267_4 constrains: - libgfortran-ng ==15.1.0=*_4 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 29246 timestamp: 1753903898593 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.1.0-hfdf1602_1.conda sha256: 981e3fac416e80b007a2798d6c1d4357ebebeb72a039aca1fb3a7effe9dcae86 md5: c98207b6e2b1a309abab696d229f163e depends: - libgfortran5 15.1.0 hb74de2c_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 134383 timestamp: 1756239485494 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda sha256: 3070e5e2681f7f2fb7af0a81b92213f9ab430838900da8b4f9b8cf998ddbdd84 md5: 8a4ab7ff06e4db0be22485332666da0f depends: - __glibc >=2.17,<3.0.a0 - libgcc >=15.1.0 constrains: - libgfortran 15.1.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 1564595 timestamp: 1753903882088 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_1.conda sha256: 1f8f5b2fdd0d2559d0f3bade8da8f57e9ee9b54685bd6081c6d6d9a2b0239b41 md5: 4281bd1c654cb4f5cab6392b3330451f depends: - llvm-openmp >=8.0.0 constrains: - libgfortran 15.1.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 759679 timestamp: 1756238772083 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda sha256: e0487a8fec78802ac04da0ac1139c3510992bc58a58cde66619dde3b363c2933 md5: 3baf8976c96134738bba224e9ef6b1e5 depends: - __glibc >=2.17,<3.0.a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 447289 timestamp: 1753903801049 - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.1.0-h1383e82_4.conda sha256: e4ce8693bc3250b98cbc41cc53116fb27ad63eaf851560758e8ccaf0e9b137aa md5: 78582ad1a764f4a0dca2f3027a46cc5a depends: - libwinpthread >=12.0.0.r4.gg4f2fc60ca constrains: - msys2-conda-epoch <0.0a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 535125 timestamp: 1753904060607 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.39.0-hdb79228_0.conda sha256: d3341cf69cb02c07bbd1837968f993da01b7bd467e816b1559a3ca26c1ff14c5 md5: a2e30ccd49f753fd30de0d30b1569789 depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libcurl >=8.14.1,<9.0a0 - libgcc >=14 - libgrpc >=1.73.1,<1.74.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 - libstdcxx >=14 - openssl >=3.5.1,<4.0a0 constrains: - libgoogle-cloud 2.39.0 *_0 license: Apache-2.0 license_family: Apache purls: [] size: 1307909 timestamp: 1752048413383 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.39.0-head0a95_0.conda sha256: 209facdb8ea5b68163f146525720768fa3191cef86c82b2538e8c3cafa1e9dd4 md5: ad7272a081abe0966d0297691154eda5 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libcurl >=8.14.1,<9.0a0 - libcxx >=19 - libgrpc >=1.73.1,<1.74.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 - openssl >=3.5.1,<4.0a0 constrains: - libgoogle-cloud 2.39.0 *_0 license: Apache-2.0 license_family: Apache purls: [] size: 876283 timestamp: 1752047598741 - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-2.39.0-h19ee442_0.conda sha256: 8f5b26e9ea985c819a67e41664da82219534f9b9c8ba190f7d3c440361e5accb md5: c2c512f98c5c666782779439356a1713 depends: - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libcurl >=8.14.1,<9.0a0 - libgrpc >=1.73.1,<1.74.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - libgoogle-cloud 2.39.0 *_0 license: Apache-2.0 license_family: Apache purls: [] size: 14952 timestamp: 1752049549178 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.39.0-hdbdcf42_0.conda sha256: 59eb8365f0aee384f2f3b2a64dcd454f1a43093311aa5f21a8bb4bd3c79a6db8 md5: bd21962ff8a9d1ce4720d42a35a4af40 depends: - __glibc >=2.17,<3.0.a0 - libabseil - libcrc32c >=1.1.2,<1.2.0a0 - libcurl - libgcc >=14 - libgoogle-cloud 2.39.0 hdb79228_0 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - openssl license: Apache-2.0 license_family: Apache purls: [] size: 804189 timestamp: 1752048589800 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.39.0-hfa3a374_0.conda sha256: a5160c23b8b231b88d0ff738c7f52b0ee703c4c0517b044b18f4d176e729dfd8 md5: 147a468b9b6c3ced1fccd69b864ae289 depends: - __osx >=11.0 - libabseil - libcrc32c >=1.1.2,<1.2.0a0 - libcurl - libcxx >=19 - libgoogle-cloud 2.39.0 head0a95_0 - libzlib >=1.3.1,<2.0a0 - openssl license: Apache-2.0 license_family: Apache purls: [] size: 525153 timestamp: 1752047915306 - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-2.39.0-he04ea4c_0.conda sha256: 51c29942d9bb856081605352ac74c45cad4fedbaac89de07c74efb69a3be9ab3 md5: 26198e3dc20bbcbea8dd6fa5ab7ea1e0 depends: - libabseil - libcrc32c >=1.1.2,<1.2.0a0 - libcurl - libgoogle-cloud 2.39.0 h19ee442_0 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache purls: [] size: 14904 timestamp: 1752049852815 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.73.1-h1e535eb_0.conda sha256: f91e61159bf2cb340884ec92dd6ba42a620f0f73b68936507a7304b7d8445709 md5: 8075d8550f773a17288c7ec2cf2f2d56 depends: - __glibc >=2.17,<3.0.a0 - c-ares >=1.34.5,<2.0a0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libgcc >=13 - libprotobuf >=6.31.1,<6.31.2.0a0 - libre2-11 >=2024.7.2 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.1,<4.0a0 - re2 constrains: - grpc-cpp =1.73.1 license: Apache-2.0 license_family: APACHE purls: [] size: 8408884 timestamp: 1751746547271 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.73.1-hcdac78c_0.conda sha256: d12b3b89a2c2f9b5e90be87495e8c97ee56bb47aa7061e13747b41b10759ad8f md5: 32fbcf10c4d9982e1cfec578a333def1 depends: - __osx >=11.0 - c-ares >=1.34.5,<2.0a0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libcxx >=18 - libprotobuf >=6.31.1,<6.31.2.0a0 - libre2-11 >=2024.7.2 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.1,<4.0a0 - re2 constrains: - grpc-cpp =1.73.1 license: Apache-2.0 license_family: APACHE purls: [] size: 4618885 timestamp: 1751705260982 - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.73.1-h04afb49_0.conda sha256: a32f3b4f0fc7d9613cf18e8e1235796e15cd99749bdee97a94c1ce773fd98f43 md5: 9adc6511fdf045fbd7096ecd1fc534dd depends: - c-ares >=1.34.5,<2.0a0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 - libre2-11 >=2024.7.2 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.1,<4.0a0 - re2 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - grpc-cpp =1.73.1 license: Apache-2.0 license_family: APACHE purls: [] size: 14615824 timestamp: 1751707257545 - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h88281d1_1000.conda sha256: 2fb437b82912c74b4869b66c601d52c77bb3ee8cb4812eab346d379f1c823225 md5: e6298294e7612eccf57376a0683ddc80 depends: - libwinpthread >=12.0.0.r4.gg4f2fc60ca - libxml2 >=2.13.8,<2.14.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: [] size: 2412139 timestamp: 1752762145331 - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f md5: 915f5995e94f60e9a4826e0b0920ee88 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: LGPL-2.1-only purls: [] size: 790176 timestamp: 1754908768807 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 md5: 4d5a7445f0b25b6a3ddbb56e790f5251 depends: - __osx >=11.0 license: LGPL-2.1-only purls: [] size: 750379 timestamp: 1754909073836 - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7 md5: 64571d1dd6cdcfa25d0664a5950fdaa2 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LGPL-2.1-only purls: [] size: 696926 timestamp: 1754909290005 - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda sha256: 98b399287e27768bf79d48faba8a99a2289748c65cd342ca21033fab1860d4a4 md5: 9fa334557db9f63da6c9285fd2a48638 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib purls: [] size: 628947 timestamp: 1745268527144 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.0-h5505292_0.conda sha256: 78df2574fa6aa5b6f5fc367c03192f8ddf8e27dc23641468d54e031ff560b9d4 md5: 01caa4fbcaf0e6b08b3aef1151e91745 depends: - __osx >=11.0 constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib purls: [] size: 553624 timestamp: 1745268405713 - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.0-h2466b09_0.conda sha256: e61b0adef3028b51251124e43eb6edf724c67c0f6736f1628b02511480ac354e md5: 7c51d27540389de84852daa1cdb9c63c depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib purls: [] size: 838154 timestamp: 1745268437136 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda build_number: 34 sha256: 9c941d5da239f614b53065bc5f8a705899326c60c9f349d9fbd7bd78298f13ab md5: f05a31377b4d9a8d8740f47d1e70b70e depends: - libblas 3.9.0 34_h59b9bed_openblas constrains: - liblapacke 3.9.0 34*_openblas - libcblas 3.9.0 34*_openblas - blas 2.134 openblas license: BSD-3-Clause license_family: BSD purls: [] size: 19324 timestamp: 1754678435277 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda build_number: 34 sha256: 659c7cc2d7104c5fa33482d28a6ce085fd116ff5625a117b7dd45a3521bf8efc md5: 94b13d05122e301de02842d021eea5fb depends: - libblas 3.9.0 34_h10e41b3_openblas constrains: - libcblas 3.9.0 34*_openblas - blas 2.134 openblas - liblapacke 3.9.0 34*_openblas license: BSD-3-Clause license_family: BSD purls: [] size: 19532 timestamp: 1754678979401 - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-34_hf9ab0e9_mkl.conda build_number: 34 sha256: c65298d584551cba1b7a42537f8e0093ec9fd0e871fc80ddf9cf6ffa0efa25ae md5: ba80d9feadfbafceafb0bf46d35f5886 depends: - libblas 3.9.0 34_h5709861_mkl constrains: - libcblas 3.9.0 34*_mkl - liblapacke 3.9.0 34*_mkl - blas 2.134 mkl license: BSD-3-Clause license_family: BSD purls: [] size: 82224 timestamp: 1754682540087 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 md5: 1a580f7796c7bf6393fddb8bbbde58dc depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 constrains: - xz 5.8.1.* license: 0BSD purls: [] size: 112894 timestamp: 1749230047870 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 md5: d6df911d4564d77c4374b02552cb17d1 depends: - __osx >=11.0 constrains: - xz 5.8.1.* license: 0BSD purls: [] size: 92286 timestamp: 1749230283517 - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc md5: c15148b2e18da456f5108ccb5e411446 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - xz 5.8.1.* license: 0BSD purls: [] size: 104935 timestamp: 1749230611612 - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee md5: c7e925f37e3b40d893459e625f6a53f1 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: BSD-2-Clause license_family: BSD purls: [] size: 91183 timestamp: 1748393666725 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda sha256: 0a1875fc1642324ebd6c4ac864604f3f18f57fbcf558a8264f6ced028a3c75b2 md5: 85ccccb47823dd9f7a99d2c7f530342f depends: - __osx >=11.0 license: BSD-2-Clause license_family: BSD purls: [] size: 71829 timestamp: 1748393749336 - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf md5: 74860100b2029e2523cf480804c76b9b depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-2-Clause license_family: BSD purls: [] size: 88657 timestamp: 1723861474602 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda sha256: ad260036929255d8089f748db0dce193d0d588ad7f88c06027dd9d8662cc1cc6 md5: 5f05af73150f62adab1492ab2d18d573 depends: - __glibc >=2.17,<3.0.a0 - blosc >=1.21.6,<2.0a0 - bzip2 >=1.0.8,<2.0a0 - hdf4 >=4.2.15,<4.2.16.0a0 - hdf5 >=1.14.6,<1.14.7.0a0 - libaec >=1.1.4,<2.0a0 - libcurl >=8.14.1,<9.0a0 - libgcc >=14 - libstdcxx >=14 - libxml2 >=2.13.8,<2.14.0a0 - libzip >=1.11.2,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.1,<4.0a0 - zlib - zstd >=1.5.7,<1.6.0a0 license: MIT license_family: MIT purls: [] size: 844115 timestamp: 1754055003755 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.9.2-nompi_h2d3d5cf_118.conda sha256: e7ca7726e94ef56e96ef7e5a89b23971188b2b54e1b660ed1c200593cc0ae055 md5: ed5b74ff627e6cb6d7ab1c3ef7e3baf8 depends: - __osx >=11.0 - blosc >=1.21.6,<2.0a0 - bzip2 >=1.0.8,<2.0a0 - hdf4 >=4.2.15,<4.2.16.0a0 - hdf5 >=1.14.6,<1.14.7.0a0 - libaec >=1.1.4,<2.0a0 - libcurl >=8.14.1,<9.0a0 - libcxx >=19 - libxml2 >=2.13.8,<2.14.0a0 - libzip >=1.11.2,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.1,<4.0a0 - zlib - zstd >=1.5.7,<1.6.0a0 license: MIT license_family: MIT purls: [] size: 683396 timestamp: 1754055262589 - conda: https://conda.anaconda.org/conda-forge/win-64/libnetcdf-4.9.2-nompi_ha45073a_118.conda sha256: f179694134c0d0ebc600f1ef0d6797c17a894fea8f089a91db6e7bc04e467b76 md5: 54557b761dc20f53f504271208cd88c7 depends: - blosc >=1.21.6,<2.0a0 - bzip2 >=1.0.8,<2.0a0 - hdf4 >=4.2.15,<4.2.16.0a0 - hdf5 >=1.14.6,<1.14.7.0a0 - libaec >=1.1.4,<2.0a0 - libcurl >=8.14.1,<9.0a0 - libxml2 >=2.13.8,<2.14.0a0 - libzip >=1.11.2,<2.0a0 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - zlib - zstd >=1.5.7,<1.6.0a0 license: MIT license_family: MIT purls: [] size: 626420 timestamp: 1754055160171 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 md5: 19e57602824042dfd0446292ef90488b depends: - __glibc >=2.17,<3.0.a0 - c-ares >=1.32.3,<2.0a0 - libev >=4.33,<4.34.0a0 - libev >=4.33,<5.0a0 - libgcc >=13 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - openssl >=3.3.2,<4.0a0 license: MIT license_family: MIT purls: [] size: 647599 timestamp: 1729571887612 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f md5: 3408c02539cee5f1141f9f11450b6a51 depends: - __osx >=11.0 - c-ares >=1.34.2,<2.0a0 - libcxx >=17 - libev >=4.33,<4.34.0a0 - libev >=4.33,<5.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.3.2,<4.0a0 license: MIT license_family: MIT purls: [] size: 566719 timestamp: 1729572385640 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 md5: d864d34357c3b65a4b731f78c0801dc4 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: LGPL-2.1-only license_family: GPL purls: [] size: 33731 timestamp: 1750274110928 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda sha256: 1b51d1f96e751dc945cc06f79caa91833b0c3326efe24e9b506bd64ef49fc9b0 md5: dfc5aae7b043d9f56ba99514d5e60625 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 constrains: - openblas >=0.3.30,<0.3.31.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 5938936 timestamp: 1755474342204 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_2.conda sha256: 7b8551a4d21cf0b19f9a162f1f283a201b17f1bd5a6579abbd0d004788c511fa md5: d004259fd8d3d2798b16299d6ad6c9e9 depends: - __osx >=11.0 - libgfortran - libgfortran5 >=14.3.0 - llvm-openmp >=19.1.7 constrains: - openblas >=0.3.30,<0.3.31.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 4284696 timestamp: 1755471861128 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.21.0-hb9b0907_1.conda sha256: ba9b09066f9abae9b4c98ffedef444bbbf4c068a094f6c77d70ef6f006574563 md5: 1c0320794855f457dea27d35c4c71e23 depends: - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libcurl >=8.14.1,<9.0a0 - libgrpc >=1.73.1,<1.74.0a0 - libopentelemetry-cpp-headers 1.21.0 ha770c72_1 - libprotobuf >=6.31.1,<6.31.2.0a0 - libzlib >=1.3.1,<2.0a0 - nlohmann_json - prometheus-cpp >=1.3.0,<1.4.0a0 constrains: - cpp-opentelemetry-sdk =1.21.0 license: Apache-2.0 license_family: APACHE purls: [] size: 885397 timestamp: 1751782709380 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.21.0-he15edb5_1.conda sha256: 4bf8f703ddd140fe54d4c8464ac96b28520fbc1083cce52c136a85a854745d5c md5: cbcea547d6d831863ab0a4e164099062 depends: - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libcurl >=8.14.1,<9.0a0 - libgrpc >=1.73.1,<1.74.0a0 - libopentelemetry-cpp-headers 1.21.0 hce30654_1 - libprotobuf >=6.31.1,<6.31.2.0a0 - libzlib >=1.3.1,<2.0a0 - nlohmann_json - prometheus-cpp >=1.3.0,<1.4.0a0 constrains: - cpp-opentelemetry-sdk =1.21.0 license: Apache-2.0 license_family: APACHE purls: [] size: 564609 timestamp: 1751782939921 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.21.0-ha770c72_1.conda sha256: b3a1b36d5f92fbbfd7b6426982a99561bdbd7e4adbafca1b7f127c9a5ab0a60f md5: 9e298d76f543deb06eb0f3413675e13a license: Apache-2.0 license_family: APACHE purls: [] size: 363444 timestamp: 1751782679053 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.21.0-hce30654_1.conda sha256: ce74278453dec1e3c11158ec368c8f1b03862e279b63f79ed01f38567a1174e6 md5: c7df4b2d612208f3a27486c113b6aefc license: Apache-2.0 license_family: APACHE purls: [] size: 363213 timestamp: 1751782889359 - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-21.0.0-h790f06f_1_cpu.conda build_number: 1 sha256: d34b06ac43035456ba865aa91480fbecbba9ba8f3b571ba436616eeaec287973 md5: 74b7bdad69ba0ecae4524fbc6286a500 depends: - __glibc >=2.17,<3.0.a0 - libarrow 21.0.0 hb116c0f_1_cpu - libgcc >=14 - libstdcxx >=14 - libthrift >=0.22.0,<0.22.1.0a0 - openssl >=3.5.1,<4.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 1368049 timestamp: 1754309534709 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-21.0.0-h3402b2e_1_cpu.conda build_number: 1 sha256: 0e2026fb72df2ac4d01d8a942a1f4c46ff7bdb1633ebc4ba7a96d1728528d30c md5: 9c638f296376aab412eda99c9f202fc7 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libarrow 21.0.0 h20b3f57_1_cpu - libcxx >=19 - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 - libthrift >=0.22.0,<0.22.1.0a0 - openssl >=3.5.1,<4.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 976924 timestamp: 1754306880140 - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-21.0.0-h24c48c9_1_cpu.conda build_number: 1 sha256: 96693693bd928563949565435981e53df6b597e5ce056c32d12655d2d9ab7275 md5: 4fa99106ece76469570885afc8a962c7 depends: - libarrow 21.0.0 h1f0de8a_1_cpu - libthrift >=0.22.0,<0.22.1.0a0 - openssl >=3.5.1,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: [] size: 909390 timestamp: 1754309097970 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda sha256: e75a2723000ce3a4b9fd9b9b9ce77553556c93e475a4657db6ed01abc02ea347 md5: 7af8e91b0deb5f8e25d1a595dea79614 depends: - libgcc >=14 - __glibc >=2.17,<3.0.a0 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement purls: [] size: 317390 timestamp: 1753879899951 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda sha256: a2e0240fb0c79668047b528976872307ea80cb330baf8bf6624ac2c6443449df md5: 4d0f5ce02033286551a32208a5519884 depends: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement purls: [] size: 287056 timestamp: 1753879907258 - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.50-h7351971_1.conda sha256: e84b041f91c94841cb9b97952ab7f058d001d4a15ed4ce226ec5fdb267cc0fa5 md5: 3ae6e9f5c47c495ebeed95651518be61 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement purls: [] size: 382709 timestamp: 1753879944850 - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h9ef548d_1.conda sha256: b2a62237203a9f4d98bedb2dfc87b548cc7cede151f65589ced1e687a1c3f3b1 md5: b92e2a26764fcadb4304add7e698ccf2 depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libgcc >=13 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 4015243 timestamp: 1751690262221 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.31.1-h702a38d_1.conda sha256: 4f1cb41130b7772071a1b10654a825168515fd83d229c1752b90a3fd9d9f0c6b md5: 16c4f075e63a1f497aa392f843d81f96 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libcxx >=18 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 3044706 timestamp: 1751689138445 - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.31.1-hdcda5b4_1.conda sha256: 085b55d51328c8fcd6aef15f717a21d921bf8df1db2adfa81036e041a0609cd4 md5: f046835750b70819a1e2fffddf111825 depends: - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: [] size: 7615542 timestamp: 1751690551169 - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.07.22-h7b12aa8_0.conda sha256: 3d6c77dd6ce9b3d0c7db4bff668d2c2c337c42dc71a277ee587b30f9c4471fc7 md5: f9ad3f5d2eb40a8322d4597dca780d82 depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libgcc >=14 - libstdcxx >=14 constrains: - re2 2025.07.22.* license: BSD-3-Clause license_family: BSD purls: [] size: 210939 timestamp: 1753295040247 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.07.22-hb7c0934_0.conda sha256: b1375fc448e389d60e835a38ede1758950530a9bdcc652a48b5e7872a43b6080 md5: e87a3f87fcbab723929e4ef0e60721f3 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libcxx >=19 constrains: - re2 2025.07.22.* license: BSD-3-Clause license_family: BSD purls: [] size: 165876 timestamp: 1753295135782 - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.07.22-h0eb2380_0.conda sha256: 9f00fa38819740105783c13bca21dc091a687004ade0a334ac458d7b8cf6deec md5: 4b7ddadb9c8e45ba0b9e132af55a8372 depends: - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - re2 2025.07.22.* license: BSD-3-Clause license_family: BSD purls: [] size: 264048 timestamp: 1753295554213 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 md5: a587892d3c13b6621a6091be690dbca2 depends: - libgcc-ng >=12 license: ISC purls: [] size: 205978 timestamp: 1716828628198 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 md5: a7ce36e284c5faaf93c220dfc39e3abd depends: - __osx >=11.0 license: ISC purls: [] size: 164972 timestamp: 1716828607917 - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.20-hc70643c_0.conda sha256: 7bcb3edccea30f711b6be9601e083ecf4f435b9407d70fc48fbcf9e5d69a0fc6 md5: 198bb594f202b205c7d18b936fa4524f depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: ISC purls: [] size: 202344 timestamp: 1716828757533 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda sha256: 6d9c32fc369af5a84875725f7ddfbfc2ace795c28f246dc70055a79f9b2003da md5: 0b367fad34931cb79e0d6b7e5c06bb1c depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: blessing purls: [] size: 932581 timestamp: 1753948484112 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda sha256: 802ebe62e6bc59fc26b26276b793e0542cfff2d03c086440aeaf72fb8bbcec44 md5: 1dcb0468f5146e38fae99aef9656034b depends: - __osx >=11.0 - icu >=75.1,<76.0a0 - libzlib >=1.3.1,<2.0a0 license: blessing purls: [] size: 902645 timestamp: 1753948599139 - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda sha256: 5dc4f07b2d6270ac0c874caec53c6984caaaa84bc0d3eb593b0edf3dc8492efa md5: ccb20d946040f86f0c05b644d5eadeca depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: blessing purls: [] size: 1288499 timestamp: 1753948889360 - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 md5: eecce068c7e4eddeb169591baac20ac4 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.0,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 304790 timestamp: 1745608545575 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda sha256: 8bfe837221390ffc6f111ecca24fa12d4a6325da0c8d131333d63d6c37f27e0a md5: b68e8f66b94b44aaa8de4583d3d4cc40 depends: - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.0,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 279193 timestamp: 1745608793272 - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda sha256: cbdf93898f2e27cefca5f3fe46519335d1fab25c4ea2a11b11502ff63e602c09 md5: 9dce2f112bfd3400f4f432b3d0ac07b2 depends: - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.0,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: [] size: 292785 timestamp: 1745608759342 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda sha256: b5b239e5fca53ff90669af1686c86282c970dd8204ebf477cf679872eb6d48ac md5: 3c376af8888c386b9d3d1c2701e2f3ab depends: - __glibc >=2.17,<3.0.a0 - libgcc 15.1.0 h767d61c_4 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 3903453 timestamp: 1753903894186 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda sha256: 81c841c1cf4c0d06414aaa38a249f9fdd390554943065c3a0b18a9fb7e8cc495 md5: 2d34729cbc1da0ec988e57b13b712067 depends: - libstdcxx 15.1.0 h8f9b012_4 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 29317 timestamp: 1753903924491 - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda sha256: 4888b9ea2593c36ca587a5ebe38d0a56a0e6d6a9e4bb7da7d9a326aaaca7c336 md5: 8ed82d90e6b1686f5e98f8b7825a15ef depends: - __glibc >=2.17,<3.0.a0 - libevent >=2.1.12,<2.1.13.0a0 - libgcc >=14 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.1,<4.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 424208 timestamp: 1753277183984 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h14a376c_1.conda sha256: 8b703f2c6e47ed5886d7298601b9416b59e823fc8d1a8fa867192c94c5911aac md5: 3161023bb2f8c152e4c9aa59bdd40975 depends: - __osx >=11.0 - libcxx >=19 - libevent >=2.1.12,<2.1.13.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.1,<4.0a0 license: Apache-2.0 license_family: APACHE purls: [] size: 323360 timestamp: 1753277264380 - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda sha256: 87516b128ffa497fc607d5da0cc0366dbee1dbcc14c962bf9ea951d480c7698b md5: 556d49ad5c2ad553c2844cc570bb71c7 depends: - libevent >=2.1.12,<2.1.13.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.1,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: [] size: 636513 timestamp: 1753277481158 - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda sha256: c62694cd117548d810d2803da6d9063f78b1ffbf7367432c5388ce89474e9ebe md5: b6093922931b535a7ba566b6f384fbe6 depends: - __glibc >=2.17,<3.0.a0 - lerc >=4.0.0,<5.0a0 - libdeflate >=1.24,<1.25.0a0 - libgcc >=14 - libjpeg-turbo >=3.1.0,<4.0a0 - liblzma >=5.8.1,<6.0a0 - libstdcxx >=14 - libwebp-base >=1.6.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: HPND purls: [] size: 433078 timestamp: 1755011934951 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h025e3ab_6.conda sha256: d6ed4b307dde5d66b73aa3f155b3ed40ba9394947cfe148e2cd07605ef4b410b md5: d0862034c2c563ef1f52a3237c133d8d depends: - __osx >=11.0 - lerc >=4.0.0,<5.0a0 - libcxx >=19 - libdeflate >=1.24,<1.25.0a0 - libjpeg-turbo >=3.1.0,<4.0a0 - liblzma >=5.8.1,<6.0a0 - libwebp-base >=1.6.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: HPND purls: [] size: 372136 timestamp: 1755012109767 - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-h550210a_6.conda sha256: fd27821c8cfc425826f13760c3263d7b3b997c5372234cefa1586ff384dcc989 md5: 72d45aa52ebca91aedb0cfd9eac62655 depends: - lerc >=4.0.0,<5.0a0 - libdeflate >=1.24,<1.25.0a0 - libjpeg-turbo >=3.1.0,<4.0a0 - liblzma >=5.8.1,<6.0a0 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 license: HPND purls: [] size: 983988 timestamp: 1755012056987 - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h202a827_0.conda sha256: c4ca78341abb308134e605476d170d6f00deba1ec71b0b760326f36778972c0e md5: 0f98f3e95272d118f7931b6bef69bfe5 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: MIT license_family: MIT purls: [] size: 83080 timestamp: 1748341697686 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-h74a6958_0.conda sha256: db843568afeafcb7eeac95b44f00f3e5964b9bb6b94d6880886843416d3f7618 md5: 639880d40b6e2083e20b86a726154864 depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] size: 83815 timestamp: 1748341829716 - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.10.0-hff4702e_0.conda sha256: c3588c52e50666d631e21fffdc057594dbb78464bb87b5832fee3f713a1e4c52 md5: 0c661f61710bf7fec2ea584d276208d7 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT purls: [] size: 85704 timestamp: 1748342286008 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 md5: 40b61aab5c7ba9ff276c41cfffe6b80b depends: - libgcc-ng >=12 license: BSD-3-Clause license_family: BSD purls: [] size: 33601 timestamp: 1680112270483 - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b md5: aea31d2e5b1091feca96fcfe945c3cf9 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - libwebp 1.6.0 license: BSD-3-Clause license_family: BSD purls: [] size: 429011 timestamp: 1752159441324 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda sha256: a4de3f371bb7ada325e1f27a4ef7bcc81b2b6a330e46fac9c2f78ac0755ea3dd md5: e5e7d467f80da752be17796b87fe6385 depends: - __osx >=11.0 constrains: - libwebp 1.6.0 license: BSD-3-Clause license_family: BSD purls: [] size: 294974 timestamp: 1752159906788 - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda sha256: 7b6316abfea1007e100922760e9b8c820d6fc19df3f42fb5aca684cfacb31843 md5: f9bbae5e2537e3b06e0f7310ba76c893 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - libwebp 1.6.0 license: BSD-3-Clause license_family: BSD purls: [] size: 279176 timestamp: 1752159543911 - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda sha256: 373f2973b8a358528b22be5e8d84322c165b4c5577d24d94fd67ad1bb0a0f261 md5: 08bfa5da6e242025304b206d152479ef depends: - ucrt constrains: - pthreads-win32 <0.0a0 - msys2-conda-epoch <0.0a0 license: MIT AND BSD-3-Clause-Clear purls: [] size: 35794 timestamp: 1737099561703 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa md5: 92ed62436b625154323d40d5f2f11dd7 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - pthread-stubs - xorg-libxau >=1.0.11,<2.0a0 - xorg-libxdmcp license: MIT license_family: MIT purls: [] size: 395888 timestamp: 1727278577118 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 md5: af523aae2eca6dfa1c8eec693f5b9a79 depends: - __osx >=11.0 - pthread-stubs - xorg-libxau >=1.0.11,<2.0a0 - xorg-libxdmcp license: MIT license_family: MIT purls: [] size: 323658 timestamp: 1727278733917 - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda sha256: 08dec73df0e161c96765468847298a420933a36bc4f09b50e062df8793290737 md5: a69bbf778a462da324489976c84cfc8c depends: - libgcc >=13 - libwinpthread >=12.0.0.r4.gg4f2fc60ca - pthread-stubs - ucrt >=10.0.20348.0 - xorg-libxau >=1.0.11,<2.0a0 - xorg-libxdmcp license: MIT license_family: MIT purls: [] size: 1208687 timestamp: 1727279378819 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c md5: 5aa797f8787fe7a17d1b0821485b5adc depends: - libgcc-ng >=12 license: LGPL-2.1-or-later purls: [] size: 100393 timestamp: 1702724383534 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h2cb61b6_1.conda sha256: 2c80ef042b47dfddb1f425d57d367e0657f8477d80111644c88b172ff2f99151 md5: 42a8e4b54e322b4cd1dbfb30a8a7ce9e depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libiconv >=1.18,<2.0a0 - liblzma >=5.8.1,<6.0a0 - libzlib >=1.3.1,<2.0a0 constrains: - icu <0.0a0 license: MIT license_family: MIT purls: [] size: 697020 timestamp: 1754315347913 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.8-h4a9ca0c_1.conda sha256: 365ad1fa0b213e3712d882f187e6de7f601a0e883717f54fe69c344515cdba78 md5: 05774cda4a601fc21830842648b3fe04 depends: - __osx >=11.0 - icu >=75.1,<76.0a0 - libiconv >=1.18,<2.0a0 - liblzma >=5.8.1,<6.0a0 - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT purls: [] size: 582952 timestamp: 1754315458016 - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.conda sha256: 32fa908bb2f2a6636dab0edaac1d4bf5ff62ad404a82d8bb16702bc5b8eb9114 md5: aeb49dc1f5531de13d2c0d57ffa6d0c8 depends: - libiconv >=1.18,<2.0a0 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: [] size: 1519401 timestamp: 1754315497781 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda sha256: 991e7348b0f650d495fb6d8aa9f8c727bdf52dabf5853c0cc671439b160dce48 md5: a7b27c075c9b7f459f1c022090697cba depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 - openssl >=3.3.2,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 109043 timestamp: 1730442108429 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzip-1.11.2-h1336266_0.conda sha256: 507599a77c1ce823c2d3acaefaae4ead0686f183f3980467a4c4b8ba209eff40 md5: 7177414f275db66735a17d316b0a81d6 depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.3.2,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 125507 timestamp: 1730442214849 - conda: https://conda.anaconda.org/conda-forge/win-64/libzip-1.11.2-h3135430_0.conda sha256: 8ed49d8aa0ff908e16c82f92154174027c8906429e8b63d71f0b27ecc987b43e md5: 09066edc7810e4bd1b41ad01a6cc4706 depends: - bzip2 >=1.0.8,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.3.2,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: [] size: 146856 timestamp: 1730442305774 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 md5: edb0dca6bc32e4f4789199455a1dbeb8 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 constrains: - zlib 1.3.1 *_2 license: Zlib license_family: Other purls: [] size: 60963 timestamp: 1727963148474 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b md5: 369964e85dc26bfe78f41399b366c435 depends: - __osx >=11.0 constrains: - zlib 1.3.1 *_2 license: Zlib license_family: Other purls: [] size: 46438 timestamp: 1727963202283 - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 md5: 41fbfac52c601159df6c01f875de31b9 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - zlib 1.3.1 *_2 license: Zlib license_family: Other purls: [] size: 55476 timestamp: 1727963768015 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.8-hbb9b287_2.conda sha256: a5bf3712542ad6c37f5a091174f65fa221197547f6f2e90f227476d90ed8b901 md5: 725044ef08febdc554bbf2a895ef798f depends: - __osx >=11.0 constrains: - openmp 20.1.8|20.1.8.* - intel-openmp <0.0a0 license: Apache-2.0 WITH LLVM-exception license_family: APACHE purls: [] size: 283280 timestamp: 1756144638686 - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-20.1.8-hfa2b4ca_2.conda sha256: 8970b7f9057a1c2c18bfd743c6f5ce73b86197d7724423de4fa3d03911d5874b md5: 2dc2edf349464c8b83a576175fc2ad42 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - intel-openmp <0.0a0 - openmp 20.1.8|20.1.8.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE purls: [] size: 344490 timestamp: 1756145011384 - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 sha256: 9afe0b5cfa418e8bdb30d8917c5a6cec10372b037924916f1f85b9f4899a67a6 md5: 91e27ef3d05cc772ce627e51cff111c4 depends: - python >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/locket?source=hash-mapping size: 8250 timestamp: 1650660473123 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.4-py311h8c6ae76_0.conda sha256: cff970448fbb85da6b3083ad985a991f789df7905941904eb085003314aac725 md5: cb99a4a8a0828c76d2869d807ef92f7a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - lz4-c >=1.10.0,<1.11.0a0 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/lz4?source=hash-mapping size: 40124 timestamp: 1746562069107 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.4-py312hf0f0c11_0.conda sha256: a04aff570a27173eea3a2b515b4794ce20e058b658f642475f72ccc1f6d88cff md5: f770ae71fc1800e7a735a7b452c0ab81 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - lz4-c >=1.10.0,<1.11.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/lz4?source=hash-mapping size: 40315 timestamp: 1746562078119 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.4-py313h8756d67_0.conda sha256: 0dda09a39f20464fc8115c65574a3223be10ccd214b35f0cd083aa56253940b8 md5: c56653951f28dcd2c5be9338208b23df depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - lz4-c >=1.10.0,<1.11.0a0 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/lz4?source=hash-mapping size: 40468 timestamp: 1746562034878 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.4-py311h3a49619_0.conda sha256: 7a99454d71f58f86caf4fa62f4654cdbb635060e759a3f0a11789db7c65a20e8 md5: ee86f7c753f037c7003058ed49052ade depends: - __osx >=11.0 - lz4-c >=1.10.0,<1.11.0a0 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/lz4?source=hash-mapping size: 107161 timestamp: 1746562184297 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.4-py312hf263c89_0.conda sha256: 265cd74fdace1106dbaf395bcf8d1cc2b1d20f998ff0694451f2a91f9804c7d8 md5: be22e508c6268b4c7b7b147845deb7f5 depends: - __osx >=11.0 - lz4-c >=1.10.0,<1.11.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 purls: - pkg:pypi/lz4?source=hash-mapping size: 106981 timestamp: 1746562316986 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.4-py313h28882b1_0.conda sha256: e49fbc45d110b27e0c1a14bdf09c738707ec45b1a4e8bf466d56df2fc5391e43 md5: 8712b8867f7283fffc9bcf0ce7d3b1ca depends: - __osx >=11.0 - lz4-c >=1.10.0,<1.11.0a0 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/lz4?source=hash-mapping size: 108111 timestamp: 1746562384614 - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-4.4.4-py311h0476921_0.conda sha256: 63cebd1a8c46edd4b49fdd57592adbe1801415b13a92aa11415771fd9e7b1a5e md5: 14eaa1c2bf53891015979ca01472a56d depends: - lz4-c >=1.10.0,<1.11.0a0 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/lz4?source=hash-mapping size: 43063 timestamp: 1746562751298 - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-4.4.4-py312h032eceb_0.conda sha256: c81ae54d4a708f1d8f14837aab1e036feb52dbc6af487498b4581cfa10ed6fe3 md5: 1b3e1a6d4aae9904141f8134b6beb632 depends: - lz4-c >=1.10.0,<1.11.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/lz4?source=hash-mapping size: 42804 timestamp: 1746562353385 - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-4.4.4-py313h05901a4_0.conda sha256: 8487c2c4da6c8efb33ddd0433d31ff1bb3d0217f835260d104a0ebaad614f595 md5: 69b4bcd6174e17d2350a8232cd97db02 depends: - lz4-c >=1.10.0,<1.11.0a0 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/lz4?source=hash-mapping size: 43362 timestamp: 1746562513761 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 md5: 9de5350a85c4a20c685259b889aa6393 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 license: BSD-2-Clause license_family: BSD purls: [] size: 167055 timestamp: 1733741040117 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 md5: 01511afc6cc1909c5303cf31be17b44f depends: - __osx >=11.0 - libcxx >=18 license: BSD-2-Clause license_family: BSD purls: [] size: 148824 timestamp: 1733741047892 - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda sha256: 632cf3bdaf7a7aeb846de310b6044d90917728c73c77f138f08aa9438fc4d6b5 md5: 0b69331897a92fac3d8923549d48d092 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-2-Clause license_family: BSD purls: [] size: 139891 timestamp: 1733741168264 - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda sha256: 0291d90706ac6d3eea73e66cd290ef6d805da3fad388d1d476b8536ec92ca9a8 md5: 6565a715337ae279e351d0abd8ffe88a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 constrains: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping size: 25354 timestamp: 1733219879408 - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 md5: eb227c3e0bf58f5bd69c0532b157975b depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 constrains: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping size: 24604 timestamp: 1733219911494 - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda sha256: d812caf52efcea7c9fd0eafb21d45dadfd0516812f667b928bee50e87634fae5 md5: 21b62c55924f01b6eef6827167b46acb depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 constrains: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping size: 24856 timestamp: 1733219782830 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h4921393_1.conda sha256: 4f738a7c80e34e5e5d558e946b06d08e7c40e3cc4bdf08140bf782c359845501 md5: 249e2f6f5393bb6b36b3d3a3eebdcdf9 depends: - __osx >=11.0 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 constrains: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping size: 24976 timestamp: 1733219849253 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 md5: 46e547061080fddf9cf95a0327e8aba6 depends: - __osx >=11.0 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 constrains: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping size: 24048 timestamp: 1733219945697 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py313ha9b7d5b_1.conda sha256: 81759af8a9872c8926af3aa59dc4986eee90a0956d1ec820b42ac4f949a71211 md5: 3acf05d8e42ff0d99820d2d889776fff depends: - __osx >=11.0 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 constrains: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping size: 24757 timestamp: 1733219916634 - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py311h5082efb_1.conda sha256: 6f756e13ccf1a521d3960bd3cadddf564e013e210eaeced411c5259f070da08e md5: c1f2ddad665323278952a453912dc3bd depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping size: 28238 timestamp: 1733220208800 - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py312h31fea79_1.conda sha256: bbb9595fe72231a8fbc8909cfa479af93741ecd2d28dfe37f8f205fef5df2217 md5: 944fdd848abfbd6929e57c790b8174dd depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping size: 27582 timestamp: 1733220007802 - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py313hb4c8b1a_1.conda sha256: f16cb398915f52d582bcea69a16cf69a56dab6ea2fab6f069da9c2c10f09534c md5: ec9ecf6ee4cceb73a0c9a8cdfdf58bed depends: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping size: 27930 timestamp: 1733220059655 - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py313h683a580_0.conda sha256: 48c12e4682fdb92e2dfa4c4f885e252d0b14168dd4a672a6da376fea551b2e69 md5: 9edc5badd11b451eb00eb8c492545fe2 depends: - __glibc >=2.17,<3.0.a0 - contourpy >=1.0.1 - cycler >=0.10 - fonttools >=4.22.0 - freetype - kiwisolver >=1.3.1 - libfreetype >=2.13.3 - libfreetype6 >=2.13.3 - libgcc >=14 - libstdcxx >=14 - numpy >=1.23 - numpy >=1.23,<3 - packaging >=20.0 - pillow >=8 - pyparsing >=2.3.1 - python >=3.13,<3.14.0a0 - python-dateutil >=2.7 - python_abi 3.13.* *_cp313 - qhull >=2020.2,<2020.3.0a0 - tk >=8.6.13,<8.7.0a0 license: PSF-2.0 license_family: PSF purls: - pkg:pypi/matplotlib?source=hash-mapping size: 8341150 timestamp: 1754006124310 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.5-py313h919948c_0.conda sha256: 3942fd6b63ad0ea8a9109dd745e64091ba10bc3fa0504425c6e25633d8fcec9c md5: 4029ee1e6d3448aac06fe33d6ceda272 depends: - __osx >=11.0 - contourpy >=1.0.1 - cycler >=0.10 - fonttools >=4.22.0 - freetype - kiwisolver >=1.3.1 - libcxx >=19 - libfreetype >=2.13.3 - libfreetype6 >=2.13.3 - numpy >=1.23 - numpy >=1.23,<3 - packaging >=20.0 - pillow >=8 - pyparsing >=2.3.1 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python-dateutil >=2.7 - python_abi 3.13.* *_cp313 - qhull >=2020.2,<2020.3.0a0 license: PSF-2.0 license_family: PSF purls: - pkg:pypi/matplotlib?source=hash-mapping size: 8137095 timestamp: 1754005898026 - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.5-py313he1ded55_0.conda sha256: cdf826574270d01869250021b0d58bc39330cb885e523f6eb897d1c7dda7c192 md5: d2d0d64e2fd39aca9dfb689b1c100414 depends: - contourpy >=1.0.1 - cycler >=0.10 - fonttools >=4.22.0 - freetype - kiwisolver >=1.3.1 - libfreetype >=2.13.3 - libfreetype6 >=2.13.3 - numpy >=1.23 - numpy >=1.23,<3 - packaging >=20.0 - pillow >=8 - pyparsing >=2.3.1 - python >=3.13,<3.14.0a0 - python-dateutil >=2.7 - python_abi 3.13.* *_cp313 - qhull >=2020.2,<2020.3.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: PSF-2.0 license_family: PSF purls: - pkg:pypi/matplotlib?source=hash-mapping size: 8198421 timestamp: 1754006042640 - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda sha256: 69b7dc7131703d3d60da9b0faa6dd8acbf6f6c396224cf6aef3e855b8c0c41c6 md5: af6ab708897df59bd6e7283ceab1b56b depends: - python >=3.9 - traitlets license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/matplotlib-inline?source=hash-mapping size: 14467 timestamp: 1733417051523 - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.4-pyhcf101f3_0.conda sha256: 609ea628ace5c6cdbdce772704e6cb159ead26969bb2f386ca1757632b0f74c6 md5: f5a4d548d1d3bdd517260409fc21e205 depends: - python >=3.10 - typing_extensions - python license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/mistune?source=hash-mapping size: 72996 timestamp: 1756495311698 - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda sha256: ce841e7c3898764154a9293c0f92283c1eb28cdacf7a164c94b632a6af675d91 md5: 5cddc979c74b90cf5e5cda4f97d5d8bb depends: - llvm-openmp >=20.1.8 - tbb 2021.* license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary purls: [] size: 103088799 timestamp: 1753975600547 - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.1-py311hd18a35c_0.conda sha256: f07aafd9e9adddf66b75630b4f68784e22ce63ae9e0887711a7386ceb2506fca md5: d0898973440adc2ad25917028669126d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/msgpack?source=hash-mapping size: 103109 timestamp: 1749813330034 - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.1-py312h68727a3_0.conda sha256: 969b8e50922b592228390c25ac417c0761fd6f98fccad870ac5cc84f35da301a md5: 6998b34027ecc577efe4e42f4b022a98 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/msgpack?source=hash-mapping size: 102924 timestamp: 1749813333354 - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.1-py313h33d0bda_0.conda sha256: b0e1b68a6e74d77986190f7296187c799a3f56119cb06663f7a57b15a7b1bd98 md5: 009fb5ad03d4506be5f1e5c2f875f1c2 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/msgpack?source=hash-mapping size: 102677 timestamp: 1749813320003 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.1-py311h210dab8_0.conda sha256: eb0cfc60f428cd4cd9f50f7764ee2c2910949b82893055cf29c0866c163e5c33 md5: f4f5b9fb201bfad3d0806d4a3af405b2 depends: - __osx >=11.0 - libcxx >=18 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/msgpack?source=hash-mapping size: 90646 timestamp: 1749813845551 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.1-py312hb23fbb9_0.conda sha256: 0cdc5fcdb75727a13cbcfc49e00b0fddf6705c7bd908aee1dd1e7a869de8dfe9 md5: 4ae8111ba5af53e50cb6f9d1705c408c depends: - __osx >=11.0 - libcxx >=18 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/msgpack?source=hash-mapping size: 91155 timestamp: 1749813638452 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.1-py313h0ebd0e5_0.conda sha256: 183ebd9dcfc5c5f2833ff61e9a12e3b6b4e454a1222d0629d2dc7046cfe68c52 md5: b9bcc8ff2ab0cdc05229ad67146814f1 depends: - __osx >=11.0 - libcxx >=18 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/msgpack?source=hash-mapping size: 92134 timestamp: 1749813606665 - conda: https://conda.anaconda.org/conda-forge/win-64/msgpack-python-1.1.1-py311h3257749_0.conda sha256: a0ba6da7e31c406c39da1258d0c4304b58e791b3836529e51dc56d7d8f542de4 md5: 236c48eab3925b666eed26a3ba94bcb6 depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/msgpack?source=hash-mapping size: 88144 timestamp: 1749814077794 - conda: https://conda.anaconda.org/conda-forge/win-64/msgpack-python-1.1.1-py312hd5eb7cc_0.conda sha256: 41d9b229e0654400d81bfe417675b4603e4cd7d13ffc1b1aa9c748c67d5bd39f md5: 732a1b46ab8c8ee0dce4aac014e66006 depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/msgpack?source=hash-mapping size: 87498 timestamp: 1749813960284 - conda: https://conda.anaconda.org/conda-forge/win-64/msgpack-python-1.1.1-py313h1ec8472_0.conda sha256: 50a3f1bfcfa634538a2c0271bc9cd52d63a7933d5b4d56b16b176526af964108 md5: 6a43d815d2b23ecfed7073c0706ac43d depends: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/msgpack?source=hash-mapping size: 87496 timestamp: 1749813653283 - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90 md5: 37293a85a0f4f77bbd9cf7aaefc62609 depends: - python >=3.9 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/munkres?source=hash-mapping size: 15851 timestamp: 1749895533014 - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.2.0-pyhcf101f3_0.conda sha256: 9f08e4e50695546e6c68288a35350b5cce8be13fbd1f4dc0ecf04a1e180e1673 md5: 7b058c5f94d7fdfde0f91e3f498b81fc depends: - python >=3.10 - python license: MIT license_family: MIT purls: - pkg:pypi/narwhals?source=compressed-mapping size: 248742 timestamp: 1756119139962 - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda sha256: a20cff739d66c2f89f413e4ba4c6f6b59c50d5c30b5f0d840c13e8c9c2df9135 md5: 6bb0d77277061742744176ab555b723c depends: - jupyter_client >=6.1.12 - jupyter_core >=4.12,!=5.0.* - nbformat >=5.1 - python >=3.8 - traitlets >=5.4 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/nbclient?source=hash-mapping size: 28045 timestamp: 1734628936013 - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.6-hb482800_0.conda sha256: 5480b7e05bf3079fcb7357a5a15a96c3a1649cc1371d0c468c806898a7e53088 md5: aa90ea40c80d4bd3da35cb17ed668f22 depends: - nbconvert-core ==7.16.6 pyh29332c3_0 - nbconvert-pandoc ==7.16.6 hed9df3c_0 license: BSD-3-Clause license_family: BSD purls: [] size: 5241 timestamp: 1738067871725 - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda sha256: dcccb07c5a1acb7dc8be94330e62d54754c0e9c9cb2bb6865c8e3cfe44cf5a58 md5: d24beda1d30748afcc87c429454ece1b depends: - beautifulsoup4 - bleach-with-css !=5.0.0 - defusedxml - importlib-metadata >=3.6 - jinja2 >=3.0 - jupyter_core >=4.7 - jupyterlab_pygments - markupsafe >=2.0 - mistune >=2.0.3,<4 - nbclient >=0.5.0 - nbformat >=5.7 - packaging - pandocfilters >=1.4.1 - pygments >=2.4.1 - python >=3.9 - traitlets >=5.1 - python constrains: - pandoc >=2.9.2,<4.0.0 - nbconvert ==7.16.6 *_0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/nbconvert?source=hash-mapping size: 200601 timestamp: 1738067871724 - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.6-hed9df3c_0.conda sha256: 1e8923f1557c2ddb7bba915033cfaf8b8c1b7462c745172458102c11caee1002 md5: 5b0afb6c52e74a7eca2cf809a874acf4 depends: - nbconvert-core ==7.16.6 pyh29332c3_0 - pandoc license: BSD-3-Clause license_family: BSD purls: [] size: 5722 timestamp: 1738067871725 - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda sha256: 7a5bd30a2e7ddd7b85031a5e2e14f290898098dc85bea5b3a5bf147c25122838 md5: bbe1963f1e47f594070ffe87cdf612ea depends: - jsonschema >=2.6 - jupyter_core >=4.12,!=5.0.* - python >=3.9 - python-fastjsonschema >=2.15 - traitlets >=5.1 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/nbformat?source=hash-mapping size: 100945 timestamp: 1733402844974 - conda: https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.7-pyhd8ed1ab_0.conda sha256: eb99d3f00e6d1fd2b07bb20a721a64deab97bccf38d9abc1d4a93e389daa9fb3 md5: 9a3844478c73b5fe288426d001453261 depends: - docutils - jinja2 - nbconvert - nbformat - python >=3.6 - sphinx - traitlets license: MIT license_family: MIT purls: - pkg:pypi/nbsphinx?source=hash-mapping size: 34324 timestamp: 1741075538022 - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 md5: 47e340acb35de30501a76c7c799c41d7 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: X11 AND BSD-3-Clause purls: [] size: 891641 timestamp: 1738195959188 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 md5: 068d497125e4bf8a66bf707254fff5ae depends: - __osx >=11.0 license: X11 AND BSD-3-Clause purls: [] size: 797030 timestamp: 1738196177597 - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda sha256: bb7b21d7fd0445ddc0631f64e66d91a179de4ba920b8381f29b9d006a42788c0 md5: 598fd7d4d0de2455fb74f56063969a97 depends: - python >=3.9 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/nest-asyncio?source=hash-mapping size: 11543 timestamp: 1733325673691 - conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py313h6d1955d_102.conda sha256: b425333a7e5591d4f1bd9886fb0cb29eb61679b1f28e603ec5c3fa8da8c86251 md5: 1715ff41a8bb9b6c883067586cbd8c39 depends: - __glibc >=2.17,<3.0.a0 - certifi - cftime - hdf5 >=1.14.6,<1.14.7.0a0 - libgcc >=13 - libnetcdf >=4.9.2,<4.9.3.0a0 - libzlib >=1.3.1,<2.0a0 - numpy >=1.21,<3 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - pkg:pypi/netcdf4?source=hash-mapping size: 1148365 timestamp: 1745588783461 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/netcdf4-1.7.2-nompi_py313h2bc0fea_102.conda sha256: 789ab7a371f80ecce4e8f61ed8cb8d981277aaf9a41571cbc8c35ad3b71df8c8 md5: 9c28a33fa3dcbecfee6e70da076d80c4 depends: - __osx >=11.0 - certifi - cftime - hdf5 >=1.14.6,<1.14.7.0a0 - libnetcdf >=4.9.2,<4.9.3.0a0 - libzlib >=1.3.1,<2.0a0 - numpy >=1.21,<3 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - pkg:pypi/netcdf4?source=hash-mapping size: 1056057 timestamp: 1745589404901 - conda: https://conda.anaconda.org/conda-forge/win-64/netcdf4-1.7.2-nompi_py313h8bda5d6_102.conda sha256: f7e588425252cfe45732d3b4e0d2164a6bea508af412b3ddc73e98bb94e4cce5 md5: c1353f9e82eb336b0d164ef05b23b828 depends: - certifi - cftime - hdf5 >=1.14.6,<1.14.7.0a0 - libnetcdf >=4.9.2,<4.9.3.0a0 - libzlib >=1.3.1,<2.0a0 - numpy >=1.21,<3 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT purls: - pkg:pypi/netcdf4?source=hash-mapping size: 998987 timestamp: 1745590151055 - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h3f2d84a_0.conda sha256: e2fc624d6f9b2f1b695b6be6b905844613e813aa180520e73365062683fe7b49 md5: d76872d096d063e226482c99337209dc license: MIT license_family: MIT purls: [] size: 135906 timestamp: 1744445169928 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-ha1acc90_0.conda sha256: 6e689213c8d5e5f65ef426c0fcfb41b056e4c4d90fc020631cfddb6c87d5d6c9 md5: c74975897efab6cdc7f5ac5a69cca2f3 license: MIT license_family: MIT purls: [] size: 136487 timestamp: 1744445244122 - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/numpy/2.4.0.dev0/numpy-2.4.0.dev0-cp313-cp313-macosx_11_0_arm64.whl name: numpy version: 2.4.0.dev0 requires_python: ">=3.11" - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/numpy/2.4.0.dev0/numpy-2.4.0.dev0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: numpy version: 2.4.0.dev0 requires_python: ">=3.11" - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/numpy/2.4.0.dev0/numpy-2.4.0.dev0-cp313-cp313-win_amd64.whl name: numpy version: 2.4.0.dev0 requires_python: ">=3.11" - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_2.conda sha256: a8be67f8be3354e33da3adacb021f7f93971ddc466d79eab412151bf5dc58cf4 md5: 7fb6248106c55e3ccd29ac675be01fac depends: - python - libgcc >=14 - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - libcblas >=3.9.0,<4.0a0 - libblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - python_abi 3.11.* *_cp311 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping size: 9415269 timestamp: 1756343065236 - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312h33ff503_2.conda sha256: 0348fcaaefba8b77e7f9889a0d8ed356ff8aa53c1b69b47697b5c8c5f7d33b0e md5: b6daf7dbe075ac2ae2ad59cdc45aa8c4 depends: - python - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - libgcc >=14 - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - python_abi 3.12.* *_cp312 - liblapack >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping size: 8785544 timestamp: 1756343060399 - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py313hf6604e3_2.conda sha256: dc99944cc1ab9b1939fc94ca0ad3e7629ff4b8fd371a5c94a153e6a66af5aa0d md5: 67d27f74a90f5f0336035203f91a0abc depends: - python - libgcc >=14 - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - libcblas >=3.9.0,<4.0a0 - libblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - python_abi 3.13.* *_cp313 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping size: 8890327 timestamp: 1756343073222 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.2-py311h0856f98_2.conda sha256: b2cb7fc23d462840fec513fbb5ca4467a2d8b3e9ab2588096443b80d9f286058 md5: c55c144bf8ee31580fe4fecaab9043a5 depends: - python - python 3.11.* *_cpython - __osx >=11.0 - libcxx >=19 - liblapack >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - libblas >=3.9.0,<4.0a0 - python_abi 3.11.* *_cp311 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping size: 7274422 timestamp: 1756343068339 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.2-py312h2f38b44_2.conda sha256: b1d3dff32c97411778dd67a9920fba810e460f58e1625a8711f7c2eb6d540313 md5: ac380ace5a774475d2a75a150d67ded0 depends: - python - libcxx >=19 - python 3.12.* *_cpython - __osx >=11.0 - libblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - python_abi 3.12.* *_cp312 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping size: 6658415 timestamp: 1756343070880 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.2-py313h674b998_2.conda sha256: f3603c74f79a9f8a67eb8f4ce4b678036ca3de6dd329657ae19a298cd956f66e md5: 9c44ae43d006497eef4ba440820f9997 depends: - python - __osx >=11.0 - libcxx >=19 - python 3.13.* *_cp313 - python_abi 3.13.* *_cp313 - libcblas >=3.9.0,<4.0a0 - libblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping size: 6748521 timestamp: 1756343067600 - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py311h80b3fa1_2.conda sha256: cfce275b0959d2de5abeaa5892ec3192a3aa38600c8e12d962c9c4a4ac838106 md5: 7ad07d0ab1888f4e4dc95b330a51bffd depends: - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - libblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - python_abi 3.11.* *_cp311 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping size: 8019925 timestamp: 1756343088463 - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py312ha72d056_2.conda sha256: 86591a692a02eafcc33d4f35b26b53471dd8ab53492a58052461d5da037806c3 md5: d98b7ec5211b2e197e7e0991757116cb depends: - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - python_abi 3.12.* *_cp312 - libcblas >=3.9.0,<4.0a0 - libblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping size: 7376601 timestamp: 1756343079617 - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py313hce7ae62_2.conda sha256: 6c10cd2ef2ced4c9c4e2582648505248bb14d8dfa509d1610845fafa877cfa23 md5: fd183febc421360098ad1052f2239c6b depends: - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - libblas >=3.9.0,<4.0a0 - python_abi 3.13.* *_cp313 - liblapack >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping size: 7460843 timestamp: 1756343087901 - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda sha256: 0b7396dacf988f0b859798711b26b6bc9c6161dca21bacfd778473da58730afa md5: 01243c4aaf71bde0297966125aea4706 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libpng >=1.6.50,<1.7.0a0 - libstdcxx >=14 - libtiff >=4.7.0,<4.8.0a0 - libzlib >=1.3.1,<2.0a0 license: BSD-2-Clause license_family: BSD purls: [] size: 357828 timestamp: 1754297886899 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h889cd5d_1.conda sha256: 6013916893fcd9bc97c479279cfe4616de7735ec566bad0ee41bc729e14d31b2 md5: ab581998c77c512d455a13befcddaac3 depends: - __osx >=11.0 - libcxx >=19 - libpng >=1.6.50,<1.7.0a0 - libtiff >=4.7.0,<4.8.0a0 - libzlib >=1.3.1,<2.0a0 license: BSD-2-Clause license_family: BSD purls: [] size: 320198 timestamp: 1754297986425 - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.3-h24db6dd_1.conda sha256: c29cb1641bc5cfc2197e9b7b436f34142be4766dd2430a937b48b7474935aa55 md5: 25f45acb1a234ad1c9b9a20e1e6c559e depends: - libpng >=1.6.50,<1.7.0a0 - libtiff >=4.7.0,<4.8.0a0 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-2-Clause license_family: BSD purls: [] size: 245076 timestamp: 1754298075628 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda sha256: c9f54d4e8212f313be7b02eb962d0cb13a8dae015683a403d3accd4add3e520e md5: ffffb341206dd0dab0c36053c048d621 depends: - __glibc >=2.17,<3.0.a0 - ca-certificates - libgcc >=14 license: Apache-2.0 license_family: Apache purls: [] size: 3128847 timestamp: 1754465526100 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda sha256: f6d1c87dbcf7b39fad24347570166dade1c533ae2d53c60a70fa4dc874ef0056 md5: bcb0d87dfbc199d0a461d2c7ca30b3d8 depends: - __osx >=11.0 - ca-certificates license: Apache-2.0 license_family: Apache purls: [] size: 3074848 timestamp: 1754465710470 - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda sha256: 2413f3b4606018aea23acfa2af3c4c46af786739ab4020422e9f0c2aec75321b md5: 150d3920b420a27c0848acca158f94dc depends: - ca-certificates - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache purls: [] size: 9275175 timestamp: 1754467904482 - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.2.0-h1bc01a4_0.conda sha256: 9a64535b36ae6776334a7923e91e2dc8d7ce164ee71d2d5075d7867dbd68e7a8 md5: 53ab33c0b0ba995d2546e54b2160f3fd depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libprotobuf >=6.31.1,<6.31.2.0a0 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - snappy >=1.2.2,<1.3.0a0 - tzdata - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 license_family: Apache purls: [] size: 1277190 timestamp: 1754216415878 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.2.0-hca0cb2d_0.conda sha256: 1d78de52b2f4ee2f53eb7ce97a9bdd23941a26d2ae1685d13cf62724e18c8144 md5: 462e3c1f980e4f701d7d9167a0b3b3e5 depends: - __osx >=11.0 - libcxx >=19 - libprotobuf >=6.31.1,<6.31.2.0a0 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - snappy >=1.2.2,<1.3.0a0 - tzdata - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 license_family: Apache purls: [] size: 485207 timestamp: 1754216670599 - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.2.0-h0018cbe_0.conda sha256: 5eccd0c28ec86a615650a94aa8841d2bd1ef09934d010f18836fd8357155044e md5: 940c04e0508928f6d9feb98dbc383467 depends: - libprotobuf >=6.31.1,<6.31.2.0a0 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - snappy >=1.2.2,<1.3.0a0 - tzdata - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 license_family: Apache purls: [] size: 1155619 timestamp: 1754216976525 - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 md5: 58335b26c38bf4a20f399384c33cbcf9 depends: - python >=3.8 - python license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/packaging?source=hash-mapping size: 62477 timestamp: 1745345660407 - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/pandas/3.0.0.dev0+2348.g7bfef3b1cb/pandas-3.0.0.dev0+2348.g7bfef3b1cb-cp313-cp313-macosx_11_0_arm64.whl name: pandas version: 3.0.0.dev0+2348.g7bfef3b1cb requires_dist: - numpy>=1.26.0 - python-dateutil>=2.8.2 - tzdata>=2023.3 - hypothesis>=6.84.0 ; extra == 'test' - pytest>=7.3.2 ; extra == 'test' - pytest-xdist>=3.4.0 ; extra == 'test' - pyarrow>=12.0.1 ; extra == 'pyarrow' - bottleneck>=1.3.6 ; extra == 'performance' - numba>=0.59.0 ; extra == 'performance' - numexpr>=2.9.0 ; extra == 'performance' - scipy>=1.12.0 ; extra == 'computation' - xarray>=2024.1.1 ; extra == 'computation' - fsspec>=2023.12.2 ; extra == 'fss' - s3fs>=2023.12.2 ; extra == 'aws' - gcsfs>=2023.12.2 ; extra == 'gcp' - odfpy>=1.4.1 ; extra == 'excel' - openpyxl>=3.1.2 ; extra == 'excel' - python-calamine>=0.1.7 ; extra == 'excel' - pyxlsb>=1.0.10 ; extra == 'excel' - xlrd>=2.0.1 ; extra == 'excel' - xlsxwriter>=3.2.0 ; extra == 'excel' - pyarrow>=12.0.1 ; extra == 'parquet' - pyarrow>=12.0.1 ; extra == 'feather' - pyiceberg>=0.7.1 ; extra == 'iceberg' - tables>=3.8.0 ; extra == 'hdf5' - pyreadstat>=1.2.6 ; extra == 'spss' - sqlalchemy>=2.0.0 ; extra == 'postgresql' - psycopg2>=2.9.9 ; extra == 'postgresql' - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' - sqlalchemy>=2.0.0 ; extra == 'mysql' - pymysql>=1.1.0 ; extra == 'mysql' - sqlalchemy>=2.0.0 ; extra == 'sql-other' - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' - beautifulsoup4>=4.12.3 ; extra == 'html' - html5lib>=1.1 ; extra == 'html' - lxml>=4.9.2 ; extra == 'html' - lxml>=4.9.2 ; extra == 'xml' - matplotlib>=3.8.3 ; extra == 'plot' - jinja2>=3.1.3 ; extra == 'output-formatting' - tabulate>=0.9.0 ; extra == 'output-formatting' - pyqt5>=5.15.9 ; extra == 'clipboard' - qtpy>=2.3.0 ; extra == 'clipboard' - zstandard>=0.22.0 ; extra == 'compression' - pytz>=2023.4 ; extra == 'timezone' - adbc-driver-postgresql>=1.2.0 ; extra == 'all' - adbc-driver-sqlite>=1.2.0 ; extra == 'all' - beautifulsoup4>=4.12.3 ; extra == 'all' - bottleneck>=1.3.6 ; extra == 'all' - fastparquet>=2024.2.0 ; extra == 'all' - fsspec>=2023.12.2 ; extra == 'all' - gcsfs>=2023.12.2 ; extra == 'all' - html5lib>=1.1 ; extra == 'all' - hypothesis>=6.84.0 ; extra == 'all' - jinja2>=3.1.3 ; extra == 'all' - lxml>=4.9.2 ; extra == 'all' - matplotlib>=3.8.3 ; extra == 'all' - numba>=0.59.0 ; extra == 'all' - numexpr>=2.9.0 ; extra == 'all' - odfpy>=1.4.1 ; extra == 'all' - openpyxl>=3.1.2 ; extra == 'all' - psycopg2>=2.9.9 ; extra == 'all' - pyarrow>=12.0.1 ; extra == 'all' - pyiceberg>=0.7.1 ; extra == 'all' - pymysql>=1.1.0 ; extra == 'all' - pyqt5>=5.15.9 ; extra == 'all' - pyreadstat>=1.2.6 ; extra == 'all' - pytest>=7.3.2 ; extra == 'all' - pytest-xdist>=3.4.0 ; extra == 'all' - python-calamine>=0.1.7 ; extra == 'all' - pytz>=2023.4 ; extra == 'all' - pyxlsb>=1.0.10 ; extra == 'all' - qtpy>=2.3.0 ; extra == 'all' - scipy>=1.12.0 ; extra == 'all' - s3fs>=2023.12.2 ; extra == 'all' - sqlalchemy>=2.0.0 ; extra == 'all' - tables>=3.8.0 ; extra == 'all' - tabulate>=0.9.0 ; extra == 'all' - xarray>=2024.1.1 ; extra == 'all' - xlrd>=2.0.1 ; extra == 'all' - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.22.0 ; extra == 'all' requires_python: ">=3.11" - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/pandas/3.0.0.dev0+2348.g7bfef3b1cb/pandas-3.0.0.dev0+2348.g7bfef3b1cb-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl name: pandas version: 3.0.0.dev0+2348.g7bfef3b1cb requires_dist: - numpy>=1.26.0 - python-dateutil>=2.8.2 - tzdata>=2023.3 - hypothesis>=6.84.0 ; extra == 'test' - pytest>=7.3.2 ; extra == 'test' - pytest-xdist>=3.4.0 ; extra == 'test' - pyarrow>=12.0.1 ; extra == 'pyarrow' - bottleneck>=1.3.6 ; extra == 'performance' - numba>=0.59.0 ; extra == 'performance' - numexpr>=2.9.0 ; extra == 'performance' - scipy>=1.12.0 ; extra == 'computation' - xarray>=2024.1.1 ; extra == 'computation' - fsspec>=2023.12.2 ; extra == 'fss' - s3fs>=2023.12.2 ; extra == 'aws' - gcsfs>=2023.12.2 ; extra == 'gcp' - odfpy>=1.4.1 ; extra == 'excel' - openpyxl>=3.1.2 ; extra == 'excel' - python-calamine>=0.1.7 ; extra == 'excel' - pyxlsb>=1.0.10 ; extra == 'excel' - xlrd>=2.0.1 ; extra == 'excel' - xlsxwriter>=3.2.0 ; extra == 'excel' - pyarrow>=12.0.1 ; extra == 'parquet' - pyarrow>=12.0.1 ; extra == 'feather' - pyiceberg>=0.7.1 ; extra == 'iceberg' - tables>=3.8.0 ; extra == 'hdf5' - pyreadstat>=1.2.6 ; extra == 'spss' - sqlalchemy>=2.0.0 ; extra == 'postgresql' - psycopg2>=2.9.9 ; extra == 'postgresql' - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' - sqlalchemy>=2.0.0 ; extra == 'mysql' - pymysql>=1.1.0 ; extra == 'mysql' - sqlalchemy>=2.0.0 ; extra == 'sql-other' - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' - beautifulsoup4>=4.12.3 ; extra == 'html' - html5lib>=1.1 ; extra == 'html' - lxml>=4.9.2 ; extra == 'html' - lxml>=4.9.2 ; extra == 'xml' - matplotlib>=3.8.3 ; extra == 'plot' - jinja2>=3.1.3 ; extra == 'output-formatting' - tabulate>=0.9.0 ; extra == 'output-formatting' - pyqt5>=5.15.9 ; extra == 'clipboard' - qtpy>=2.3.0 ; extra == 'clipboard' - zstandard>=0.22.0 ; extra == 'compression' - pytz>=2023.4 ; extra == 'timezone' - adbc-driver-postgresql>=1.2.0 ; extra == 'all' - adbc-driver-sqlite>=1.2.0 ; extra == 'all' - beautifulsoup4>=4.12.3 ; extra == 'all' - bottleneck>=1.3.6 ; extra == 'all' - fastparquet>=2024.2.0 ; extra == 'all' - fsspec>=2023.12.2 ; extra == 'all' - gcsfs>=2023.12.2 ; extra == 'all' - html5lib>=1.1 ; extra == 'all' - hypothesis>=6.84.0 ; extra == 'all' - jinja2>=3.1.3 ; extra == 'all' - lxml>=4.9.2 ; extra == 'all' - matplotlib>=3.8.3 ; extra == 'all' - numba>=0.59.0 ; extra == 'all' - numexpr>=2.9.0 ; extra == 'all' - odfpy>=1.4.1 ; extra == 'all' - openpyxl>=3.1.2 ; extra == 'all' - psycopg2>=2.9.9 ; extra == 'all' - pyarrow>=12.0.1 ; extra == 'all' - pyiceberg>=0.7.1 ; extra == 'all' - pymysql>=1.1.0 ; extra == 'all' - pyqt5>=5.15.9 ; extra == 'all' - pyreadstat>=1.2.6 ; extra == 'all' - pytest>=7.3.2 ; extra == 'all' - pytest-xdist>=3.4.0 ; extra == 'all' - python-calamine>=0.1.7 ; extra == 'all' - pytz>=2023.4 ; extra == 'all' - pyxlsb>=1.0.10 ; extra == 'all' - qtpy>=2.3.0 ; extra == 'all' - scipy>=1.12.0 ; extra == 'all' - s3fs>=2023.12.2 ; extra == 'all' - sqlalchemy>=2.0.0 ; extra == 'all' - tables>=3.8.0 ; extra == 'all' - tabulate>=0.9.0 ; extra == 'all' - xarray>=2024.1.1 ; extra == 'all' - xlrd>=2.0.1 ; extra == 'all' - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.22.0 ; extra == 'all' requires_python: ">=3.11" - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/pandas/3.0.0.dev0+2348.g7bfef3b1cb/pandas-3.0.0.dev0+2348.g7bfef3b1cb-cp313-cp313-win_amd64.whl name: pandas version: 3.0.0.dev0+2348.g7bfef3b1cb requires_dist: - numpy>=1.26.0 - python-dateutil>=2.8.2 - tzdata>=2023.3 - hypothesis>=6.84.0 ; extra == 'test' - pytest>=7.3.2 ; extra == 'test' - pytest-xdist>=3.4.0 ; extra == 'test' - pyarrow>=12.0.1 ; extra == 'pyarrow' - bottleneck>=1.3.6 ; extra == 'performance' - numba>=0.59.0 ; extra == 'performance' - numexpr>=2.9.0 ; extra == 'performance' - scipy>=1.12.0 ; extra == 'computation' - xarray>=2024.1.1 ; extra == 'computation' - fsspec>=2023.12.2 ; extra == 'fss' - s3fs>=2023.12.2 ; extra == 'aws' - gcsfs>=2023.12.2 ; extra == 'gcp' - odfpy>=1.4.1 ; extra == 'excel' - openpyxl>=3.1.2 ; extra == 'excel' - python-calamine>=0.1.7 ; extra == 'excel' - pyxlsb>=1.0.10 ; extra == 'excel' - xlrd>=2.0.1 ; extra == 'excel' - xlsxwriter>=3.2.0 ; extra == 'excel' - pyarrow>=12.0.1 ; extra == 'parquet' - pyarrow>=12.0.1 ; extra == 'feather' - pyiceberg>=0.7.1 ; extra == 'iceberg' - tables>=3.8.0 ; extra == 'hdf5' - pyreadstat>=1.2.6 ; extra == 'spss' - sqlalchemy>=2.0.0 ; extra == 'postgresql' - psycopg2>=2.9.9 ; extra == 'postgresql' - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' - sqlalchemy>=2.0.0 ; extra == 'mysql' - pymysql>=1.1.0 ; extra == 'mysql' - sqlalchemy>=2.0.0 ; extra == 'sql-other' - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' - beautifulsoup4>=4.12.3 ; extra == 'html' - html5lib>=1.1 ; extra == 'html' - lxml>=4.9.2 ; extra == 'html' - lxml>=4.9.2 ; extra == 'xml' - matplotlib>=3.8.3 ; extra == 'plot' - jinja2>=3.1.3 ; extra == 'output-formatting' - tabulate>=0.9.0 ; extra == 'output-formatting' - pyqt5>=5.15.9 ; extra == 'clipboard' - qtpy>=2.3.0 ; extra == 'clipboard' - zstandard>=0.22.0 ; extra == 'compression' - pytz>=2023.4 ; extra == 'timezone' - adbc-driver-postgresql>=1.2.0 ; extra == 'all' - adbc-driver-sqlite>=1.2.0 ; extra == 'all' - beautifulsoup4>=4.12.3 ; extra == 'all' - bottleneck>=1.3.6 ; extra == 'all' - fastparquet>=2024.2.0 ; extra == 'all' - fsspec>=2023.12.2 ; extra == 'all' - gcsfs>=2023.12.2 ; extra == 'all' - html5lib>=1.1 ; extra == 'all' - hypothesis>=6.84.0 ; extra == 'all' - jinja2>=3.1.3 ; extra == 'all' - lxml>=4.9.2 ; extra == 'all' - matplotlib>=3.8.3 ; extra == 'all' - numba>=0.59.0 ; extra == 'all' - numexpr>=2.9.0 ; extra == 'all' - odfpy>=1.4.1 ; extra == 'all' - openpyxl>=3.1.2 ; extra == 'all' - psycopg2>=2.9.9 ; extra == 'all' - pyarrow>=12.0.1 ; extra == 'all' - pyiceberg>=0.7.1 ; extra == 'all' - pymysql>=1.1.0 ; extra == 'all' - pyqt5>=5.15.9 ; extra == 'all' - pyreadstat>=1.2.6 ; extra == 'all' - pytest>=7.3.2 ; extra == 'all' - pytest-xdist>=3.4.0 ; extra == 'all' - python-calamine>=0.1.7 ; extra == 'all' - pytz>=2023.4 ; extra == 'all' - pyxlsb>=1.0.10 ; extra == 'all' - qtpy>=2.3.0 ; extra == 'all' - scipy>=1.12.0 ; extra == 'all' - s3fs>=2023.12.2 ; extra == 'all' - sqlalchemy>=2.0.0 ; extra == 'all' - tables>=3.8.0 ; extra == 'all' - tabulate>=0.9.0 ; extra == 'all' - xarray>=2024.1.1 ; extra == 'all' - xlrd>=2.0.1 ; extra == 'all' - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.22.0 ; extra == 'all' requires_python: ">=3.11" - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.2-py311hed34c8f_0.conda sha256: ac5372b55c12644ba4bab81270bb294fb70197f86c9b3ede57dfe367ecc6f198 md5: f98711aba4ad00ea3c286dcea5f57c1f depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - numpy >=1.22.4 - numpy >=1.23,<3 - python >=3.11,<3.12.0a0 - python-dateutil >=2.8.2 - python-tzdata >=2022.7 - python_abi 3.11.* *_cp311 - pytz >=2020.1 constrains: - pyqt5 >=5.15.9 - pyarrow >=10.0.1 - s3fs >=2022.11.0 - xlrd >=2.0.1 - numexpr >=2.8.4 - openpyxl >=3.1.0 - pyreadstat >=1.2.0 - zstandard >=0.19.0 - bottleneck >=1.3.6 - python-calamine >=0.1.7 - fastparquet >=2022.12.0 - psycopg2 >=2.9.6 - html5lib >=1.1 - numba >=0.56.4 - lxml >=4.9.2 - odfpy >=1.4.1 - xlsxwriter >=3.0.5 - pytables >=3.8.0 - pandas-gbq >=0.19.0 - sqlalchemy >=2.0.0 - blosc >=1.21.3 - pyxlsb >=1.0.10 - tabulate >=0.9.0 - tzdata >=2022.7 - gcsfs >=2022.11.0 - fsspec >=2022.11.0 - scipy >=1.10.0 - beautifulsoup4 >=4.11.2 - qtpy >=2.3.0 - matplotlib >=3.6.3 - xarray >=2022.12.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=compressed-mapping size: 15354460 timestamp: 1755779368955 - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.2-py312hf79963d_0.conda sha256: 1d2bbe7e84460ee68a25687f0312d7a106e97a980e89c491cd5c0ea2d1f9e146 md5: 73ed2394e5a88a403a071355698b48cb depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - numpy >=1.22.4 - numpy >=1.23,<3 - python >=3.12,<3.13.0a0 - python-dateutil >=2.8.2 - python-tzdata >=2022.7 - python_abi 3.12.* *_cp312 - pytz >=2020.1 constrains: - psycopg2 >=2.9.6 - zstandard >=0.19.0 - pyqt5 >=5.15.9 - bottleneck >=1.3.6 - pyarrow >=10.0.1 - s3fs >=2022.11.0 - pyxlsb >=1.0.10 - tabulate >=0.9.0 - fsspec >=2022.11.0 - beautifulsoup4 >=4.11.2 - xlrd >=2.0.1 - blosc >=1.21.3 - xlsxwriter >=3.0.5 - sqlalchemy >=2.0.0 - python-calamine >=0.1.7 - pytables >=3.8.0 - openpyxl >=3.1.0 - pandas-gbq >=0.19.0 - html5lib >=1.1 - numba >=0.56.4 - lxml >=4.9.2 - qtpy >=2.3.0 - numexpr >=2.8.4 - matplotlib >=3.6.3 - xarray >=2022.12.0 - gcsfs >=2022.11.0 - tzdata >=2022.7 - odfpy >=1.4.1 - pyreadstat >=1.2.0 - fastparquet >=2022.12.0 - scipy >=1.10.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=compressed-mapping size: 15108897 timestamp: 1755779512007 - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.2-py313h08cd8bf_0.conda sha256: 692a3bbf69b8fb7112e6416cffdf304c9aefbbe30bcce42ceacdcdd8cf5a1f44 md5: 5f4cc42e08d6d862b7b919a3c8959e0b depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - numpy >=1.22.4 - numpy >=1.23,<3 - python >=3.13,<3.14.0a0 - python-dateutil >=2.8.2 - python-tzdata >=2022.7 - python_abi 3.13.* *_cp313 - pytz >=2020.1 constrains: - pyreadstat >=1.2.0 - sqlalchemy >=2.0.0 - zstandard >=0.19.0 - python-calamine >=0.1.7 - tabulate >=0.9.0 - gcsfs >=2022.11.0 - tzdata >=2022.7 - scipy >=1.10.0 - xlrd >=2.0.1 - psycopg2 >=2.9.6 - pandas-gbq >=0.19.0 - pyqt5 >=5.15.9 - pytables >=3.8.0 - fastparquet >=2022.12.0 - odfpy >=1.4.1 - qtpy >=2.3.0 - numba >=0.56.4 - html5lib >=1.1 - xarray >=2022.12.0 - fsspec >=2022.11.0 - bottleneck >=1.3.6 - blosc >=1.21.3 - pyarrow >=10.0.1 - numexpr >=2.8.4 - xlsxwriter >=3.0.5 - matplotlib >=3.6.3 - beautifulsoup4 >=4.11.2 - pyxlsb >=1.0.10 - openpyxl >=3.1.0 - s3fs >=2022.11.0 - lxml >=4.9.2 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=hash-mapping size: 15102764 timestamp: 1755779522491 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.2-py311hff7e5bb_0.conda sha256: eb63f2d792b8eb69d1d53750fdde083f0bcf5b928cb069a1e557016a01ce4d71 md5: b28dbf599ee12914447e0b60530950d2 depends: - __osx >=11.0 - libcxx >=19 - numpy >=1.22.4 - numpy >=1.23,<3 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python-dateutil >=2.8.2 - python-tzdata >=2022.7 - python_abi 3.11.* *_cp311 - pytz >=2020.1 constrains: - pandas-gbq >=0.19.0 - zstandard >=0.19.0 - pyarrow >=10.0.1 - lxml >=4.9.2 - xarray >=2022.12.0 - xlsxwriter >=3.0.5 - pytables >=3.8.0 - pyreadstat >=1.2.0 - psycopg2 >=2.9.6 - odfpy >=1.4.1 - qtpy >=2.3.0 - openpyxl >=3.1.0 - html5lib >=1.1 - fastparquet >=2022.12.0 - python-calamine >=0.1.7 - sqlalchemy >=2.0.0 - beautifulsoup4 >=4.11.2 - scipy >=1.10.0 - pyqt5 >=5.15.9 - gcsfs >=2022.11.0 - blosc >=1.21.3 - bottleneck >=1.3.6 - s3fs >=2022.11.0 - pyxlsb >=1.0.10 - xlrd >=2.0.1 - fsspec >=2022.11.0 - tabulate >=0.9.0 - matplotlib >=3.6.3 - numexpr >=2.8.4 - tzdata >=2022.7 - numba >=0.56.4 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=compressed-mapping size: 14406952 timestamp: 1755779878619 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.2-py312h98f7732_0.conda sha256: fcbd2083a33d7e3ae9fae3ed0612e8d3e47e67da0cf5c73137e6fb13a50bda9e md5: 5e79cb3dfde551ceed2713a31babf903 depends: - __osx >=11.0 - libcxx >=19 - numpy >=1.22.4 - numpy >=1.23,<3 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python-dateutil >=2.8.2 - python-tzdata >=2022.7 - python_abi 3.12.* *_cp312 - pytz >=2020.1 constrains: - beautifulsoup4 >=4.11.2 - fastparquet >=2022.12.0 - openpyxl >=3.1.0 - numba >=0.56.4 - psycopg2 >=2.9.6 - xlrd >=2.0.1 - pyarrow >=10.0.1 - pytables >=3.8.0 - pyxlsb >=1.0.10 - fsspec >=2022.11.0 - gcsfs >=2022.11.0 - lxml >=4.9.2 - zstandard >=0.19.0 - sqlalchemy >=2.0.0 - scipy >=1.10.0 - blosc >=1.21.3 - matplotlib >=3.6.3 - xlsxwriter >=3.0.5 - html5lib >=1.1 - pyreadstat >=1.2.0 - odfpy >=1.4.1 - python-calamine >=0.1.7 - numexpr >=2.8.4 - xarray >=2022.12.0 - tabulate >=0.9.0 - s3fs >=2022.11.0 - pandas-gbq >=0.19.0 - pyqt5 >=5.15.9 - qtpy >=2.3.0 - tzdata >=2022.7 - bottleneck >=1.3.6 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=hash-mapping size: 13963929 timestamp: 1755779746492 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.2-py313hd1f53c0_0.conda sha256: 4fe3d91274f1d6a4ad13c3f8e7f1dac1c205d4defb18f6a737346ab6be5d91ee md5: 6648125fd971c2525f893200617ab22b depends: - __osx >=11.0 - libcxx >=19 - numpy >=1.22.4 - numpy >=1.23,<3 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python-dateutil >=2.8.2 - python-tzdata >=2022.7 - python_abi 3.13.* *_cp313 - pytz >=2020.1 constrains: - python-calamine >=0.1.7 - tabulate >=0.9.0 - qtpy >=2.3.0 - numexpr >=2.8.4 - pytables >=3.8.0 - fsspec >=2022.11.0 - gcsfs >=2022.11.0 - fastparquet >=2022.12.0 - pyreadstat >=1.2.0 - lxml >=4.9.2 - sqlalchemy >=2.0.0 - numba >=0.56.4 - pandas-gbq >=0.19.0 - odfpy >=1.4.1 - zstandard >=0.19.0 - matplotlib >=3.6.3 - bottleneck >=1.3.6 - pyarrow >=10.0.1 - psycopg2 >=2.9.6 - xlsxwriter >=3.0.5 - s3fs >=2022.11.0 - xarray >=2022.12.0 - xlrd >=2.0.1 - pyxlsb >=1.0.10 - pyqt5 >=5.15.9 - scipy >=1.10.0 - tzdata >=2022.7 - blosc >=1.21.3 - beautifulsoup4 >=4.11.2 - openpyxl >=3.1.0 - html5lib >=1.1 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=hash-mapping size: 14047923 timestamp: 1755779620427 - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.2-py311h11fd7f3_0.conda sha256: 7eaadbdb9c58274daac8f5659ce448a570ea10e9bfc55c97a72a95a6e9b4d5aa md5: 1528d744a31b20442ca7c1f365a28cc2 depends: - numpy >=1.22.4 - numpy >=1.23,<3 - python >=3.11,<3.12.0a0 - python-dateutil >=2.8.2 - python-tzdata >=2022.7 - python_abi 3.11.* *_cp311 - pytz >=2020.1 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - beautifulsoup4 >=4.11.2 - tzdata >=2022.7 - xlsxwriter >=3.0.5 - pytables >=3.8.0 - html5lib >=1.1 - s3fs >=2022.11.0 - matplotlib >=3.6.3 - pyarrow >=10.0.1 - lxml >=4.9.2 - python-calamine >=0.1.7 - pyxlsb >=1.0.10 - pandas-gbq >=0.19.0 - fastparquet >=2022.12.0 - bottleneck >=1.3.6 - xarray >=2022.12.0 - fsspec >=2022.11.0 - odfpy >=1.4.1 - pyqt5 >=5.15.9 - openpyxl >=3.1.0 - tabulate >=0.9.0 - psycopg2 >=2.9.6 - blosc >=1.21.3 - pyreadstat >=1.2.0 - qtpy >=2.3.0 - scipy >=1.10.0 - gcsfs >=2022.11.0 - numexpr >=2.8.4 - sqlalchemy >=2.0.0 - zstandard >=0.19.0 - xlrd >=2.0.1 - numba >=0.56.4 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=hash-mapping size: 14410335 timestamp: 1755779632554 - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.2-py312hc128f0a_0.conda sha256: cb2a3e204e6e1cba20b4409e43b3405fb78713c3d3f7d61e4b52b7356852e391 md5: 8d15003eebb1f6b913d07172664afb67 depends: - numpy >=1.22.4 - numpy >=1.23,<3 - python >=3.12,<3.13.0a0 - python-dateutil >=2.8.2 - python-tzdata >=2022.7 - python_abi 3.12.* *_cp312 - pytz >=2020.1 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - zstandard >=0.19.0 - blosc >=1.21.3 - pandas-gbq >=0.19.0 - tabulate >=0.9.0 - scipy >=1.10.0 - xlsxwriter >=3.0.5 - pyxlsb >=1.0.10 - pyqt5 >=5.15.9 - numexpr >=2.8.4 - s3fs >=2022.11.0 - xlrd >=2.0.1 - openpyxl >=3.1.0 - matplotlib >=3.6.3 - bottleneck >=1.3.6 - lxml >=4.9.2 - fsspec >=2022.11.0 - psycopg2 >=2.9.6 - beautifulsoup4 >=4.11.2 - pyarrow >=10.0.1 - sqlalchemy >=2.0.0 - html5lib >=1.1 - fastparquet >=2022.12.0 - python-calamine >=0.1.7 - numba >=0.56.4 - qtpy >=2.3.0 - pytables >=3.8.0 - pyreadstat >=1.2.0 - odfpy >=1.4.1 - tzdata >=2022.7 - xarray >=2022.12.0 - gcsfs >=2022.11.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=hash-mapping size: 13869930 timestamp: 1755779639033 - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.2-py313hc90dcd4_0.conda sha256: d58849a03599e75d6ff9488e368a882aa37388e4b41478bbd3e3ea1179031fe0 md5: 35fe6d384d80f6e52c880c4abfc41a35 depends: - numpy >=1.22.4 - numpy >=1.23,<3 - python >=3.13,<3.14.0a0 - python-dateutil >=2.8.2 - python-tzdata >=2022.7 - python_abi 3.13.* *_cp313 - pytz >=2020.1 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - pytables >=3.8.0 - qtpy >=2.3.0 - numba >=0.56.4 - tabulate >=0.9.0 - blosc >=1.21.3 - fsspec >=2022.11.0 - odfpy >=1.4.1 - gcsfs >=2022.11.0 - lxml >=4.9.2 - pandas-gbq >=0.19.0 - pyqt5 >=5.15.9 - matplotlib >=3.6.3 - sqlalchemy >=2.0.0 - html5lib >=1.1 - beautifulsoup4 >=4.11.2 - pyreadstat >=1.2.0 - zstandard >=0.19.0 - fastparquet >=2022.12.0 - scipy >=1.10.0 - xarray >=2022.12.0 - xlsxwriter >=3.0.5 - bottleneck >=1.3.6 - s3fs >=2022.11.0 - psycopg2 >=2.9.6 - tzdata >=2022.7 - pyarrow >=10.0.1 - xlrd >=2.0.1 - pyxlsb >=1.0.10 - openpyxl >=3.1.0 - numexpr >=2.8.4 - python-calamine >=0.1.7 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=hash-mapping size: 13966284 timestamp: 1755779637297 - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.7.0.2-ha770c72_0.conda sha256: 243c49b34caa9328e9d5f62c98be9eb046be8fee9836854b88d9022ce8013497 md5: db0c1632047d38997559ce2c4741dd91 license: GPL-2.0-or-later license_family: GPL purls: [] size: 21704062 timestamp: 1748609438645 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.7.0.2-hce30654_0.conda sha256: 8cd35b1ff32538cd257be20f2adfd92f842cdd65a065650c8e3fc2d2a0acc773 md5: 62031b5e240df47db4c26e672013587c license: GPL-2.0-or-later license_family: GPL purls: [] size: 27400568 timestamp: 1748609466843 - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.7.0.2-h57928b3_0.conda sha256: 7fff0deca558c5ab6c836127481decbec83c0add3a0ab2b81d1f10130146c357 md5: a77c859d9469f24691d6c6590b56fa45 license: GPL-2.0-or-later license_family: GPL purls: [] size: 25783551 timestamp: 1748609806484 - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f md5: 457c2c8c08e54905d6954e79cb5b5db9 depends: - python !=3.0,!=3.1,!=3.2,!=3.3 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandocfilters?source=hash-mapping size: 11627 timestamp: 1631603397334 - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda sha256: 30de7b4d15fbe53ffe052feccde31223a236dae0495bab54ab2479de30b2990f md5: a110716cdb11cf51482ff4000dc253d7 depends: - python >=3.10 - python license: MIT license_family: MIT purls: - pkg:pypi/parso?source=hash-mapping size: 81562 timestamp: 1755974222274 - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda sha256: 472fc587c63ec4f6eba0cc0b06008a6371e0a08a5986de3cf4e8024a47b4fe6c md5: 0badf9c54e24cecfb0ad2f99d680c163 depends: - locket - python >=3.9 - toolz license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/partd?source=hash-mapping size: 20884 timestamp: 1715026639309 - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a md5: d0d408b1f18883a944376da5cf8101ea depends: - ptyprocess >=0.5 - python >=3.9 license: ISC purls: - pkg:pypi/pexpect?source=hash-mapping size: 53561 timestamp: 1733302019362 - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda sha256: e2ac3d66c367dada209fc6da43e645672364b9fd5f9d28b9f016e24b81af475b md5: 11a9d1d09a3615fc07c3faf79bc0b943 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/pickleshare?source=hash-mapping size: 11748 timestamp: 1733327448200 - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h1322bbf_0.conda sha256: cf296d5185090f27ac4e3d73177ff865ca87307c815d759f3baa0f9c8680a250 md5: 8b4568b1357f5ec5494e36b06076c3a1 depends: - __glibc >=2.17,<3.0.a0 - lcms2 >=2.17,<3.0a0 - libfreetype >=2.13.3 - libfreetype6 >=2.13.3 - libgcc >=13 - libjpeg-turbo >=3.1.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - libwebp-base >=1.5.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openjpeg >=2.5.3,<3.0a0 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - tk >=8.6.13,<8.7.0a0 license: HPND purls: - pkg:pypi/pillow?source=hash-mapping size: 43054892 timestamp: 1751482121228 - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h80c1187_0.conda sha256: 7c9a8f65a200587bf7a0135ca476f9c472348177338ed8b825ddcc08773fde68 md5: 7911e727a6c24db662193a960b81b6b2 depends: - __glibc >=2.17,<3.0.a0 - lcms2 >=2.17,<3.0a0 - libfreetype >=2.13.3 - libfreetype6 >=2.13.3 - libgcc >=13 - libjpeg-turbo >=3.1.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - libwebp-base >=1.5.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openjpeg >=2.5.3,<3.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - tk >=8.6.13,<8.7.0a0 license: HPND purls: - pkg:pypi/pillow?source=hash-mapping size: 42964111 timestamp: 1751482158083 - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py313h8db990d_0.conda sha256: 73067c9a1ea4857ce9fb6788d404cd7d931ba323ad26eddf083c5b12dc8d73c0 md5: 114a74a6e184101112fdffd3a1cb5b8f depends: - __glibc >=2.17,<3.0.a0 - lcms2 >=2.17,<3.0a0 - libfreetype >=2.13.3 - libfreetype6 >=2.13.3 - libgcc >=13 - libjpeg-turbo >=3.1.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - libwebp-base >=1.5.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openjpeg >=2.5.3,<3.0a0 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - tk >=8.6.13,<8.7.0a0 license: HPND purls: - pkg:pypi/pillow?source=hash-mapping size: 42651243 timestamp: 1751482117433 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.3.0-py311hb9ba9e9_0.conda sha256: 6eb85c7828cd28f79980dff822a2acac74c8edaa186a9dfef53bc2bf7421cd26 md5: afcdff84f6b7dd35ba49f3fe55dcc90f depends: - __osx >=11.0 - lcms2 >=2.17,<3.0a0 - libfreetype >=2.13.3 - libfreetype6 >=2.13.3 - libjpeg-turbo >=3.1.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - libwebp-base >=1.5.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openjpeg >=2.5.3,<3.0a0 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 - tk >=8.6.13,<8.7.0a0 license: HPND purls: - pkg:pypi/pillow?source=hash-mapping size: 42028662 timestamp: 1751482509684 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.3.0-py312h50aef2c_0.conda sha256: 3d60288e8cfd42e4548c9e5192a285e73f81df2869f69b9d3905849b45d9bd2a md5: dddff48655b5cd24a5170a6df979943a depends: - __osx >=11.0 - lcms2 >=2.17,<3.0a0 - libfreetype >=2.13.3 - libfreetype6 >=2.13.3 - libjpeg-turbo >=3.1.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - libwebp-base >=1.5.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openjpeg >=2.5.3,<3.0a0 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 - tk >=8.6.13,<8.7.0a0 license: HPND purls: - pkg:pypi/pillow?source=hash-mapping size: 42514714 timestamp: 1751482419501 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.3.0-py313hb37fac4_0.conda sha256: 7cde8deee86b0c57640a8c48a895490244ebff147bbeb67f5bf671368c27b12a md5: fa126c6e1b159bab7fdb7a89ce7cdf58 depends: - __osx >=11.0 - lcms2 >=2.17,<3.0a0 - libfreetype >=2.13.3 - libfreetype6 >=2.13.3 - libjpeg-turbo >=3.1.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - libwebp-base >=1.5.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openjpeg >=2.5.3,<3.0a0 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 - tk >=8.6.13,<8.7.0a0 license: HPND purls: - pkg:pypi/pillow?source=hash-mapping size: 42120953 timestamp: 1751482521154 - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-11.3.0-py311h0f9b5fc_0.conda sha256: 91aa79f6a0894edf9c698251428f3bb175f274c476f6bc07eb9136ab10ba1e76 md5: feb1a7f0fa15a147350d2c7d477e72b3 depends: - lcms2 >=2.17,<3.0a0 - libfreetype >=2.13.3 - libfreetype6 >=2.13.3 - libjpeg-turbo >=3.1.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - libwebp-base >=1.5.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openjpeg >=2.5.3,<3.0a0 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - tk >=8.6.13,<8.7.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: HPND purls: - pkg:pypi/pillow?source=hash-mapping size: 42754092 timestamp: 1751482299214 - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-11.3.0-py312hfb502af_0.conda sha256: 7b523afc3ce71be4655c0d639c3fe2e4d0f2f6ce87e4bcc523163700995f2b3f md5: 40dd6b8b814253a77c3297273bfb3701 depends: - lcms2 >=2.17,<3.0a0 - libfreetype >=2.13.3 - libfreetype6 >=2.13.3 - libjpeg-turbo >=3.1.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - libwebp-base >=1.5.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openjpeg >=2.5.3,<3.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - tk >=8.6.13,<8.7.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: HPND purls: - pkg:pypi/pillow?source=hash-mapping size: 42787505 timestamp: 1751482431385 - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-11.3.0-py313h641beac_0.conda sha256: 7443ad7db99ec4432c9dc09961a92405b899889aafea5b55dc193d2eb5416ba8 md5: 04595138d9590cd65691218b20f0f4b6 depends: - lcms2 >=2.17,<3.0a0 - libfreetype >=2.13.3 - libfreetype6 >=2.13.3 - libjpeg-turbo >=3.1.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - libwebp-base >=1.5.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openjpeg >=2.5.3,<3.0a0 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - tk >=8.6.13,<8.7.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: HPND purls: - pkg:pypi/pillow?source=hash-mapping size: 42177350 timestamp: 1751482641943 - pypi: git+https://github.com/hgrecco/pint.git#6e0d03862a863169d18e6f8687472ec256718732 name: pint version: 0.26.dev5+g6e0d03862 requires_dist: - flexcache>=0.3 - flexparser>=0.4 - platformdirs>=2.1.0 - typing-extensions>=4.0.0 - babel<=2.8 ; extra == 'all' - dask<2025.3.0 ; extra == 'all' - matplotlib ; extra == 'all' - mip>=1.13 ; python_full_version < '3.13' and extra == 'all' - numpy>=1.23 ; extra == 'all' - pint-pandas>=0.3 ; extra == 'all' - uncertainties>=3.1.6 ; extra == 'all' - xarray ; extra == 'all' - babel<=2.8 ; extra == 'babel' - pytest ; extra == 'codspeed' - pytest-benchmark ; extra == 'codspeed' - pytest-codspeed ; extra == 'codspeed' - pytest-cov ; extra == 'codspeed' - pytest-mpl ; extra == 'codspeed' - pytest-subtests ; extra == 'codspeed' - dask<2025.3.0 ; extra == 'dask' - babel ; extra == 'docs' - commonmark==0.8.1 ; extra == 'docs' - docutils ; extra == 'docs' - graphviz ; extra == 'docs' - ipykernel ; extra == 'docs' - ipython<=8.12 ; extra == 'docs' - jupyter-client ; extra == 'docs' - nbsphinx ; extra == 'docs' - pooch ; extra == 'docs' - pygments>=2.4 ; extra == 'docs' - recommonmark==0.5.0 ; extra == 'docs' - sciform ; extra == 'docs' - scipy ; extra == 'docs' - serialize ; extra == 'docs' - sparse ; extra == 'docs' - sphinx-book-theme>=1.1.0 ; extra == 'docs' - sphinx-copybutton ; extra == 'docs' - sphinx-design ; extra == 'docs' - sphinx>=6,<8.2 ; extra == 'docs' - matplotlib ; extra == 'matplotlib' - mip>=1.13 ; python_full_version < '3.13' and extra == 'mip' - numpy>=1.23 ; extra == 'numpy' - pint-pandas>=0.3 ; extra == 'pandas' - pytest ; extra == 'test' - pytest-benchmark ; extra == 'test' - pytest-cov ; extra == 'test' - pytest-subtests ; extra == 'test' - pytest ; extra == 'test-all' - pytest-benchmark ; extra == 'test-all' - pytest-cov ; extra == 'test-all' - pytest-mpl ; extra == 'test-all' - pytest-subtests ; extra == 'test-all' - pytest-mpl ; extra == 'test-mpl' - uncertainties>=3.1.6 ; extra == 'uncertainties' - xarray ; extra == 'xarray' requires_python: ">=3.11" - conda: https://conda.anaconda.org/conda-forge/noarch/pint-0.25-pyhe01879c_0.conda sha256: 623e6dc9554bccab6dc016360c56a75d22582f502b1d429bdffb9bd09b3b365a md5: 4105d76e84f5a52d307dd1d1aed1128b depends: - python >=3.11 - platformdirs >=2.1.0 - flexcache >=0.3 - flexparser >=0.4 - typing_extensions >=4.0.0 - python constrains: - numpy >=1.23 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pint?source=hash-mapping size: 243139 timestamp: 1755321351815 - pypi: ./ name: pint-xarray version: 0.5.2.dev26+g0766c3bfa sha256: 86165cb540c3e7dd5ed1f45b804f83aefd85d327fcbe0c55c055360ac9a5d85c requires_dist: - xarray>=2023.7.0 - numpy>=1.26 - pint>=0.24 requires_python: ">=3.11" editable: true - pypi: https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl name: platformdirs version: 4.4.0 sha256: abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85 requires_dist: - furo>=2024.8.6 ; extra == 'docs' - proselint>=0.14 ; extra == 'docs' - sphinx-autodoc-typehints>=3 ; extra == 'docs' - sphinx>=8.1.3 ; extra == 'docs' - appdirs==1.4.4 ; extra == 'test' - covdefaults>=2.3 ; extra == 'test' - pytest-cov>=6 ; extra == 'test' - pytest-mock>=3.14 ; extra == 'test' - pytest>=8.3.4 ; extra == 'test' - mypy>=1.14.1 ; extra == 'type' requires_python: ">=3.9" - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda sha256: dfe0fa6e351d2b0cef95ac1a1533d4f960d3992f9e0f82aeb5ec3623a699896b md5: cc9d9a3929503785403dbfad9f707145 depends: - python >=3.10 - python license: MIT license_family: MIT purls: - pkg:pypi/platformdirs?source=compressed-mapping size: 23653 timestamp: 1756227402815 - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda sha256: a8eb555eef5063bbb7ba06a379fa7ea714f57d9741fe0efdb9442dbbc2cccbcc md5: 7da7ccd349dbf6487a7778579d2bb971 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/pluggy?source=hash-mapping size: 24246 timestamp: 1747339794916 - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_3.conda sha256: 032405adb899ba7c7cc24d3b4cd4e7f40cf24ac4f253a8e385a4f44ccb5e0fc6 md5: d2bbbd293097e664ffb01fc4cdaf5729 depends: - packaging >=20.0 - platformdirs >=2.5.0 - python >=3.9 - requests >=2.19.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pooch?source=hash-mapping size: 55588 timestamp: 1754941801129 - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc md5: a83f6a2fdc079e643237887a37460668 depends: - __glibc >=2.17,<3.0.a0 - libcurl >=8.10.1,<9.0a0 - libgcc >=13 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - zlib license: MIT license_family: MIT purls: [] size: 199544 timestamp: 1730769112346 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff md5: 7172339b49c94275ba42fec3eaeda34f depends: - __osx >=11.0 - libcurl >=8.10.1,<9.0a0 - libcxx >=18 - libzlib >=1.3.1,<2.0a0 - zlib license: MIT license_family: MIT purls: [] size: 173220 timestamp: 1730769371051 - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda sha256: 4817651a276016f3838957bfdf963386438c70761e9faec7749d411635979bae md5: edb16f14d920fb3faf17f5ce582942d6 depends: - python >=3.10 - wcwidth constrains: - prompt_toolkit 3.0.52 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/prompt-toolkit?source=hash-mapping size: 273927 timestamp: 1756321848365 - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py311h49ec1c0_1.conda sha256: 729720d777b14329af411220fd305f78e8914356f963af0053420e1cf5e58a53 md5: d30c3f3b089100634f93e97e5ee3aa85 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping size: 483612 timestamp: 1755851438911 - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py312h4c3975b_1.conda sha256: 87fa638e19db9c9c5a1e9169d12a4b90ea32c72b47e8da328b36d233ba72cc79 md5: ebc6080d32b9608710a0d651e581d9f4 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping size: 467818 timestamp: 1755851390449 - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py313h07c4f96_1.conda sha256: 9182273778a10b2a82343c5c1c8b57f4551dd07d9a639585d468f4a7fe5ff1e8 md5: 5a7c24c9dc49128731ae565cf598cde4 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping size: 474571 timestamp: 1755851494108 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py311h3696347_1.conda sha256: c21cd67c4037f232ba539f221839d1bcc7dbcc416d51f821fd319d91b5b61c3b md5: c449b450f0c81bc09e6a59a07adf95a1 depends: - __osx >=11.0 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping size: 493127 timestamp: 1755851546773 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py312h163523d_1.conda sha256: 7cae084fc2776ad6425d1713430ee39fb3366dae4742e005dc64d425eed3a2f8 md5: 2d2326a0b582b1b56252a479f204fab1 depends: - __osx >=11.0 - 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 purls: - pkg:pypi/psutil?source=hash-mapping size: 474827 timestamp: 1755851594550 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py313hcdf3177_1.conda sha256: 4964c94067fdf290d4790095ead992b2a3afb438bff8bd9b51c444d97fb63914 md5: 1ce8cf644e210b54665d8e46850d7567 depends: - __osx >=11.0 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping size: 484934 timestamp: 1755851718841 - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.0.0-py311h3485c13_1.conda sha256: f48c2e47fda7259235f8abb55d219c419df3cc52e2e15ee9ee17da20b86393e5 md5: cd66a378835a5da422201faac2c114c7 depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping size: 499413 timestamp: 1755851559633 - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.0.0-py312he06e257_1.conda sha256: 5da4eabbcf285a251d06827484b7f90ad43a7960b6753c57d4735966851d16e1 md5: f3362e816f134b248cc0ac41924c7277 depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping size: 485245 timestamp: 1755851679538 - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.0.0-py313h5ea7bf4_1.conda sha256: 9e63542ffd8ac4104cff34e722019fc3eb6eef274c77740eef1d73056c56cade md5: 00c2580acce9c51004818c6981c586d9 depends: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping size: 490305 timestamp: 1755851561624 - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 md5: b3c17d95b5a10c6e64a21fa17573e70e depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: MIT license_family: MIT purls: [] size: 8252 timestamp: 1726802366959 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 md5: 415816daf82e0b23a736a069a75e9da7 depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] size: 8381 timestamp: 1726802424786 - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda sha256: 7e446bafb4d692792310ed022fe284e848c6a868c861655a92435af7368bae7b md5: 3c8f2573569bb816483e5cf57efbbe29 depends: - libgcc >=13 - libwinpthread >=12.0.0.r4.gg4f2fc60ca - ucrt >=10.0.20348.0 license: MIT license_family: MIT purls: [] size: 9389 timestamp: 1726802555076 - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83 md5: 7d9daffbb8d8e0af0f769dbbcd173a54 depends: - python >=3.9 license: ISC purls: - pkg:pypi/ptyprocess?source=hash-mapping size: 19457 timestamp: 1733302371990 - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0 md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/pure-eval?source=hash-mapping size: 16668 timestamp: 1733569518868 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-21.0.0-py311h38be061_0.conda sha256: 3e0630ce8b1fb09745b22a214f5f96bbdc8daabefa5660cd1dd82ee07acf240a md5: 53595e5097b9cd0f979a9fe91ab668b2 depends: - libarrow-acero 21.0.0.* - libarrow-dataset 21.0.0.* - libarrow-substrait 21.0.0.* - libparquet 21.0.0.* - pyarrow-core 21.0.0 *_0_* - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: Apache-2.0 license_family: APACHE purls: [] size: 26115 timestamp: 1753371900134 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-21.0.0-py312h7900ff3_0.conda sha256: f8a1cdbe092418e9486f05b3038c92fc889ec7aea6c7e1b31b21728c7f960ae0 md5: 47840b91316fed382da9873e40b62ee0 depends: - libarrow-acero 21.0.0.* - libarrow-dataset 21.0.0.* - libarrow-substrait 21.0.0.* - libparquet 21.0.0.* - pyarrow-core 21.0.0 *_0_* - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: APACHE purls: [] size: 26130 timestamp: 1753372099545 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-21.0.0-py313h78bf25f_0.conda sha256: 5d0f17c0fbf8d5b78458bc616d5bfaf9812aa9cc81e9e38b21e61787a5060199 md5: 1580ddd94606ccb60270877cb8838562 depends: - libarrow-acero 21.0.0.* - libarrow-dataset 21.0.0.* - libarrow-substrait 21.0.0.* - libparquet 21.0.0.* - pyarrow-core 21.0.0 *_0_* - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: Apache-2.0 license_family: APACHE purls: [] size: 26103 timestamp: 1753372222314 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-21.0.0-py311ha1ab1f8_0.conda sha256: 20a1187ebf6e3d97836dc04d9deb5f9a3736967104fd8cc1154787ffc10f26c9 md5: 557051f0666c7f48c845cdddd229a4d9 depends: - libarrow-acero 21.0.0.* - libarrow-dataset 21.0.0.* - libarrow-substrait 21.0.0.* - libparquet 21.0.0.* - pyarrow-core 21.0.0 *_0_* - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: Apache-2.0 license_family: APACHE purls: [] size: 26179 timestamp: 1753372345331 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-21.0.0-py312h1f38498_0.conda sha256: 82b76a858477ca2926b1ce889414889fb747b9357f5ec4032ca028e29c791a18 md5: 9c9796e1bb1e7f1f06b6ff668edc8fbe depends: - libarrow-acero 21.0.0.* - libarrow-dataset 21.0.0.* - libarrow-substrait 21.0.0.* - libparquet 21.0.0.* - pyarrow-core 21.0.0 *_0_* - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: APACHE purls: [] size: 26248 timestamp: 1753371977166 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-21.0.0-py313h39782a4_0.conda sha256: 2cf1e4193ce7904866fb48839095c586c7abfdc91e9bb5698af0324310142c31 md5: 398c05f27303ea930271992e281536c2 depends: - libarrow-acero 21.0.0.* - libarrow-dataset 21.0.0.* - libarrow-substrait 21.0.0.* - libparquet 21.0.0.* - pyarrow-core 21.0.0 *_0_* - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: Apache-2.0 license_family: APACHE purls: [] size: 26223 timestamp: 1753371833960 - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-21.0.0-py311h1ea47a8_0.conda sha256: 0bf2e151d868c91b9bcf687e63f06f760a6b7a560cb74be6f420a779048d4165 md5: 9953f4f63bd2639aaa1412bfe4752105 depends: - libarrow-acero 21.0.0.* - libarrow-dataset 21.0.0.* - libarrow-substrait 21.0.0.* - libparquet 21.0.0.* - pyarrow-core 21.0.0 *_0_* - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: Apache-2.0 license_family: APACHE purls: [] size: 26484 timestamp: 1753372947940 - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-21.0.0-py312h2e8e312_0.conda sha256: 325029e805bf7e88a8064b61acd998d3dc1a2ab1a194ef6c8ef2db6014a5dfc1 md5: acfca835758be2fbd8ba36d3f4e4b6b7 depends: - libarrow-acero 21.0.0.* - libarrow-dataset 21.0.0.* - libarrow-substrait 21.0.0.* - libparquet 21.0.0.* - pyarrow-core 21.0.0 *_0_* - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: APACHE purls: [] size: 26486 timestamp: 1753372018841 - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-21.0.0-py313hfa70ccb_0.conda sha256: 420ed1bd70736819caf998b4df132781347b973b4f050f7ce7c35a1a503143bd md5: 1722f945fedb2133bdce2f8e78318482 depends: - libarrow-acero 21.0.0.* - libarrow-dataset 21.0.0.* - libarrow-substrait 21.0.0.* - libparquet 21.0.0.* - pyarrow-core 21.0.0 *_0_* - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: Apache-2.0 license_family: APACHE purls: [] size: 26557 timestamp: 1753373106836 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-21.0.0-py311h342b5a4_0_cpu.conda sha256: 71777195703bdb15cf193273b0e4da6b252a593530dfc2ffe6ace2c0a30010b4 md5: 8a7ec568798eb3b4e2c9cb00c8a303c0 depends: - __glibc >=2.17,<3.0.a0 - libarrow 21.0.0.* *cpu - libarrow-compute 21.0.0.* *cpu - libgcc >=14 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 constrains: - apache-arrow-proc * cpu - numpy >=1.21,<3 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping size: 5371870 timestamp: 1753371875792 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-21.0.0-py312hc195796_0_cpu.conda sha256: b812cd0c1a8e0acbacc78ac15bff0b9fc4e81a223a2d09af5df521cdf8b092a0 md5: b20ffa63d24140cb1987cde8698bbce2 depends: - __glibc >=2.17,<3.0.a0 - libarrow 21.0.0.* *cpu - libarrow-compute 21.0.0.* *cpu - libgcc >=14 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 constrains: - numpy >=1.21,<3 - apache-arrow-proc * cpu license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping size: 4796116 timestamp: 1753371950984 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-21.0.0-py313he109ebe_0_cpu.conda sha256: 900374d98691caf4c9fffec8713b5ee2fc70040bd2dddbe1c91d660714bc89b5 md5: 3018b7f30825c21c47a7a1e061459f96 depends: - __glibc >=2.17,<3.0.a0 - libarrow 21.0.0.* *cpu - libarrow-compute 21.0.0.* *cpu - libgcc >=14 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 constrains: - apache-arrow-proc * cpu - numpy >=1.21,<3 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping size: 5345643 timestamp: 1753371833528 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-21.0.0-py311h740f514_0_cpu.conda sha256: fa0dce66266c807009f9994f39b04d3e9c07ffbabd9bdebd98593349dcf4faee md5: bfd6002d69eb562e2f02650a162c5bba depends: - __osx >=11.0 - libarrow 21.0.0.* *cpu - libarrow-compute 21.0.0.* *cpu - libcxx >=18 - libzlib >=1.3.1,<2.0a0 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 constrains: - numpy >=1.21,<3 - apache-arrow-proc * cpu license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping size: 4285527 timestamp: 1753372295212 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-21.0.0-py312h3dbcb64_0_cpu.conda sha256: 1bfe60f962d767387cf9c6134fb2c8ba2930734fa2d0ec3e24671e32cf80f525 md5: c5cf21732ece92ab7ed7897b310f1210 depends: - __osx >=11.0 - libarrow 21.0.0.* *cpu - libarrow-compute 21.0.0.* *cpu - libcxx >=18 - libzlib >=1.3.1,<2.0a0 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 constrains: - numpy >=1.21,<3 - apache-arrow-proc * cpu license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping size: 4258662 timestamp: 1753371934508 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-21.0.0-py313hf9431ad_0_cpu.conda sha256: 696a7e9139c02fbfb5a1fd8f33599a50cb2d71ba47b09d18670f71d5b2651d50 md5: 104f10514db27ffb78bc4bacfd92fc5d depends: - __osx >=11.0 - libarrow 21.0.0.* *cpu - libarrow-compute 21.0.0.* *cpu - libcxx >=18 - libzlib >=1.3.1,<2.0a0 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 constrains: - numpy >=1.21,<3 - apache-arrow-proc * cpu license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping size: 3919054 timestamp: 1753371806669 - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-21.0.0-py311ha836b3b_0_cpu.conda sha256: 7c9ac7fbc412594bfd7b9655f8b567e4474480140fb74468057f2e421a70fcce md5: 43e1fe8fe7bbba53945ed170680bd734 depends: - libarrow 21.0.0.* *cpu - libarrow-compute 21.0.0.* *cpu - libzlib >=1.3.1,<2.0a0 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - apache-arrow-proc * cpu - numpy >=1.21,<3 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping size: 3556248 timestamp: 1753372309548 - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-21.0.0-py312h85419b5_0_cpu.conda sha256: 68ce7f9b59e5dd92781513b40fb923bd87a1023973580b75b8417e98b7c89e1b md5: a411147ac3fabb67e47a648d0aa67bd3 depends: - libarrow 21.0.0.* *cpu - libarrow-compute 21.0.0.* *cpu - libzlib >=1.3.1,<2.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - numpy >=1.21,<3 - apache-arrow-proc * cpu license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping size: 3475968 timestamp: 1753371986093 - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-21.0.0-py313h5921983_0_cpu.conda sha256: def0185a4ab0456d3eb04d92f69c3adb459b67787915509d18f683dbde9fc2da md5: baff4f6ac77293753e03246d73a6b7ac depends: - libarrow 21.0.0.* *cpu - libarrow-compute 21.0.0.* *cpu - libzlib >=1.3.1,<2.0a0 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - apache-arrow-proc * cpu - numpy >=1.21,<3 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping size: 3522677 timestamp: 1753371949973 - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 md5: 12c566707c80111f9799308d9e265aef depends: - python >=3.9 - python license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pycparser?source=hash-mapping size: 110100 timestamp: 1733195786147 - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a md5: 6b6ece66ebcae2d5f326c77ef2c5a066 depends: - python >=3.9 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/pygments?source=hash-mapping size: 889287 timestamp: 1750615908735 - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda sha256: afe32182b1090911b64ac0f29eb47e03a015d142833d8a917defd65d91c99b74 md5: aa0028616c0750c773698fdc254b2b8d depends: - python >=3.9 - python license: MIT license_family: MIT purls: - pkg:pypi/pyparsing?source=compressed-mapping size: 102292 timestamp: 1753873557076 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca md5: e2fd202833c4a981ce8a65974fe4abd1 depends: - __win - python >=3.9 - win_inet_pton license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pysocks?source=hash-mapping size: 21784 timestamp: 1733217448189 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 md5: 461219d1a5bd61342293efa2c0c90eac depends: - __unix - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pysocks?source=hash-mapping size: 21085 timestamp: 1733217331982 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda sha256: 93e267e4ec35353e81df707938a6527d5eb55c97bf54c3b87229b69523afb59d md5: a49c2283f24696a7b30367b7346a0144 depends: - colorama >=0.4 - exceptiongroup >=1 - iniconfig >=1 - packaging >=20 - pluggy >=1.5,<2 - pygments >=2.7.2 - python >=3.9 - tomli >=1 constrains: - pytest-faulthandler >=2 license: MIT license_family: MIT purls: - pkg:pypi/pytest?source=hash-mapping size: 276562 timestamp: 1750239526127 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda sha256: 3a9fc07be76bc67aef355b78816b5117bfe686e7d8c6f28b45a1f89afe104761 md5: ce978e1b9ed8b8d49164e90a5cdc94cd depends: - coverage >=7.5 - pytest >=4.6 - python >=3.9 - toml license: MIT license_family: MIT purls: - pkg:pypi/pytest-cov?source=hash-mapping size: 28216 timestamp: 1749778064293 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-reportlog-0.1.2-pyhd8ed1ab_0.tar.bz2 sha256: 8a5006206da2ed0951401f185100012ccd90b2e6349e4b4a60aec37112c59f22 md5: 4ec7cfd66ee4475f774be16bfd9cb3d9 depends: - pytest >=5.2 - python >=3.5 license: MIT license_family: MIT purls: - pkg:pypi/pytest-reportlog?source=hash-mapping size: 8936 timestamp: 1608119852059 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda sha256: b7b58a5be090883198411337b99afb6404127809c3d1c9f96e99b59f36177a96 md5: 8375cfbda7c57fbceeda18229be10417 depends: - execnet >=2.1 - pytest >=7.0.0 - python >=3.9 constrains: - psutil >=3.0 license: MIT license_family: MIT purls: - pkg:pypi/pytest-xdist?source=hash-mapping size: 39300 timestamp: 1751452761594 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda sha256: 9979a7d4621049388892489267139f1aa629b10c26601ba5dce96afc2b1551d4 md5: 8c399445b6dc73eab839659e6c7b5ad1 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 - libexpat >=2.7.0,<3.0a0 - libffi >=3.4.6,<3.5.0a0 - libgcc >=13 - liblzma >=5.8.1,<6.0a0 - libnsl >=2.0.1,<2.1.0a0 - libsqlite >=3.50.0,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libxcrypt >=4.4.36 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.0,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata constrains: - python_abi 3.11.* *_cp311 license: Python-2.0 purls: [] size: 30629559 timestamp: 1749050021812 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda sha256: 6cca004806ceceea9585d4d655059e951152fc774a471593d4f5138e6a54c81d md5: 94206474a5608243a10c92cefbe0908f depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 - libexpat >=2.7.0,<3.0a0 - libffi >=3.4.6,<3.5.0a0 - libgcc >=13 - liblzma >=5.8.1,<6.0a0 - libnsl >=2.0.1,<2.1.0a0 - libsqlite >=3.50.0,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libxcrypt >=4.4.36 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.0,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata constrains: - python_abi 3.12.* *_cp312 license: Python-2.0 purls: [] size: 31445023 timestamp: 1749050216615 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda build_number: 102 sha256: c2cdcc98ea3cbf78240624e4077e164dc9d5588eefb044b4097c3df54d24d504 md5: 89e07d92cf50743886f41638d58c4328 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 - libexpat >=2.7.0,<3.0a0 - libffi >=3.4.6,<3.5.0a0 - libgcc >=13 - liblzma >=5.8.1,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - libsqlite >=3.50.1,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.0,<4.0a0 - python_abi 3.13.* *_cp313 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata license: Python-2.0 purls: [] size: 33273132 timestamp: 1750064035176 python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda sha256: 2c966293ef9e97e66b55747c7a97bc95ba0311ac1cf0d04be4a51aafac60dcb1 md5: 95facc4683b7b3b9cf8ae0ed10f30dce depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.7.0,<3.0a0 - libffi >=3.4.6,<3.5.0a0 - liblzma >=5.8.1,<6.0a0 - libsqlite >=3.50.0,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.0,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata constrains: - python_abi 3.11.* *_cp311 license: Python-2.0 purls: [] size: 14573820 timestamp: 1749048947732 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.11-hc22306f_0_cpython.conda sha256: cde8b944c2dc378a5afbc48028d0843583fd215493d5885a80f1b41de085552f md5: 9207ebad7cfbe2a4af0702c92fd031c4 depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.7.0,<3.0a0 - libffi >=3.4.6,<3.5.0a0 - liblzma >=5.8.1,<6.0a0 - libsqlite >=3.50.0,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.0,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata constrains: - python_abi 3.12.* *_cp312 license: Python-2.0 purls: [] size: 13009234 timestamp: 1749048134449 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda build_number: 102 sha256: ee1b09fb5563be8509bb9b29b2b436a0af75488b5f1fa6bcd93fe0fba597d13f md5: 123b7f04e7b8d6fc206cf2d3466f8a4b depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.7.0,<3.0a0 - libffi >=3.4.6,<3.5.0a0 - liblzma >=5.8.1,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - libsqlite >=3.50.1,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.0,<4.0a0 - python_abi 3.13.* *_cp313 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata license: Python-2.0 purls: [] size: 12931515 timestamp: 1750062475020 python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.13-h3f84c4b_0_cpython.conda sha256: 723dbca1384f30bd2070f77dd83eefd0e8d7e4dda96ac3332fbf8fe5573a8abb md5: bedbb6f7bb654839719cd528f9b298ad depends: - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.7.0,<3.0a0 - libffi >=3.4.6,<3.5.0a0 - liblzma >=5.8.1,<6.0a0 - libsqlite >=3.50.0,<4.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.0,<4.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - python_abi 3.11.* *_cp311 license: Python-2.0 purls: [] size: 18242669 timestamp: 1749048351218 - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.11-h3f84c4b_0_cpython.conda sha256: b69412e64971b5da3ced0fc36f05d0eacc9393f2084c6f92b8f28ee068d83e2e md5: 6aa5e62df29efa6319542ae5025f4376 depends: - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.7.0,<3.0a0 - libffi >=3.4.6,<3.5.0a0 - liblzma >=5.8.1,<6.0a0 - libsqlite >=3.50.0,<4.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.0,<4.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - python_abi 3.12.* *_cp312 license: Python-2.0 purls: [] size: 15829289 timestamp: 1749047682640 - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda build_number: 102 sha256: 3de2b9f89b220cb779f6947cf87b328f73d54eed4f7e75a3f9337caeb4443910 md5: a9a4658f751155c819d6cd4c47f0a4d2 depends: - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.7.0,<3.0a0 - libffi >=3.4.6,<3.5.0a0 - liblzma >=5.8.1,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - libsqlite >=3.50.1,<4.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.0,<4.0a0 - python_abi 3.13.* *_cp313 - tk >=8.6.13,<8.7.0a0 - tzdata - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Python-2.0 purls: [] size: 16825621 timestamp: 1750062318985 python_site_packages_path: Lib/site-packages - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl name: python-dateutil version: 2.9.0.post0 sha256: a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 requires_dist: - six>=1.5 requires_python: ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 md5: 5b8d21249ff20967101ffa321cab24e8 depends: - python >=3.9 - six >=1.5 - python license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/python-dateutil?source=hash-mapping size: 233310 timestamp: 1751104122689 - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda sha256: df9aa74e9e28e8d1309274648aac08ec447a92512c33f61a8de0afa9ce32ebe8 md5: 23029aae904a2ba587daba708208012f depends: - python >=3.9 - python license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/fastjsonschema?source=hash-mapping size: 244628 timestamp: 1755304154927 - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda sha256: ac6cf618100c2e0cad1cabfe2c44bf4a944aa07bb1dc43abff73373351a7d079 md5: 2eabcede0db21acee23c181db58b4128 depends: - cpython 3.13.5.* - python_abi * *_cp313 license: Python-2.0 purls: [] size: 47572 timestamp: 1750062593102 - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda sha256: e8392a8044d56ad017c08fec2b0eb10ae3d1235ac967d0aab8bd7b41c4a5eaf0 md5: 88476ae6ebd24f39261e0854ac244f33 depends: - python >=3.9 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/tzdata?source=hash-mapping size: 144160 timestamp: 1742745254292 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda build_number: 8 sha256: fddf123692aa4b1fc48f0471e346400d9852d96eeed77dbfdd746fa50a8ff894 md5: 8fcb6b0e2161850556231336dae58358 constrains: - python 3.11.* *_cpython license: BSD-3-Clause license_family: BSD purls: [] size: 7003 timestamp: 1752805919375 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda build_number: 8 sha256: 80677180dd3c22deb7426ca89d6203f1c7f1f256f2d5a94dc210f6e758229809 md5: c3efd25ac4d74b1584d2f7a57195ddf1 constrains: - python 3.12.* *_cpython license: BSD-3-Clause license_family: BSD purls: [] size: 6958 timestamp: 1752805918820 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda build_number: 8 sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 md5: 94305520c52a4aa3f6c2b1ff6008d9f8 constrains: - python 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: [] size: 7002 timestamp: 1752805902938 - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda sha256: 8d2a8bf110cc1fc3df6904091dead158ba3e614d8402a83e51ed3a8aa93cdeb0 md5: bc8e3267d44011051f2eb14d22fb0960 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/pytz?source=hash-mapping size: 189015 timestamp: 1742920947249 - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py313h40c08fc_1.conda sha256: 87eaeb79b5961e0f216aa840bc35d5f0b9b123acffaecc4fda4de48891901f20 md5: 1ce4f826332dca56c76a5b0cc89fb19e depends: - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - python_abi 3.13.* *_cp313 license: PSF-2.0 license_family: PSF purls: - pkg:pypi/pywin32?source=hash-mapping size: 6695114 timestamp: 1756487139550 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda sha256: d107ad62ed5c62764fba9400f2c423d89adf917d687c7f2e56c3bfed605fb5b3 md5: 014417753f948da1f70d132b2de573be depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT purls: - pkg:pypi/pyyaml?source=hash-mapping size: 213136 timestamp: 1737454846598 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b md5: cf2485f39740de96e2a7f2bb18ed2fee depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT purls: - pkg:pypi/pyyaml?source=hash-mapping size: 206903 timestamp: 1737454910324 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py313h8060acc_2.conda sha256: 6826217690cfe92d6d49cdeedb6d63ab32f51107105d6a459d30052a467037a0 md5: 50992ba61a8a1f8c2d346168ae1c86df depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT purls: - pkg:pypi/pyyaml?source=hash-mapping size: 205919 timestamp: 1737454783637 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py311h4921393_2.conda sha256: 2af6006c9f692742181f4aa2e0656eb112981ccb0b420b899d3dd42c881bd72f md5: 250b2ee8777221153fd2de9c279a7efa depends: - __osx >=11.0 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT purls: - pkg:pypi/pyyaml?source=hash-mapping size: 196951 timestamp: 1737454935552 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda sha256: ad225ad24bfd60f7719709791345042c3cb32da1692e62bd463b084cf140e00d md5: 68149ed4d4e9e1c42d2ba1f27f08ca96 depends: - __osx >=11.0 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT purls: - pkg:pypi/pyyaml?source=hash-mapping size: 192148 timestamp: 1737454886351 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py313ha9b7d5b_2.conda sha256: 58c41b86ff2dabcf9ccd9010973b5763ec28b14030f9e1d9b371d22b538bce73 md5: 03a7926e244802f570f25401c25c13bc depends: - __osx >=11.0 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT purls: - pkg:pypi/pyyaml?source=hash-mapping size: 194243 timestamp: 1737454911892 - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.2-py311h5082efb_2.conda sha256: 6095e1d58c666f6a06c55338df09485eac34c76e43d92121d5786794e195aa4d md5: e474ba674d780f0fa3b979ae9e81ba91 depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT purls: - pkg:pypi/pyyaml?source=hash-mapping size: 187430 timestamp: 1737454904007 - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.2-py312h31fea79_2.conda sha256: 76fec03ef7e67e37724873e1f805131fb88efb57f19e9a77b4da616068ef5c28 md5: ba00a2e5059c1fde96459858537cc8f5 depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT purls: - pkg:pypi/pyyaml?source=hash-mapping size: 181734 timestamp: 1737455207230 - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.2-py313hb4c8b1a_2.conda sha256: 5b496c96e48f495de41525cb1b603d0147f2079f88a8cf061aaf9e17a2fe1992 md5: d14f685b5d204b023c641b188a8d0d7c depends: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT purls: - pkg:pypi/pyyaml?source=hash-mapping size: 182783 timestamp: 1737455202579 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.2-py312hfb55c3c_2.conda noarch: python sha256: dcf749dcf86feac506c32dc8469f0b8201f5c5077026ade7fe01bf3b90f74ecd md5: ba7305f9723cc16cf79288e0bb7b34b2 depends: - python - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - libgcc >=14 - _python_abi3_support 1.* - cpython >=3.12 - zeromq >=4.3.5,<4.4.0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pyzmq?source=compressed-mapping size: 211840 timestamp: 1756136260634 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.0.2-py312hd175295_2.conda noarch: python sha256: 86eed77fb602b6293a3f7bbfd3ca68614c1affb090275522f64cb544647866d5 md5: 65576738b32b8fc5883b779861f11a1b depends: - python - __osx >=11.0 - libcxx >=19 - _python_abi3_support 1.* - cpython >=3.12 - zeromq >=4.3.5,<4.4.0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pyzmq?source=compressed-mapping size: 190696 timestamp: 1756136303952 - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.0.2-py312hbb5da91_2.conda noarch: python sha256: f88274990a913c536c17fb03ed8256b33f8081dc62aed009260f1b031c5086ba md5: 9648d45e60a9d47b17091fdfae12c4bc depends: - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - zeromq >=4.3.5,<4.3.6.0a0 - _python_abi3_support 1.* - cpython >=3.12 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pyzmq?source=compressed-mapping size: 185652 timestamp: 1756136271766 - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc md5: 353823361b1d27eb3960efb076dfcaf6 depends: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - libstdcxx-ng >=12 license: LicenseRef-Qhull purls: [] size: 552937 timestamp: 1720813982144 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda sha256: 873ac689484262a51fd79bc6103c1a1bedbf524924d7f0088fb80703042805e4 md5: 6483b1f59526e05d7d894e466b5b6924 depends: - __osx >=11.0 - libcxx >=16 license: LicenseRef-Qhull purls: [] size: 516376 timestamp: 1720814307311 - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda sha256: 887d53486a37bd870da62b8fa2ebe3993f912ad04bd755e7ed7c47ced97cbaa8 md5: 854fbdff64b572b5c0b470f334d34c11 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LicenseRef-Qhull purls: [] size: 1377020 timestamp: 1720814433486 - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.07.22-h5a314c3_0.conda sha256: 0e65b369dad6b161912e58aaa20e503534225d999b2a3eeedba438f0f3923c7e md5: 40a7d4cef7d034026e0d6b29af54b5ce depends: - libre2-11 2025.07.22 h7b12aa8_0 license: BSD-3-Clause license_family: BSD purls: [] size: 27363 timestamp: 1753295056377 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.07.22-h52998f3_0.conda sha256: 15bb66249b32520857937fbe2d9dd784f51eee824a4ff8c9e11cc121751bca20 md5: 126afcd653892413bccbcd3d476d81d0 depends: - libre2-11 2025.07.22 hb7c0934_0 license: BSD-3-Clause license_family: BSD purls: [] size: 27392 timestamp: 1753295156331 - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.07.22-h3dd2b4f_0.conda sha256: 16e32968448bc39534a0f3c657de5437159767ff711e31d57d8eedafcb43a501 md5: 5ce0cd0feef1fe474e5651849b8873e6 depends: - libre2-11 2025.07.22 h0eb2380_0 license: BSD-3-Clause license_family: BSD purls: [] size: 217078 timestamp: 1753295596837 - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c md5: 283b96675859b20a825f8fa30f311446 depends: - libgcc >=13 - ncurses >=6.5,<7.0a0 license: GPL-3.0-only license_family: GPL purls: [] size: 282480 timestamp: 1740379431762 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 md5: 63ef3f6e6d6d5c589e64f11263dc5676 depends: - ncurses >=6.5,<7.0a0 license: GPL-3.0-only license_family: GPL purls: [] size: 252359 timestamp: 1740379663071 - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda sha256: e20909f474a6cece176dfc0dc1addac265deb5fa92ea90e975fbca48085b20c3 md5: 9140f1c09dd5489549c6a33931b943c7 depends: - attrs >=22.2.0 - python >=3.9 - rpds-py >=0.7.0 - typing_extensions >=4.4.0 - python license: MIT license_family: MIT purls: - pkg:pypi/referencing?source=hash-mapping size: 51668 timestamp: 1737836872415 - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda sha256: 8dc54e94721e9ab545d7234aa5192b74102263d3e704e6d0c8aa7008f2da2a7b md5: db0c6b99149880c8ba515cf4abe93ee4 depends: - certifi >=2017.4.17 - charset-normalizer >=2,<4 - idna >=2.5,<4 - python >=3.9 - urllib3 >=1.21.1,<3 constrains: - chardet >=3.0.2,<6 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/requests?source=hash-mapping size: 59263 timestamp: 1755614348400 - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda sha256: 0116a9ca9bf3487e18979b58b2f280116dba55cb53475af7a6d835f7aa133db8 md5: 5f0f24f8032c2c1bb33f59b75974f5fc depends: - python >=3.9 license: 0BSD OR CC0-1.0 purls: - pkg:pypi/roman-numerals-py?source=hash-mapping size: 13348 timestamp: 1740240332327 - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py313h843e2db_0.conda sha256: 64e5748673d41f055ff4ca5e7a720e9a0a6122f7b2954d21d427f247b9d3e2b8 md5: f713aec06900657c138e60dc61889557 depends: - python - __glibc >=2.17,<3.0.a0 - libgcc >=14 - python_abi 3.13.* *_cp313 constrains: - __glibc >=2.17 license: MIT license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping size: 389201 timestamp: 1756315722486 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py313h80e0809_0.conda sha256: a4bd0f620cdab3760b7f8a39248ce974187c160f8cd54860f2d8674d75e7d711 md5: 853010644628104ea462f6458a7e0a44 depends: - python - __osx >=11.0 - python 3.13.* *_cp313 - python_abi 3.13.* *_cp313 constrains: - __osx >=11.0 license: MIT license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping size: 354660 timestamp: 1756315398955 - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py313hfbe8231_0.conda sha256: 3239b9612d2ee2e8e1c6af84b426a46031a8c6c712420024afacdaa534ee0411 md5: bdaef5397588a4b73e788cf33d6b2a5e depends: - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping size: 250241 timestamp: 1756315366475 - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.23-h8e187f5_0.conda sha256: 016fe83763bc837beb205732411583179e2aac1cdef40225d4ad5eeb1bc7b837 md5: edd15d7a5914dc1d87617a2b7c582d23 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - openssl >=3.5.1,<4.0a0 license: Apache-2.0 license_family: Apache purls: [] size: 383097 timestamp: 1753407970803 - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/scipy/1.17.0.dev0/scipy-1.17.0.dev0-cp313-cp313-macosx_12_0_arm64.whl name: scipy version: 1.17.0.dev0 requires_dist: - numpy>=1.26.4 - pytest>=8.0.0 ; extra == 'test' - pytest-cov ; extra == 'test' - pytest-timeout ; extra == 'test' - pytest-xdist ; extra == 'test' - asv ; extra == 'test' - mpmath ; extra == 'test' - gmpy2 ; extra == 'test' - threadpoolctl ; extra == 'test' - scikit-umfpack ; extra == 'test' - pooch ; extra == 'test' - hypothesis>=6.30 ; extra == 'test' - array-api-strict>=2.3.1 ; extra == 'test' - cython ; extra == 'test' - meson ; extra == 'test' - ninja ; sys_platform != 'emscripten' and extra == 'test' - sphinx>=5.0.0,<8.2.0 ; extra == 'doc' - intersphinx-registry ; extra == 'doc' - pydata-sphinx-theme>=0.15.2 ; extra == 'doc' - sphinx-copybutton ; extra == 'doc' - sphinx-design>=0.4.0 ; extra == 'doc' - matplotlib>=3.5 ; extra == 'doc' - numpydoc ; extra == 'doc' - jupytext ; extra == 'doc' - myst-nb>=1.2.0 ; extra == 'doc' - pooch ; extra == 'doc' - jupyterlite-sphinx>=0.19.1 ; extra == 'doc' - jupyterlite-pyodide-kernel ; extra == 'doc' - linkify-it-py ; extra == 'doc' - tabulate ; extra == 'doc' - spin ; extra == 'dev' - mypy==1.10.0 ; extra == 'dev' - typing-extensions ; extra == 'dev' - types-psutil ; extra == 'dev' - pycodestyle ; extra == 'dev' - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: ">=3.11" - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/scipy/1.17.0.dev0/scipy-1.17.0.dev0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scipy version: 1.17.0.dev0 requires_dist: - numpy>=1.26.4 - pytest>=8.0.0 ; extra == 'test' - pytest-cov ; extra == 'test' - pytest-timeout ; extra == 'test' - pytest-xdist ; extra == 'test' - asv ; extra == 'test' - mpmath ; extra == 'test' - gmpy2 ; extra == 'test' - threadpoolctl ; extra == 'test' - scikit-umfpack ; extra == 'test' - pooch ; extra == 'test' - hypothesis>=6.30 ; extra == 'test' - array-api-strict>=2.3.1 ; extra == 'test' - cython ; extra == 'test' - meson ; extra == 'test' - ninja ; sys_platform != 'emscripten' and extra == 'test' - sphinx>=5.0.0,<8.2.0 ; extra == 'doc' - intersphinx-registry ; extra == 'doc' - pydata-sphinx-theme>=0.15.2 ; extra == 'doc' - sphinx-copybutton ; extra == 'doc' - sphinx-design>=0.4.0 ; extra == 'doc' - matplotlib>=3.5 ; extra == 'doc' - numpydoc ; extra == 'doc' - jupytext ; extra == 'doc' - myst-nb>=1.2.0 ; extra == 'doc' - pooch ; extra == 'doc' - jupyterlite-sphinx>=0.19.1 ; extra == 'doc' - jupyterlite-pyodide-kernel ; extra == 'doc' - linkify-it-py ; extra == 'doc' - tabulate ; extra == 'doc' - spin ; extra == 'dev' - mypy==1.10.0 ; extra == 'dev' - typing-extensions ; extra == 'dev' - types-psutil ; extra == 'dev' - pycodestyle ; extra == 'dev' - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: ">=3.11" - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/scipy/1.17.0.dev0/scipy-1.17.0.dev0-cp313-cp313-win_amd64.whl name: scipy version: 1.17.0.dev0 requires_dist: - numpy>=1.26.4 - pytest>=8.0.0 ; extra == 'test' - pytest-cov ; extra == 'test' - pytest-timeout ; extra == 'test' - pytest-xdist ; extra == 'test' - asv ; extra == 'test' - mpmath ; extra == 'test' - gmpy2 ; extra == 'test' - threadpoolctl ; extra == 'test' - scikit-umfpack ; extra == 'test' - pooch ; extra == 'test' - hypothesis>=6.30 ; extra == 'test' - array-api-strict>=2.3.1 ; extra == 'test' - cython ; extra == 'test' - meson ; extra == 'test' - ninja ; sys_platform != 'emscripten' and extra == 'test' - sphinx>=5.0.0,<8.2.0 ; extra == 'doc' - intersphinx-registry ; extra == 'doc' - pydata-sphinx-theme>=0.15.2 ; extra == 'doc' - sphinx-copybutton ; extra == 'doc' - sphinx-design>=0.4.0 ; extra == 'doc' - matplotlib>=3.5 ; extra == 'doc' - numpydoc ; extra == 'doc' - jupytext ; extra == 'doc' - myst-nb>=1.2.0 ; extra == 'doc' - pooch ; extra == 'doc' - jupyterlite-sphinx>=0.19.1 ; extra == 'doc' - jupyterlite-pyodide-kernel ; extra == 'doc' - linkify-it-py ; extra == 'doc' - tabulate ; extra == 'doc' - spin ; extra == 'dev' - mypy==1.10.0 ; extra == 'dev' - typing-extensions ; extra == 'dev' - types-psutil ; extra == 'dev' - pycodestyle ; extra == 'dev' - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: ">=3.11" - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py311h1e13796_1.conda sha256: ede8e41298cdf0df52c78f102145e62449a1aca79f80b1bea198042417de09cc md5: 84a0938801df456e4f3fa651d37d404f depends: - __glibc >=2.17,<3.0.a0 - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 - liblapack >=3.9.0,<4.0a0 - libstdcxx >=14 - numpy <2.6 - numpy >=1.23,<3 - numpy >=1.25.2 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: BSD-3-Clause purls: - pkg:pypi/scipy?source=hash-mapping size: 17266942 timestamp: 1756529906396 - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py312h7a1785b_1.conda sha256: d5e65c845446ae64ad55b2ee0571f29d1ac39c8ced36e9f5a04d2d105e61fab9 md5: b965f164d14d4cffe1ddcf39195b63d6 depends: - __glibc >=2.17,<3.0.a0 - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 - liblapack >=3.9.0,<4.0a0 - libstdcxx >=14 - numpy <2.6 - numpy >=1.23,<3 - numpy >=1.25.2 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: BSD-3-Clause purls: - pkg:pypi/scipy?source=hash-mapping size: 17014751 timestamp: 1756530097597 - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py313h11c21cd_1.conda sha256: 75c751b8594b810d9c3735641aed6d6c13706e97e5c2ae0cdb49fa7d2da915dd md5: 270039a4640693aab11ee3c05385f149 depends: - __glibc >=2.17,<3.0.a0 - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 - liblapack >=3.9.0,<4.0a0 - libstdcxx >=14 - numpy <2.6 - numpy >=1.23,<3 - numpy >=1.25.2 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause purls: - pkg:pypi/scipy?source=hash-mapping size: 17210234 timestamp: 1756530199043 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py311h0a08e73_1.conda sha256: c84c9a75f9834d48f8606650874368ff09c3c68f44dfb32193f697974eb67352 md5: 3c1d0008f9be169bcf2c4261b0b99984 depends: - __osx >=11.0 - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - libcxx >=19 - libgfortran - libgfortran5 >=14.3.0 - libgfortran5 >=15.1.0 - liblapack >=3.9.0,<4.0a0 - numpy <2.6 - numpy >=1.23,<3 - numpy >=1.25.2 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: BSD-3-Clause purls: - pkg:pypi/scipy?source=hash-mapping size: 14067983 timestamp: 1756529940163 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py312h6e75237_1.conda sha256: 005096a5a5731c61484e1a901a11f082e83d92ad13588a59bea186be9f41bb85 md5: a1f1ef4fafc37c93d4f77947d2b5e5d2 depends: - __osx >=11.0 - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - libcxx >=19 - libgfortran - libgfortran5 >=14.3.0 - libgfortran5 >=15.1.0 - liblapack >=3.9.0,<4.0a0 - numpy <2.6 - numpy >=1.23,<3 - numpy >=1.25.2 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: BSD-3-Clause purls: - pkg:pypi/scipy?source=hash-mapping size: 13773643 timestamp: 1756530081074 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py313h7d0615d_1.conda sha256: 9d365a0ec5f3e710d13fb3497cc6549c0b3153b2fa1ac27476f32ada81c4deca md5: cfa5f5e690bacf0b2aef1b0ba2c67391 depends: - __osx >=11.0 - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - libcxx >=19 - libgfortran - libgfortran5 >=14.3.0 - libgfortran5 >=15.1.0 - liblapack >=3.9.0,<4.0a0 - numpy <2.6 - numpy >=1.23,<3 - numpy >=1.25.2 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: BSD-3-Clause purls: - pkg:pypi/scipy?source=hash-mapping size: 13967703 timestamp: 1756530201442 - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.1-py311h9a1c30b_1.conda sha256: a1814713e747735727fa43e89e4150f924a8625f1db3d7742d7c64dcfc2c0ef9 md5: 0a17e013760698d9d2f43d6e7a5bbe11 depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - numpy <2.6 - numpy >=1.23,<3 - numpy >=1.25.2 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause purls: - pkg:pypi/scipy?source=hash-mapping size: 15455418 timestamp: 1756530883718 - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.1-py312h33376e8_1.conda sha256: 39b571147566f01d277756af236fb015328e16f8d51bd7416a599ac8d1d95952 md5: e5f09202e165ee93531ee7d798249623 depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - numpy <2.6 - numpy >=1.23,<3 - numpy >=1.25.2 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause purls: - pkg:pypi/scipy?source=hash-mapping size: 15186373 timestamp: 1756530507532 - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.1-py313h62a08ca_1.conda sha256: 03b1828ca3d9eec8459ee113a1bc306aa4cab0e85a3444f1673c70c007010468 md5: 9842dfddafe8372a82dfbfd0460a5396 depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - numpy <2.6 - numpy >=1.23,<3 - numpy >=1.25.2 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause purls: - pkg:pypi/scipy?source=hash-mapping size: 15282796 timestamp: 1756530913317 - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl name: six version: 1.17.0 sha256: 4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 requires_python: ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d md5: 3339e3b65d58accf4ca4fb8748ab16b3 depends: - python >=3.9 - python license: MIT license_family: MIT purls: - pkg:pypi/six?source=compressed-mapping size: 18455 timestamp: 1753199211006 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda sha256: 8b8acbde6814d1643da509e11afeb6bb30eb1e3004cf04a7c9ae43e9b097f063 md5: 3d8da0248bdae970b4ade636a104b7f5 depends: - libgcc >=14 - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 license: BSD-3-Clause license_family: BSD purls: [] size: 45805 timestamp: 1753083455352 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hd121638_0.conda sha256: b3d447d72d2af824006f4ba78ae4188747886d6d95f2f165fe67b95541f02b05 md5: ba9ca3813f4db8c0d85d3c84404e02ba depends: - libcxx >=19 - __osx >=11.0 license: BSD-3-Clause license_family: BSD purls: [] size: 38824 timestamp: 1753083462800 - conda: https://conda.anaconda.org/conda-forge/win-64/snappy-1.2.2-h7fa0ca8_0.conda sha256: b38ed597bf71f73275a192b8cb22888997760bac826321f5838951d5d31acb23 md5: 194a0c548899fa2a10684c34e56a3564 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 license: BSD-3-Clause license_family: BSD purls: [] size: 67221 timestamp: 1753083479147 - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda sha256: c2248418c310bdd1719b186796ae50a8a77ce555228b6acd32768e2543a15012 md5: bf7a226e58dfb8346c70df36065d86c9 depends: - python >=3.9 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/sniffio?source=hash-mapping size: 15019 timestamp: 1733244175724 - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda sha256: 17007a4cfbc564dc3e7310dcbe4932c6ecb21593d4fec3c68610720f19e73fb2 md5: 755cf22df8693aa0d1aec1c123fa5863 depends: - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/snowballstemmer?source=hash-mapping size: 73009 timestamp: 1747749529809 - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda sha256: d1e3e06b5cf26093047e63c8cc77b70d970411c5cbc0cb1fad461a8a8df599f7 md5: 0401a17ae845fa72c7210e206ec5647d depends: - python >=3.9 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/sortedcontainers?source=hash-mapping size: 28657 timestamp: 1738440459037 - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda sha256: c978576cf9366ba576349b93be1cfd9311c00537622a2f9e14ba2b90c97cae9c md5: 18c019ccf43769d211f2cf78e9ad46c2 depends: - python >=3.10 license: MIT license_family: MIT purls: - pkg:pypi/soupsieve?source=hash-mapping size: 37803 timestamp: 1756330614547 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.3.0-pyhd8ed1ab_0.conda sha256: 03c4d8b4cf3c5418e15f30f45be52bcde7c7e05baeec7dec5aaf6e238a411481 md5: 6ce9ddee4c0f68bda548303196f4cf4c depends: - alabaster >=0.7.14 - babel >=2.13 - colorama >=0.4.6 - docutils >=0.20,<0.22 - imagesize >=1.3 - jinja2 >=3.1 - packaging >=23.0 - pygments >=2.17 - python >=3.11 - requests >=2.30.0 - roman-numerals-py >=1.0.0 - snowballstemmer >=2.2 - sphinxcontrib-applehelp >=1.0.7 - sphinxcontrib-devhelp >=1.0.6 - sphinxcontrib-htmlhelp >=2.0.6 - sphinxcontrib-jsmath >=1.0.1 - sphinxcontrib-qthelp >=1.0.6 - sphinxcontrib-serializinghtml >=1.1.9 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/sphinx?source=hash-mapping size: 1427513 timestamp: 1756120552616 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-autobuild-2024.10.3-pyhd8ed1ab_1.conda sha256: 8efa48241f074da54552409d25359a1abfdc08e94e12ecbe6f90d9d3eba9ac21 md5: cd457248c6185c0e3ba2137500fcbc0c depends: - colorama >=0.4.6 - python >=3.9 - sphinx - starlette >=0.35 - uvicorn >=0.25 - watchfiles >=0.20 - websockets >=11 license: MIT license_family: MIT purls: - pkg:pypi/sphinx-autobuild?source=hash-mapping size: 17305 timestamp: 1736585842606 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-autosummary-accessors-2025.3.1-pyhd8ed1ab_0.conda sha256: 1523894e3dab4033ad1b6bf2df88768d7ce3d77ed20f1fda5a47f59b35df3413 md5: 358a080adb56f8a671ff3edeb54dcb6f depends: - importlib-metadata - python >=3.9 - sphinx >=3.3 license: MIT license_family: MIT purls: - pkg:pypi/sphinx-autosummary-accessors?source=hash-mapping size: 12593 timestamp: 1741707272686 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-rtd-theme-3.0.1-hd8ed1ab_0.conda noarch: python sha256: 2d00b2674b570d7da4fd291d40d164212f836ba74e262582dd3e83ac66495e8a md5: 108ffe613895b927d20cc60130a88e95 depends: - sphinx_rtd_theme 3.0.1 pyha770c72_0 license: MIT license_family: MIT purls: [] size: 6334 timestamp: 1730015356748 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda sha256: b81e8b0a66dcff33f308909940c9127e51536b99a51167f3e7266e65e3473f7d md5: 740536f8a54250b1964e494c0bf5c9c3 depends: - docutils >0.18,<0.22 - python >=3.8 - sphinx >=6,<9 - sphinxcontrib-jquery >=4,<5 license: MIT license_family: MIT purls: - pkg:pypi/sphinx-rtd-theme?source=hash-mapping size: 4630230 timestamp: 1730015354284 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda sha256: d7433a344a9ad32a680b881c81b0034bc61618d12c39dd6e3309abeffa9577ba md5: 16e3f039c0aa6446513e94ab18a8784b depends: - python >=3.9 - sphinx >=5 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/sphinxcontrib-applehelp?source=hash-mapping size: 29752 timestamp: 1733754216334 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda sha256: 55d5076005d20b84b20bee7844e686b7e60eb9f683af04492e598a622b12d53d md5: 910f28a05c178feba832f842155cbfff depends: - python >=3.9 - sphinx >=5 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/sphinxcontrib-devhelp?source=hash-mapping size: 24536 timestamp: 1733754232002 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda sha256: c1492c0262ccf16694bdcd3bb62aa4627878ea8782d5cd3876614ffeb62b3996 md5: e9fb3fe8a5b758b4aff187d434f94f03 depends: - python >=3.9 - sphinx >=5 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/sphinxcontrib-htmlhelp?source=hash-mapping size: 32895 timestamp: 1733754385092 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda sha256: 69c08d18663b57ebc8e4187c64c8d29b10996bb465a515cd288d87b6f2f52a5e md5: 403185829255321ea427333f7773dd1f depends: - python >=3.9 - sphinx >=1.8 license: 0BSD AND MIT purls: - pkg:pypi/sphinxcontrib-jquery?source=hash-mapping size: 112964 timestamp: 1734344603903 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda sha256: 578bef5ec630e5b2b8810d898bbbf79b9ae66d49b7938bcc3efc364e679f2a62 md5: fa839b5ff59e192f411ccc7dae6588bb depends: - python >=3.9 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/sphinxcontrib-jsmath?source=hash-mapping size: 10462 timestamp: 1733753857224 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda sha256: c664fefae4acdb5fae973bdde25836faf451f41d04342b64a358f9a7753c92ca md5: 00534ebcc0375929b45c3039b5ba7636 depends: - python >=3.9 - sphinx >=5 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/sphinxcontrib-qthelp?source=hash-mapping size: 26959 timestamp: 1733753505008 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda sha256: 64d89ecc0264347486971a94487cb8d7c65bfc0176750cf7502b8a272f4ab557 md5: 3bc61f7161d28137797e038263c04c54 depends: - python >=3.9 - sphinx >=5 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/sphinxcontrib-serializinghtml?source=hash-mapping size: 28669 timestamp: 1733750596111 - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 md5: b1b505328da7a6b246787df4b5a49fbc depends: - asttokens - executing - pure_eval - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/stack-data?source=hash-mapping size: 26988 timestamp: 1733569565672 - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.47.3-pyhfdc7a7d_0.conda sha256: 12f1e9361138d23c787b321ee0a621a7a04b3918d790e13cef29e5e57f479506 md5: 7839e6127ef19c0a07fe798d9d1c436b depends: - anyio >=3.6.2,<5 - python >=3.10 - typing_extensions >=4.10.0 - python license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/starlette?source=hash-mapping size: 63403 timestamp: 1756076609765 - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_3.conda sha256: 30e82640a1ad9d9b5bee006da7e847566086f8fdb63d15b918794a7ef2df862c md5: 72226638648e494aaafde8155d50dab2 depends: - libhwloc >=2.12.1,<2.12.2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: [] size: 150266 timestamp: 1755776172092 - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.1.0-pyhd8ed1ab_0.conda sha256: a83c83f5e622a2f34fb1d179c55c3ff912429cd0a54f9f3190ae44a0fdba2ad2 md5: a15c62b8a306b8978f094f76da2f903f depends: - python >=3.9 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/tblib?source=hash-mapping size: 17914 timestamp: 1743515657639 - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda sha256: cad582d6f978276522f84bd209a5ddac824742fe2d452af6acf900f8650a73a2 md5: f1acf5fdefa8300de697982bcb1761c9 depends: - python >=3.5 - webencodings >=0.4 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/tinycss2?source=hash-mapping size: 28285 timestamp: 1729802975370 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 md5: a0116df4f4ed05c303811a837d5b39d8 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 license: TCL license_family: BSD purls: [] size: 3285204 timestamp: 1748387766691 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda sha256: cb86c522576fa95c6db4c878849af0bccfd3264daf0cc40dd18e7f4a7bfced0e md5: 7362396c170252e7b7b0c8fb37fe9c78 depends: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 license: TCL license_family: BSD purls: [] size: 3125538 timestamp: 1748388189063 - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda sha256: e3614b0eb4abcc70d98eae159db59d9b4059ed743ef402081151a948dce95896 md5: ebd0e761de9aa879a51d22cc721bd095 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: TCL license_family: BSD purls: [] size: 3466348 timestamp: 1748388121356 - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda sha256: 34f3a83384ac3ac30aefd1309e69498d8a4aa0bf2d1f21c645f79b180e378938 md5: b0dd904de08b7db706167240bf37b164 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/toml?source=hash-mapping size: 22132 timestamp: 1734091907682 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda sha256: 040a5a05c487647c089ad5e05ad5aff5942830db2a4e656f1e300d73436436f1 md5: 30a0a26c8abccf4b7991d590fe17c699 depends: - python >=3.9 - python license: MIT license_family: MIT purls: - pkg:pypi/tomli?source=compressed-mapping size: 21238 timestamp: 1753796677376 - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda sha256: eda38f423c33c2eaeca49ed946a8d3bf466cc3364970e083a65eb2fd85258d87 md5: 40d0ed782a8aaa16ef248e68c06c168d depends: - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/toolz?source=hash-mapping size: 52475 timestamp: 1733736126261 - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py311h49ec1c0_0.conda sha256: 99b43e96b71271bf906d87d9dceeb1b5d7f79d56d2cd58374e528b56830c99af md5: 8e82bf1a7614ac43096a5c8d726030a3 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping size: 869655 timestamp: 1754732128935 - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py312h4c3975b_0.conda sha256: 891965f8e495ad5cef399db03a13df48df7add06ae131f4b77a88749c74b2060 md5: 82dacd4832dcde0c2b7888248a3b3d7c depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/tornado?source=compressed-mapping size: 850503 timestamp: 1754732194289 - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_0.conda sha256: bc4df522f933ea8829334d79732d828880bb976ed03a1f68f0826b91eaaee0b1 md5: 01082edc358a2285f6480b918e35e1af depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping size: 878421 timestamp: 1754732125966 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py311h3696347_0.conda sha256: e174acd73e641bc71673b9d4793a2c0321206baafd7a76e92b011fdc85a67908 md5: cb8f3a7aa93ebc21113e2f6266d66c9c depends: - __osx >=11.0 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping size: 871796 timestamp: 1754732249406 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py312h163523d_0.conda sha256: 82ceea2527ac484f5c8d7dee95033935b7fecb0b42afb2d9538f7397404aa6d8 md5: 181a5ca410bad66be792da0e11038016 depends: - __osx >=11.0 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping size: 853490 timestamp: 1754732280524 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_0.conda sha256: e687a470c8cea7815da666493cb6161948a7a1ae118237624db7689612732a04 md5: d086389c0d48b2751361720665321eeb depends: - __osx >=11.0 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping size: 875854 timestamp: 1754732465438 - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py311h3485c13_0.conda sha256: 288fc2b231d4b9895fefb50066881531a8d148f5cb01aa99eb9d335bf00b6447 md5: 4f7ddc08f9282d519d5c1316e540d4ad depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping size: 874287 timestamp: 1754732248470 - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py312he06e257_0.conda sha256: bc5f5b20aa13e3ba343685c54d75a02c737ae6a5fe778908caf563d9f2273cb2 md5: ef13034aef592637ce6e2dc1ca126bca depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping size: 855809 timestamp: 1754732413384 - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_0.conda sha256: 6a461f7ffba2f0d90bca775fc95f58840c9b3ed3d6002659f4979a4a7b7ed344 md5: 57756431d27f6043d8bc1e78eb8b3c7b depends: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping size: 878818 timestamp: 1754732227288 - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 md5: 019a7385be9af33791c989871317e1ed depends: - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/traitlets?source=hash-mapping size: 110051 timestamp: 1733367480074 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c md5: edd329d7d3a4ab45dcf905899a7a6115 depends: - typing_extensions ==4.15.0 pyhcf101f3_0 license: PSF-2.0 license_family: PSF purls: [] size: 91383 timestamp: 1756220668932 - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 md5: 0caa1af407ecff61170c9437a808404d depends: - python >=3.10 - python license: PSF-2.0 license_family: PSF purls: - pkg:pypi/typing-extensions?source=compressed-mapping size: 51692 timestamp: 1756220668932 - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl name: tzdata version: "2025.2" sha256: 1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 requires_python: ">=2" - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 md5: 4222072737ccff51314b5ece9c7d6f5a license: LicenseRef-Public-Domain purls: [] size: 122968 timestamp: 1742727099393 - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 md5: 71b24316859acd00bdb8b38f5e2ce328 constrains: - vc14_runtime >=14.29.30037 - vs2015_runtime >=14.29.30037 license: LicenseRef-MicrosoftWindowsSDK10 purls: [] size: 694692 timestamp: 1756385147981 - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda sha256: 4fb9789154bd666ca74e428d973df81087a697dbb987775bc3198d2215f240f8 md5: 436c165519e140cb08d246a4472a9d6a depends: - brotli-python >=1.0.9 - h2 >=4,<5 - pysocks >=1.5.6,<2.0,!=1.5.7 - python >=3.9 - zstandard >=0.18.0 license: MIT license_family: MIT purls: - pkg:pypi/urllib3?source=hash-mapping size: 101735 timestamp: 1750271478254 - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.35.0-pyh31011fe_0.conda sha256: bf304f72c513bead1a670326e02971c1cfe8320cf756447a45b74a2571884ad3 md5: c7f6c7ffba6257580291ce55fb1097aa depends: - __unix - click >=7.0 - h11 >=0.8 - python >=3.9 - typing_extensions >=4.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/uvicorn?source=hash-mapping size: 50232 timestamp: 1751201685083 - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.35.0-pyh5737063_0.conda sha256: 3fd05848316f69f9211924c1b17a1646a107ee28c2e16256df74f9937bac47df md5: 062d8e8fd904879d6c2fef2876fafd7a depends: - __win - click >=7.0 - h11 >=0.8 - python >=3.9 - typing_extensions >=4.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/uvicorn?source=hash-mapping size: 50517 timestamp: 1751201850068 - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda sha256: cb357591d069a1e6cb74199a8a43a7e3611f72a6caed9faa49dbb3d7a0a98e0b md5: 28f4ca1e0337d0f27afb8602663c5723 depends: - vc14_runtime >=14.44.35208 track_features: - vc14 license: BSD-3-Clause license_family: BSD purls: [] size: 18249 timestamp: 1753739241465 - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda sha256: af4b4b354b87a9a8d05b8064ff1ea0b47083274f7c30b4eb96bc2312c9b5f08f md5: 603e41da40a765fd47995faa021da946 depends: - ucrt >=10.0.20348.0 - vcomp14 14.44.35208 h818238b_31 constrains: - vs2015_runtime 14.44.35208.* *_31 license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary purls: [] size: 682424 timestamp: 1753739239305 - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda sha256: 67b317b64f47635415776718d25170a9a6f9a1218c0f5a6202bfd687e07b6ea4 md5: a6b1d5c1fc3cb89f88f7179ee6a9afe3 depends: - ucrt >=10.0.20348.0 constrains: - vs2015_runtime 14.44.35208.* *_31 license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary purls: [] size: 113963 timestamp: 1753739198723 - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_31.conda sha256: 8b20152d00e1153ccb1ed377a160110482f286a6d85a82b57ffcd60517d523a7 md5: d75abcfbc522ccd98082a8c603fce34c depends: - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: [] size: 18249 timestamp: 1753739241918 - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.1.0-py313h920b4c0_0.conda sha256: 5a27ec51a5de9a251ce7078739d0fc9301510992405fae5a29784c5daac3caeb md5: c9f7604d02c82ec812444d5ccee625bd depends: - __glibc >=2.17,<3.0.a0 - anyio >=3.0.0 - libgcc >=13 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 constrains: - __glibc >=2.17 license: MIT license_family: MIT purls: - pkg:pypi/watchfiles?source=hash-mapping size: 420988 timestamp: 1750054029977 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.1.0-py313hdde674f_0.conda sha256: 84b538fb6084d7ca1d0a6bdf0d5fa02218614ba0ca956fe813ca90f63540086f md5: e8dcf3b73be8a3819fab1a583d08a529 depends: - __osx >=11.0 - anyio >=3.0.0 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 constrains: - __osx >=11.0 license: MIT license_family: MIT purls: - pkg:pypi/watchfiles?source=hash-mapping size: 367558 timestamp: 1750054281986 - conda: https://conda.anaconda.org/conda-forge/win-64/watchfiles-1.1.0-py313hf3b5b86_0.conda sha256: dbe6ad52cae1b30c4147a4c97e7f0bdb7cf5bfc08bb8e8cf2301b4aa6956ee12 md5: c525096add47054427ea3a7ce8b30ffe depends: - anyio >=3.0.0 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT purls: - pkg:pypi/watchfiles?source=hash-mapping size: 308441 timestamp: 1750054555332 - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda sha256: f21e63e8f7346f9074fd00ca3b079bd3d2fa4d71f1f89d5b6934bf31446dc2a5 md5: b68980f2495d096e71c7fd9d7ccf63e6 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/wcwidth?source=hash-mapping size: 32581 timestamp: 1733231433877 - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda sha256: 19ff205e138bb056a46f9e3839935a2e60bd1cf01c8241a5e172a422fed4f9c6 md5: 2841eb5bfc75ce15e9a0054b98dcd64d depends: - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/webencodings?source=hash-mapping size: 15496 timestamp: 1733236131358 - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-15.0.1-py313h54dd161_2.conda sha256: 9de398238e7737d79a36db16f49b1e82b032c7ea7458f8af7396653c5f9bf6bc md5: d6dccef73e6b207a6ad0095e19c7690f depends: - python - libgcc >=14 - __glibc >=2.17,<3.0.a0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/websockets?source=hash-mapping size: 364253 timestamp: 1756476348604 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-15.0.1-py313h5b5ffa7_2.conda sha256: f69336b39d0c0e38d1e82054de850120478cabf0e661b0042967dde6df263a1c md5: ef9a9bc862e6b22426c2614748567b37 depends: - python - python 3.13.* *_cp313 - __osx >=11.0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/websockets?source=hash-mapping size: 367500 timestamp: 1756476397592 - conda: https://conda.anaconda.org/conda-forge/win-64/websockets-15.0.1-py313h5fd188c_2.conda sha256: 75cd0f0137fde98fef5c30b30fb75825c248e06b0ae1704e903e6a226a8893fb md5: d613174559c775a83ba68349d40de23f depends: - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/websockets?source=hash-mapping size: 421317 timestamp: 1756476374762 - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f md5: 46e441ba871f524e2b067929da3051c2 depends: - __win - python >=3.9 license: LicenseRef-Public-Domain purls: - pkg:pypi/win-inet-pton?source=hash-mapping size: 9555 timestamp: 1733130678956 - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/xarray/2025.8.1.dev18+g37e512dac/xarray-2025.8.1.dev18+g37e512dac-py3-none-any.whl name: xarray version: 2025.8.1.dev18+g37e512dac requires_dist: - numpy>=1.26 - packaging>=24.1 - pandas>=2.2 - scipy>=1.13 ; extra == 'accel' - bottleneck ; extra == 'accel' - numbagg>=0.8 ; extra == 'accel' - numba>=0.59 ; extra == 'accel' - flox>=0.9 ; extra == 'accel' - opt-einsum ; extra == 'accel' - numpy<2.3 ; extra == 'accel' - xarray[accel,etc,io,parallel,viz] ; extra == 'complete' - netcdf4>=1.6.0 ; extra == 'io' - h5netcdf ; extra == 'io' - pydap ; extra == 'io' - scipy>=1.13 ; extra == 'io' - zarr>=2.18 ; extra == 'io' - fsspec ; extra == 'io' - cftime ; extra == 'io' - pooch ; extra == 'io' - sparse>=0.15 ; extra == 'etc' - dask[complete] ; extra == 'parallel' - cartopy>=0.23 ; extra == 'viz' - matplotlib ; extra == 'viz' - nc-time-axis ; extra == 'viz' - seaborn ; extra == 'viz' - pandas-stubs ; extra == 'types' - scipy-stubs ; extra == 'types' - types-pyyaml ; extra == 'types' - types-pygments ; extra == 'types' - types-colorama ; extra == 'types' - types-decorator ; extra == 'types' - types-defusedxml ; extra == 'types' - types-docutils ; extra == 'types' - types-networkx ; extra == 'types' - types-pexpect ; extra == 'types' - types-psutil ; extra == 'types' - types-pycurl ; extra == 'types' - types-openpyxl ; extra == 'types' - types-python-dateutil ; extra == 'types' - types-pytz ; extra == 'types' - types-setuptools ; extra == 'types' requires_python: ">=3.11" - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.8.0-pyhd8ed1ab_0.conda sha256: 91c476aab9f878a243b4edb31a3cf6c7bb4e873ff537315f475769b890bbbb29 md5: a7b1b2ffdbf18922945874ccbe1420aa depends: - numpy >=1.26 - packaging >=24.1 - pandas >=2.2 - python >=3.11 constrains: - flox >=0.9 - toolz >=0.12 - h5netcdf >=1.3 - dask-core >=2024.6 - iris >=3.9 - bottleneck >=1.4 - hdf5 >=1.14 - h5py >=3.11 - cftime >=1.6 - cartopy >=0.23 - pint >=0.24 - sparse >=0.15 - nc-time-axis >=1.4 - matplotlib-base >=3.8 - seaborn-base >=0.13 - distributed >=2024.6 - netcdf4 >=1.6.0 - zarr >=2.18 - scipy >=1.13 - numba >=0.60 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/xarray?source=compressed-mapping size: 894173 timestamp: 1755208520958 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: MIT license_family: MIT purls: [] size: 14780 timestamp: 1734229004433 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda sha256: f33e6f013fc36ebc200f09ddead83468544cb5c353a3b50499b07b8c34e28a8d md5: 50901e0764b7701d8ed7343496f4f301 depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] size: 13593 timestamp: 1734229104321 - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-h0e40799_0.conda sha256: 047836241b2712aab1e29474a6f728647bff3ab57de2806b0bb0a6cf9a2d2634 md5: 2ffbfae4548098297c033228256eb96e depends: - libgcc >=13 - libwinpthread >=12.0.0.r4.gg4f2fc60ca - ucrt >=10.0.20348.0 license: MIT license_family: MIT purls: [] size: 108013 timestamp: 1734229474049 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee md5: 8035c64cb77ed555e3f150b7b3972480 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: MIT license_family: MIT purls: [] size: 19901 timestamp: 1727794976192 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 md5: 77c447f48cab5d3a15ac224edb86a968 depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] size: 18487 timestamp: 1727795205022 - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-h0e40799_0.conda sha256: 9075f98dcaa8e9957e4a3d9d30db05c7578a536950a31c200854c5c34e1edb2c md5: 8393c0f7e7870b4eb45553326f81f0ff depends: - libgcc >=13 - libwinpthread >=12.0.0.r4.gg4f2fc60ca - ucrt >=10.0.20348.0 license: MIT license_family: MIT purls: [] size: 69920 timestamp: 1727795651979 - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.4.0-pyhd8ed1ab_0.conda sha256: ac6d4d4133b1e0f69075158cdf00fccad20e29fc6cc45faa480cec37a84af6ae md5: 5663fa346821cd06dc1ece2c2600be2c depends: - python >=3.8 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/xyzservices?source=hash-mapping size: 49477 timestamp: 1745598150265 - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad md5: a77f85f77be52ff59391544bfe73390a depends: - libgcc >=14 - __glibc >=2.17,<3.0.a0 license: MIT license_family: MIT purls: [] size: 85189 timestamp: 1753484064210 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac md5: 78a0fe9e9c50d2c381e8ee47e3ea437d depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] size: 83386 timestamp: 1753484079473 - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda sha256: 80ee68c1e7683a35295232ea79bcc87279d31ffeda04a1665efdb43cbd50a309 md5: 433699cba6602098ae8957a323da2664 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 license: MIT license_family: MIT purls: [] size: 63944 timestamp: 1753484092156 - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 md5: 3947a35e916fcc6b9825449affbf4214 depends: - __glibc >=2.17,<3.0.a0 - krb5 >=1.21.3,<1.22.0a0 - libgcc >=13 - libsodium >=1.0.20,<1.0.21.0a0 - libstdcxx >=13 license: MPL-2.0 license_family: MOZILLA purls: [] size: 335400 timestamp: 1731585026517 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a md5: f7e6b65943cb73bce0143737fded08f1 depends: - __osx >=11.0 - krb5 >=1.21.3,<1.22.0a0 - libcxx >=18 - libsodium >=1.0.20,<1.0.21.0a0 license: MPL-2.0 license_family: MOZILLA purls: [] size: 281565 timestamp: 1731585108039 - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda sha256: 15cc8e2162d0a33ffeb3f7b7c7883fd830c54a4b1be6a4b8c7ee1f4fef0088fb md5: e03f2c245a5ee6055752465519363b1c depends: - krb5 >=1.21.3,<1.22.0a0 - libsodium >=1.0.20,<1.0.21.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MPL-2.0 license_family: MOZILLA purls: [] size: 2527503 timestamp: 1731585151036 - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda sha256: 5488542dceeb9f2874e726646548ecc5608060934d6f9ceaa7c6a48c61f9cc8d md5: e52c2ef711ccf31bb7f70ca87d144b9e depends: - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/zict?source=hash-mapping size: 36341 timestamp: 1733261642963 - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda sha256: 7560d21e1b021fd40b65bfb72f67945a3fcb83d78ad7ccf37b8b3165ec3b68ad md5: df5e78d904988eb55042c0c97446079f depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/zipp?source=hash-mapping size: 22963 timestamp: 1749421737203 - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib 1.3.1 hb9d3cd8_2 license: Zlib license_family: Other purls: [] size: 92286 timestamp: 1727963153079 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 md5: e3170d898ca6cb48f1bb567afb92f775 depends: - __osx >=11.0 - libzlib 1.3.1 h8359307_2 license: Zlib license_family: Other purls: [] size: 77606 timestamp: 1727963209370 - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.1-h2466b09_2.conda sha256: 8c688797ba23b9ab50cef404eca4d004a948941b6ee533ead0ff3bf52012528c md5: be60c4e8efa55fddc17b4131aa47acbd depends: - libzlib 1.3.1 h2466b09_2 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Zlib license_family: Other purls: [] size: 107439 timestamp: 1727963788936 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h49ec1c0_3.conda sha256: 2d2adc6539abbab7a599357b73faf8e3d8c9fc40f31d9fdf2e2927c315f02a6a md5: 493d5b49a7b416746b2fe41c82e27dce depends: - __glibc >=2.17,<3.0.a0 - cffi >=1.11 - libgcc >=14 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 487091 timestamp: 1756075708517 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h4c3975b_3.conda sha256: 40c76563f3a398f27b4036e468881a1f909a8c66d100a16a28c1379a0940a59c md5: 7a2c6e25a4fabf9fab62ee1977beabe5 depends: - __glibc >=2.17,<3.0.a0 - cffi >=1.11 - libgcc >=14 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 488806 timestamp: 1756075707087 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py313h07c4f96_3.conda sha256: a2e3a0f646bc2f33fd87de332f73b88b7c3efb7b693e06a920f6aaa0d2f49231 md5: 0720da5e63f3c93647350cc217fdf2bc depends: - __glibc >=2.17,<3.0.a0 - cffi >=1.11 - libgcc >=14 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 492832 timestamp: 1756075709448 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py311h3696347_3.conda sha256: 392bdd0a344705dbdf14b5f6a083f67367a3fa333b10d56b56591d462c7c1631 md5: 94f5136be6b59888a143f3be16f06ff5 depends: - __osx >=11.0 - cffi >=1.11 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 510335 timestamp: 1756075846880 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h163523d_3.conda sha256: dd4bc79229fb401a856eff02c392d3e6cfa5da9a2becb5077f5eb89c315b40eb md5: 718b0aa0e2a3bb6f5e2dcc168f9e2ac3 depends: - __osx >=11.0 - cffi >=1.11 - 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 purls: - pkg:pypi/zstandard?source=hash-mapping size: 511025 timestamp: 1756075793991 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py313hcdf3177_3.conda sha256: 1504af74fe125281735e28bed7cb505c9ab77ca0604de95769248016e438b1c8 md5: 2c20f2bf641dd839f6f9b7c057196a68 depends: - __osx >=11.0 - cffi >=1.11 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 516638 timestamp: 1756075906716 - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py311h3485c13_3.conda sha256: 5b3a2666e21723b96b3637aef4d108c2996979efe5719998649184f01b20ed7e md5: 8265296d9de69a925580b651c0c717ae depends: - cffi >=1.11 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 343300 timestamp: 1756075846831 - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py312he06e257_3.conda sha256: 13f43231e22173473ba300d9a128caf386ec73a18a5b9b192858ba18ea2e78f1 md5: e23097165ce8ba29c30854c2a9e84449 depends: - cffi >=1.11 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 342842 timestamp: 1756075919270 - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py313h5ea7bf4_3.conda sha256: fd446ae9142ddcaf123de7997dbded7aee88c333ab4dfd7bf3cfca4c2041aca1 md5: 884170f85de370eb45d5c4edab147861 depends: - cffi >=1.11 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 347160 timestamp: 1756075776191 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 567578 timestamp: 1742433379869 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda sha256: 0d02046f57f7a1a3feae3e9d1aa2113788311f3cf37a3244c71e61a93177ba67 md5: e6f69c7bcccdefa417f056fa593b40f0 depends: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD purls: [] size: 399979 timestamp: 1742433432699 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda sha256: bc64864377d809b904e877a98d0584f43836c9f2ef27d3d2a1421fa6eae7ca04 md5: 21f56217d6125fb30c3c3f10c786d751 depends: - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: [] size: 354697 timestamp: 1742433568506 pint-xarray-0.6.0/pyproject.toml000066400000000000000000000112641505507415300167200ustar00rootroot00000000000000[project] name = "pint-xarray" authors = [ { name = "Tom Nicholas", email = "tomnicholas1@googlemail.com" }, ] description = "Physical units interface to xarray using Pint" license = "Apache-2.0" readme = "README.md" classifiers = [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: Science/Research", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering", ] requires-python = ">=3.11" dependencies = [ "xarray >= 2023.07.0", "numpy >= 1.26", "pint >= 0.24", ] dynamic = ["version"] [project.urls] Home = "https://github.com/xarray-contrib/pint-xarray" Documentation = "https://pint-xarray.readthedocs.io/en/stable" [tool.setuptools.packages.find] include = [ "pint_xarray", "pint_xarray.tests", ] [build-system] requires = ["setuptools >= 77", "setuptools_scm >= 8"] build-backend = "setuptools.build_meta" [tool.setuptools_scm] fallback_version = "999" [tool.pytest.ini_options] junit_family = "xunit2" [tool.ruff] target-version = "py311" builtins = ["ellipsis"] exclude = [ ".git", ".eggs", "build", "dist", "__pycache__", ] line-length = 100 [tool.ruff.lint] # E402: module level import not at top of file # E501: line too long - let black worry about that # E731: do not assign a lambda expression, use a def ignore = [ "E402", "E501", "E731", "UP038", ] select = [ "F", # Pyflakes "E", # Pycodestyle "I", # isort "UP", # Pyupgrade "TID", # flake8-tidy-imports "W", ] extend-safe-fixes = [ "TID252", # absolute imports ] fixable = ["I", "TID252"] [tool.ruff.lint.isort] known-first-party = ["pint_xarray"] known-third-party = [ "xarray", ] [tool.ruff.lint.flake8-tidy-imports] # Disallow all relative imports. ban-relative-imports = "all" [tool.coverage.run] source = ["pint_xarray"] branch = true omit = ["pint_xarray/tests/*"] [tool.coverage.report] show_missing = true exclude_lines = ["pragma: no cover", "if TYPE_CHECKING"] [tool.pixi.workspace] channels = ["conda-forge"] platforms = ["linux-64", "osx-arm64", "win-64"] [tool.pixi.dependencies] numpy = "*" pint = "*" xarray = "*" [tool.pixi.pypi-dependencies] pint-xarray = { path = ".", editable = true } [tool.pixi.feature.optional-deps.dependencies] dask = "*" scipy = "*" bottleneck = "*" [tool.pixi.feature.tests.dependencies] pytest = ">=8" pytest-cov = "*" pytest-xdist = "*" cytoolz = "*" [tool.pixi.feature.tests-py311.dependencies] python = "3.11.*" [tool.pixi.feature.tests-py311.tasks] tests = "pytest -n auto --cov=pint_xarray" [tool.pixi.feature.tests-py312.dependencies] python = "3.12.*" [tool.pixi.feature.tests-py312.tasks] tests = "pytest -n auto --cov=pint_xarray" [tool.pixi.feature.tests-py313.dependencies] python = "3.13.*" [tool.pixi.feature.tests-py313.tasks] doctests = "pytest --doctest-modules pint_xarray --ignore pint_xarray/tests" tests = "pytest -n auto --cov=pint_xarray" [tool.pixi.feature.nightly.pypi-options] extra-index-urls = [ "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple", ] [tool.pixi.feature.nightly.pypi-dependencies] pint-xarray = { path = ".", editable = true } pint = { git = "git+https://github.com/hgrecco/pint.git" } xarray = "*" numpy = "*" scipy = "*" [tool.pixi.feature.nightly.dependencies] pytest-reportlog = ">=0.1.2" python = "3.13.*" [tool.pixi.feature.nightly.tasks] tests = "pytest -n auto --cov=pint_xarray --report-log=tests.jsonl" [tool.pixi.feature.docs.dependencies] sphinx = "*" sphinx-rtd-theme = ">=1.0" sphinx-autosummary-accessors = "*" nbsphinx = "*" cf-xarray = ">=0.10" pooch = "*" netcdf4 = "*" ipython = "*" ipykernel = "*" jupyter_client = "*" matplotlib-base = "*" sphinx-autobuild = "*" python = "3.13.*" [tool.pixi.feature.docs.tasks] build-docs = { cmd = "rm -rf generated/; python -m sphinx -b html -w warnings.log -W -Tn -j auto . _build", cwd = "docs" } autobuild-docs = { cmd = "sphinx-autobuild -b html -w warnings.log -W -Tn -j auto . _build", cwd = "docs" } build-docs-rtd = { cmd = "python -m sphinx -b html -W -T -j auto . $READTHEDOCS_OUTPUT/html", cwd = "docs" } [tool.pixi.feature.dev.dependencies] ipython = "*" ipdb = "*" python = "3.13.*" pooch = ">=1.8.2,<2" netcdf4 = ">=1.7.2,<2" [tool.pixi.environments] tests = ["optional-deps", "tests"] nightly = { features = ["tests", "nightly"], no-default-feature = true } docs = ["docs"] tests-py311 = ["optional-deps", "tests", "tests-py311"] tests-py312 = ["optional-deps", "tests", "tests-py312"] tests-py313 = ["optional-deps", "tests", "tests-py313"] doctests = ["optional-deps", "tests", "tests-py313"] dev = ["optional-deps", "tests", "dev"] pint-xarray-0.6.0/requirements.txt000066400000000000000000000000501505507415300172570ustar00rootroot00000000000000pint>=0.13 numpy>=1.17.1 xarray>=0.15.1