From 49724bfbdaa53a9d3a43b40f7afe2bf1679ba011 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 10:40:01 +0100 Subject: [PATCH 01/35] Apply templates --- .badgery.yaml | 72 + .copier-answers.yml | 34 +- .github/actions/download-artifact/action.yml | 50 + .github/actions/github-script/action.yml | 19 + .../actions/setup-easyscience-bot/action.yml | 40 + .github/actions/setup-pixi/action.yml | 20 +- .github/actions/upload-artifact/action.yml | 49 + .github/actions/upload-codecov/action.yml | 42 + .github/configs/pages-deployment.json | 6 + .github/configs/rulesets-develop.json | 37 + .github/configs/rulesets-gh-pages.json | 19 + .github/configs/rulesets-master.json | 30 + .github/scripts/backmerge-conflict-issue.js | 69 + .github/workflows/backmerge.yml | 109 + .github/workflows/cleanup.yml | 84 + .github/workflows/coverage.yml | 94 + .github/workflows/dashboard.yml | 104 + .github/workflows/docs.yml | 184 + .github/workflows/issues-labels.yml | 42 + .github/workflows/pr-labels.yml | 56 + .github/workflows/pypi-publish.yml | 46 + .github/workflows/pypi-test.yml | 80 + .github/workflows/quality.yml | 121 + .github/workflows/release-notes.yml | 71 + .github/workflows/release-pr.yml | 55 + .github/workflows/security.yml | 93 + .github/workflows/test-trigger.yml | 40 + .github/workflows/test.yml | 271 + .github/workflows/tutorial-tests-trigger.yml | 40 + .github/workflows/tutorial-tests.yml | 64 + .gitignore | 55 +- .pre-commit-config.yaml | 73 +- .prettierignore | 17 + CONTRIBUTING.md | 457 +- LICENSE | 3 +- README.md | 58 +- codecov.yml | 13 + docs/docs/api-reference/index.md | 8 + docs/docs/assets/javascripts/extra.js | 29 + docs/docs/assets/stylesheets/extra.css | 359 + docs/docs/index.md | 20 + docs/docs/installation-and-setup/index.md | 281 + docs/docs/introduction/index.md | 68 + docs/docs/tutorials/index.md | 21 + docs/docs/tutorials/tutorial.py | 20 + docs/docs/user-guide/index.md | 24 + docs/includes/abbreviations.md | 15 + docs/mkdocs.yml | 174 + docs/overrides/.icons/app.svg | 4 + docs/overrides/.icons/google-colab.svg | 7 + docs/overrides/main.html | 39 + docs/overrides/partials/logo.html | 15 + pixi.lock | 1494 +- pixi.toml | 277 +- prettierrc.toml | 22 + pyproject.toml | 320 +- src/easyscience/__init__.py | 27 +- tests/__init__.py | 3 - tests/coord_cython.c | 27472 ---------------- tests/coord_cython.pyx | 273 - tests/coords.py | 504 - .../fitting/test_fitter.py | 0 .../fitting/test_multi_fitter.py | 0 tests/integration_tests/fitting/__init__.py | 0 tests/package_test.py | 7 - .../base_classes/test_collection_base.py | 0 .../base_classes/test_easy_list.py | 0 .../base_classes/test_model_base.py | 0 .../base_classes/test_new_base.py | 0 .../base_classes/test_obj_base.py | 0 .../calculators/test_interface_factory.py | 0 .../fitting/minimizers/test_factory.py | 0 .../fitting/minimizers/test_minimizer_base.py | 0 .../minimizers/test_minimizer_bumps.py | 0 .../fitting/minimizers/test_minimizer_dfo.py | 0 .../minimizers/test_minimizer_lmfit.py | 0 .../fitting/test_fitter.py | 0 .../test_entry_list_comprehensive.py | 0 .../global_object/test_global_object.py | 0 .../test_integration_comprehensive.py | 0 .../global_object/test_map.py | 0 .../global_object/test_undo_redo.py | 0 .../test_undo_redo_comprehensive.py | 0 .../io/test_serializer_base.py | 0 .../io/test_serializer_component.py | 0 .../io/test_serializer_dict.py | 0 .../{unit_tests => unit}/legacy/test_dict.py | 0 .../{unit_tests => unit}/legacy/test_json.py | 0 tests/{unit_tests => unit}/legacy/test_xml.py | 0 .../models/test_polynomial.py | 0 .../variable/test_descriptor_any_type.py | 0 .../variable/test_descriptor_array.py | 0 .../variable/test_descriptor_base.py | 0 .../variable/test_descriptor_bool.py | 0 .../variable/test_descriptor_number.py | 0 .../variable/test_descriptor_str.py | 0 .../variable/test_parameter.py | 0 ...test_parameter_dependency_serialization.py | 0 tests/unit_tests/__init__.py | 3 - tests/unit_tests/base_classes/__init__.py | 0 tests/unit_tests/fitting/__init__.py | 4 - .../fitting/calculators/__init__.py | 4 - .../unit_tests/fitting/minimizers/__init__.py | 0 tests/unit_tests/global_object/__init__.py | 0 tests/unit_tests/io/__init__.py | 4 - tests/unit_tests/models/__init__.py | 4 - tests/unit_tests/variable/__init__.py | 0 tools/test_scripts.py | 55 + tools/update_docs_assets.py | 91 + tools/update_github_labels.py | 339 + tools/update_spdx.py | 106 + 111 files changed, 5927 insertions(+), 28883 deletions(-) create mode 100644 .badgery.yaml create mode 100644 .github/actions/download-artifact/action.yml create mode 100644 .github/actions/github-script/action.yml create mode 100644 .github/actions/setup-easyscience-bot/action.yml create mode 100644 .github/actions/upload-artifact/action.yml create mode 100644 .github/actions/upload-codecov/action.yml create mode 100644 .github/configs/pages-deployment.json create mode 100644 .github/configs/rulesets-develop.json create mode 100644 .github/configs/rulesets-gh-pages.json create mode 100644 .github/configs/rulesets-master.json create mode 100644 .github/scripts/backmerge-conflict-issue.js create mode 100644 .github/workflows/backmerge.yml create mode 100644 .github/workflows/cleanup.yml create mode 100644 .github/workflows/coverage.yml create mode 100644 .github/workflows/dashboard.yml create mode 100644 .github/workflows/docs.yml create mode 100644 .github/workflows/issues-labels.yml create mode 100644 .github/workflows/pr-labels.yml create mode 100644 .github/workflows/pypi-publish.yml create mode 100644 .github/workflows/pypi-test.yml create mode 100644 .github/workflows/quality.yml create mode 100644 .github/workflows/release-notes.yml create mode 100644 .github/workflows/release-pr.yml create mode 100644 .github/workflows/security.yml create mode 100644 .github/workflows/test-trigger.yml create mode 100644 .github/workflows/test.yml create mode 100644 .github/workflows/tutorial-tests-trigger.yml create mode 100644 .github/workflows/tutorial-tests.yml create mode 100644 .prettierignore create mode 100644 codecov.yml create mode 100644 docs/docs/api-reference/index.md create mode 100644 docs/docs/assets/javascripts/extra.js create mode 100644 docs/docs/assets/stylesheets/extra.css create mode 100644 docs/docs/index.md create mode 100644 docs/docs/installation-and-setup/index.md create mode 100644 docs/docs/introduction/index.md create mode 100644 docs/docs/tutorials/index.md create mode 100644 docs/docs/tutorials/tutorial.py create mode 100644 docs/docs/user-guide/index.md create mode 100644 docs/includes/abbreviations.md create mode 100644 docs/mkdocs.yml create mode 100644 docs/overrides/.icons/app.svg create mode 100644 docs/overrides/.icons/google-colab.svg create mode 100644 docs/overrides/main.html create mode 100644 docs/overrides/partials/logo.html create mode 100644 prettierrc.toml delete mode 100644 tests/__init__.py delete mode 100644 tests/coord_cython.c delete mode 100644 tests/coord_cython.pyx delete mode 100644 tests/coords.py rename tests/{integration_tests => integration}/fitting/test_fitter.py (100%) rename tests/{integration_tests => integration}/fitting/test_multi_fitter.py (100%) delete mode 100644 tests/integration_tests/fitting/__init__.py delete mode 100644 tests/package_test.py rename tests/{unit_tests => unit}/base_classes/test_collection_base.py (100%) rename tests/{unit_tests => unit}/base_classes/test_easy_list.py (100%) rename tests/{unit_tests => unit}/base_classes/test_model_base.py (100%) rename tests/{unit_tests => unit}/base_classes/test_new_base.py (100%) rename tests/{unit_tests => unit}/base_classes/test_obj_base.py (100%) rename tests/{unit_tests => unit}/fitting/calculators/test_interface_factory.py (100%) rename tests/{unit_tests => unit}/fitting/minimizers/test_factory.py (100%) rename tests/{unit_tests => unit}/fitting/minimizers/test_minimizer_base.py (100%) rename tests/{unit_tests => unit}/fitting/minimizers/test_minimizer_bumps.py (100%) rename tests/{unit_tests => unit}/fitting/minimizers/test_minimizer_dfo.py (100%) rename tests/{unit_tests => unit}/fitting/minimizers/test_minimizer_lmfit.py (100%) rename tests/{unit_tests => unit}/fitting/test_fitter.py (100%) rename tests/{unit_tests => unit}/global_object/test_entry_list_comprehensive.py (100%) rename tests/{unit_tests => unit}/global_object/test_global_object.py (100%) rename tests/{unit_tests => unit}/global_object/test_integration_comprehensive.py (100%) rename tests/{unit_tests => unit}/global_object/test_map.py (100%) rename tests/{unit_tests => unit}/global_object/test_undo_redo.py (100%) rename tests/{unit_tests => unit}/global_object/test_undo_redo_comprehensive.py (100%) rename tests/{unit_tests => unit}/io/test_serializer_base.py (100%) rename tests/{unit_tests => unit}/io/test_serializer_component.py (100%) rename tests/{unit_tests => unit}/io/test_serializer_dict.py (100%) rename tests/{unit_tests => unit}/legacy/test_dict.py (100%) rename tests/{unit_tests => unit}/legacy/test_json.py (100%) rename tests/{unit_tests => unit}/legacy/test_xml.py (100%) rename tests/{unit_tests => unit}/models/test_polynomial.py (100%) rename tests/{unit_tests => unit}/variable/test_descriptor_any_type.py (100%) rename tests/{unit_tests => unit}/variable/test_descriptor_array.py (100%) rename tests/{unit_tests => unit}/variable/test_descriptor_base.py (100%) rename tests/{unit_tests => unit}/variable/test_descriptor_bool.py (100%) rename tests/{unit_tests => unit}/variable/test_descriptor_number.py (100%) rename tests/{unit_tests => unit}/variable/test_descriptor_str.py (100%) rename tests/{unit_tests => unit}/variable/test_parameter.py (100%) rename tests/{unit_tests => unit}/variable/test_parameter_dependency_serialization.py (100%) delete mode 100644 tests/unit_tests/__init__.py delete mode 100644 tests/unit_tests/base_classes/__init__.py delete mode 100644 tests/unit_tests/fitting/__init__.py delete mode 100644 tests/unit_tests/fitting/calculators/__init__.py delete mode 100644 tests/unit_tests/fitting/minimizers/__init__.py delete mode 100644 tests/unit_tests/global_object/__init__.py delete mode 100644 tests/unit_tests/io/__init__.py delete mode 100644 tests/unit_tests/models/__init__.py delete mode 100644 tests/unit_tests/variable/__init__.py create mode 100644 tools/test_scripts.py create mode 100644 tools/update_docs_assets.py create mode 100644 tools/update_github_labels.py create mode 100644 tools/update_spdx.py diff --git a/.badgery.yaml b/.badgery.yaml new file mode 100644 index 00000000..99bcdc1c --- /dev/null +++ b/.badgery.yaml @@ -0,0 +1,72 @@ +default_branch: master +develop_branch: develop + +cards: + - group: Tests + type: gh_action + title: Code/package tests (GitHub) + file: test.yml + enabled: true + - group: Tests + type: gh_action + title: Tutorial tests (GitHub) + file: tutorial-tests.yml + enabled: true + + - group: Tests + type: gh_action + title: Package tests (PyPI) + file: pypi-test.yml + enabled: true + + - group: Code Quality + type: codefactor + title: Code quality (CodeFactor) + enabled: true + + - group: Code Quality + type: radon_mi + title: Maintainability index (radon) + report: reports/{branch}/maintainability-index.json + enabled: true + + - group: Code Quality + type: radon_cc + title: Cyclomatic complexity (radon) + report: reports/{branch}/cyclomatic-complexity.json + enabled: true + + - group: Size + type: radon_loc + title: Source/Logical lines of code (radon) + report: reports/{branch}/raw-metrics.json + enabled: true + + - group: Size + type: radon_ff + title: Functions/Files count (radon) + report: reports/{branch}/cyclomatic-complexity.json + enabled: true + + - group: Coverage + type: codecov + title: Unit test coverage (Codecov) + flag: unittests + enabled: true + + - group: Coverage + type: interrogate + title: Docstring coverage (interrogate) + report: reports/{branch}/coverage-docstring.txt + enabled: true + - group: Build & Release + type: gh_action + title: Publishing (PyPI) + workflow: pypi-publish.yml + enabled: true + + - group: Build & Release + type: gh_action + title: Docs build/deployment + workflow: docs.yml + enabled: true diff --git a/.copier-answers.yml b/.copier-answers.yml index a3add030..f223f786 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,12 +1,22 @@ -# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 1b51781 -_src_path: gh:/EasyScience/EasyProjectTemplate -description: Core foundation of the EasyScience family of projects, providing the - building blocks for libraries and applications -max_python: '3.12' -min_python: '3.8' -orgname: EasyScience -packagename: easyscience -prettyname: Easyscience -projectname: EasyScience -year: 2024 +# WARNING: Do not edit this file manually. +# Any changes will be overwritten by Copier. +_commit: v0.7.0-3-g390cc8d +_src_path: gh:easyscience/templates +lib_docs_url: https://easyscience.github.io/core +lib_doi: 10.5281/zenodo.18163581 +lib_package_name: easyscience +lib_python_max: '3.13' +lib_python_min: '3.11' +lib_repo_name: core +project_contact_email: support@easyscience.org +project_copyright_years: 2021-2026 +project_extended_description: The foundation of the framework, providing reusable + building blocks for scientific libraries and applications aimed at making data + analysis easier +project_homepage_url: https://easyscience.github.io/core +project_name: EasyScience +project_repo_name: core +project_short_description: Core building blocks for EasyScience +project_shortcut: ES +project_type: lib +template_type: lib diff --git a/.github/actions/download-artifact/action.yml b/.github/actions/download-artifact/action.yml new file mode 100644 index 00000000..e4fd62f5 --- /dev/null +++ b/.github/actions/download-artifact/action.yml @@ -0,0 +1,50 @@ +name: 'Download artifact' +description: 'Generic wrapper for actions/download-artifact' +inputs: + name: + description: 'Name of the artifact to download' + required: true + + path: + description: 'Destination path' + required: false + default: '.' + + pattern: + description: 'Glob pattern to match artifact names (optional)' + required: false + default: '' + + merge-multiple: + description: 'Merge multiple artifacts into the same directory' + required: false + default: 'false' + + github-token: + description: 'GitHub token for cross-repo download (optional)' + required: false + default: '' + + repository: + description: 'owner/repo for cross-repo download (optional)' + required: false + default: '' + + run-id: + description: 'Workflow run ID for cross-run download (optional)' + required: false + default: '' + +runs: + using: 'composite' + steps: + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: ${{ inputs.name }} + path: ${{ inputs.path }} + pattern: ${{ inputs.pattern }} + merge-multiple: ${{ inputs.merge-multiple }} + github-token: ${{ inputs.github-token }} + repository: ${{ inputs.repository }} + run-id: ${{ inputs.run-id }} diff --git a/.github/actions/github-script/action.yml b/.github/actions/github-script/action.yml new file mode 100644 index 00000000..ab32da56 --- /dev/null +++ b/.github/actions/github-script/action.yml @@ -0,0 +1,19 @@ +name: 'GitHub Script' +description: 'Wrapper for actions/github-script' +inputs: + script: + description: 'JavaScript to run' + required: true + + github-token: + description: 'GitHub token (defaults to github.token)' + required: false + default: ${{ github.token }} + +runs: + using: 'composite' + steps: + - uses: actions/github-script@v8 + with: + script: ${{ inputs.script }} + github-token: ${{ inputs.github-token }} diff --git a/.github/actions/setup-easyscience-bot/action.yml b/.github/actions/setup-easyscience-bot/action.yml new file mode 100644 index 00000000..4b28eaf8 --- /dev/null +++ b/.github/actions/setup-easyscience-bot/action.yml @@ -0,0 +1,40 @@ +name: 'Setup EasyScience bot for pushing' +description: 'Create GitHub App token and configure git identity + origin remote' +inputs: + app-id: + description: 'GitHub App ID' + required: true + private-key: + description: 'GitHub App private key (PEM)' + required: true + repositories: + description: 'Additional repositories to grant access to (newline-separated)' + required: false + default: '' + +outputs: + token: + description: 'Installation access token' + value: ${{ steps.app-token.outputs.token }} + +runs: + using: 'composite' + steps: + - name: Create GitHub App installation token + id: app-token + uses: actions/create-github-app-token@v2 + with: + app-id: ${{ inputs.app-id }} + private-key: ${{ inputs.private-key }} + repositories: ${{ inputs.repositories }} + + - name: Configure git for pushing + shell: bash + run: | + git config user.name "easyscience[bot]" + git config user.email "${{ inputs.app-id }}+easyscience[bot]@users.noreply.github.com" + + - name: Configure origin remote to use the bot token + shell: bash + run: | + git remote set-url origin https://x-access-token:${{ steps.app-token.outputs.token }}@github.com/${{ github.repository }}.git diff --git a/.github/actions/setup-pixi/action.yml b/.github/actions/setup-pixi/action.yml index 8c68f51e..eb891e1f 100644 --- a/.github/actions/setup-pixi/action.yml +++ b/.github/actions/setup-pixi/action.yml @@ -4,13 +4,21 @@ inputs: environments: description: 'Pixi environments to setup' required: false - default: 'dev' + default: 'default' activate-environment: description: 'Environment to activate' required: false - default: 'dev' + default: 'default' run-install: - description: 'Whether to run install' + description: 'Whether to run pixi install' + required: false + default: 'true' + locked: + description: 'Whether to run pixi install --locked' + required: false + default: 'false' + frozen: + description: 'Whether to run pixi install --frozen' required: false default: 'true' cache: @@ -25,10 +33,12 @@ inputs: runs: using: 'composite' steps: - - uses: prefix-dev/setup-pixi@v0.9.0 + - uses: prefix-dev/setup-pixi@v0.9.3 with: environments: ${{ inputs.environments }} activate-environment: ${{ inputs.activate-environment }} run-install: ${{ inputs.run-install }} + locked: ${{ inputs.locked }} + frozen: ${{ inputs.frozen }} cache: ${{ inputs.cache }} - post-cleanup: ${{ inputs.post-cleanup }} \ No newline at end of file + post-cleanup: ${{ inputs.post-cleanup }} diff --git a/.github/actions/upload-artifact/action.yml b/.github/actions/upload-artifact/action.yml new file mode 100644 index 00000000..825ac396 --- /dev/null +++ b/.github/actions/upload-artifact/action.yml @@ -0,0 +1,49 @@ +name: 'Upload artifact' +description: 'Generic wrapper for actions/upload-artifact' +inputs: + name: + description: 'Artifact name' + required: true + + path: + description: 'File(s)/dir(s)/glob(s) to upload (newline-separated)' + required: true + + include-hidden-files: + description: 'Include hidden files' + required: false + default: 'true' + + if-no-files-found: + description: 'warn | error | ignore' + required: false + default: 'error' + + compression-level: + description: '0-9 (0 = no compression)' + required: false + default: '0' + + retention-days: + description: 'Retention in days (optional)' + required: false + default: '' + + overwrite: + description: 'Overwrite an existing artifact with the same name' + required: false + default: 'false' + +runs: + using: 'composite' + steps: + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.name }} + path: ${{ inputs.path }} + include-hidden-files: ${{ inputs.include-hidden-files }} + if-no-files-found: ${{ inputs.if-no-files-found }} + compression-level: ${{ inputs.compression-level }} + retention-days: ${{ inputs.retention-days }} + overwrite: ${{ inputs.overwrite }} diff --git a/.github/actions/upload-codecov/action.yml b/.github/actions/upload-codecov/action.yml new file mode 100644 index 00000000..37d6298a --- /dev/null +++ b/.github/actions/upload-codecov/action.yml @@ -0,0 +1,42 @@ +name: 'Upload coverage to Codecov' +description: 'Generic wrapper for codecov/codecov-action@v5' + +inputs: + name: + description: 'Codecov upload name' + required: true + + flags: + description: 'Codecov flags' + required: false + default: '' + + files: + description: 'Coverage report files' + required: true + + fail_ci_if_error: + description: 'Fail CI if upload fails' + required: false + default: 'true' + + verbose: + description: 'Enable verbose output' + required: false + default: 'true' + + token: + description: 'Codecov token' + required: true + +runs: + using: composite + steps: + - uses: codecov/codecov-action@v5 + with: + name: ${{ inputs.name }} + flags: ${{ inputs.flags }} + files: ${{ inputs.files }} + fail_ci_if_error: ${{ inputs.fail_ci_if_error }} + verbose: ${{ inputs.verbose }} + token: ${{ inputs.token }} diff --git a/.github/configs/pages-deployment.json b/.github/configs/pages-deployment.json new file mode 100644 index 00000000..c0d3fbee --- /dev/null +++ b/.github/configs/pages-deployment.json @@ -0,0 +1,6 @@ +{ + "source": { + "branch": "gh-pages", + "path": "/" + } +} diff --git a/.github/configs/rulesets-develop.json b/.github/configs/rulesets-develop.json new file mode 100644 index 00000000..04489e52 --- /dev/null +++ b/.github/configs/rulesets-develop.json @@ -0,0 +1,37 @@ +{ + "name": "develop branch", + "target": "branch", + "enforcement": "active", + "conditions": { + "ref_name": { + "include": ["refs/heads/develop"], + "exclude": [] + } + }, + "bypass_actors": [ + { + "actor_id": 2476259, + "actor_type": "Integration", + "bypass_mode": "always" + } + ], + "rules": [ + { + "type": "non_fast_forward" + }, + { + "type": "deletion" + }, + { + "type": "pull_request", + "parameters": { + "allowed_merge_methods": ["squash"], + "dismiss_stale_reviews_on_push": false, + "require_code_owner_review": false, + "require_last_push_approval": false, + "required_approving_review_count": 0, + "required_review_thread_resolution": false + } + } + ] +} diff --git a/.github/configs/rulesets-gh-pages.json b/.github/configs/rulesets-gh-pages.json new file mode 100644 index 00000000..ebf38928 --- /dev/null +++ b/.github/configs/rulesets-gh-pages.json @@ -0,0 +1,19 @@ +{ + "name": "gh-pages branch", + "target": "branch", + "enforcement": "active", + "conditions": { + "ref_name": { + "include": ["refs/heads/gh-pages"], + "exclude": [] + } + }, + "rules": [ + { + "type": "non_fast_forward" + }, + { + "type": "deletion" + } + ] +} diff --git a/.github/configs/rulesets-master.json b/.github/configs/rulesets-master.json new file mode 100644 index 00000000..f658a5c6 --- /dev/null +++ b/.github/configs/rulesets-master.json @@ -0,0 +1,30 @@ +{ + "name": "master branch", + "target": "branch", + "enforcement": "active", + "conditions": { + "ref_name": { + "include": ["~DEFAULT_BRANCH"], + "exclude": [] + } + }, + "rules": [ + { + "type": "non_fast_forward" + }, + { + "type": "deletion" + }, + { + "type": "pull_request", + "parameters": { + "allowed_merge_methods": ["merge"], + "dismiss_stale_reviews_on_push": false, + "require_code_owner_review": false, + "require_last_push_approval": false, + "required_approving_review_count": 0, + "required_review_thread_resolution": false + } + } + ] +} diff --git a/.github/scripts/backmerge-conflict-issue.js b/.github/scripts/backmerge-conflict-issue.js new file mode 100644 index 00000000..f6bd98b5 --- /dev/null +++ b/.github/scripts/backmerge-conflict-issue.js @@ -0,0 +1,69 @@ +module.exports = async ({ github, context, core }) => { + // Repo context + const owner = context.repo.owner + const repo = context.repo.repo + + // Link to the exact workflow run that detected the conflict + const runUrl = `${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}` + + // We use a *stable title* so we can find/reuse the same "conflict tracker" issue + // instead of creating a new issue on every failed run. + const title = 'Backmerge conflict: master → develop' + + // Comment/issue body includes the run URL so maintainers can jump straight to logs. + const body = [ + 'Automatic backmerge failed due to merge conflicts.', + '', + `Workflow run: ${runUrl}`, + '', + 'Manual resolution required.', + ].join('\n') + + // Label applied to the tracker issue (assumed to already exist in the repo). + const label = '[bot] backmerge' + + // Search issues by title across *open and closed* issues. + // Why: if the conflict was resolved previously and the issue was closed, + // we prefer to reopen it and append a new comment instead of creating duplicates. + const q = `repo:${owner}/${repo} is:issue in:title "${title}"` + const search = await github.rest.search.issuesAndPullRequests({ + q, + per_page: 10, + }) + + // Pick the first exact-title match (search can return partial matches). + const existing = search.data.items.find((i) => i.title === title) + + if (existing) { + // If a tracker issue exists, reuse it: + // - reopen it if needed + // - add a comment with the new run URL + if (existing.state === 'closed') { + await github.rest.issues.update({ + owner, + repo, + issue_number: existing.number, + state: 'open', + }) + } + + await github.rest.issues.createComment({ + owner, + repo, + issue_number: existing.number, + body, + }) + + core.notice(`Conflict issue updated: #${existing.number}`) + return + } + + // No tracker issue exists yet -> create the first one. + await github.rest.issues.create({ + owner, + repo, + title, + body, + labels: [label], + }) +} diff --git a/.github/workflows/backmerge.yml b/.github/workflows/backmerge.yml new file mode 100644 index 00000000..47b3384a --- /dev/null +++ b/.github/workflows/backmerge.yml @@ -0,0 +1,109 @@ +# This workflow automatically merges `master` into `develop` whenever a +# new version release with a tag is published. It can also be triggered +# manually via workflow_dispatch for cases where an automatic backmerge +# is needed outside of the standard release process. +# If a merge conflict occurs, the workflow creates an issue to notify +# maintainers for manual resolution. + +name: Backmerge (master → develop) + +on: + release: + types: [published, prereleased] + workflow_dispatch: + +permissions: + contents: write + issues: write + +concurrency: + group: backmerge-master-into-develop + cancel-in-progress: false + +jobs: + backmerge: + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - name: Checkout repository (for local actions) + uses: actions/checkout@v5 + + - name: Setup easyscience[bot] + id: bot + uses: ./.github/actions/setup-easyscience-bot + with: + app-id: ${{ vars.EASYSCIENCE_APP_ID }} + private-key: ${{ secrets.EASYSCIENCE_APP_KEY }} + repositories: ${{ github.event.repository.name }} + + - name: Checkout repository (with bot token) + uses: actions/checkout@v5 + with: + fetch-depth: 0 + token: ${{ steps.bot.outputs.token }} + + - name: Configure git identity + run: | + git config user.name "easyscience[bot]" + git config user.email "${{ vars.EASYSCIENCE_APP_ID }}+easyscience[bot]@users.noreply.github.com" + + - name: Set merge message + run: | + if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + MESSAGE="Backmerge: master into develop (manual) [skip ci]" + else + TAG="${{ github.event.release.tag_name }}" + MESSAGE="Backmerge: master (${TAG}) into develop [skip ci]" + fi + + echo "MESSAGE=$MESSAGE" >> "$GITHUB_ENV" + echo "message=$MESSAGE" >> "$GITHUB_OUTPUT" + echo "📝 Merge message: $MESSAGE" | tee -a "$GITHUB_STEP_SUMMARY" + + - name: Prepare branches + run: | + git fetch origin master develop + git checkout -B develop origin/develop + + - name: Check if develop is already up-to-date + id: up_to_date + run: | + if git merge-base --is-ancestor origin/master develop; then + echo "value=true" >> "$GITHUB_OUTPUT" + echo "ℹ️ Develop is already up-to-date with master" | tee -a "$GITHUB_STEP_SUMMARY" + else + echo "value=false" >> "$GITHUB_OUTPUT" + fi + + - name: Try merge master into develop + id: merge + if: steps.up_to_date.outputs.value == 'false' + continue-on-error: true + run: | + if ! git merge origin/master --no-ff -m "${MESSAGE}"; then + echo "conflict=true" >> "$GITHUB_OUTPUT" + echo "❌ Backmerge conflict detected." | tee -a "$GITHUB_STEP_SUMMARY" + git status --porcelain || true + exit 0 + fi + + echo "conflict=false" >> "$GITHUB_OUTPUT" + echo "✅ Merge commit created." | tee -a "$GITHUB_STEP_SUMMARY" + + - name: Push to develop (if merge succeeded) + if: + steps.up_to_date.outputs.value == 'false' && steps.merge.outputs.conflict == + 'false' + run: | + git push origin develop + echo "🚀 Backmerge successful: master → develop" | tee -a "$GITHUB_STEP_SUMMARY" + + - name: Create issue (if merge failed with conflicts) + if: steps.merge.outputs.conflict == 'true' + uses: ./.github/actions/github-script + with: + github-token: ${{ steps.bot.outputs.token }} + script: | + const run = require('./.github/scripts/backmerge-conflict-issue.js') + await run({ github, context, core }) diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml new file mode 100644 index 00000000..7305679b --- /dev/null +++ b/.github/workflows/cleanup.yml @@ -0,0 +1,84 @@ +# This workflow will delete old workflow runs based on the input +# parameters. +# https://github.com/Mattraks/delete-workflow-runs + +name: Old workflow runs cleanup + +on: + # Run monthly, at 00:00 on the 1st day of month. + schedule: + - cron: '0 0 1 * *' + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + inputs: + days: + description: 'Number of days.' + required: true + default: 30 + minimum_runs: + description: 'The minimum runs to keep for each workflow.' + required: true + default: 6 + delete_workflow_pattern: + description: + 'The name or filename of the workflow. if not set then it will target all + workflows.' + required: false + delete_workflow_by_state_pattern: + description: + 'Remove workflow by state: active, deleted, disabled_fork, + disabled_inactivity, disabled_manually' + required: true + default: 'All' + type: choice + options: + - 'All' + - active + - deleted + - disabled_inactivity + - disabled_manually + delete_run_by_conclusion_pattern: + description: + 'Remove workflow by conclusion: action_required, cancelled, failure, skipped, + success' + required: true + default: 'All' + type: choice + options: + - 'All' + - action_required + - cancelled + - failure + - skipped + - success + dry_run: + description: 'Only log actions, do not perform any delete operations (dry run).' + required: false + default: 'false' + type: choice + options: + - 'false' + - 'true' + +jobs: + del-runs: + runs-on: ubuntu-latest + + permissions: + actions: write + + steps: + - name: Delete workflow runs + uses: Mattraks/delete-workflow-runs@v2 + with: + token: ${{ github.token }} + repository: ${{ github.repository }} + retain_days: ${{ github.event.inputs.days }} + keep_minimum_runs: ${{ github.event.inputs.minimum_runs }} + delete_workflow_pattern: ${{ github.event.inputs.delete_workflow_pattern }} + delete_workflow_by_state_pattern: + ${{ github.event.inputs.delete_workflow_by_state_pattern }} + delete_run_by_conclusion_pattern: + ${{ github.event.inputs.delete_run_by_conclusion_pattern }} + dry_run: ${{ github.event.inputs.dry_run }} diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 00000000..cd9ff1e0 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,94 @@ +name: Coverage checks + +on: + # Trigger the workflow on push + push: + # Do not run on version tags (those are handled by other workflows) + tags-ignore: ['v*'] + # Trigger the workflow on pull request + pull_request: + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Need permissions to trigger the dashboard build workflow +permissions: + actions: write + contents: read + +# Allow only one concurrent workflow, skipping runs queued between the run +# in-progress and latest queued. And cancel in-progress runs. +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +# Set the environment variables to be used in all jobs defined in this workflow +env: + CI_BRANCH: ${{ github.head_ref || github.ref_name }} + +jobs: + # Job 1: Run docstring coverage + docstring-coverage: + runs-on: ubuntu-latest + + steps: + - name: Check-out repository + uses: actions/checkout@v5 + + - name: Set up pixi + uses: ./.github/actions/setup-pixi + + - name: Run docstring coverage + run: pixi run docstring-coverage + + # Job 2: Run unit tests with coverage and upload to Codecov + unit-tests-coverage: + runs-on: ubuntu-latest + + steps: + - name: Check-out repository + uses: actions/checkout@v5 + + - name: Set up pixi + uses: ./.github/actions/setup-pixi + + - name: Run unit tests with coverage + run: pixi run unit-tests-coverage --cov-report=xml:coverage-unit.xml + + - name: Upload unit tests coverage to Codecov + if: ${{ !cancelled() }} + uses: ./.github/actions/upload-codecov + with: + name: unit-tests-job + flags: unittests + files: ./coverage-unit.xml + token: ${{ secrets.CODECOV_TOKEN }} + + # Job 2: Run integration tests with coverage and upload to Codecov + integration-tests-coverage: + runs-on: ubuntu-latest + + steps: + - name: Check-out repository + uses: actions/checkout@v5 + + - name: Set up pixi + uses: ./.github/actions/setup-pixi + + - name: Run integration tests with coverage + run: + pixi run integration-tests-coverage --cov-report=xml:coverage-integration.xml + + - name: Upload integration tests coverage to Codecov + if: ${{ !cancelled() }} + uses: ./.github/actions/upload-codecov + with: + name: integration-tests-job + flags: integration + files: ./coverage-integration.xml + token: ${{ secrets.CODECOV_TOKEN }} + + # Job 4: Build and publish dashboard (reusable workflow) + run-reusable-workflows: + needs: [docstring-coverage, unit-tests-coverage, integration-tests-coverage] # depend on the previous jobs + uses: ./.github/workflows/dashboard.yml + secrets: inherit diff --git a/.github/workflows/dashboard.yml b/.github/workflows/dashboard.yml new file mode 100644 index 00000000..5159f71b --- /dev/null +++ b/.github/workflows/dashboard.yml @@ -0,0 +1,104 @@ +name: Dashboard build and publish + +on: + workflow_dispatch: + workflow_call: + +permissions: + contents: read + +# Set the environment variables to be used in all jobs defined in this workflow +env: + CI_BRANCH: ${{ github.head_ref || github.ref_name }} + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + DEVELOP_BRANCH: develop + REPO_OWNER: ${{ github.repository_owner }} + REPO_NAME: ${{ github.event.repository.name }} + +jobs: + dashboard: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + with: + fetch-depth: 0 + + - name: Set up pixi + uses: ./.github/actions/setup-pixi + + - name: Install badgery + shell: bash + run: pixi add --pypi --git https://github.com/enhantica/badgery badgery + + - name: Run docstring coverage and code complexity/maintainability checks + run: | + for BRANCH in $DEFAULT_BRANCH $DEVELOP_BRANCH $CI_BRANCH; do + echo + echo "🔹🔸🔹🔸🔹 Processing branch $BRANCH 🔹🔸🔹🔸🔹" + if [ -d "../$BRANCH" ]; then + echo "Branch $BRANCH already processed, skipping" + continue + fi + + git worktree add ../$BRANCH origin/$BRANCH + mkdir -p reports/$BRANCH + + echo "Docstring coverage for branch $BRANCH" + pixi run interrogate -c pyproject.toml --fail-under=0 ../$BRANCH/src > reports/$BRANCH/coverage-docstring.txt + + echo "Cyclomatic complexity for branch $BRANCH" + pixi run radon cc -s -j ../$BRANCH/src > reports/$BRANCH/cyclomatic-complexity.json + + echo "Maintainability index for branch $BRANCH" + pixi run radon mi -j ../$BRANCH/src > reports/$BRANCH/maintainability-index.json + + echo "Raw metrics for branch $BRANCH" + pixi run radon raw -s -j ../$BRANCH/src > reports/$BRANCH/raw-metrics.json + done + + - name: Generate dashboard HTML + run: > + pixi run python -m badgery --config .badgery.yaml --repo ${{ github.repository + }} --branch ${{ env.CI_BRANCH }} --output index.html + + - name: Prepare publish directory + run: | + mkdir -p _dashboard_publish/${{ env.REPO_NAME }}/${{ env.CI_BRANCH }} + cp index.html _dashboard_publish/${{ env.REPO_NAME }}/${{ env.CI_BRANCH }} + + # Create GitHub App token for pushing to external dashboard repo. + # The 'repositories' parameter is required to grant access to repos + # other than the one where the workflow is running. + - name: Setup easyscience[bot] + id: bot + uses: ./.github/actions/setup-easyscience-bot + with: + app-id: ${{ vars.EASYSCIENCE_APP_ID }} + private-key: ${{ secrets.EASYSCIENCE_APP_KEY }} + repositories: | + ${{ github.event.repository.name }} + dashboard + + # Publish to external dashboard repository with retry logic. + # Retry is needed to handle transient GitHub API/authentication issues + # that occasionally cause 403 errors when multiple workflows push concurrently. + # Uses personal_token (not github_token) as GITHUB_TOKEN cannot access external repos. + - name: Publish to main branch of ${{ github.repository }} + uses: Wandalen/wretry.action@v3.8.0 + with: + attempt_limit: 3 + attempt_delay: 15000 # 15 seconds between retries + action: peaceiris/actions-gh-pages@v4 + with: | + publish_dir: ./_dashboard_publish + keep_files: true + external_repository: ${{ env.REPO_OWNER }}/dashboard + publish_branch: master + personal_token: ${{ steps.bot.outputs.token }} + + - name: Add dashboard link to summary + run: | + URL="https://${{ env.REPO_OWNER }}.github.io/dashboard/${{ env.REPO_NAME }}/${{ env.CI_BRANCH }}" + echo "Dashboard link: [$URL]($URL)" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..c23c2c8c --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,184 @@ +# This workflow builds and deploys documentation for the project. +# +# Overview: +# - Converts tutorial Python scripts to Jupyter notebooks and executes them. +# - Builds the documentation site using MkDocs with the Material theme. +# - Uploads the built site as an artifact for local inspection. +# - Deploys versioned documentation to the gh-pages branch using Mike: +# - For release tags (v*): deploys to a versioned folder (e.g., /0.9.1/) and updates /latest/. +# - For branches: deploys to /dev/. +# +# The action summary page will contain a link to the built artifact for downloading +# and inspecting, as well as a link to the deployed documentation site. + +name: Docs build and deployment + +on: + # Trigger the workflow on push + push: + # Selected branches + branches: [develop] # master and main are already verified in PR + # Runs on creating a new tag starting with 'v', e.g. 'v1.0.3' + tags: ['v*'] + # Trigger the workflow on pull request + pull_request: + # Selected branches + branches: [master, main, develop] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Allow only one concurrent deployment to gh-pages at a time. +# All docs workflows share the same concurrency group to prevent race conditions +# when multiple branches/tags trigger simultaneous deployments. +concurrency: + group: docs-gh-pages-deploy + cancel-in-progress: false + +# Set the environment variables to be used in all jobs defined in this workflow +env: + # CI_BRANCH - the branch name (used in mkdocs.yml) + # For PRs: github.head_ref is the source branch + # For pushes: github.ref_name is the branch + # For tags: github.ref_name is the tag name + # GITHUB_REPOSITORY - the repository name (used in mkdocs.yml) + # NOTEBOOKS_DIR - the directory containing the Jupyter notebooks (used in mkdocs.yml) + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + DEVELOP_BRANCH: develop + CI_BRANCH: ${{ github.head_ref || github.ref_name }} + IS_RELEASE_TAG: ${{ startsWith(github.ref, 'refs/tags/v') }} + GITHUB_REPOSITORY: ${{ github.repository }} + NOTEBOOKS_DIR: tutorials + +jobs: + # Single job that builds and deploys documentation. + # Uses macOS runner for consistent Plotly chart rendering. + build-deploy-docs: + runs-on: ubuntu-latest # macos-latest + + permissions: + contents: write # Required for pushing to the gh-pages branch + + steps: + # Setting DOCS_VERSION to be used in mkdocs.yml, and then in the + # main.html template. It defines the versioned docs subfolder name + # in the gh-pages branch. If it's a release tag, use the version + # number without the 'v' prefix, otherwise use 'dev'. + # Setting RELEASE_VERSION to be used in mkdocs.yml to show + # the latest release version in the index.md file. If it's a + # release tag, use the tag name, otherwise use the branch name + # for development builds. + - name: Set extra env variables + shell: bash + run: | + if [[ "${IS_RELEASE_TAG}" == "true" ]]; then + RELEASE_VERSION="${GITHUB_REF_NAME}" + DOCS_VERSION="${RELEASE_VERSION#v}" + else + RELEASE_VERSION="${CI_BRANCH}" + DOCS_VERSION="dev" + fi + echo "RELEASE_VERSION=${RELEASE_VERSION}" >> "$GITHUB_ENV" + echo "DOCS_VERSION=${DOCS_VERSION}" >> "$GITHUB_ENV" + + # Check out the repository source code. + # Note: The gh-pages branch is fetched separately later for mike deployment. + - name: Checkout repository + uses: actions/checkout@v5 + + # Activate dark mode to create documentation with Plotly charts in dark mode + # Need a better solution to automatically switch the chart colour theme based on the mkdocs material switcher + # Something similar to mkdocs_plotly_plugin https://haoda-li.github.io/mkdocs-plotly-plugin/, + # but for generating documentation from notepads + #- name: Activate dark mode + # run: | + # brew install dark-mode + # dark-mode status + # dark-mode on + # dark-mode status + + # Set up the pixi package manager and install dependencies from pixi.toml. + # Uses frozen lockfile to ensure reproducible builds. + - name: Set up pixi + uses: ./.github/actions/setup-pixi + # Pre-import the main package to exclude info messages from the docs + # E.g., Matplotlib may print messages to stdout/stderr when first + # imported. This step allows to avoid "Matplotlib is building the font + # cache" messages during notebook execution. + - name: Pre-build site step + run: pixi run python -c "import easyscience" + + # Prepare the Jupyter notebooks for documentation (strip output, etc.). + - name: Prepare notebooks + run: pixi run notebook-prepare + + # Execute all Jupyter notebooks to generate output cells (plots, tables, etc.). + # Uses multiple cores for parallel execution to speed up the process. + - name: Run notebooks + # if: false # Temporarily disabled to speed up the docs build + run: pixi run notebook-exec + + # Build the static files for the documentation site for local inspection + # Input: docs/ directory containing the Markdown files + # Output: site/ directory containing the generated HTML files + - name: Build site for local check + run: pixi run docs-build-local + + # Upload the static files from the site/ directory to be used for + # local check + - name: Upload built site as artifact + uses: ./.github/actions/upload-artifact + with: + name: site-local_easyscience-lib-${{ env.RELEASE_VERSION }} + path: docs/site/ + + # Create GitHub App token for pushing to gh-pages as easyscience[bot]. + - name: Setup easyscience[bot] + id: bot + uses: ./.github/actions/setup-easyscience-bot + with: + app-id: ${{ vars.EASYSCIENCE_APP_ID }} + private-key: ${{ secrets.EASYSCIENCE_APP_KEY }} + + # Configure git identity and remote URL so mike pushes as easyscience[bot]. + - name: Configure git for pushing + run: | + set -euo pipefail + git config user.name "easyscience[bot]" + git config user.email "${{ vars.EASYSCIENCE_APP_ID }}+easyscience[bot]@users.noreply.github.com" + git remote set-url origin "https://x-access-token:${{ steps.bot.outputs.token }}@github.com/${{ github.repository }}.git" + + # Fetch the gh-pages branch to ensure mike has the latest remote state. + # This is required because the checkout step only fetches the source branch, + # not the gh-pages branch that mike needs to update. + - name: Fetch gh-pages branch + run: | + git fetch origin gh-pages:gh-pages 2>/dev/null || true + + # Deploy versioned documentation using mike (MkDocs plugin for versioning). + # - For release tags (v*): deploys to versioned folder (e.g., /0.9.1/) and aliases to /latest/. + # - For branches: deploys to /dev/. + # The "${RELEASE_VERSION#v}" syntax strips the 'v' prefix (v0.9.1 -> 0.9.1). + # Also sets 'latest' as the default version for the version selector. + - name: Rebuild and deploy docs with mike + run: | + # Exit on error (-e), undefined vars (-u), and pipeline failures (pipefail) + set -euo pipefail + + REPO_NAME="${{ github.event.repository.name }}" + BASE_URL="https://easyscience.github.io/${REPO_NAME}" + + # Deploy the release version and update the "latest" alias + if [[ "${IS_RELEASE_TAG}" == "true" ]]; then + pixi run docs-deploy-pre "${RELEASE_VERSION#v}" latest + pixi run docs-set-default-pre latest + DEPLOYMENT_URL="${BASE_URL}/latest" + + # Deploy/update the "dev" alias (or whatever your convention is) + else + pixi run docs-deploy-pre dev + DEPLOYMENT_URL="${BASE_URL}/dev" + + fi + + # Add links to the action summary page for easy access + echo "🔗 deployment url [${DEPLOYMENT_URL}](${DEPLOYMENT_URL})" >> "${GITHUB_STEP_SUMMARY}" diff --git a/.github/workflows/issues-labels.yml b/.github/workflows/issues-labels.yml new file mode 100644 index 00000000..3a60cdd7 --- /dev/null +++ b/.github/workflows/issues-labels.yml @@ -0,0 +1,42 @@ +# Verifies if an issue has at least one of the `[scope]` and one of the +# `[priority]` labels. If not, the bot adds labels with a warning emoji +# to indicate that those labels need to be added. + +name: Issue labels check + +on: + issues: + types: [opened, labeled, unlabeled] + +permissions: + issues: write + +jobs: + check-labels: + runs-on: ubuntu-latest + + steps: + - name: Setup easyscience[bot] + id: bot + uses: ./.github/actions/setup-easyscience-bot + with: + app-id: ${{ vars.EASYSCIENCE_APP_ID }} + private-key: ${{ secrets.EASYSCIENCE_APP_KEY }} + + - name: Check for required [scope] label + uses: trstringer/require-label-prefix@v1 + with: + secret: ${{ steps.bot.outputs.token }} + prefix: '[scope]' + labelSeparator: ' ' + addLabel: true + defaultLabel: '[scope] ⚠️ label needed' + + - name: Check for required [priority] label + uses: trstringer/require-label-prefix@v1 + with: + secret: ${{ steps.bot.outputs.token }} + prefix: '[priority]' + labelSeparator: ' ' + addLabel: true + defaultLabel: '[priority] ⚠️ label needed' diff --git a/.github/workflows/pr-labels.yml b/.github/workflows/pr-labels.yml new file mode 100644 index 00000000..642cd318 --- /dev/null +++ b/.github/workflows/pr-labels.yml @@ -0,0 +1,56 @@ +# Verifies if a pull request has at least one label from a set of valid +# labels before it can be merged. +# +# NOTE: +# This workflow may be triggered twice in quick succession when a PR is +# created: +# 1) `opened` — when the pull request is initially created +# 2) `labeled` — if labels are added immediately after creation +# (e.g. by manual labeling, another workflow, or GitHub App). +# +# These are separate GitHub events, so two workflow runs can be started. + +name: PR labels check + +on: + pull_request_target: + types: [opened, labeled, unlabeled, synchronize] + +permissions: + pull-requests: read + +jobs: + check-labels: + runs-on: ubuntu-latest + + steps: + - name: Check for valid labels + run: | + PR_LABELS=$(echo '${{ toJson(github.event.pull_request.labels.*.name) }}' | jq -r '.[]') + + echo "Current PR labels: $PR_LABELS" + VALID_LABELS=( + "[bot] release" + "[scope] bug" + "[scope] documentation" + "[scope] enhancement" + "[scope] maintenance" + "[scope] significant" + ) + + found=false + for label in "${VALID_LABELS[@]}"; do + if echo "$PR_LABELS" | grep -Fxq "$label"; then + echo "✅ Found valid label: $label" + found=true + break + fi + done + + if [ "$found" = false ]; then + echo "ERROR: PR must have at least one of the following labels:" + for label in "${VALID_LABELS[@]}"; do + echo " - $label" + done + exit 1 + fi diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/pypi-publish.yml new file mode 100644 index 00000000..95a3b394 --- /dev/null +++ b/.github/workflows/pypi-publish.yml @@ -0,0 +1,46 @@ +# Builds a Python package and publish it to PyPI when a new tag is +# created. + +name: PyPI publishing + +on: + # Runs on creating a new tag starting with 'v', e.g. 'v1.0.3' + push: + tags: ['v*'] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + pypi-publish: + runs-on: ubuntu-latest + + permissions: + contents: read + id-token: write # IMPORTANT: this permission is mandatory for trusted publishing + + steps: + - name: Check-out repository + uses: actions/checkout@v5 + with: + fetch-depth: 0 # full history with tags to get the version number by versioningit + + - name: Set up pixi + uses: ./.github/actions/setup-pixi + + # Build the Python package (to dist/ folder) + - name: Create Python package + run: pixi run default-build + + # Publish the package to PyPI (from dist/ folder) + # Instead of publishing with personal access token, we use + # GitHub Actions OIDC to get a short-lived token from PyPI. + # New publisher must be previously configured in PyPI at + # https://pypi.org/manage/project/easyscience/settings/publishing/ + # Use the following data: + # Owner: easyscience + # Repository name: core + # Workflow name: pypi-publish.yml + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + packages-dir: 'dist' diff --git a/.github/workflows/pypi-test.yml b/.github/workflows/pypi-test.yml new file mode 100644 index 00000000..6f4e582f --- /dev/null +++ b/.github/workflows/pypi-test.yml @@ -0,0 +1,80 @@ +name: PyPI package tests + +on: + # Run daily, at 00:00. + schedule: + - cron: '0 0 * * *' + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Allow only one concurrent workflow, skipping runs queued between the run +# in-progress and latest queued. And cancel in-progress runs. +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +# Set the environment variables to be used in all jobs defined in this workflow +env: + CI_BRANCH: ${{ github.head_ref || github.ref_name }} + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + +jobs: + # Job 1: Test installation from PyPI on multiple OS + pypi-package-tests: + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Set up pixi + uses: ./.github/actions/setup-pixi + with: + environments: '' + activate-environment: '' + run-install: false + frozen: false + + - name: Init pixi project + run: pixi init easyscience + + - name: Add Python 3.13 from Conda + working-directory: easyscience + run: pixi add "python=3.13" + + - name: Add other Conda dependencies + working-directory: easyscience + run: pixi add gsl + + - name: Add easyscience from PyPI + working-directory: easyscience + run: pixi add --pypi "easyscience" + + - name: Add dev dependencies from PyPI + working-directory: easyscience + run: pixi add --pypi pytest pytest-xdist + + - name: Add Pixi task as a shortcut + working-directory: easyscience + run: pixi task add easyscience "python -m easyscience" + + - name: Run unit tests to verify the installation + working-directory: easyscience + run: pixi run python -m pytest ../tests/unit/ --color=yes -v + + - name: Run integration tests to verify the installation + working-directory: easyscience + run: pixi run python -m pytest ../tests/integration/ --color=yes -n auto + + # Job 2: Build and publish dashboard (reusable workflow) + run-reusable-workflows: + needs: pypi-package-tests # depend on previous job + uses: ./.github/workflows/dashboard.yml + secrets: inherit diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml new file mode 100644 index 00000000..1fe7ecbd --- /dev/null +++ b/.github/workflows/quality.yml @@ -0,0 +1,121 @@ +# The workflow is divided into several steps to ensure code quality: +# - Check the validity of pyproject.toml +# - Check code linting +# - Check code formatting +# - Check formatting of docstrings in the code +# - Check formatting of Markdown, YAML, TOML, etc. files + +name: Code quality checks + +on: + # Trigger the workflow on push + push: + branches-ignore: [master, main] # Already verified in PR + # Do not run this workflow on creating a new tag starting with + # 'v', e.g. 'v1.0.3' (see publish-pypi.yml) + tags-ignore: ['v*'] + # Trigger the workflow on pull request + pull_request: + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Allow only one concurrent workflow, skipping runs queued between the run +# in-progress and latest queued. And cancel in-progress runs. +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +# Set the environment variables to be used in all jobs defined in this workflow +env: + CI_BRANCH: ${{ github.head_ref || github.ref_name }} + +jobs: + code-quality: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Set up pixi + uses: ./.github/actions/setup-pixi + + - name: Run post-install developer steps + run: pixi run post-install + + # Check the validity of pyproject.toml + - name: Check validity of pyproject.toml + id: check_pyproject + continue-on-error: true + shell: bash + run: pixi run pyproject-check + + # Check code linting with Ruff in the project root + - name: Check code linting + id: check_code_linting + continue-on-error: true + shell: bash + run: pixi run py-lint-check + + # Check code formatting with Ruff in the project root + - name: Check code formatting + id: check_code_formatting + continue-on-error: true + shell: bash + run: pixi run py-format-check + + # Check formatting of docstrings in the code with docformatter + - name: Check formatting of docstrings in the code + id: check_docs_formatting + continue-on-error: true + shell: bash + run: pixi run docs-format-check + + # Check formatting of MD, YAML, TOML, etc. files with Prettier in + # the project root + - name: Check formatting of MD, YAML, TOML, etc. files + id: check_others_formatting + continue-on-error: true + shell: bash + run: pixi run nonpy-format-check + # Check formatting of Jupyter Notebooks in the tutorials folder + - name: Prepare notebooks and check formatting + id: check_notebooks_formatting + continue-on-error: true + shell: bash + run: | + pixi run notebook-prepare + pixi run notebook-format-check + + # Add summary + - name: Add quality checks summary + if: always() + shell: bash + run: | + { + echo "## 🧪 Code Quality Checks Summary" + echo "" + echo "| Check | Status |" + echo "|-------|--------|" + echo "| pyproject.toml | ${{ steps.check_pyproject.outcome == 'success' && '✅' || '❌' }} |" + echo "| py lint | ${{ steps.check_code_linting.outcome == 'success' && '✅' || '❌' }} |" + echo "| py format | ${{ steps.check_code_formatting.outcome == 'success' && '✅' || '❌' }} |" + echo "| docstring format | ${{ steps.check_docs_formatting.outcome == 'success' && '✅' || '❌' }} |" + echo "| nonpy format | ${{ steps.check_others_formatting.outcome == 'success' && '✅' || '❌' }} |" + echo "| notebooks format | ${{ steps.check_notebooks_formatting.outcome == 'success' && '✅' || '❌' }} |" + } >> "$GITHUB_STEP_SUMMARY" + + # Fail job if any check failed + - name: Fail job if any check failed + if: | + steps.check_pyproject.outcome == 'failure' + || steps.check_code_linting.outcome == 'failure' + || steps.check_code_formatting.outcome == 'failure' + || steps.check_docs_formatting.outcome == 'failure' + || steps.check_others_formatting.outcome == 'failure' + || steps.check_notebooks_formatting.outcome == 'failure' + shell: bash + run: exit 1 diff --git a/.github/workflows/release-notes.yml b/.github/workflows/release-notes.yml new file mode 100644 index 00000000..4dd25dfa --- /dev/null +++ b/.github/workflows/release-notes.yml @@ -0,0 +1,71 @@ +# Drafts your next Release notes as pull requests are merged into +# default branch + +name: Release draft update + +on: + # Runs on pushes targeting the default branch (updates the real draft release) + push: + branches: [master, main] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + draft-release-notes: + permissions: + # write permission is required to create a github release + contents: write + + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + with: + fetch-depth: 0 # full history with tags to get the version number + + - name: Set up pixi + uses: ./.github/actions/setup-pixi + + - name: Setup easyscience[bot] + id: bot + uses: ./.github/actions/setup-easyscience-bot + with: + app-id: ${{ vars.EASYSCIENCE_APP_ID }} + private-key: ${{ secrets.EASYSCIENCE_APP_KEY }} + + - name: Drafts the next release notes + id: draft + uses: enhantica/drafterino@v2 + with: + config: | + title: 'easyscience $COMPUTED_VERSION' + tag: 'v$COMPUTED_VERSION' + note-template: '- $PR_TITLE (#$PR_NUMBER)' + + default-bump: post + + major-bump-labels: ['[scope] significant'] + minor-bump-labels: ['[scope] enhancement'] + patch-bump-labels: ['[scope] bug', '[scope] maintenance'] + post-bump-labels: ['[scope] documentation'] + + release-notes: + - title: 'Added' + labels: ['[scope] significant', '[scope] enhancement'] + - title: 'Fixed' + labels: ['[scope] bug'] + - title: 'Changed' + labels: ['[scope] maintenance', '[scope] documentation'] + env: + GITHUB_TOKEN: ${{ steps.bot.outputs.token }} + + - name: Create GitHub draft release + uses: softprops/action-gh-release@v2 + with: + draft: true + tag_name: ${{ steps.draft.outputs.tag_name }} + name: ${{ steps.draft.outputs.release_name }} + body: ${{ steps.draft.outputs.release_notes }} + env: + GITHUB_TOKEN: ${{ steps.bot.outputs.token }} diff --git a/.github/workflows/release-pr.yml b/.github/workflows/release-pr.yml new file mode 100644 index 00000000..7e6fda49 --- /dev/null +++ b/.github/workflows/release-pr.yml @@ -0,0 +1,55 @@ +# This workflow creates an automated release PR from a source branch into the default branch. +# +# Usage: +# - Triggered manually via workflow_dispatch. +# - Creates a PR titled "Release: merge into ". +# - Adds the label "[bot] release" so it is excluded from changelogs. +# - The PR body makes clear that this is automation only (no review needed). + +name: 'Release PR (develop → master)' + +on: + workflow_dispatch: + inputs: + source_branch: + description: 'Source branch to create PR from' + required: false + default: 'develop' + type: string + +permissions: + contents: read + pull-requests: write + +env: + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + SOURCE_BRANCH: ${{ inputs.source_branch || 'develop' }} + +jobs: + create-pull-request: + runs-on: ubuntu-latest + steps: + - name: Checkout ${{ env.SOURCE_BRANCH }} branch + uses: actions/checkout@v5 + with: + ref: ${{ env.SOURCE_BRANCH }} + + - name: Setup easyscience[bot] + id: bot + uses: ./.github/actions/setup-easyscience-bot + with: + app-id: ${{ vars.EASYSCIENCE_APP_ID }} + private-key: ${{ secrets.EASYSCIENCE_APP_KEY }} + + - name: Create PR from ${{ env.SOURCE_BRANCH }} to ${{ env.DEFAULT_BRANCH }} + env: + GH_TOKEN: ${{ steps.bot.outputs.token }} + run: | + gh pr create \ + --base ${{ env.DEFAULT_BRANCH }} \ + --head ${{ env.SOURCE_BRANCH }} \ + --title "Release: merge ${{ env.SOURCE_BRANCH }} into ${{ env.DEFAULT_BRANCH }}" \ + --label "[bot] release" \ + --body "This PR is created automatically to trigger the release pipeline. It merges the accumulated changes from \`${{ env.SOURCE_BRANCH }}\` into \`${{ env.DEFAULT_BRANCH }}\`. + + ⚠️ It is labeled \`[bot] release\` and is excluded from release notes and version bump logic." diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml new file mode 100644 index 00000000..9b34cccf --- /dev/null +++ b/.github/workflows/security.yml @@ -0,0 +1,93 @@ +# Code scanning (CodeQL) for vulnerabilities and insecure coding patterns. +# +# What this workflow does +# - Runs GitHub CodeQL analysis and uploads results to your repository's Security tab. +# - Triggers on PRs (so findings appear as PR checks) and on pushes to `develop`. +# - Runs on a weekly schedule. +# +# Where to find results on GitHub +# - Repository → Security → Code scanning alerts +# (You can filter by tool = CodeQL and by branch.) +# +# Where to configure on GitHub +# - Repository → Settings → Advanced Security +# Enable "GitHub Advanced Security" (if available) and configure CodeQL there. +# - Repository → Security → Code scanning alerts +# This page shows findings produced by this workflow. +# +# Notes about the scheduled run +# - Scheduled workflows are triggered from the repository's *default branch*. +# If your default branch is `master` but you want the scheduled scan to analyze +# `develop`, this workflow checks out `develop` explicitly for scheduled runs. +# +# References +# - CodeQL Action: https://github.com/github/codeql-action +# - Advanced setup docs: https://docs.github.com/en/code-security/code-scanning + +name: Security scans with CodeQL + +on: + # Run on pull requests so results show up as PR checks and code + # scanning alerts. + pull_request: + branches: [master, main, develop] + + # Run on pushes (e.g., after merging PRs). + push: + branches: [master, main, develop] + + # Run weekly. (Cron is in UTC.) + schedule: + - cron: '0 3 * * 1' + +permissions: + contents: read + security-events: write + +jobs: + codeql: + name: Code scanning + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + # Keep this list tight to avoid noise and speed up runs. + language: [python, actions] + + steps: + # Scheduled workflows run from the default branch. + # We explicitly analyze `develop` on the schedule to keep the scan + # focused on the active dev branch. + - name: Checkout repository (scheduled → develop) + if: ${{ github.event_name == 'schedule' }} + uses: actions/checkout@v5 + with: + ref: develop + + - name: Checkout repository + if: ${{ github.event_name != 'schedule' }} + uses: actions/checkout@v5 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v4 + with: + languages: ${{ matrix.language }} + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4 + + print-link: + name: Print results link + runs-on: ubuntu-latest + + needs: codeql + permissions: {} # no special perms needed just to print links + + steps: + - name: Add Code Scanning link to job summary + run: | + echo "## 🔎 CodeQL Results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "View Code Scanning alerts here:" >> $GITHUB_STEP_SUMMARY + echo "${{ github.server_url }}/${{ github.repository }}/security/code-scanning" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/test-trigger.yml b/.github/workflows/test-trigger.yml new file mode 100644 index 00000000..ecf6b40c --- /dev/null +++ b/.github/workflows/test-trigger.yml @@ -0,0 +1,40 @@ +name: Scheduled code tests trigger + +on: + # Run daily, at 00:00. + schedule: + - cron: '0 0 * * *' + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +permissions: + contents: read + +jobs: + code-tests-trigger: + runs-on: ubuntu-latest + + steps: + - name: Checkout develop branch + uses: actions/checkout@v5 + with: + ref: develop + + - name: Setup easyscience[bot] + id: bot + uses: ./.github/actions/setup-easyscience-bot + with: + app-id: ${{ vars.EASYSCIENCE_APP_ID }} + private-key: ${{ secrets.EASYSCIENCE_APP_KEY }} + + - name: Dispatch code tests workflow + uses: ./.github/actions/github-script + with: + github-token: ${{ steps.bot.outputs.token }} + script: | + await github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: "test.yml", + ref: "develop" + }); diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..05998190 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,271 @@ +# This is the main workflow for testing the code before and after +# packaging it. +# The workflow is divided into three jobs: +# 1. env-prepare: +# - Prepare the environment for testing +# 2. source-test: +# - Test the code base against the latest code in the repository +# - Create the Python package +# - Upload the Python package for the next job +# 3. package-test: +# - Download the Python package (including extra files) from the previous job +# - Install the downloaded Python package +# - Test the code base against the installed package +# 4. dashboard-build-trigger: +# - Trigger the dashboard build workflow to update the code quality +# metrics on the dashboard + +name: Code and package tests + +on: + # Trigger the workflow on push + push: + branches-ignore: [master, main] # Already verified in PR + # But do not run this workflow on creating a new tag starting with + # 'v', e.g. 'v1.0.3' (see publish-pypi.yml) + tags-ignore: ['v*'] + # Trigger the workflow on pull request + pull_request: + branches: ['**'] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Need permissions to trigger the dashboard build workflow +permissions: + actions: write + contents: read + +# Allow only one concurrent workflow, skipping runs queued between the run +# in-progress and latest queued. And cancel in-progress runs. +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +# Set the environment variables to be used in all jobs defined in this workflow +env: + CI_BRANCH: ${{ github.head_ref || github.ref_name }} + PY_VERSIONS: '3.11 3.13' + PIXI_ENVS: 'py-311-env py-313-env' + +jobs: + # Job 1: Set up environment variables + env-prepare: + runs-on: [ubuntu-latest] + + outputs: + pytest-marks: ${{ steps.set-mark.outputs.pytest_marks }} + + steps: + # Determine if integration tests should be run fully or only the fast ones + # (to save time on branches other than master and develop) + - name: Set mark for integration tests + id: set-mark + run: | + if [[ "${{ env.CI_BRANCH }}" == "master" || "${{ env.CI_BRANCH }}" == "develop" ]]; then + echo "pytest_marks=" >> $GITHUB_OUTPUT + else + echo "pytest_marks=-m fast" >> $GITHUB_OUTPUT + fi + + # Job 2: Test code + source-test: + needs: env-prepare # depend on previous job + + strategy: + fail-fast: false + matrix: + os: [ubuntu-24.04, macos-14, windows-2022] + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Set up pixi + uses: ./.github/actions/setup-pixi + with: + environments: ${{ env.PIXI_ENVS }} + + - name: Run unit tests + shell: bash + run: | + set -euo pipefail + + for py_ver in $PY_VERSIONS; do + echo + echo "🔹🔸🔹🔸🔹 Python: $py_ver 🔹🔸🔹🔸🔹" + + env="py-$(echo $py_ver | tr -d .)-env" # Converts 3.11 -> py-311-env + + echo "Running tests in environment: $env" + pixi run --environment $env unit-tests + done + + - name: Run integration tests ${{ needs.env-prepare.outputs.pytest-marks }} + shell: bash + run: | + set -euo pipefail + + for py_ver in $PY_VERSIONS; do + echo + echo "🔹🔸🔹🔸🔹 Python: $py_ver 🔹🔸🔹🔸🔹" + + env="py-$(echo $py_ver | tr -d .)-env" # Converts 3.11 -> py-311-env + + echo "Running tests in environment: $env" + pixi run --environment $env integration-tests ${{ needs.env-prepare.outputs.pytest-marks }} + done + + # Delete all local tags when not on a tagged commit to force versioningit + # to fall back to the configured default-tag, which is '999.0.0' in our case. + # This is needed for testing the package in the next job, as its version + # must be higher than the PyPI version for pip to prefer the local version. + - name: Force using versioningit default tag (non tagged release) + if: startsWith(github.ref , 'refs/tags/v') != true + run: git tag --delete $(git tag) + + - name: Build package wheels for all Python versions + shell: bash + run: | + set -euo pipefail + + for py_ver in $PY_VERSIONS; do + echo + echo "🔹🔸🔹🔸🔹 Python: $py_ver 🔹🔸🔹🔸🔹" + + env="py-$(echo $py_ver | tr -d .)-env" # Converts 3.11 -> py-311-env + + echo "Building wheel in environment: $env" + pixi run --environment $env dist-build + + echo "Moving built wheel to dist/py$py_ver/" + pixi run mkdir -p dist/py$py_ver + pixi run mv dist/*.whl dist/py$py_ver/ + done + + - name: Remove Python cache files before uploading + shell: bash + run: pixi run clean-pycache + + # More than one file/dir need to be specified in 'path', to preserve the + # structure of the dist/ directory, not only its contents. + - name: Upload package (incl. extras) for next job + uses: ./.github/actions/upload-artifact + with: + name: easyscience_${{ matrix.os }}_${{ runner.arch }} + path: dist/ + + # Job 3: Test the package + package-test: + needs: source-test # depend on previous job + + strategy: + fail-fast: false + matrix: + os: [ubuntu-24.04, macos-14, windows-2022] + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Download package (incl. extras) from previous job + uses: ./.github/actions/download-artifact + with: + # name and path should be taken from the upload step of the previous job + name: easyscience_${{ matrix.os }}_${{ runner.arch }} + path: dist/ + + - name: Set up pixi + uses: ./.github/actions/setup-pixi + with: + environments: '' + activate-environment: '' + run-install: false + frozen: false + + - name: Install easyscience from the built wheel + shell: bash + run: | + set -euo pipefail + + for py_ver in $PY_VERSIONS; do + echo + echo "🔹🔸🔹🔸🔹 Python: $py_ver 🔹🔸🔹🔸🔹" + + echo "Initializing pixi project" + pixi init easyscience_py$py_ver + cd easyscience_py$py_ver + + echo "Adding Python $py_ver" + pixi add "python=$py_ver" + + echo "Adding Conda dependencies" + pixi add gsl + + #echo "Adding PyPI dependencies" + #pixi add --pypi pytest pytest-xdist + + echo "Looking for wheel in ../dist/py$py_ver/" + ls -l "../dist/py$py_ver/" + + whl_path=(../dist/"py$py_ver"/*.whl) + if [[ ! -f "${whl_path[0]}" ]]; then + echo "❌ No wheel found in ../dist/py$py_ver/" + exit 1 + fi + + whl_url="file://$(python -c 'import os,sys; print(os.path.abspath(sys.argv[1]))' "${whl_path[0]}")" + + echo "Adding easyscience from: $whl_url" + pixi add --pypi "easyscience[dev] @ ${whl_url}" + + echo "Exiting pixi project directory" + cd .. + done + + - name: Run unit tests + shell: bash + run: | + set -euo pipefail + + for py_ver in $PY_VERSIONS; do + echo + echo "🔹🔸🔹🔸🔹 Python: $py_ver 🔹🔸🔹🔸🔹" + + echo "Entering pixi project directory easyscience_py$py_ver" + cd easyscience_py$py_ver + + echo "Running tests" + pixi run python -m pytest ../tests/unit/ --color=yes -v + + echo "Exiting pixi project directory" + cd .. + done + + - name: Run integration tests ${{ needs.env-prepare.outputs.pytest-marks }} + shell: bash + run: | + set -euo pipefail + + for py_ver in $PY_VERSIONS; do + echo + echo "🔹🔸🔹🔸🔹 Python: $py_ver 🔹🔸🔹🔸🔹" + + echo "Entering pixi project directory easyscience_py$py_ver" + cd easyscience_py$py_ver + + echo "Running tests" + pixi run python -m pytest ../tests/integration/ --color=yes -n auto -v ${{ needs.env-prepare.outputs.pytest-marks }} + + echo "Exiting pixi project directory" + cd .. + done + + # Job 4: Build and publish dashboard (reusable workflow) + run-reusable-workflows: + needs: package-test # depend on previous job + uses: ./.github/workflows/dashboard.yml + secrets: inherit diff --git a/.github/workflows/tutorial-tests-trigger.yml b/.github/workflows/tutorial-tests-trigger.yml new file mode 100644 index 00000000..1bc27f4f --- /dev/null +++ b/.github/workflows/tutorial-tests-trigger.yml @@ -0,0 +1,40 @@ +name: Scheduled tutorial tests trigger + +on: + # Run daily, at 00:00. + schedule: + - cron: '0 0 * * *' + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +permissions: + contents: read + +jobs: + tutorial-tests-trigger: + runs-on: ubuntu-latest + + steps: + - name: Checkout develop branch + uses: actions/checkout@v5 + with: + ref: develop + + - name: Setup easyscience[bot] + id: bot + uses: ./.github/actions/setup-easyscience-bot + with: + app-id: ${{ vars.EASYSCIENCE_APP_ID }} + private-key: ${{ secrets.EASYSCIENCE_APP_KEY }} + + - name: Dispatch tutorial tests workflow + uses: ./.github/actions/github-script + with: + github-token: ${{ steps.bot.outputs.token }} + script: | + await github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: "tutorial-tests.yml", + ref: "develop" + }); diff --git a/.github/workflows/tutorial-tests.yml b/.github/workflows/tutorial-tests.yml new file mode 100644 index 00000000..4c9244d0 --- /dev/null +++ b/.github/workflows/tutorial-tests.yml @@ -0,0 +1,64 @@ +name: Tutorial tests + +on: + # Trigger the workflow on push + push: + # Selected branches + branches: [develop] # master and main are already verified in PR + # Trigger the workflow on pull request + pull_request: + branches: ['**'] + # Trigger the workflow on workflow_call (to be called from other workflows) + # Needed, as standard schedule triggers the master branch only, but we want + # to run this workflow on develop branch. + workflow_call: + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +permissions: + contents: read + +# Allow only one concurrent workflow, skipping runs queued between the run +# in-progress and latest queued. And cancel in-progress runs. +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +# Set the environment variables to be used in all jobs defined in this workflow +env: + CI_BRANCH: ${{ github.head_ref || github.ref_name }} + +jobs: + # Job 1: Test tutorials as scripts and notebooks on multiple OS + tutorial-tests: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Set up pixi + uses: ./.github/actions/setup-pixi + + - name: Test tutorials as python scripts + shell: bash + run: pixi run script-tests + + - name: Prepare notebooks + shell: bash + run: pixi run notebook-prepare + + - name: Test tutorials as notebooks + shell: bash + run: pixi run notebook-tests + + # Job 2: Build and publish dashboard (reusable workflow) + run-reusable-workflows: + needs: tutorial-tests # depend on previous job + uses: ./.github/workflows/dashboard.yml + secrets: inherit diff --git a/.gitignore b/.gitignore index 5d0e0e91..f7ce4ac2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,22 @@ +# Python +__pycache__/ +.venv/ +.coverage + +# PyInstaller +dist/ +build/ +*.spec + +# MkDocs +docs/site/ + +# Jupyter Notebooks +.ipynb_checkpoints + +# Node +node_modules/ + # QtCreator *.autosave @@ -12,41 +31,13 @@ # QtCreator CMake CMakeLists.txt.user* -# Python -__pycache__ -.venv -.coverage -.pyc - -# Poetry -dist -poetry.lock -*.egg-info - -# Pixi -.pixi/ +# PyCharm +.idea/ -# PyInstaller -build -*.spec - -# Jupyter -.ipynb_checkpoints +# VS Code +.vscode/ # macOS .DS_Store *.app *.dmg - -# Docs -docs/_build - -# VSCode -.vscode - -# Misc -..* -*.log -*.zip -.ci/ -.idea/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 16fd4a4f..007d2389 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,23 +1,54 @@ repos: -- repo: https://github.com/psf/black - rev: 22.3.0 - hooks: - - id: black - exclude: ^dist/ + - repo: local + hooks: + # ------------- + # Manual checks + # ------------- + - id: pixi-pyproject-check + name: pixi run pyproject-check + entry: pixi run pyproject-check + language: system + pass_filenames: false + stages: [manual] -- repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.3.0 # Use the ref you want to point at - hooks: - - id: trailing-whitespace - - id: check-yaml - - id: check-xml - - id: check-toml - - id: pretty-format-json - - id: detect-private-key -- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks - rev: v2.5.0 - hooks: - - id: pretty-format-yaml - args: [--autofix, --indent, '2'] - #- id: pretty-format-toml - # args: [--autofix] + - id: pixi-py-lint-check + name: pixi run py-lint-check + entry: pixi run py-lint-check + language: system + pass_filenames: false + stages: [manual] + + - id: pixi-py-format-check + name: pixi run py-format-check + entry: pixi run py-format-check + language: system + pass_filenames: false + stages: [manual] + + - id: pixi-nonpy-format-check + name: pixi run nonpy-format-check + entry: pixi run nonpy-format-check + language: system + pass_filenames: false + stages: [manual] + + - id: pixi-docs-format-check + name: pixi run docs-format-check + entry: pixi run docs-format-check + language: system + pass_filenames: false + stages: [manual] + + - id: pixi-notebook-format-check + name: pixi run notebook-format-check + entry: pixi run notebook-format-check + language: system + pass_filenames: false + stages: [manual] + + - id: pixi-unit-tests + name: pixi run unit-tests + entry: pixi run unit-tests + language: system + pass_filenames: false + stages: [manual] diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..788ec8fa --- /dev/null +++ b/.prettierignore @@ -0,0 +1,17 @@ +# Copier +.copier-answers*.yml + +# Pixi +.pixi +pixi.lock + +# MkDocs +docs/overrides/ +docs/site/ +docs/docs/assets/ + +# Python +.pytest_cache/ + +# MyPy +.mypy_cache diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cb8357ab..be518599 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,134 +1,407 @@ -# Contributing +# Contributing to EasyScience -When contributing to the EasyScience repository, please first discuss the change you wish to make via issue, -email, or any other method with the owners of this repository before making a change. +Thank you for your interest in contributing to **EasyScience**! -Please note we have a code of conduct, please follow it in all your interactions with the project. +This guide explains how to: -## Development Setup +- Report issues +- Contribute code +- Improve documentation +- Suggest enhancements +- Interact with the EasyScience community -We use [pixi](https://pixi.sh) for dependency management and development workflow automation. This ensures consistent environments across different platforms and simplifies the development process. +Whether you are an experienced developer or contributing for the first +time, this document walks you through the entire process step by step. -### Prerequisites +Please make sure you follow the EasyScience organization-wide +[Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md). -1. Install pixi following the [official installation guide](https://pixi.sh/latest/#installation) +--- -### Getting Started +## Table of Contents + +- [How to Interact With This Project](#how-to-interact-with-this-project) +- [1. Understanding the Development Model](#1-understanding-the-development-model) +- [2. Getting the Code](#2-getting-the-code) +- [3. Setting Up the Development Environment](#3-setting-up-the-development-environment) +- [4. Creating a Branch](#4-creating-a-branch) +- [5. Implementing Your Changes](#5-implementing-your-changes) +- [6. Code Quality Checks](#6-code-quality-checks) +- [7. Opening a Pull Request](#7-opening-a-pull-request) +- [8. Continuous Integration (CI)](#8-continuous-integration-ci) +- [9. Code Review](#9-code-review) +- [10. Documentation Contributions](#10-documentation-contributions) +- [11. Reporting Issues](#11-reporting-issues) +- [12. Security Issues](#12-security-issues) +- [13. Releases](#13-releases) + +--- + +## How to Interact With This Project + +If you are not planning to modify the code, you may want to: + +- 🐞 Report a bug — see [Reporting Issues](#11-reporting-issues) +- 🛡 Report a security issue — + see [Security Issues](#12-security-issues) +- 💬 Ask a question or start a discussion at + [Project Discussions](https://github.com/easyscience/core/discussions) + +If you plan to contribute code or documentation, continue below. + +--- + +## 1. Understanding the Development Model + +Before you start coding, it is important to understand how development +works in this project. + +### Branching Strategy + +We use the following branches: + +- `master` — stable releases only +- `develop` — active development branch +- Short-lived branches — one branch per contribution + +All normal contributions must target the `develop` branch. + +This means: + +- Do **not** open Pull Requests against `master` +- Always create your branch from `develop` +- Always target `develop` when opening a Pull Request + +See ADR easyscience/.github#12 for full details on the branching +strategy. + +--- + +## 2. Getting the Code + +### 2.1. If You Are an External Contributor + +If you are not a core maintainer of this repository, follow these steps. + +1. Open the repository page: `https://github.com/easyscience/core` + +2. Click the **Fork** button (top-right corner). This creates your own + copy of the repository. + +3. Clone your fork locally: + + ```bash + git clone https://github.com//core.git + cd core + ``` + +4. Add the original repository as `upstream`: + + ```bash + git remote add upstream https://github.com/easyscience/core.git + ``` + +5. Switch to the `develop` branch and update it: + + ```bash + git fetch upstream + git checkout develop + git pull upstream develop + ``` + +If you have contributed before, make sure your local `develop` branch is +up to date before starting new work. You can update it with: -1. Fork and clone the repository: ```bash -git clone https://github.com/your-username/EasyScience.git -cd EasyScience +git fetch upstream +git pull upstream develop ``` -2. Set up the development environment: +This ensures you are working on the latest version of the project. + +### 2.2. If You Are a Core Team Member + +Core team members do not need to fork the repository. You can create a +new branch directly from `develop`, but the rest of the workflow remains +the same. + +--- + +## 3. Setting Up the Development Environment + +You need: + +- Git +- Pixi + +EasyScience projects use **Pixi** to manage the development environment. + +To install Pixi, follow the official instructions: +https://pixi.prefix.dev/latest/installation/ + +You do **not** need to manually install Python. Pixi automatically: + +- Creates the correct Python environment +- Installs all required dependencies +- Installs development tools (linters, formatters, test tools) + +Set up the environment: + ```bash pixi install +pixi run post-install +``` + +After this step, your development environment is ready. + +See ADR easyscience/.github#63 for more details about this decision. + +--- + +## 4. Creating a Branch + +Never work directly on `develop`. + +Create a new branch: + +```bash +git checkout -b my-change +``` + +Use a clear and descriptive name, for example: + +- `improve-solver-speed` +- `fix-boundary-condition` +- `add-tutorial-example` + +Clear branch names make reviews and history easier to understand. + +--- + +## 5. Implementing Your Changes + +While developing: + +- Make small, logical commits +- Write clear and descriptive commit messages +- Follow the Google docstring convention +- Add or update unit tests if behavior changes + +Example: + +```bash +git add . +git commit -m "Improve performance of time integrator for large systems" +``` + +Run tests locally: + +```bash +pixi run unit-tests +``` + +Running tests frequently is strongly recommended. + +--- + +## 6. Code Quality Checks + +Before opening a Pull Request, always run: + +```bash +pixi run check +``` + +This command runs: + +- Formatting checks +- Linting +- Docstring validation +- Notebook checks +- Unit tests +- Other project validations + +A successful run should look like this: + +```bash +pixi run pyproject-check...................................Passed +pixi run py-lint-check.....................................Passed +pixi run py-format-check...................................Passed +pixi run nonpy-format-check................................Passed +pixi run docs-format-check.................................Passed +pixi run notebook-format-check.............................Passed +pixi run unit-tests........................................Passed +``` + +If something fails, read the error message carefully and fix the issue. + +You can run individual checks, for example: + +```bash +pixi run py-lint-check +``` + +Some formatting issues can be fixed automatically: + +```bash +pixi run fix ``` -3. Run tests to verify everything is working: +If everything is correctly formatted, you will see: + +```text +✅ All code auto-formatting steps have been applied. +``` + +This indicates that the auto-formatting pipeline completed successfully. +If you do not see this message and no error messages appear, try running +the command again. + +If errors are reported, resolve them and re-run: + ```bash -pixi run test +pixi run check ``` -### Development Workflow +All checks must pass before your Pull Request can be merged. + +If you are unsure how to fix an issue, ask for help in your Pull Request +discussion. -- **Run tests**: `pixi run test` (full test suite with coverage) -- **Run unit tests only**: `pixi run test-unit` -- **Check code style**: `pixi run lint-check` -- **Fix code style**: `pixi run lint` -- **Check code formatting**: `pixi run format-check` -- **Format code**: `pixi run format` -- **Build package**: `pixi run build` -- **Build documentation**: `pixi run docs-build` +--- -### Before Submitting a Pull Request +## 7. Opening a Pull Request -1. Update the lock file to ensure dependencies are up to date: `pixi run update-lock` -2. Ensure all tests pass: `pixi run test` -3. Check code style: `pixi run lint-check` -4. Format your code: `pixi run format` -5. Update documentation if necessary -6. Add tests for new functionality +Push your branch: -## Pull Request Process +```bash +git push origin my-change +``` -1. Ensure any install or build dependencies are removed before the end of the layer when doing a - build. -2. Update the README.md with details of changes to the interface, this includes new environment - variables, exposed ports, useful file locations and container parameters. -3. Increase the version numbers in any examples files and the README.md to the new version that this - Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). -4. You may merge the Pull Request in once you have the sign-off of two other developers, or if you - do not have permission to do that, you may request the second reviewer to merge it for you. +On GitHub: -## Code of Conduct +- Click **Compare & Pull Request** +- Ensure the base branch is `develop` +- Write a clear and concise title +- Add a description explaining what changed and why +- Add the required `[scope]` label -### Our Pledge +### Pull Request Title -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level of experience, -nationality, personal appearance, race, religion, or sexual identity and -orientation. +The PR title appears in release notes and changelogs. It should be +concise and informative. + +Good examples: + +- Improve performance of time integrator for large systems +- Fix incorrect boundary condition handling in solver +- Add adaptive step-size control to ODE solver +- Add tutorial for custom model configuration +- Refactor solver API for improved readability + +### Required `[scope]` Label + +Each Pull Request must include one `[scope]` label: + +| Label | Description | +| ----------------------- | ----------------------------------------------------------------------- | +| `[scope] bug` | Bug report or fix (major.minor.**PATCH**) | +| `[scope] documentation` | Documentation-only changes (major.minor.patch.**POST**) | +| `[scope] enhancement` | Adds or improves features (major.**MINOR**.patch) | +| `[scope] maintenance` | Code/tooling cleanup without feature or bug fix (major.minor.**PATCH**) | +| `[scope] significant` | Breaking or major changes (**MAJOR**.minor.patch) | + +See ADR easyscience/.github#33 for full versioning rules. + +--- + +## 8. Continuous Integration (CI) + +After opening a Pull Request: + +- Automated checks run automatically +- You will see green checkmarks or red crosses + +If checks fail: + +1. Open the failing check +2. Read the logs +3. Fix the issue locally +4. Run `pixi run check` +5. Push your changes + +The Pull Request updates automatically. + +--- + +## 9. Code Review + +All Pull Requests are reviewed by at least one core team member. + +Code review is collaborative and aims to improve quality. + +Do not take comments personally — they are meant to help. + +To update your PR: + +```bash +git add . +git commit -m "Address review comments" +git push +``` + +--- + +## 10. Documentation Contributions + +If your change affects users, update the documentation. + +This may include: + +- API documentation +- Examples +- Tutorials +- Jupyter notebooks + +Preview documentation locally: + +```bash +pixi run docs-serve +``` -### Our Standards +Open the URL shown in the terminal to review your changes. -Examples of behavior that contributes to creating a positive environment -include: +--- -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community +## 11. Reporting Issues -Examples of unacceptable behavior by participants include: +If you find a bug but do not want to fix it: -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting +- Search existing issues first +- Provide clear reproduction steps +- Include logs and environment details -### Our Responsibilities +Clear issue reports help maintainers significantly. -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. +--- -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. +## 12. Security Issues -### Scope +Do **not** report security vulnerabilities publicly. -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. +If you discover a potential vulnerability, contact the maintainers +privately. -### Enforcement +--- -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at suport@easydiffraction.org. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. +## 13. Releases -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. +Releases are created by merging `develop` into `master`. -### Attribution +Once your contribution is merged into `develop`, it will be included in +the next stable release. -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at [http://contributor-covenant.org/version/1/4][version] +--- -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ +Thank you for contributing to EasyScience and the EasyScience +ecosystem! diff --git a/LICENSE b/LICENSE index f21bf746..c4e3e48e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,6 @@ BSD 3-Clause License -Copyright (c) 2025, Easyscience contributors (https://github.com/EasyScience) -All rights reserved. +Copyright (c) 2021-2026 EasyScience contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/README.md b/README.md index b41a80be..893e8fa1 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,43 @@ -[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) -[![PyPI badge](http://img.shields.io/pypi/v/EasyScience.svg)](https://pypi.python.org/pypi/EasyScience) -[![License: BSD 3-Clause](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](LICENSE) -[![codecov](https://codecov.io/github/EasyScience/corelib/graph/badge.svg?token=wc6Q0j0Q9t)](https://codecov.io/github/EasyScience/corelib) +

+ + + + + + + EasyScience + +

-# Easyscience +**EasyScience** is the foundation of the framework, providing reusable building blocks for scientific libraries and applications aimed at making data analysis easier. -## About + -EasyScience package is the foundation of the EasyScience family of projects, providing the building blocks for libraries and applications -which aim to make scientific data simulation and analysis easier. -## Install +**EasyScience** is developed as a Python library. -**EasyScience** can be downloaded using pip: -```pip install easyscience``` -Or direct from the repository: +## Useful Links -```pip install https://github.com/easyScience/EasyScience``` +### 📚 For Users -### Development +- 📖 [Documentation](https://easyscience.github.io/core/latest) +- 🚀 [Getting Started](https://easyscience.github.io/core/latest/introduction) +- 🧪 [Tutorials](https://easyscience.github.io/core/latest/tutorials) +- 💬 [Get in Touch](https://easyscience.github.io/core/latest/introduction/#get-in-touch) +- 🧾 [Citation](https://easyscience.github.io/core/latest/introduction/#citation) -For development setup and workflow instructions, please see [CONTRIBUTING.md](CONTRIBUTING.md). +### 🤝 For Contributors -## Test +- 🤝 [Contributing Guide](https://github.com/easyscience/core/blob/master/CONTRIBUTING.md) +- 🛡 [Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md) +- 🐞 [Issue Tracker](https://github.com/easyscience/core/issues) +- 💡 [Discussions](https://github.com/easyscience/core/discussions) +- 🧑‍💻 [Source Code](https://github.com/easyscience/core) -After installation, launch the test suite: +### ⚖️ Project Information -```python -m pytest``` - -## Documentation - -Documentation can be found at: - -[https://easyScience.github.io/corelib](https://easyScience.github.io/corelib) - -## Contributing -We absolutely welcome contributions. **EasyScience** is maintained by the ESS and on a volunteer basis and thus we need to foster a community that can support user questions and develop new features to make this software a useful tool for all users while encouraging every member of the community to share their ideas. - -## License -While **EasyScience** is under the BSD-3 license, DFO-LS is subject to the GPL license. +- ⚖️ [License](https://raw.githubusercontent.com/easyscience/core/refs/heads/master/LICENSE) diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000..f62b13ab --- /dev/null +++ b/codecov.yml @@ -0,0 +1,13 @@ +# Codecov configuration +# https://docs.codecov.com/docs/codecovyml-reference + +coverage: + status: + project: + default: + # Make project coverage informational (won't block PR) + informational: true + patch: + default: + # Require patch coverage but with threshold + threshold: 1% diff --git a/docs/docs/api-reference/index.md b/docs/docs/api-reference/index.md new file mode 100644 index 00000000..27b862ac --- /dev/null +++ b/docs/docs/api-reference/index.md @@ -0,0 +1,8 @@ +--- +icon: material/code-braces-box +--- + +# :material-code-braces-box: API Reference + +This section contains the reference detailing the functions and modules +available in EasyScience. diff --git a/docs/docs/assets/javascripts/extra.js b/docs/docs/assets/javascripts/extra.js new file mode 100644 index 00000000..dd3fc356 --- /dev/null +++ b/docs/docs/assets/javascripts/extra.js @@ -0,0 +1,29 @@ +(function() { + + "use strict" + + // Variables + const header = document.getElementsByTagName('header')[0] + + console.log(window.pageYOffset) + + // Hide-show header shadow + function toggleHeaderShadow() { + if (window.pageYOffset <= 0) { + header.classList.remove("md-header--shadow") + } else { + header.classList.add("md-header--shadow") + } + } + + // Onload + window.onload = function() { + toggleHeaderShadow() + } + + // Onscroll + window.onscroll = function() { + toggleHeaderShadow() + } + +})() diff --git a/docs/docs/assets/stylesheets/extra.css b/docs/docs/assets/stylesheets/extra.css new file mode 100644 index 00000000..a625be80 --- /dev/null +++ b/docs/docs/assets/stylesheets/extra.css @@ -0,0 +1,359 @@ +/*************/ +/* Variables */ +/*************/ + +:root { + --sz-link-color--lightmode: #0184c7; + --sz-hovered-link-color--lightmode: #37bdf9; + --sz-body-background-color--lightmode: #fafafa; + --sz-body-text-color--lightmode: #525252; + --sz-body-heading-color--lightmode: #434343; + --sz-code-background-color--lightmode: #ececec; + + --sz-link-color--darkmode: #37bdf9; + --sz-hovered-link-color--darkmode: #2890c0; + --sz-body-background-color--darkmode: #262626; + --sz-body-text-color--darkmode: #a3a3a3; + --sz-body-heading-color--darkmode: #e5e5e5; + --sz-code-background-color--darkmode: #212121; +} + +/****************/ +/* Color styles */ +/****************/ + +/* Default styles https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/stylesheets/main/_typeset.scss */ + +/* Light mode */ + +/* Default light mode https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/stylesheets/main/_colors.scss */ + +[data-md-color-scheme="default"] { + + /* Primary color shades */ + --md-primary-fg-color: var(--sz-body-background-color--lightmode); /* Navigation background */ + --md-primary-bg-color: var(--sz-body-text-color--lightmode); /* E.g., Header title and icons */ + --md-primary-bg-color--light: var(--sz-body-text-color--lightmode); /* E.g., Header search */ + + /* Accent color shades */ + --md-accent-fg-color: var(--sz-hovered-link-color--lightmode); /* E.g., Hovered `a` elements & copy icon in code */ + + /* Default color shades */ + --md-default-fg-color: var(--sz-body-text-color--lightmode); + --md-default-fg-color--light: var(--sz-body-heading-color--lightmode); /* E.g., `h1` color & TOC viewed items & `$` in code */ + --md-default-fg-color--lighter: var(--sz-body-text-color--lightmode); /* E.g., `¶` sign near `h1-h8` */ + --md-default-fg-color--lightest: var(--sz-body-text-color--lightmode); /* E.g., Copy icon in code */ + --md-default-bg-color: var(--sz-body-background-color--lightmode); + + /* Code color shades */ + --md-code-bg-color: var(--sz-code-background-color--lightmode); + + /* Typeset color shades */ + --md-typeset-color: var(--sz-body-text-color--lightmode); + + /* Typeset `a` color shades */ + --md-typeset-a-color: var(--sz-link-color--lightmode); + + /* Footer color shades */ + --md-footer-fg-color: var(--sz-body-text-color--lightmode); /* E.g., Next -> */ + --md-footer-fg-color--light: var(--sz-body-text-color--lightmode); /* E.g., © 2022 EasyDiffraction, Material for MkDocs */ + --md-footer-fg-color--lighter: var(--sz-body-text-color--lightmode); /* E.g. Made with */ + --md-footer-bg-color: hsla(0, 0%, 0%, 0.0); /* Space with, e.g., Next -> */ + --md-footer-bg-color--dark: hsla(0, 0%, 0%, 0.0); /* Space with, e.g., © 2022 EasyDiffraction */ + + /* Custom colors */ + --sz-red-color: #F44336; + --sz-blue-color: #03A9F4; + --sz-green-color: #4CAF50; + --sz-orange-color: #FF9800; + + /* Logo display */ + --md-footer-logo-dark-mode: none; + --md-footer-logo-light-mode: block; +} + +/* Dark mode */ + +/* Default dark mode: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/stylesheets/palette/_scheme.scss */ + +[data-md-color-scheme="slate"] { + + /* Primary color shades */ + --md-primary-fg-color: var(--sz-body-background-color--darkmode); /* Navigation background */ + --md-primary-bg-color: var(--sz-body-text-color--darkmode); /* E.g., Header title and icons */ + --md-primary-bg-color--light: var(--sz-body-text-color--darkmode); /* E.g., Header search */ + + /* Accent color shades */ + --md-accent-fg-color: var(--sz-hovered-link-color--darkmode); /* E.g., Hovered `a` elements & copy icon in code */ + + /* Default color shades */ + --md-default-fg-color: var(--sz-body-text-color--darkmode); + --md-default-fg-color--light: var(--sz-body-heading-color--darkmode); /* E.g., `h1` color & TOC viewed items & `$` in code */ + --md-default-fg-color--lighter: var(--sz-body-text-color--darkmode); /* E.g., `¶` sign near `h1-h8` */ + --md-default-fg-color--lightest: var(--sz-body-text-color--darkmode); /* E.g., Copy icon in code */ + --md-default-bg-color: var(--sz-body-background-color--darkmode); + + /* Code color shades */ + --md-code-bg-color: var(--sz-code-background-color--darkmode); + + /* Typeset color shades */ + --md-typeset-color: var(--sz-body-text-color--darkmode); + + /* Typeset `a` color shades */ + --md-typeset-a-color: var(--sz-link-color--darkmode); + + /* Footer color shades */ + --md-footer-fg-color: var(--sz-body-text-color--darkmode); /* E.g., Next -> */ + --md-footer-fg-color--light: var(--sz-body-text-color--darkmode); /* E.g., © 2022 EasyDiffraction, Material for MkDocs */ + --md-footer-fg-color--lighter: var(--sz-body-text-color--darkmode); /* E.g. Made with */ + --md-footer-bg-color: hsla(0, 0%, 0%, 0.0); /* Space with, e.g., Next -> */ + --md-footer-bg-color--dark: hsla(0, 0%, 0%, 0.0); /* Space with, e.g., © 2022 EasyDiffraction */ + + /* Custom colors */ + --sz-red-color: #EF9A9A; + --sz-blue-color: #81D4FA; + --sz-green-color: #A5D6A7; + --sz-orange-color: #FFCC80; + + /* Logo display */ + --md-footer-logo-dark-mode: block; + --md-footer-logo-light-mode: none; +} + +/*****************/ +/* Custom styles */ +/*****************/ + +/* Logo */ + +#logo_light_mode { + display: var(--md-footer-logo-light-mode); +} + +#logo_dark_mode { + display: var(--md-footer-logo-dark-mode); +} + +/* Customize default styles of MkDocs Material */ + +/* Hide navigation title */ +label.md-nav__title[for="__drawer"] { + height: 0; +} + +/* Hide site title (first topic) while keeping page title and version selector */ +.md-header__topic:first-child .md-ellipsis { + display: none; +} + +/* Increase logo size */ +.md-logo :is(img, svg) { + height: 1.8rem !important; +} + +/* Hide GH repo with counts (top right page corner) */ +.md-header__source { + display: none; +} + +/* Hide GH repo with counts (navigation bar in mobile view) */ +.md-nav__source { + display: none; +} + +/* Ensure all horizontal lines in the navigation list are removed or hidden */ +.md-nav__item { + /* Removes any border starting from the second level */ + border: none !important; + /* Modifies the background color to hide the first horizontal line */ + background-color: var(--md-default-bg-color); +} + +/* Increase TOC (on the right) width */ +.md-nav--secondary { + margin-left: -10px; + margin-right: -4px; +} + +/* */ +.md-nav__item > .md-nav__link { + padding-left: 0.5em; /* Default */ +} + +/* Change line height of the tabel cells */ +.md-typeset td, +.md-typeset th { + line-height: 1.25 !important; +} + +/* Change vertical alignment of the icon inside the tabel cells */ +.md-typeset td .twemoji { + vertical-align: sub !important; +} + +/* Change the width of the primary sidebar */ +/* +.md-sidebar--primary { + width: 240px; +} +*/ + +/* Change the overall width of the page */ +.md-grid { + max-width: 1280px; +} + +/* Needed for mkdocs-jupyter to show download and other buttons on top of the notebook */ +.md-content__button { + position: relative !important; +} + +/* Background color of the search input field */ +.md-search__input { + background-color: var(--md-code-bg-color) !important; +} + +/* Customize default style of mkdocs-jupyter plugin */ + +/* Set the width of the notebook to fill 100% and not reduce by the width of .md-content__button's +Adjust the margins and paddings to fit the defaults in MkDocs Material and do not crop the label in the header +*/ +.jupyter-wrapper { + width: 100% !important; + display: flex !important; +} + +.jp-Notebook { + padding: 0 !important; + margin-top: -3em !important; + + /* Ensure notebook content stretches across the page */ + width: 100% !important; + max-width: 100% !important; + + /* mkdocs-material + some notebook HTML end up as flex */ + align-items: stretch !important; +} + +.jp-Notebook .jp-Cell { + /* Key: flex children often need min-width: 0 to prevent weird shrink */ + width: 100% !important; + max-width: 100% !important; + min-width: 0 !important; + + /* Removes jupyter cell paddings */ + padding-left: 0 !important; +} + +/* Removes jupyter cell prefixes, like In[123]: */ +.prompt, +.jp-InputPrompt, +.jp-OutputPrompt { + display: none !important; +} + +/* Removes jupyter output cell padding to align with input cell text */ +.jp-RenderedText { + padding-left: 0.85em !important; +} + +/* Extra styling the panda dataframes, on top of the style included in the code */ +table.dataframe { + float: left; + margin-left: 0.75em !important; + margin-bottom: 0.5em !important; + font-size: var(--jp-code-font-size) !important; + color: var(--md-primary-bg-color) !important; + /* Allow table cell wrapping in MkDocs-Jupyter outputs */ + /* + table-layout: auto !important; + width: auto !important; + */ +} + +/* Allow wrap for the last column */ +/* +table.dataframe td:last-child, +table.dataframe th:last-child { + white-space: normal !important; + word-break: break-word !important; +} +*/ + +/* Custom styles for the CIF files */ + +.cif { + padding-left: 1em; + padding-right: 1em; + padding-top: 1px; + padding-bottom: 1px; + background-color: var(--md-code-bg-color); + font-size: small; +} +.red { + color: var(--sz-red-color); +} +.green { + color: var(--sz-green-color); +} +.blue { + color: var(--sz-blue-color); +} +.orange { + color: var(--sz-orange-color); +} +.grey { + color: grey; +} + +/**********/ +/* Labels */ +/**********/ + +.label-cif { + padding-top: 0.5ex; + padding-bottom: 0.5ex; + padding-left: 0.9ex; + padding-right: 0.9ex; + border-radius: 1ex; + color: var(--md-default-fg-color) !important; + background-color: var(--md-code-bg-color); +} + +p .label-cif, li .label-cif { + vertical-align: 5%; + font-size: 12px; +} + +.label-cif:hover { + color: white !important; +} + +.label-experiment { + padding-top: 0.25ex; + padding-bottom: 0.6ex; + padding-left: 0.9ex; + padding-right: 0.9ex; + border-radius: 1ex; + color: var(--md-default-fg-color) !important; + background-color: rgba(55, 189, 249, 0.1); +} + +p .label-experiment, li .label-experiment { + vertical-align: 5%; + font-size: 12px; +} + +h1 .label-experiment { + padding-top: 0.05ex; + padding-bottom: 0.4ex; + padding-left: 0.9ex; + padding-right: 0.9ex; + border-radius: 0.75ex; + color: var(--md-default-fg-color) !important; + background-color: rgba(55, 189, 249, 0.1); +} + +.label-experiment:hover { + color: white !important; +} diff --git a/docs/docs/index.md b/docs/docs/index.md new file mode 100644 index 00000000..08bb8b2a --- /dev/null +++ b/docs/docs/index.md @@ -0,0 +1,20 @@ +![](assets/images/logo_dark.svg#gh-dark-mode-only)![](assets/images/logo_light.svg#gh-light-mode-only) + +# Core building blocks for EasyScience + +Here is a brief overview of the main documentation sections: + +- [:material-information-slab-circle: Introduction](introduction/index.md) – + Provides a description of EasyScience, including its purpose, licensing, + latest release details, and contact information. +- [:material-cog-box: Installation & Setup](installation-and-setup/index.md) – + Guides users through system requirements, environment configuration, and the + installation process. +- [:material-book-open-variant: User Guide](user-guide/index.md) – Covers core + concepts, key terminology, workflow steps, and essential parameters for + effective use of EasyScience. +- [:material-school: Tutorials](tutorials/index.md) – Offers practical, + step-by-step examples demonstrating common workflows and data analysis tasks. +- [:material-code-braces-box: API Reference](api-reference/index.md) – An + auto-generated reference detailing the available functions and modules in + EasyScience. diff --git a/docs/docs/installation-and-setup/index.md b/docs/docs/installation-and-setup/index.md new file mode 100644 index 00000000..707540cd --- /dev/null +++ b/docs/docs/installation-and-setup/index.md @@ -0,0 +1,281 @@ +--- +icon: material/cog-box +--- + +# :material-cog-box: Installation & Setup + +**EasyScience** is a cross-platform Python library compatible with +**Python 3.11** through **3.13**. + +To install and set up EasyScience, we recommend using +[**Pixi**](https://pixi.prefix.dev), a modern package manager for Windows, +macOS, and Linux. + +??? note "Main benefits of using Pixi" + + - **Ease of use**: Pixi simplifies the installation process, making it + accessible even for users with limited experience in package management. + - **Python version control**: Pixi allows specifying and managing different + Python versions for each project, ensuring compatibility. + - **Isolated environments**: Pixi creates isolated environments for each + project, preventing conflicts between different package versions. + - **PyPI and Conda support**: Pixi can install packages from both PyPI and + Conda repositories, providing access to a wide range of libraries. + +An alternative installation method using the traditional **pip** package +manager is also provided. + +## Installing with Pixi recommended { #installing-with-pixi data-toc-label="Installing with Pixi" } + +This section describes the simplest way to set up EasyScience using +**Pixi**. + +#### Installing Pixi + +- Install Pixi by following the instructions on the + [official Pixi Installation Guide](https://pixi.prefix.dev/latest/installation). + +#### Setting up EasyScience with Pixi + + + +- Choose a project location (local drive recommended). + + ??? warning ":fontawesome-brands-windows: Windows + OneDrive" + + We **do not recommend creating a Pixi project inside OneDrive or other + synced folders**. + + By default, Pixi creates the virtual environment inside the project + directory (in `.pixi/`). On Windows, synced folders such as OneDrive + may cause file‑system issues (e.g., path-length limitations or + restricted link operations), which can lead to unexpected install + errors or environments being recreated. + + Instead, create your project in a **local directory on your drive** + where you have full write permissions. + + + +- Initialize a new Pixi project and navigate into it: + ```txt + pixi init easyscience + cd easyscience + ``` +- Set the Python version for the Pixi environment (e.g., 3.13): + ```txt + pixi add python=3.13 + ``` +- Add EasyScience to the Pixi environment from PyPI: + ```txt + pixi add --pypi easyscience + ``` +- Add a Pixi task to run EasyScience commands easily: + ```txt + pixi task add easyscience "python -m easyscience" + ``` + +#### Updating Pixi and EasyScience + +- To update all packages in the Pixi environment, including EasyScience: + ```txt + pixi update + ``` +- To update Pixi itself to the latest version: + ```txt + pixi self-update + ``` + +#### Uninstalling Pixi + +- Follow the + [official Pixi Guide](https://pixi.prefix.dev/latest/installation/#uninstall). + +## Classical Installation + +This section describes how to install EasyScience using the traditional +method with **pip**. It is assumed that you are familiar with Python package +management and virtual environments. + +### Environment Setup optional { #environment-setup data-toc-label="Environment Setup" } + +We recommend using a **virtual environment** to isolate dependencies and +avoid conflicts with system-wide packages. If any issues arise, you can +simply delete and recreate the environment. + +#### Creating and Activating a Virtual Environment: + + + +- Create a new virtual environment: + ```txt + python3 -m venv venv + ``` +- Activate the environment: + + === ":material-apple: macOS" + ```txt + . venv/bin/activate + ``` + === ":material-linux: Linux" + ```txt + . venv/bin/activate + ``` + === ":fontawesome-brands-windows: Windows" + ```txt + . venv/Scripts/activate # Windows with Unix-like shells + .\venv\Scripts\activate.bat # Windows with CMD + .\venv\Scripts\activate.ps1 # Windows with PowerShell + ``` + +- The terminal should now show `(venv)`, indicating that the virtual environment + is active. + + + +#### Deactivating and Removing the Virtual Environment: + + + +- Exit the environment: + ```txt + deactivate + ``` +- If this environment is no longer needed, delete it: + + === ":material-apple: macOS" + ```txt + rm -rf venv + ``` + === ":material-linux: Linux" + ```txt + rm -rf venv + ``` + === ":fontawesome-brands-windows: Windows" + ```txt + rmdir /s /q venv + ``` + + + +### Installing from PyPI { #from-pypi } + +EasyScience is available on **PyPI (Python Package Index)** and can be +installed using `pip`. To do so, use the following command: + +```txt +pip install easyscience +``` + +To install a specific version of EasyScience, e.g., 1.0.3: + +```txt +pip install 'easyscience==1.0.3' +``` + +To upgrade to the latest version: + +```txt +pip install --upgrade easyscience +``` + +To upgrade to the latest version and force reinstallation of all +dependencies (useful if files are corrupted): + +```txt +pip install --upgrade --force-reinstall easyscience +``` + +To check the installed version: + +```txt +pip show easyscience +``` + +### Installing from GitHub alternative { #from-github data-toc-label="Installing from GitHub" } + +Installing unreleased versions is generally not recommended but may be +useful for testing. + +To install EasyScience from the `develop` branch of GitHub, for example: + +```txt +pip install git+https://github.com/easyscience/core@develop +``` + +To include extra dependencies (e.g., dev): + +```txt +pip install 'easyscience[dev] @ git+https://github.com/easyscience/core@develop' +``` + +## How to Run Tutorials + +EasyScience includes a collection of **Jupyter Notebook examples** that +demonstrate key functionality. These tutorials serve as **step-by-step +guides** to help users understand the data analysis workflow. They are +available as **static HTML pages** in the +[:material-school: Tutorials](../tutorials/index.md) section. + +In the next sections, we explain how to set up Jupyter and run the +tutorials interactively in two different ways: locally or online via +Google Colab. + +If you decide to run the tutorials locally, you need to download them +first. This can be done individually via the :material-download: +**Download Notebook** button available on each tutorial page, or all at +once using the command line, as shown below. + +### Run Tutorials Locally with Pixi recommended { #running-with-pixi data-toc-label="Run Tutorials Locally with Pixi" } + +- Navigate to your existing Pixi project, created as described in the + [Installing with Pixi](#installing-with-pixi) section. +- Add JupyterLab and the Pixi kernel for Jupyter: + ```txt + pixi add --pypi jupyterlab pixi-kernel + ``` +- Download all the EasyScience tutorials to the `tutorials/` directory: + ```txt + pixi run easyscience download-all-tutorials + ``` +- Start JupyterLab in the `tutorials/` directory to access the + notebooks: + ```txt + pixi run jupyter lab tutorials/ + ``` +- Your web browser should open automatically. Click on one of the + `*.ipynb` files and select the `Python (Pixi)` kernel to get started. + +### Classical Run Tutorials Locally + +- Install Jupyter Notebook and IPython kernel: + ```txt + pip install notebook ipykernel + ``` +- Add the virtual environment as a Jupyter kernel: + ```txt + python -m ipykernel install --user --name=venv --display-name "EasyScience Python kernel" + ``` +- Download all the EasyScience tutorials to the `tutorials/` directory: + ```txt + python -m easyscience download-all-tutorials + ``` +- Launch the Jupyter Notebook server (opens browser automatically at + `http://localhost:8888/`): + ```txt + jupyter notebook tutorials/ + ``` +- Open one of the `*.ipynb` files and select the + `EasyScience Python kernel` to get started. + +### Run Tutorials via Google Colab + +**Google Colab** lets you run Jupyter Notebooks in the cloud without any +local installation. This is the fastest way to start experimenting with +EasyScience. + +- Ensure you have a **Google account**. +- Go to the **[:material-school: Tutorials](../tutorials/index.md)** + section. +- Click the :google-colab: **Open in Google Colab** button on any + tutorial. diff --git a/docs/docs/introduction/index.md b/docs/docs/introduction/index.md new file mode 100644 index 00000000..e753c063 --- /dev/null +++ b/docs/docs/introduction/index.md @@ -0,0 +1,68 @@ +--- +icon: material/information-slab-circle +--- + +# :material-information-slab-circle: Introduction + +## Description + +**EasyScience** is the foundation of the framework, providing reusable building blocks for scientific libraries and applications aimed at making data analysis easier. + + +**EasyScience** is developed as a Python library. + + + + + +## License + +**EasyScience** library is released under the +[BSD 3-Clause License](https://raw.githubusercontent.com/easyscience/core/master/LICENSE). + +## Releases + +The latest version of the **EasyScience** library is +[{{ vars.release_version }}](https://github.com/easyscience/core/releases/latest). + +For a complete list of new features, bug fixes, and improvements, see +the +[GitHub Releases page](https://github.com/easyscience/core/releases). + +## Citation + +If you use **EasyScience** library in your work, +please cite the specific version you used. + +All official releases of the **EasyScience** library are archived +on Zenodo, each with a version-specific Digital Object Identifier (DOI). + +Citation details in various styles (e.g., APA, MLA) and formats (e.g., +BibTeX, JSON) are available on the +[Zenodo archive page](https://doi.org/10.5281/zenodo.18163581). + +## Contributing + +We welcome contributions of any kind! + +**EasyScience** is intended to be a community-driven, open-source +project supported by a diverse group of contributors. + +The project is maintained by the +[European Spallation Source (ESS)](https://ess.eu). + +If you would like to report a bug or request a new feature, please use +the [GitHub Issue Tracker](https://github.com/easyscience/core/issues) +(A free GitHub account is required.) + +To contribute code, documentation, or tests, please see our +[:material-account-plus: Contributing Guidelines](https://github.com/easyscience/core/blob/master/CONTRIBUTING.md) +for detailed development instructions. + +## Get in Touch + +For general questions or feedback, please contact us at +[support@easyscience.org](mailto:support@easyscience.org). diff --git a/docs/docs/tutorials/index.md b/docs/docs/tutorials/index.md new file mode 100644 index 00000000..ce63aafe --- /dev/null +++ b/docs/docs/tutorials/index.md @@ -0,0 +1,21 @@ +--- +icon: material/school +--- + +# :material-school: Tutorials + +This section presents a collection of **Jupyter Notebook** tutorials +that demonstrate how to use EasyScience for various tasks. These +tutorials serve as self-contained, step-by-step **guides** to help users +grasp the workflow of data analysis using EasyScience. + +Instructions on how to run the tutorials are provided in the +[:material-cog-box: Installation & Setup](../installation-and-setup/index.md#how-to-run-tutorials) +section of the documentation. + +The tutorials are organized into the following categories: + +## Getting Started + +- [Dummy tutorial](tutorial.ipynb) – A dummy tutorial to ensure the + tutorial infrastructure is working correctly. diff --git a/docs/docs/tutorials/tutorial.py b/docs/docs/tutorials/tutorial.py new file mode 100644 index 00000000..94d8016a --- /dev/null +++ b/docs/docs/tutorials/tutorial.py @@ -0,0 +1,20 @@ +# %% [markdown] +# # Dummy Tutorial +# +# This is a dummy tutorial file to ensure that the tutorials section is +# not empty. You can replace this file with actual tutorial content as +# needed. + +# %% [markdown] +# ## Import Library + +# %% +import easyscience + +# %% [markdown] +# ## Step 1: Blah Blah Blah + +# %% +# This is a placeholder for tutorial content. +print('This is a dummy tutorial.') +print('Imported library:', easyscience) diff --git a/docs/docs/user-guide/index.md b/docs/docs/user-guide/index.md new file mode 100644 index 00000000..26e99be5 --- /dev/null +++ b/docs/docs/user-guide/index.md @@ -0,0 +1,24 @@ +--- +icon: material/book-open-variant +--- + +# :material-book-open-variant: User Guide + +This section provides an overview of the **core concepts**, +**key parameters** and **workflow steps** required for using EasyScience +effectively. + +Here is a brief overview of the User Guide sections: + +- [Glossary](#) – Defines common terms and labels used throughout the + documentation. +- [Concept](#) – Introduces the overall idea behind data analysis in + EasyScience. +- [Data Format](#) – Explains the data structures and file formats used + by EasyScience. +- [Parameters](#) – Describes how parameters are structured, named, and + accessed within the EasyScience. +- [First Steps](#) – Shows how to begin using EasyScience in Python + or Jupyter notebooks. +- [Analysis Workflow](#) – Breaks down the data analysis pipeline into + practical, sequential steps. diff --git a/docs/includes/abbreviations.md b/docs/includes/abbreviations.md new file mode 100644 index 00000000..682f16ff --- /dev/null +++ b/docs/includes/abbreviations.md @@ -0,0 +1,15 @@ + + +*[CIF]: Crystallographic Information File. +*[curl]: Command-line tool for transferring data with URLs. +*[GitHub]: A web-based platform for version control and collaboration. +*[Google Colab]: Cloud service that allows you to run Jupyter Notebooks in the cloud. +*[IUCr]: International Union of Crystallography. +*[Jupyter Notebook]: An open-source web application that allows you to create and share documents that contain live code, equations, visualizations, and narrative text. +*[JupyterLab]: Web-based interactive development environment for notebooks, code, and data. +*[pip]: Package installer for Python. +*[PyPI]: The Python Package Index is a repository of software for the Python programming language. +*[Conda]: Conda is a cross-platform, language-agnostic binary package manager. +*[Pixi]: A modern package manager for Windows, macOS, and Linux. + + diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml new file mode 100644 index 00000000..45e25538 --- /dev/null +++ b/docs/mkdocs.yml @@ -0,0 +1,174 @@ +# Project information +site_name: EasyScience Library +site_url: https://easyscience.github.io/core + +# Repository +repo_url: https://github.com/easyscience/core +edit_uri: edit/develop/docs/ + +# Copyright +copyright: © 2021-2026 EasyScience + +# Sets the theme and theme-specific configuration +theme: + name: material + custom_dir: overrides + features: + #- content.action.edit # Temporary disable edit button (until decided on which branch to use and where to host the notebooks) + #- content.action.view + - content.code.annotate + - content.code.copy # Auto generated button to copy a code block's content + - content.tooltips + - navigation.footer + - navigation.indexes + - navigation.instant # Instant loading (SPA-like) + #- navigation.sections + - navigation.top # Back-to-top button + - navigation.tracking # Anchor tracking + - search.highlight + - search.share + - search.suggest + - toc.follow + palette: + # Palette toggle for light mode + - media: '(prefers-color-scheme: light)' + scheme: default + primary: custom + toggle: + icon: fontawesome/solid/sun + name: Switch to dark mode + # Palette toggle for dark mode + - media: '(prefers-color-scheme: dark)' + scheme: slate + primary: custom + toggle: + icon: fontawesome/solid/moon + name: Switch to light mode + font: + text: Mulish + code: Roboto Mono + icon: + edit: material/file-edit-outline + favicon: assets/images/favicon.png + logo_dark_mode: assets/images/logo_dark.svg + logo_light_mode: assets/images/logo_light.svg + +# A set of key-value pairs, where the values can be any valid YAML +# construct, that will be passed to the template +extra: + generator: false # Disable `Made with Material for MkDocs` (bottom left) + social: # Extra icons in the bottom right corner + - icon: easyscience # File: overrides/.icons/easyscience.svg + link: https://easyscience.org + name: EasyScience Framework Webpage + - icon: easyscience # File: overrides/.icons/easyscience.svg + link: https://easyscience.github.io/core + name: EasyScience Main Webpage + - icon: fontawesome/brands/github # Name as in Font Awesome + link: https://github.com/easyscience/core + name: EasyScience Library Source Code on GitHub + # Set custom variables to be used in Markdown and HTML files + vars: + ci_branch: !ENV CI_BRANCH + github_repository: !ENV GITHUB_REPOSITORY + release_version: !ENV RELEASE_VERSION + docs_version: !ENV DOCS_VERSION + notebooks_dir: !ENV NOTEBOOKS_DIR + # Renders a version selector in the header + version: + provider: mike + +# Customization to be included by the theme +extra_css: + - assets/stylesheets/extra.css +extra_javascript: + - assets/javascripts/extra.js + +# A list of extensions beyond the ones that MkDocs uses by default (meta, toc, tables, and fenced_code) +markdown_extensions: + - abbr + - admonition + - attr_list + - def_list + - footnotes + - pymdownx.blocks.caption + - pymdownx.details + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + options: + custom_icons: + - docs/overrides/.icons + - pymdownx.highlight: # whether highlighting should be carried out during build time by Pygments + use_pygments: true + pygments_lang_class: true + - pymdownx.snippets: + auto_append: + - docs/includes/abbreviations.md + - pymdownx.superfences: # whether highlighting should be carried out during build time by Pygments + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + - pymdownx.tabbed: # enables content tabs + alternate_style: true + - pymdownx.tasklist: + custom_checkbox: true + - toc: + toc_depth: 3 + +# A list of plugins (with optional configuration settings) to use when building the site +plugins: + - autorefs + - inline-svg + - markdownextradata # Plugin that injects the mkdocs.yml extra variables into the Markdown template + - mike # Plugin that makes it easy to deploy multiple versions of the docs + - mkdocs-jupyter: + include: ['*.ipynb'] # Default: ['*.py', '*.ipynb'] + execute: false # Do not execute notebooks during build. They are expected to be pre-executed. + allow_errors: false + include_source: true + include_requirejs: true # Required for Plotly + custom_mathjax_url: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS_CHTML-full,Safe' + ignore_h1_titles: true # Use titles defined in the nav section below + remove_tag_config: + remove_input_tags: + - hide-in-docs + - mkdocstrings: + handlers: + python: + paths: ['src'] # Change 'src' to your actual sources directory + options: + docstring_style: google + group_by_category: false + heading_level: 1 + show_root_heading: true + show_root_full_path: false + show_submodules: true + show_source: true + - search + +# Determines additional directories to watch when running mkdocs serve +watch: + - includes + - overrides + - ../src + +# Exclude files and folders from the global navigation +not_in_nav: | + index.md + +# Format and layout of the global navigation for the site +nav: + - Introduction: + - Introduction: introduction/index.md + - Installation & Setup: + - Installation & Setup: installation-and-setup/index.md + - User Guide: + - User Guide: user-guide/index.md + - Tutorials: + - Tutorials: tutorials/index.md + - Getting Started: + - Dummy tutorial: tutorials/tutorial.ipynb + - API Reference: + - API Reference: api-reference/index.md diff --git a/docs/overrides/.icons/app.svg b/docs/overrides/.icons/app.svg new file mode 100644 index 00000000..b4fdd4f3 --- /dev/null +++ b/docs/overrides/.icons/app.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/docs/overrides/.icons/google-colab.svg b/docs/overrides/.icons/google-colab.svg new file mode 100644 index 00000000..9cd9d1b0 --- /dev/null +++ b/docs/overrides/.icons/google-colab.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/overrides/main.html b/docs/overrides/main.html new file mode 100644 index 00000000..2e146827 --- /dev/null +++ b/docs/overrides/main.html @@ -0,0 +1,39 @@ +{% extends "base.html" %} + +{% block content %} + +{% if page.nb_url %} + {# Parse notebook path/URL #} + {% set parts = page.nb_url.split('/') %} + {% set tutorial_name = parts[-2] %} + {% set filename = parts[-1] %} + + {# Colab url #} + {% set base_colab_url = "https://colab.research.google.com/github/" %} + {% set colab_url = + base_colab_url ~ config.extra.vars.github_repository ~ + "/blob/gh-pages/" ~ config.extra.vars.docs_version ~ + "/tutorials/" ~ tutorial_name ~ "/" ~ filename + %} + + {# Download link: relative to the current page #} + {% set file_url = filename %} + + {# Open in Colab (absolute GitHub URL; works anywhere) #} + + {% include ".icons/google-colab.svg" %} + + + {# Download: use a RELATIVE link to the file next to this page #} + + {% include ".icons/material/download.svg" %} + +{% endif %} + +{{ super() }} +{% endblock content %} diff --git a/docs/overrides/partials/logo.html b/docs/overrides/partials/logo.html new file mode 100644 index 00000000..78fa69ca --- /dev/null +++ b/docs/overrides/partials/logo.html @@ -0,0 +1,15 @@ +{% if ( config.theme.logo_light_mode and config.theme.logo_dark_mode ) %} +logo +logo +{% elif config.theme.logo %} +logo +{% else %} {% set icon = config.theme.icon.logo or "material/library" %} {% +include ".icons/" ~ icon ~ ".svg" %} {% endif %} diff --git a/pixi.lock b/pixi.lock index 00863b1e..729c76c2 100644 --- a/pixi.lock +++ b/pixi.lock @@ -5,13 +5,30 @@ environments: - url: https://conda.anaconda.org/conda-forge/ indexes: - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py313h843e2db_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py313heb322e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-bootstrap_ha15bf96_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda @@ -20,18 +37,42 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py313h5008379_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -53,19 +94,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl @@ -81,7 +118,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl @@ -89,21 +125,60 @@ environments: - pypi: https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bcrypt-5.0.0-py313hcc225dc_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py313hf57695f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cryptography-46.0.5-py313h6e3882f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.21-hc6ced15_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.0-h86bffb9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.3-py313h0f4d31d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pynacl-1.6.2-py313hf61a874_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.3-py313h7c6a591_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -125,19 +200,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl @@ -153,7 +224,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl @@ -161,22 +231,61 @@ environments: - pypi: https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: ./ osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bcrypt-5.0.0-py313h2c089d5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-46.0.5-py313he3f6fad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py313h6940bce_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h65a2061_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -198,19 +307,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl @@ -226,7 +331,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl @@ -234,23 +338,63 @@ environments: - pypi: https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: ./ win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bcrypt-5.0.0-py313hfbe8231_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-46.0.5-py313hf5c5e30_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py313hd650c13_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pynacl-1.6.2-py313hed4ef92_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py313h40c08fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh07e9846_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -261,7 +405,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl @@ -273,19 +416,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl @@ -301,7 +440,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl @@ -313,13 +451,30 @@ environments: - url: https://conda.anaconda.org/conda-forge/ indexes: - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py313h843e2db_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py313heb322e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-bootstrap_ha15bf96_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda @@ -328,18 +483,42 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py313h5008379_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl @@ -362,12 +541,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/46/eb6eca305c77a4489affe1c5d8f4cae82f285d9addd8de4ec084a7184221/cachetools-6.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/76/b6/67d7c0e1f400b32c883e9342de4a8c2ae7c1a0b57c5de87622b7262e2309/coverage-7.12.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl @@ -401,7 +578,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl @@ -418,7 +594,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl @@ -434,27 +609,21 @@ environments: - pypi: https://files.pythonhosted.org/packages/42/0f/c76bf3dba22c73c38e9b1113b017cf163f7696f50e003404ec5ecdb1e8a6/nh3-0.3.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ce/b1/5f49af514f76431ba4eea935b8ad3725cdeb397e9245ab919dbc1d1dc20f/psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl @@ -465,7 +634,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl @@ -483,7 +651,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl @@ -507,13 +674,11 @@ environments: - pypi: https://files.pythonhosted.org/packages/fd/9e/8d50f3b3fc4af8c73154f64d4a2293bfa2d517a19000e70ef2d614254084/tox_gh_actions-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl @@ -521,21 +686,60 @@ environments: - pypi: https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bcrypt-5.0.0-py313hcc225dc_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py313hf57695f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cryptography-46.0.5-py313h6e3882f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.21-hc6ced15_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.0-h86bffb9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.3-py313h0f4d31d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pynacl-1.6.2-py313hf61a874_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.3-py313h7c6a591_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl @@ -559,12 +763,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/46/eb6eca305c77a4489affe1c5d8f4cae82f285d9addd8de4ec084a7184221/cachetools-6.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b8/14/771700b4048774e48d2c54ed0c674273702713c9ee7acdfede40c2666747/coverage-7.12.0-cp313-cp313-macosx_10_13_x86_64.whl @@ -598,7 +800,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl @@ -615,7 +816,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl @@ -631,27 +831,21 @@ environments: - pypi: https://files.pythonhosted.org/packages/b6/3e/f5a5cc2885c24be13e9b937441bd16a012ac34a657fe05e58927e8af8b7a/nh3-0.3.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/94/46b9154a800253e7ecff5aaacdf8ebf43db99de4a2dfa18575b02548654e/psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl @@ -662,7 +856,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl @@ -680,7 +873,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl @@ -704,13 +896,11 @@ environments: - pypi: https://files.pythonhosted.org/packages/fd/9e/8d50f3b3fc4af8c73154f64d4a2293bfa2d517a19000e70ef2d614254084/tox_gh_actions-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl @@ -718,22 +908,61 @@ environments: - pypi: https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: ./ osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bcrypt-5.0.0-py313h2c089d5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-46.0.5-py313he3f6fad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py313h6940bce_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h65a2061_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl @@ -757,12 +986,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/46/eb6eca305c77a4489affe1c5d8f4cae82f285d9addd8de4ec084a7184221/cachetools-6.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/17/a7/3aa4144d3bcb719bf67b22d2d51c2d577bf801498c13cb08f64173e80497/coverage-7.12.0-cp313-cp313-macosx_11_0_arm64.whl @@ -796,7 +1023,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl @@ -813,7 +1039,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl @@ -829,27 +1054,21 @@ environments: - pypi: https://files.pythonhosted.org/packages/b6/3e/f5a5cc2885c24be13e9b937441bd16a012ac34a657fe05e58927e8af8b7a/nh3-0.3.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/68/3a/9f93cff5c025029a36d9a92fef47220ab4692ee7f2be0fba9f92813d0cb8/psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl @@ -860,7 +1079,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl @@ -878,7 +1096,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl @@ -902,13 +1119,11 @@ environments: - pypi: https://files.pythonhosted.org/packages/fd/9e/8d50f3b3fc4af8c73154f64d4a2293bfa2d517a19000e70ef2d614254084/tox_gh_actions-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl @@ -916,23 +1131,63 @@ environments: - pypi: https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: ./ win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bcrypt-5.0.0-py313hfbe8231_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-46.0.5-py313hf5c5e30_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py313hd650c13_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pynacl-1.6.2-py313hed4ef92_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py313h40c08fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh07e9846_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl @@ -955,12 +1210,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/46/eb6eca305c77a4489affe1c5d8f4cae82f285d9addd8de4ec084a7184221/cachetools-6.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/91/77/dd4aff9af16ff776bf355a24d87eeb48fc6acde54c907cc1ea89b14a8804/coverage-7.12.0-cp313-cp313-win_amd64.whl @@ -994,7 +1247,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl @@ -1011,7 +1263,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl @@ -1027,25 +1278,19 @@ environments: - pypi: https://files.pythonhosted.org/packages/64/9a/1a1c154f10a575d20dd634e5697805e589bbdb7673a0ad00e8da90044ba7/nh3-0.3.2-cp38-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/55/4c/c3ed1a622b6ae2fd3c945a366e64eb35247a31e4db16cf5095e269e8eb3c/psutil-7.1.3-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl @@ -1057,7 +1302,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/19/b757fe28008236a4a713e813283721b8a40aa60cd7d3f83549f2e25a3155/pywinpty-3.0.2-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl @@ -1075,7 +1319,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl @@ -1099,13 +1342,11 @@ environments: - pypi: https://files.pythonhosted.org/packages/fd/9e/8d50f3b3fc4af8c73154f64d4a2293bfa2d517a19000e70ef2d614254084/tox_gh_actions-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl @@ -1239,6 +1480,18 @@ packages: version: 1.0.0 sha256: fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 + md5: 2934f256a8acfe48f6ebb4fce6cde29c + depends: + - python >=3.9 + - typing-extensions >=4.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/annotated-types?source=hash-mapping + size: 18074 + timestamp: 1733247158254 - pypi: https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl name: anyio version: 4.11.0 @@ -1366,6 +1619,71 @@ packages: - pytz ; extra == 'dev' - setuptools ; extra == 'dev' requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py313h843e2db_1.conda + sha256: cdf7496797af275f8bb5edd270aa06303dde623c7dd3a5941b0ce085d8f4cdc5 + md5: b59ec3796cba93d0db5f71e361176f27 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.13.* *_cp313 + constrains: + - __glibc >=2.17 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/bcrypt?source=hash-mapping + size: 292710 + timestamp: 1762497710166 +- conda: https://conda.anaconda.org/conda-forge/osx-64/bcrypt-5.0.0-py313hcc225dc_1.conda + sha256: b92b8fcad1fd3a74e42777c7f03e6c4dc931aae93c9f981295928bc45484f7bf + md5: 4adea8a12c7fd3e512e9e47436f84c94 + depends: + - python + - __osx >=10.13 + - python_abi 3.13.* *_cp313 + constrains: + - __osx >=10.13 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/bcrypt?source=hash-mapping + size: 278409 + timestamp: 1762497780574 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bcrypt-5.0.0-py313h2c089d5_1.conda + sha256: c8e3b95ad2665dc16ac37888fb91dd481fa759bad1fbf799451d12d6bfaec600 + md5: 4b14cba28eaf98170c2ddd7e900efa07 + depends: + - python + - __osx >=11.0 + - python 3.13.* *_cp313 + - python_abi 3.13.* *_cp313 + constrains: + - __osx >=11.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/bcrypt?source=hash-mapping + size: 267465 + timestamp: 1762497730829 +- conda: https://conda.anaconda.org/conda-forge/win-64/bcrypt-5.0.0-py313hfbe8231_1.conda + sha256: 21baf1316a8160fd3b83e7128803735b107f47c58ba5d5305a372fd6c679d42b + md5: 2a664b5cc93fbc9d7ca595b206a299f0 + 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: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/bcrypt?source=hash-mapping + size: 170702 + timestamp: 1762497739995 - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl name: beautifulsoup4 version: 4.14.2 @@ -1511,34 +1829,69 @@ packages: version: 2025.11.12 sha256: 97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl - name: cffi - version: 2.0.0 - sha256: 19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75 - requires_dist: - - pycparser ; implementation_name != 'PyPy' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl - name: cffi - version: 2.0.0 - sha256: 45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca - requires_dist: - - pycparser ; implementation_name != 'PyPy' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl - name: cffi - version: 2.0.0 - sha256: 00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb - requires_dist: - - pycparser ; implementation_name != 'PyPy' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: cffi - version: 2.0.0 - sha256: c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 - requires_dist: - - pycparser ; implementation_name != 'PyPy' - requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda + sha256: 2162a91819945c826c6ef5efe379e88b1df0fe9a387eeba23ddcf7ebeacd5bd6 + md5: d0616e7935acab407d1543b28c446f6f + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - pycparser + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 298357 + timestamp: 1761202966461 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py313hf57695f_1.conda + sha256: 16c8c80bebe1c3d671382a64beaa16996e632f5b75963379e2b084eb6bc02053 + md5: b10f64f2e725afc9bf2d9b30eff6d0ea + depends: + - __osx >=10.13 + - libffi >=3.5.2,<3.6.0a0 + - pycparser + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 290946 + timestamp: 1761203173891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda + sha256: 1fa69651f5e81c25d48ac42064db825ed1a3e53039629db69f86b952f5ce603c + md5: 050374657d1c7a4f2ea443c0d0cbd9a0 + depends: + - __osx >=11.0 + - libffi >=3.5.2,<3.6.0a0 + - pycparser + - 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/cffi?source=hash-mapping + size: 291376 + timestamp: 1761203583358 +- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda + sha256: f867a11f42bb64a09b232e3decf10f8a8fe5194d7e3a216c6bac9f40483bd1c6 + md5: 55b44664f66a2caf584d72196aa98af9 + depends: + - pycparser + - 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/cffi?source=hash-mapping + size: 292681 + timestamp: 1761203203673 - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl name: chardet version: 5.2.0 @@ -1572,11 +1925,17 @@ packages: - requests>=2.7.9 - coverage requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' -- pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - name: colorama - version: 0.4.6 - sha256: 4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*' +- 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 - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl name: comm version: 0.2.3 @@ -1684,6 +2043,34 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' +- conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda + sha256: b4be1fad1496decdb83fa80a8cd7508184f680c98b53ec454c382fa6f8d72d20 + md5: d93fcbc0d424e3a07688f1e2bfedc360 + depends: + - python >=3.10 + - colorama >=0.4.6 + - dunamai >=1.7.0 + - funcy >=1.17 + - jinja2 >=3.1.5 + - jinja2-ansible-filters >=1.3.1 + - packaging >=23.0 + - pathspec >=0.9.0 + - plumbum >=1.6.9 + - prompt-toolkit <3.0.52 + - pydantic >=2.4.2 + - pygments >=2.7.1 + - pyyaml >=5.3.1 + - questionary >=1.8.1 + - eval-type-backport >=0.1.3,<0.3.0 + - platformdirs >=4.3.6 + - typing_extensions >=4.0.0,<5.0.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/copier?source=hash-mapping + size: 55390 + timestamp: 1771686560974 - pypi: https://files.pythonhosted.org/packages/17/a7/3aa4144d3bcb719bf67b22d2d51c2d577bf801498c13cb08f64173e80497/coverage-7.12.0-cp313-cp313-macosx_11_0_arm64.whl name: coverage version: 7.12.0 @@ -1712,6 +2099,76 @@ packages: requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py313heb322e3_0.conda + sha256: 553f4ee18ad755d690ad63fa8e00d89598ecc4945ec046a8af808ddee5bb1ca0 + md5: 964f25e322b16cae073da8f5b7adf123 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.14 + - libgcc >=14 + - openssl >=3.5.5,<4.0a0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + constrains: + - __glibc >=2.17 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + purls: + - pkg:pypi/cryptography?source=compressed-mapping + size: 1718868 + timestamp: 1770772833949 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cryptography-46.0.5-py313h6e3882f_0.conda + sha256: 92a8512b8e4b00e8afd8e3e5a77b1bf384f30ecbccbd5163c9c596098b06d914 + md5: 071bcb7607cc391596db9b193a1f5014 + depends: + - __osx >=10.13 + - cffi >=1.14 + - openssl >=3.5.5,<4.0a0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + constrains: + - __osx >=10.13 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + purls: + - pkg:pypi/cryptography?source=hash-mapping + size: 1652433 + timestamp: 1770772806563 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-46.0.5-py313he3f6fad_0.conda + sha256: 5d27780eae308b9602eb80b62b8fada46680c3fc68bfb249c95ddd07f74e74d2 + md5: 2cca7fe0caca845c02b37d8b465a18fa + depends: + - __osx >=11.0 + - cffi >=1.14 + - openssl >=3.5.5,<4.0a0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + constrains: + - __osx >=11.0 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + purls: + - pkg:pypi/cryptography?source=hash-mapping + size: 1600031 + timestamp: 1770773038178 +- conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-46.0.5-py313hf5c5e30_0.conda + sha256: f565890690a299107adae6314f7e2ba633d7c4e554e87524acc99eb5bad753f9 + md5: 198a8d301501a620273ef05250e7213c + depends: + - cffi >=1.14 + - openssl >=3.5.5,<4.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 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + purls: + - pkg:pypi/cryptography?source=hash-mapping + size: 1490238 + timestamp: 1770772680643 - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl name: cycler version: 0.12.1 @@ -1787,9 +2244,22 @@ packages: version: 0.21.2 sha256: dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda + sha256: 8fc5c4879d95e64779551c2b0b734ee1685431014578702c14301cdb886c320a + md5: 50ebe9b5cceffc32858c5233196229d2 + depends: + - importlib-metadata >=1.6.0 + - packaging >=20.9 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/dunamai?source=hash-mapping + size: 30908 + timestamp: 1771368088811 - pypi: ./ name: easyscience - version: 2.0.0 + version: 2.1.0 sha256: 3e1433dc7b46ccbb4a5d63a22de63b3113897cd66b602a368db0c08b09b3659c requires_dist: - asteval @@ -1818,12 +2288,35 @@ packages: - sphinx-gallery ; extra == 'docs' - toml ; extra == 'docs' requires_python: '>=3.11' - editable: true - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl name: editables version: '0.5' sha256: 61e5ffa82629e0d8bfe09bc44a07db3c1ab8ed1ce78a6980732870f19b5e7d4c requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda + sha256: 05ffdcb83903c159bfbb78a07fbcce6fd6dda41df9c55ed75e0eb1db5528048f + md5: 879479fda1dddb002fdc4885cea33740 + depends: + - eval_type_backport >=0.2.2,<0.2.3.0a0 + - python >=3.9 + license: MIT + license_family: MIT + purls: [] + size: 6662 + timestamp: 1734857849281 +- conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda + sha256: 2d721421a60676216e10837a240c75e2190e093920a4016a469fa9a62c95ab5f + md5: 8681d7f876da5e66a1c7fce424509383 + depends: + - python >=3.9 + constrains: + - eval-type-backport >=0.2.2,<0.2.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/eval-type-backport?source=hash-mapping + size: 11520 + timestamp: 1734857840035 - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl name: executing version: 2.2.1 @@ -2027,6 +2520,17 @@ packages: version: 1.8.0 sha256: 878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231 requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda + sha256: 4a3e3e86b7b49aaa2a0faa57da2bcf39f7ee858499e8335132f83bfeed79191e + md5: 84f8955e99a8944fdee49da39edb0add + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/funcy?source=hash-mapping + size: 30249 + timestamp: 1734381235500 - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl name: h11 version: 0.16.0 @@ -2139,11 +2643,49 @@ packages: version: 1.4.1 sha256: 0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' +- 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/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 + md5: c85c76dc67d75619a92f51dfbce06992 + depends: + - python >=3.9 + - zipp >=3.1.0 + constrains: + - importlib-resources >=6.5.2,<6.5.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-resources?source=hash-mapping + size: 33781 + timestamp: 1736252433366 - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl name: iniconfig version: 2.3.0 sha256: f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12 requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + sha256: 5a4e3a01f626c8de15ddada622d364e94ff28e8d6bdedf1665442ef03a4e0140 + md5: 3a804714ed59be1969ffca10f703ec2a + depends: + - python >=3.10 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/invoke?source=hash-mapping + size: 132825 + timestamp: 1760146119847 - pypi: https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl name: ipykernel version: 7.1.0 @@ -2283,14 +2825,32 @@ packages: - docopt ; extra == 'testing' - pytest<9.0.0 ; extra == 'testing' requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - name: jinja2 - version: 3.1.6 - sha256: 85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 - requires_dist: - - markupsafe>=2.0 - - babel>=2.7 ; extra == 'i18n' - requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b + md5: 04558c96691bed63104678757beb4f8d + depends: + - markupsafe >=2.0 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=compressed-mapping + size: 120685 + timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda + sha256: a36789229ca9ce5315265b9d425abce9acb4691f5864aea69e935020545a9acb + md5: 974c5b3e353f031cfcf2365c9d375926 + depends: + - jinja2 + - python >=3.9 + - pyyaml + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2-ansible-filters?source=hash-mapping + size: 20315 + timestamp: 1734906203051 - pypi: https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl name: json5 version: 0.12.1 @@ -2864,6 +3424,45 @@ packages: purls: [] size: 88657 timestamp: 1723861474602 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_2.conda + sha256: 0c890710173a98befb5ecc0f84475f1351c39cba4b52ba2f76f47aaf3c08a819 + md5: ef0b79f6a6f4893d4faccbcedc606d3c + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: ISC + purls: [] + size: 252693 + timestamp: 1772126122364 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.21-hc6ced15_2.conda + sha256: e358c1ff16324afc21581fe05c8adbbd499f162e369c38261987e39771bb2abe + md5: f138258c578eb0a1eebd97ffac5d375c + depends: + - __osx >=10.13 + license: ISC + purls: [] + size: 266757 + timestamp: 1772126288780 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_2.conda + sha256: 214c2db705eaba7417f66c546b23b62c82aaa4c647725f15631b8ba78d974a4c + md5: 00ade92230bc329783057db16a2e4ab1 + depends: + - __osx >=11.0 + license: ISC + purls: [] + size: 223288 + timestamp: 1772126208738 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_2.conda + sha256: 3103c223d91a4f19d37be1a653057c262bf083712cde2c60e8df7154b55b58b8 + md5: 882032e3e05a4f6216b9b32742291bd7 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: ISC + purls: [] + size: 251746 + timestamp: 1772126133305 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda sha256: 4c992dcd0e34b68f843e75406f7f303b1b97c248d18f3c7c330bdc0bc26ae0b3 md5: 729a572a3ebb8c43933b30edcc628ceb @@ -3028,26 +3627,70 @@ packages: - pytest-cov ; extra == 'test' - lmfit[dev,doc,test] ; extra == 'all' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl - name: markupsafe - version: 3.0.3 - sha256: 9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl - name: markupsafe - version: 3.0.3 - sha256: e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl - name: markupsafe - version: 3.0.3 - sha256: 116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: markupsafe - version: 3.0.3 - sha256: ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 - requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda + sha256: a530a411bdaaf0b1e4de8869dfaca46cb07407bc7dc0702a9e231b0e5ce7ca85 + md5: c14389156310b8ed3520d84f854be1ee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - 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: 25909 + timestamp: 1759055357045 +- conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.3-py313h0f4d31d_0.conda + sha256: 9c698da56e3bdae80be2a7bc0d19565971b36060155374d16fce14271c8b695c + md5: 884a82dc80ecd251e38d647808c424b3 + depends: + - __osx >=10.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: 25105 + timestamp: 1759055575973 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda + sha256: e06902a1bf370fdd4ada0a8c81c504868fdb7e9971b72c6bd395aa4e5a497bd2 + md5: 3df5979cc0b761dda0053ffdb0bca3ea + 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: 25778 + timestamp: 1759055530601 +- conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py313hd650c13_0.conda + sha256: 988d14095c1392e055fd75e24544da2db01ade73b0c2f99ddc8e2b8678ead4cc + md5: 47eaaa4405741beb171ea6edc6eaf874 + 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: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 28959 + timestamp: 1759055685616 - pypi: https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl name: matplotlib version: 3.10.7 @@ -3455,11 +4098,18 @@ packages: purls: [] size: 9440812 timestamp: 1762841722179 -- pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - name: packaging - version: '25.0' - sha256: 29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 - requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 + md5: b76541e68fea4d511b1ac46a28dcd2c6 + depends: + - python >=3.8 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=compressed-mapping + size: 72010 + timestamp: 1769093650580 - pypi: https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl name: pandas version: 2.3.3 @@ -3829,6 +4479,21 @@ packages: version: 1.5.1 sha256: 93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' +- conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + sha256: ce76d5a1fc6c7ef636cbdbf14ce2d601a1bfa0dd8d286507c1fd02546fccb94b + md5: 1a884d2b1ea21abfb73911dcdb8342e4 + depends: + - bcrypt >=3.2 + - cryptography >=3.3 + - invoke >=2.0 + - pynacl >=1.5 + - python >=3.9 + license: LGPL-2.1-or-later + license_family: LGPL + purls: + - pkg:pypi/paramiko?source=hash-mapping + size: 159896 + timestamp: 1755102147074 - pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl name: parso version: 0.8.5 @@ -3840,11 +4505,17 @@ packages: - mypy==0.971 ; extra == 'qa' - types-setuptools==67.2.0.1 ; extra == 'qa' requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl - name: pathspec - version: 0.12.1 - sha256: a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 - requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda + sha256: 29ea20d0faf20374fcd61c25f6d32fb8e9a2c786a7f1473a0c3ead359470fbe1 + md5: 2908273ac396d2cd210a8127f5f1c0d6 + depends: + - python >=3.10 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping + size: 53739 + timestamp: 1769677743677 - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl name: pexpect version: 4.9.0 @@ -3979,22 +4650,18 @@ packages: - trove-classifiers>=2024.10.12 ; extra == 'tests' - defusedxml ; extra == 'xmp' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl - name: platformdirs - version: 4.5.0 - sha256: e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3 - requires_dist: - - furo>=2025.9.25 ; extra == 'docs' - - proselint>=0.14 ; extra == 'docs' - - sphinx-autodoc-typehints>=3.2 ; extra == 'docs' - - sphinx>=8.2.3 ; extra == 'docs' - - appdirs==1.4.4 ; extra == 'test' - - covdefaults>=2.3 ; extra == 'test' - - pytest-cov>=7 ; extra == 'test' - - pytest-mock>=3.15.1 ; extra == 'test' - - pytest>=8.4.2 ; extra == 'test' - - mypy>=1.18.2 ; extra == 'type' - requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda + sha256: 7f263219cecf0ba6d74c751efa60c4676ce823157ca90aa43ebba5ac615ca0fa + md5: 4fefefb892ce9cc1539405bec2f1a6cd + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=compressed-mapping + size: 25643 + timestamp: 1771233827084 - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl name: plotly version: 6.5.0 @@ -4046,6 +4713,21 @@ packages: - pytest-benchmark ; extra == 'testing' - coverage ; extra == 'testing' requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda + sha256: 972e0c1c9f0b1763d482e885732baef7f9a0cbe8686f5e2c6bdd88838619a59a + md5: 7fd2e38f4e608f5ebd80f871352c5495 + depends: + - python >=3.10 + - pywin32-on-windows + - paramiko + - importlib_resources + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/plumbum?source=hash-mapping + size: 103911 + timestamp: 1761911487086 - pypi: https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl name: prometheus-client version: 0.23.1 @@ -4053,13 +4735,30 @@ packages: requires_dist: - twisted ; extra == 'twisted' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - name: prompt-toolkit - version: 3.0.52 - sha256: 9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955 - requires_dist: +- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + sha256: ebc1bb62ac612af6d40667da266ff723662394c0ca78935340a5b5c14831227b + md5: d17ae9db4dc594267181bd199bf9a551 + depends: + - python >=3.9 - wcwidth - requires_python: '>=3.8' + constrains: + - prompt_toolkit 3.0.51 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/prompt-toolkit?source=hash-mapping + size: 271841 + timestamp: 1744724188108 +- conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda + sha256: 936189f0373836c1c77cd2d6e71ba1e583e2d3920bf6d015e96ee2d729b5e543 + md5: 1e61ab85dd7c60e5e73d853ea035dc29 + depends: + - prompt-toolkit >=3.0.51,<3.0.52.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7182 + timestamp: 1744724189376 - pypi: https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl name: propcache version: 0.4.1 @@ -4271,11 +4970,104 @@ packages: version: 2.14.0 sha256: dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl - name: pycparser - version: '2.23' - sha256: e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934 - requires_python: '>=3.8' +- 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/pydantic-2.12.5-pyhcf101f3_1.conda + sha256: 868569d9505b7fe246c880c11e2c44924d7613a8cdcc1f6ef85d5375e892f13d + md5: c3946ed24acdb28db1b5d63321dbca7d + depends: + - typing-inspection >=0.4.2 + - typing_extensions >=4.14.1 + - python >=3.10 + - typing-extensions >=4.6.1 + - annotated-types >=0.6.0 + - pydantic-core ==2.41.5 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic?source=hash-mapping + size: 340482 + timestamp: 1764434463101 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda + sha256: b15568ddc03bd33ea41610e5df951be4e245cd61957cbf8c2cfd12557f3d53b5 + md5: f27c39a1906771bbe56cd26a76bf0b8b + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.13.* *_cp313 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1940186 + timestamp: 1762989000579 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda + sha256: 73de35081774d9b445dd807ac4d4e043846159b2de348b8e6a81f1b810210fe4 + md5: e12491c39d2ea259771ce4d80a91817f + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - __osx >=10.13 + - python_abi 3.13.* *_cp313 + constrains: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1947011 + timestamp: 1762989008917 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda + sha256: 08398c0599084837ba89d69db00b3d0973dc86d6519957dc6c1b480e2571451a + md5: eaeed566f6d88c0a08d73700b34be4a2 + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - python 3.13.* *_cp313 + - __osx >=11.0 + - python_abi 3.13.* *_cp313 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1778337 + timestamp: 1762989007829 +- conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda + sha256: fb9391dc09dd01574c85e2342b9aa3b8664cd713401ef8fd6267865cc28988d8 + md5: 0437f87004ad7c64c98a013d1611db97 + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - 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/pydantic-core?source=hash-mapping + size: 1973031 + timestamp: 1762989056610 - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl name: pydata-sphinx-theme version: 0.15.4 @@ -4334,13 +5126,85 @@ packages: version: 3.4.0 sha256: f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - name: pygments - version: 2.19.2 - sha256: 86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b - requires_dist: - - colorama>=0.4.6 ; extra == 'windows-terminal' - requires_python: '>=3.8' +- 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/linux-64/pynacl-1.6.2-py313h5008379_1.conda + sha256: 51e80a7bef95025ad47a92acb69ee0e78f01e107655c86fe76abcde2ac688166 + md5: c4426edfc5514a2c9be6871557bce52b + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.4.1 + - libgcc >=14 + - libsodium >=1.0.21,<1.0.22.0a0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - six + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/pynacl?source=hash-mapping + size: 1191901 + timestamp: 1772171244923 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pynacl-1.6.2-py313hf61a874_1.conda + sha256: 2638c5a765310ac71641f37dc614792eb39b9a62059758de6b8ffc06b0639c1f + md5: 3037cfd226c8d60a492c9d0a5fe0d277 + depends: + - __osx >=11.0 + - cffi >=1.4.1 + - libsodium >=1.0.21,<1.0.22.0a0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - six + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/pynacl?source=hash-mapping + size: 1195552 + timestamp: 1772171533952 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py313h6940bce_1.conda + sha256: ef6ab85953ebf81b3b0c6d0b6377eb1a318b07823e76d2c8e850365e60d9ca5c + md5: fca94b9ddea6d5c63ccb6b5ad6d8e232 + depends: + - __osx >=11.0 + - cffi >=1.4.1 + - libsodium >=1.0.21,<1.0.22.0a0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + - six + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/pynacl?source=hash-mapping + size: 1192924 + timestamp: 1772171603602 +- conda: https://conda.anaconda.org/conda-forge/win-64/pynacl-1.6.2-py313hed4ef92_1.conda + sha256: 0960e727d0bd70e07bca0c049c4c4afa0b41bcea050135db49f54c1c0c02ed7f + md5: 99b7617a643bed6a403fc908c1e167f0 + depends: + - cffi >=1.4.1 + - libsodium >=1.0.21,<1.0.22.0a0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - six + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/pynacl?source=hash-mapping + size: 1186552 + timestamp: 1772171311072 - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl name: pyparsing version: 3.2.5 @@ -4572,31 +5436,111 @@ packages: name: pytz version: '2025.2' sha256: 5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 +- 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/noarch/pywin32-on-windows-0.1.0-pyh07e9846_2.tar.bz2 + sha256: 09803b75cccc16d8586d2f41ea890658d165f4afc359973fa1c7904a2c140eae + md5: 91733394059b880d9cc0d010c20abda0 + depends: + - python >=2.7 + - pywin32 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5282 + timestamp: 1646866839398 +- conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + sha256: 6502696aaef571913b22a808b15c185bd8ea4aabb952685deb29e6a6765761cb + md5: 2807a0becd1d986fe1ef9b7f8135f215 + depends: + - __unix + - python >=2.7 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4856 + timestamp: 1646866525560 - pypi: https://files.pythonhosted.org/packages/fc/19/b757fe28008236a4a713e813283721b8a40aa60cd7d3f83549f2e25a3155/pywinpty-3.0.2-cp313-cp313-win_amd64.whl name: pywinpty version: 3.0.2 sha256: 18f78b81e4cfee6aabe7ea8688441d30247b73e52cd9657138015c5f4ee13a51 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: pyyaml - version: 6.0.3 - sha256: 0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl - name: pyyaml - version: 6.0.3 - sha256: 79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl - name: pyyaml - version: 6.0.3 - sha256: 2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl - name: pyyaml - version: 6.0.3 - sha256: 8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 - requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda + sha256: ef7df29b38ef04ec67a8888a4aa039973eaa377e8c4b59a7be0a1c50cd7e4ac6 + md5: f256753e840c3cd3766488c9437a8f8b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - 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=compressed-mapping + size: 201616 + timestamp: 1770223543730 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.3-py313h7c6a591_1.conda + sha256: ab5f6c27d24facd1832481ccd8f432c676472d57596a3feaa77880a1462cdb2a + md5: 0eaf6cf9939bb465ee62b17d04254f9e + depends: + - __osx >=10.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: 192051 + timestamp: 1770223971430 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h65a2061_1.conda + sha256: 950725516f67c9691d81bb8dde8419581c5332c5da3da10c9ba8cbb1698b825d + md5: 5d0c8b92128c93027632ca8f8dc1190f + 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=compressed-mapping + size: 188763 + timestamp: 1770224094408 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_1.conda + sha256: dfaed50de8ee72a51096163b87631921688851001e38c78a841eba1ae8b35889 + md5: c1bdb8dd255c79fb9c428ad25cc6ee54 + 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 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=compressed-mapping + size: 180992 + timestamp: 1770223457761 - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl name: pyzmq version: 27.1.0 @@ -4618,6 +5562,18 @@ packages: requires_dist: - cffi ; implementation_name == 'pypy' requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda + sha256: 0604c6dff3af5f53e34fceb985395d08287137f220450108a795bcd1959caf14 + md5: 34fa231b5c5927684b03bb296bb94ddc + depends: + - prompt_toolkit >=2.0,<4.0 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/questionary?source=hash-mapping + size: 31257 + timestamp: 1757356458097 - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c md5: 283b96675859b20a825f8fa30f311446 @@ -5124,11 +6080,18 @@ packages: - pytest-cov ; extra == 'dev' - sphinx ; extra == 'docs' requires_python: '>=3.6' -- 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=hash-mapping + size: 18455 + timestamp: 1753199211006 - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl name: sniffio version: 1.3.1 @@ -5506,11 +6469,40 @@ packages: name: trove-classifiers version: 2025.11.14.15 sha256: d1dac259c1e908939862e3331177931c6df0a37af2c1a8debcc603d9115fcdd9 -- pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - name: typing-extensions - version: 4.15.0 - sha256: f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 - requires_python: '>=3.9' +- 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-inspection-0.4.2-pyhd8ed1ab_1.conda + sha256: 70db27de58a97aeb7ba7448366c9853f91b21137492e0b4430251a1870aa8ff4 + md5: a0a4a3035667fc34f29bfbd5c190baa6 + depends: + - python >=3.10 + - typing_extensions >=4.12.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/typing-inspection?source=hash-mapping + size: 18923 + timestamp: 1764158430324 +- 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=hash-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' @@ -5652,11 +6644,17 @@ packages: - setuptools>=68 ; extra == 'test' - time-machine>=2.10 ; platform_python_implementation == 'CPython' and extra == 'test' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl - name: wcwidth - version: 0.2.14 - sha256: a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1 - requires_python: '>=3.6' +- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + sha256: e298b508b2473c4227206800dfb14c39e4b14fd79d4636132e9e1e4244cdf4aa + md5: c3197f8c0d5b955c904616b716aca093 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wcwidth?source=compressed-mapping + size: 71550 + timestamp: 1770634638503 - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl name: webcolors version: 25.10.0 @@ -5686,6 +6684,52 @@ packages: requires_dist: - h11>=0.16.0,<1 requires_python: '>=3.10' +- 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-64/yaml-0.2.5-h4132b18_3.conda + sha256: a335161bfa57b64e6794c3c354e7d49449b28b8d8a7c4ed02bf04c3f009953f9 + md5: a645bb90997d3fc2aea0adf6517059bd + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 79419 + timestamp: 1753484072608 +- 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 - pypi: https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl name: yarl version: 1.22.0 @@ -5722,3 +6766,15 @@ packages: - multidict>=4.0 - propcache>=0.2.1 requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae + md5: 30cd29cb87d819caead4d55184c1d115 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 24194 + timestamp: 1764460141901 diff --git a/pixi.toml b/pixi.toml index a7a8897b..7cfb7b89 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,54 +1,255 @@ +####################### +# ENVIRONMENT VARIABLES +####################### + +# Platform-independent + +[activation.env] +PYTHONIOENCODING = "utf-8" + +# Platform-specific + +# Ensures the main package is used from the source code during +# development, even if main package is installed in editable mode +# via uv. This is important because `pixi update` might replace +# the installed version with the latest released version. + +# Unix/macOS +[target.unix.activation.env] +PYTHONPATH = "${PIXI_PROJECT_ROOT}/src${PYTHONPATH:+:${PYTHONPATH}}" + +# Windows +[target.win.activation.env] +PYTHONPATH = "${PIXI_PROJECT_ROOT}/src;%PYTHONPATH%" + +########### +# WORKSPACE +########### + [workspace] -name = "easyscience" -channels = ["conda-forge"] -platforms = ["linux-64", "osx-64", "osx-arm64", "win-64"] + +# Supported platforms for the lock file (pixi.lock) +platforms = ['win-64', 'linux-64', 'osx-64', 'osx-arm64'] + +# Channels for fetching packages +channels = ['conda-forge'] + +########## +# FEATURES +########## + +# Default feature configuration [dependencies] -python = ">=3.11,<3.14" +nodejs = '*' # Required for Prettier (non-Python formatting) +gsl = '*' # GNU Scientific Library; required for pdffit2. + +[pypi-dependencies] # == [feature.default.pypi-dependencies] +pip = '*' # Native package installer +easyscience = { path = ".", editable = true, extras = ['dev'] } + +# Specific features: Set specific Python versions + + +[feature.py-min.dependencies] +python = '3.11.*' +[feature.py-max.dependencies] +python = '3.13.*' -[feature.dev.pypi-dependencies] -# Development dependencies -easyscience = { path = ".", extras = ["dev"], editable = true } -[feature.docs.pypi-dependencies] -# Documentation dependencies -easyscience = { path = ".", extras = ["docs"], editable = true } -[feature.build.pypi-dependencies] -# build dependencies -easyscience = { path = ".", extras = ["build"], editable = true } +############## +# ENVIRONMENTS +############## [environments] -# Default environment with basic build setup -default = ["build"] -# Development environment with build, dev, and docs features -dev = ["build", "dev", "docs"] + +# The `default` feature is always included in all environments. +# Additional features can be specified per environment. +py-311-env = { features = ['default', 'py-min'] } +py-313-env = { features = ['default', 'py-max'] } + +# The `default` environment is always created and includes the `default` feature. +# It does not need to be specified explicitly unless non-default features are included. +default = { features = ['default', 'py-max'] } + +####### +# TASKS +####### [tasks] -# Development tasks -test = "pytest --cov=src/easyscience tests --cov-branch --cov-report=xml:coverage-unit.xml" -test-unit = "pytest tests/unit_tests" -test-integration = "pytest tests/integration_tests" -# Code quality tasks -lint-check = "ruff check ." -lint = "ruff check . --fix" -format-check = "ruff format . --check" -format = "ruff format ." +################## +# 🧪 Testing Tasks +################## -# Build tasks -build = "python -m build" -clean = "rm -rf dist/ build/ *.egg-info/" -update-lock = "pixi update" +unit-tests = 'python -m pytest tests/unit/ --color=yes -v' +integration-tests = 'python -m pytest tests/integration/ --color=yes -n auto -v' +notebook-tests = 'python -m pytest --nbmake docs/docs/tutorials/ --nbmake-timeout=600 --color=yes -n auto -v' +script-tests = 'python -m pytest tools/test_scripts.py --color=yes -n auto -v' -# Tox tasks -tox = "tox" +test = { depends-on = ['unit-tests'] } -# Documentation tasks -docs-build = "sphinx-build -b html docs/src docs/_build/html" -docs-clean = "rm -rf docs/_build/" +########### +# ✔️ Checks +########### -[pypi-dependencies] # == [feature.default.pypi-dependencies] -# Editable install of the package itself -easyscience = { path = ".", editable = true } +pyproject-check = 'python -m validate_pyproject pyproject.toml' +docs-format-check = 'docformatter --check src/ docs/docs/tutorials/' +notebook-format-check = 'nbqa ruff docs/docs/tutorials/' +py-lint-check = 'ruff check src/ tests/ docs/docs/tutorials/' +py-format-check = "ruff format --check src/ tests/ docs/docs/tutorials/" +nonpy-format-check = "npx prettier --list-different --config=prettierrc.toml --ignore-unknown ." +nonpy-format-check-modified = "python tools/nonpy_prettier_modified.py" + +check = 'pre-commit run --hook-stage manual --all-files' + +########## +# 🛠️ Fixes +########## + +docs-format-fix = 'docformatter --in-place src/ docs/docs/tutorials/' +notebook-format-fix = 'nbqa ruff --fix docs/docs/tutorials/' +py-lint-fix = 'ruff check --fix src/ tests/ docs/docs/tutorials/' +py-format-fix = "ruff format src/ tests/ docs/docs/tutorials/" +nonpy-format-fix = 'npx prettier --write --list-different --config=prettierrc.toml --ignore-unknown .' +nonpy-format-fix-modified = "python tools/nonpy_prettier_modified.py --write" +success-message-fix = 'echo "✅ All code auto-formatting steps have been applied."' + +fix = { depends-on = [ + 'py-format-fix', + 'docs-format-fix', + 'py-lint-fix', + 'nonpy-format-fix', + 'notebook-format-fix', + 'success-message-fix', +] } + +#################### +# 🧮 Code Complexity +#################### + +complexity-check = 'radon cc -s src/' +complexity-check-json = 'radon cc -s -j src/' +maintainability-check = 'radon mi src/' +maintainability-check-json = 'radon mi -j src/' +raw-metrics = 'radon raw -s src/' +raw-metrics-json = 'radon raw -s -j src/' + +############# +# 📊 Coverage +############# + +unit-tests-coverage = 'pixi run unit-tests --cov=src/easyscience --cov-report=term-missing' +integration-tests-coverage = 'pixi run integration-tests --cov=src/easyscience --cov-report=term-missing' +docstring-coverage = 'interrogate -c pyproject.toml src/easyscience' + +cov = { depends-on = [ + 'docstring-coverage', + 'unit-tests-coverage', + 'integration-tests-coverage', +] } + +######################## +# 📓 Notebook Management +######################## + +notebook-convert = 'jupytext docs/docs/tutorials/*.py --from py:percent --to ipynb' +notebook-strip = 'nbstripout docs/docs/tutorials/*.ipynb' +notebook-tweak = 'python tools/tweak_notebooks.py tutorials/' +notebook-exec = 'python -m pytest --nbmake docs/docs/tutorials/ --nbmake-timeout=600 --overwrite --color=yes -n auto -v' + +notebook-prepare = { depends-on = [ + #'notebook-convert', + 'notebook-strip', + #'notebook-tweak', +] } + +######################## +# 📚 Documentation Tasks +######################## + +docs-vars = "JUPYTER_PLATFORM_DIRS=1 PYTHONWARNINGS='ignore::RuntimeWarning'" +docs-pre = "pixi run docs-vars python -m mkdocs" +docs-serve = "pixi run docs-pre serve -f docs/mkdocs.yml" +docs-serve-dirty = "pixi run docs-serve --dirty" +docs-build = "pixi run docs-pre build -f docs/mkdocs.yml" +docs-build-local = "pixi run docs-build --no-directory-urls" + +docs-deploy-pre = 'mike deploy -F docs/mkdocs.yml --push --branch gh-pages --update-aliases --alias-type redirect' +docs-set-default-pre = 'mike set-default -F docs/mkdocs.yml --push --branch gh-pages' + +docs-update-assets = 'python tools/update_docs_assets.py' + +############################## +# 📦 Template Management Tasks +############################## + +copier-copy = "copier copy gh:easyscience/templates . --data-file ../core/.copier-answers.yml --data template_type=lib" +copier-recopy = "copier recopy --data-file ../core/.copier-answers.yml --data template_type=lib" +copier-update = "copier update --data-file ../core/.copier-answers.yml --data template_type=lib" + +##################### +# 🪝 Pre-commit Hooks +##################### + +pre-commit-clean = 'pre-commit clean' +pre-commit-install = 'pre-commit install --hook-type pre-commit --hook-type pre-push --overwrite' +pre-commit-uninstall = 'pre-commit uninstall --hook-type pre-commit --hook-type pre-push' +pre-commit-setup = { depends-on = [ + 'pre-commit-clean', + 'pre-commit-uninstall', + 'pre-commit-install', +] } + +################# +# 🐙️ GitHub Tasks +################# + +repo-wiki = 'gh api -X PATCH repos/easyscience/core -f has_wiki=false' +repo-discussions = 'gh api -X PATCH repos/easyscience/core -f has_discussions=true' +repo-description = "gh api -X PATCH repos/easyscience/core -f description='Core building blocks for EasyScience'" +repo-homepage = "gh api -X PATCH repos/easyscience/core -f homepage='https://easyscience.github.io/core'" +repo-config = { depends-on = [ + 'repo-wiki', + 'repo-discussions', + 'repo-description', + 'repo-homepage', +] } + +master-protection = 'gh api -X POST repos/easyscience/core/rulesets --input .github/configs/rulesets-master.json' +develop-protection = 'gh api -X POST repos/easyscience/core/rulesets --input .github/configs/rulesets-develop.json' +gh-pages-protection = 'gh api -X POST repos/easyscience/core/rulesets --input .github/configs/rulesets-gh-pages.json' +branch-protection = { depends-on = [ + 'master-protection', + 'develop-protection', + 'gh-pages-protection', +] } + +pages-deployment = 'gh api -X POST repos/easyscience/core/pages --input .github/configs/pages-deployment.json' + +github-labels = 'python tools/update_github_labels.py' + +#################################### +# 🚀 Other Development & Build Tasks +#################################### + +default-build = 'python -m build' +dist-build = 'python -m build --wheel --outdir dist' + +npm-config = 'npm config set registry https://registry.npmjs.org/' +prettier-install = 'npm install --no-save --no-audit --no-fund prettier prettier-plugin-toml' + +clean-pycache = "find . -type d -name '__pycache__' -prune -exec rm -rf '{}' +" +spdx-update = 'python tools/update_spdx.py' + +post-install = { depends-on = [ + 'npm-config', + 'prettier-install', + #'pre-commit-setup', +] } +########################## +# 🔗 Main Package Shortcut +########################## +easyscience = 'python -m easyscience' \ No newline at end of file diff --git a/prettierrc.toml b/prettierrc.toml new file mode 100644 index 00000000..b98c86eb --- /dev/null +++ b/prettierrc.toml @@ -0,0 +1,22 @@ +plugins = [ + "prettier-plugin-toml", # use the TOML plugin +] + +endOfLine = 'lf' # change line endings to LF +proseWrap = 'always' # change wrapping in Markdown files +semi = false # remove semicolons +singleQuote = true # use single quotes instead of double quotes +tabWidth = 2 # change tab width to 2 spaces +useTabs = false # use spaces instead of tabs + +printWidth = 79 # wrap lines at 79 characters + +[[overrides]] +files = ["*.md"] +[overrides.options] +printWidth = 72 # wrap Markdown files at 72 characters + +[[overrides]] +files = ["*.yml", "*.yaml"] +[overrides.options] +printWidth = 88 # wrap YAML files at 88 characters diff --git a/pyproject.toml b/pyproject.toml index 3cdb977c..b8000ce4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,162 +1,222 @@ -[build-system] -requires = [ - "hatchling<=1.21.0", - "setuptools-git-versioning", -] -build-backend = "hatchling.build" - -[tool.setuptools-git-versioning] -enabled = true +############################### +# Configuration for the project +############################### [project] -name = "easyscience" -dynamic = ["version"] -description = "Generic logic for easyScience libraries" -readme = "README.md" -authors = [{name = "EasyScience contributors"}] -license = { file = "LICENSE" } +name = 'easyscience' +dynamic = ['version'] # Use versioningit to manage the version +description = 'Core building blocks for EasyScience' +authors = [{ name = 'EasyScience contributors' }] +readme = 'README.md' +license = { file = 'LICENSE' } classifiers = [ - "License :: OSI Approved :: BSD License", - "Operating System :: OS Independent", - "Topic :: Scientific/Engineering", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Development Status :: 3 - Alpha" + 'Intended Audience :: Science/Research', + 'Topic :: Scientific/Engineering', + 'License :: OSI Approved :: BSD License', + 'Operating System :: OS Independent', + 'Programming Language :: Python :: 3 :: Only', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', + 'Programming Language :: Python :: 3.13', ] -requires-python = ">=3.11" +requires-python = '>=3.11' dependencies = [ - "asteval", - "bumps", - "DFO-LS", - "lmfit", - "numpy", - "uncertainties", - "scipp" + 'asteval', # Safely evaluate Python expressions from strings + 'lmfit', # Non-linear least squares fitting + 'bumps', # Bayesian uncertainty estimation + 'dfo-ls', # Derivative-free optimization + 'uncertainties', # Propagation of uncertainties in calculations + 'numpy', # Numerical computing + 'scipp', # Handling and analysis of scientific data + 'jupyterlab', # Jupyter notebooks + 'pixi-kernel', # Pixi Jupyter kernel ] [project.optional-dependencies] -build = [ - "hatchling <= 1.21.0", - "setuptools-git-versioning", - "build" -] dev = [ - "build", - "codecov", - "flake8", - "matplotlib", - "pytest", - "pytest-cov", - "ruff", - "tox-gh-actions", - "jupyterlab" -] -docs = [ - "doc8", - "readme-renderer", - "sphinx_autodoc_typehints", - "sphinx_book_theme", - "sphinx_gallery", - "toml" + 'build', # Building the package + 'pre-commit', # Pre-commit hooks + 'jinja2', # Templating + 'nbmake', # Building notebooks + 'nbstripout', # Strip output from notebooks + 'nbqa', # Linting and formatting notebooks + 'pytest', # Testing + 'pytest-cov', # Test coverage + 'pytest-xdist', # Enable parallel testing + 'ruff', # Linting and formatting code + 'radon', # Code complexity and maintainability + 'validate-pyproject[all]', # Validate pyproject.toml + 'versioningit', # Automatic versioning from git tags + 'jupytext', # Jupyter notebook text format support + 'jupyterquiz', # Quizzes in Jupyter notebooks + 'docformatter', # Code formatter for docstrings + 'interrogate', # Check for missing docstrings + 'copier', # Template management + 'mike', # MkDocs: Versioned documentation support + 'mkdocs', # Static site generator + 'mkdocs-material', # Documentation framework on top of MkDocs + 'mkdocs-autorefs', # MkDocs: Auto-references support + 'mkdocs-jupyter', # MkDocs: Jupyter notebook support + 'mkdocs-plugin-inline-svg', # MkDocs: Inline SVG support + 'mkdocs-markdownextradata-plugin', # MkDocs: Markdown extra data support, such as global variables + 'mkdocstrings-python', # MkDocs: Python docstring support + 'pyyaml', # YAML parser ] [project.urls] -homepage = "https://github.com/EasyScience/EasyScience" -documentation = "https://easyscience.github.io/EasyScience/" +homepage = 'https://easyscience.github.io/core' +documentation = 'https://easyscience.github.io/core' +source = 'https://github.com/easyscience/core' +tracker = 'https://github.com/easyscience/core/issues' -[tool.hatch.version] -path = "src/easyscience/__version__.py" +############################ +# Build system configuration +############################ -[tool.hatch.metadata] -allow-direct-references = true +# Build system 'hatch' -- Python project manager +# https://hatch.pypa.io/ + +# Versioning system 'versioningit' -- Versioning from git tags +# https://versioningit.readthedocs.io/ + +[build-system] +build-backend = 'hatchling.build' +requires = ['hatchling', 'versioningit'] -[tool.hatch.build.targets.sdist] -packages = ["src"] +############################# +# Configuration for hatchling +############################# [tool.hatch.build.targets.wheel] -packages = ["src/easyscience"] -exclude = ["src/easyscience/legacy"] +packages = ['src/easyscience'] +exclude = ['src/easyscience/legacy'] + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.version] +source = 'versioningit' # Use versioningit to manage the version + +################################ +# Configuration for versioningit +################################ + +# Versioningit generates versions from git tags, so we don't need to +# either specify them statically in pyproject.toml or save them in the +# source code. Do not use {distance} in the version format, as it +# forces a version bump for every commit, which triggers unnecessary +# pixi.lock update without any changes to the source code. + +[tool.versioningit.format] +distance = '{base_version}+dev{distance}' # example: 1.2.3.post4+dev3 +dirty = '{base_version}+dirty{distance}' # example: 0.5.8+dirty3 +distance-dirty = '{base_version}+devdirty{distance}' # example: 0.5.8+devdirty3 + +# Configure how versioningit detects versions from Git +# - 'match' ensures it only considers tags starting with 'v' +# - 'default-tag' is used as a fallback when no matching tag is found +[tool.versioningit.vcs] +method = 'git' +match = ['v*'] +default-tag = 'v999.0.0' + +################################ +# Configuration for docformatter +################################ + +# 'docformatter' -- Code formatter for docstrings +# https://docformatter.readthedocs.io/en/latest/ + +[tool.docformatter] +recursive = true +wrap-summaries = 72 +wrap-descriptions = 72 +close-quotes-on-newline = true + +################################ +# Configuration for interrogate +################################ + +# 'interrogate' -- Check for missing docstrings +# https://interrogate.readthedocs.io/en/latest/ + +[tool.interrogate] +fail-under = 0 # Minimum docstring coverage percentage to pass +verbose = 1 +#exclude = ['src/**/__init__.py'] + +####################################### +# Configuration for coverage/pytest-cov +####################################### [tool.coverage.run] -source = ["src/easyscience"] +branch = true # Measure branch coverage as well +source = ['src'] # Limit coverage to the source code directory + +[tool.coverage.report] +show_missing = true # Show missing lines +skip_covered = false # Skip files with 100% coverage in the report +fail_under = 0 # Minimum coverage percentage to pass + +########################## +# Configuration for pytest +########################## + +[tool.pytest.ini_options] +addopts = '--import-mode=importlib' +markers = ['fast: mark test as fast (should be run on every push)'] +testpaths = ['tests'] + +######################## +# Configuration for ruff +######################## -[tool.github.info] -organization = 'EasyScience' -repo = "easyscience" +# 'ruff' -- Python linter and code formatter +# https://docs.astral.sh/ruff/rules/ [tool.ruff] -line-length = 127 -exclude = [ - "docs", - "examples_old", - "tests" -] +exclude = ['tmp'] +indent-width = 4 +line-length = 99 +preview = true # Enable new rules that are not yet stable, like DOC [tool.ruff.format] -quote-style = "single" - -[tool.ruff.per-file-ignores] -# allow asserts in test files -"*test_*.py" = ["S101"] +docstring-code-format = true # Whether to format code snippets in docstrings +docstring-code-line-length = 72 # Line length for code snippets in docstrings +indent-style = 'space' # PEP 8 recommends using spaces over tabs +line-ending = 'lf' # Line endings will be converted to \n +quote-style = 'single' # But double quotes in docstrings (PEP 8, PEP 257) +# https://docs.astral.sh/ruff/rules/ [tool.ruff.lint] -ignore-init-module-imports = true select = [ - # flake8 settings from existing CI setup - "E9", "F63", "F7", "F82", - # Code should be polished to fulfill all cases below - # https://docs.astral.sh/ruff/rules/ - # pycodestyle - "E", - # Pyflakes - "F", - # pyupgrade -# "UP", - # flake8-bugbear -# "B", - # flake8-simplify -# "SIM", - # isort - "I", - # flake8-bandit - "S", + 'E', # General PEP 8 style errors + 'E9', # Runtime errors (e.g., syntax errors, undefined names) + 'F', # Pyflakes-specific checks (e.g., unused variables, imports) + 'F63', # Issues related to invalid escape sequences in strings + 'F7', # Type-related errors (e.g., mismatched argument types, unsupported operations) + 'F82', # Import-related errors (e.g., unresolved imports, reimported modules) + 'I', # Import sorting issues (e.g., unsorted imports) + 'S', # Security-related issues (e.g., use of insecure functions or libraries) + 'W', # General PEP 8 warnings (e.g., lines too long, trailing whitespace) ] +[tool.ruff.lint.per-file-ignores] +'tests/**/*.py' = ['S101'] # Allow assert statements in tests + +[tool.ruff.lint.flake8-tidy-imports] +ban-relative-imports = 'all' + [tool.ruff.lint.isort] force-single-line = true -[tool.tox] -legacy_tox_ini = """ -[tox] -isolated_build = True -envlist = py{3.11,3.12,3.13} -[gh-actions] -python = - 3.11: py311 - 3.12: py312 - 3.13: py313 -[gh-actions:env] -PLATFORM = - ubuntu-latest: linux - macos-latest: macos - macos-15-intel: macos-intel - windows-latest: windows -[testenv] -passenv = - CI - GITHUB_ACTIONS - GITHUB_ACTION - GITHUB_REF - GITHUB_REPOSITORY - GITHUB_HEAD_REF - GITHUB_RUN_ID - GITHUB_SHA - COVERAGE_FILE -deps = coverage -commands = - pip install -e '.[dev]' - pytest --cov --cov-report=xml -""" +[tool.ruff.lint.mccabe] +max-complexity = 10 # default is 10 + +[tool.ruff.lint.pycodestyle] +max-line-length = 99 # https://peps.python.org/pep-0008/#maximum-line-length +max-doc-length = 72 # https://peps.python.org/pep-0008/#maximum-line-length + +[tool.ruff.lint.pydocstyle] +convention = 'google' diff --git a/src/easyscience/__init__.py b/src/easyscience/__init__.py index e3d4b084..38011c18 100644 --- a/src/easyscience/__init__.py +++ b/src/easyscience/__init__.py @@ -1,24 +1,3 @@ -from .global_object import GlobalObject - -# Must be executed before any other imports -global_object = GlobalObject() -global_object.instantiate_stack() -global_object.stack.enabled = False - - -from .__version__ import __version__ as __version__ # noqa: E402 -from .base_classes import ObjBase # noqa: E402 -from .fitting import AvailableMinimizers # noqa: E402 -from .fitting import Fitter # noqa: E402 -from .variable import DescriptorNumber # noqa: E402 -from .variable import Parameter # noqa: E402 - -__all__ = [ - __version__, - global_object, - ObjBase, - AvailableMinimizers, - Fitter, - DescriptorNumber, - Parameter, -] +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause +"""EasyScience library.""" diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index 462d95af..00000000 --- a/tests/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project -#ifndef offsetof - #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) -#endif -#if !defined(WIN32) && !defined(MS_WINDOWS) - #ifndef __stdcall - #define __stdcall - #endif - #ifndef __cdecl - #define __cdecl - #endif - #ifndef __fastcall - #define __fastcall - #endif -#endif -#ifndef DL_IMPORT - #define DL_IMPORT(t) t -#endif -#ifndef DL_EXPORT - #define DL_EXPORT(t) t -#endif -#define __PYX_COMMA , -#ifndef HAVE_LONG_LONG - #if PY_VERSION_HEX >= 0x02070000 - #define HAVE_LONG_LONG - #endif -#endif -#ifndef PY_LONG_LONG - #define PY_LONG_LONG LONG_LONG -#endif -#ifndef Py_HUGE_VAL - #define Py_HUGE_VAL HUGE_VAL -#endif -#ifdef PYPY_VERSION - #define CYTHON_COMPILING_IN_PYPY 1 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #undef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 0 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #if PY_VERSION_HEX < 0x03050000 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #undef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #undef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 1 - #undef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 0 - #undef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 0 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 -#elif defined(PYSTON_VERSION) - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 1 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 -#else - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 1 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #if PY_VERSION_HEX < 0x02070000 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) - #define CYTHON_USE_PYTYPE_LOOKUP 1 - #endif - #if PY_MAJOR_VERSION < 3 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #if PY_VERSION_HEX < 0x02070000 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #elif !defined(CYTHON_USE_PYLONG_INTERNALS) - #define CYTHON_USE_PYLONG_INTERNALS 1 - #endif - #ifndef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 1 - #endif - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #if PY_VERSION_HEX < 0x030300F0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #elif !defined(CYTHON_USE_UNICODE_WRITER) - #define CYTHON_USE_UNICODE_WRITER 1 - #endif - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #ifndef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 1 - #endif - #ifndef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 1 - #endif - #ifndef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) - #endif - #ifndef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) - #endif - #ifndef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) - #endif - #ifndef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) - #endif -#endif -#if !defined(CYTHON_FAST_PYCCALL) -#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) -#endif -#if CYTHON_USE_PYLONG_INTERNALS - #include "longintrepr.h" - #undef SHIFT - #undef BASE - #undef MASK - #ifdef SIZEOF_VOID_P - enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; - #endif -#endif -#ifndef __has_attribute - #define __has_attribute(x) 0 -#endif -#ifndef __has_cpp_attribute - #define __has_cpp_attribute(x) 0 -#endif -#ifndef CYTHON_RESTRICT - #if defined(__GNUC__) - #define CYTHON_RESTRICT __restrict__ - #elif defined(_MSC_VER) && _MSC_VER >= 1400 - #define CYTHON_RESTRICT __restrict - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_RESTRICT restrict - #else - #define CYTHON_RESTRICT - #endif -#endif -#ifndef CYTHON_UNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -#endif -#ifndef CYTHON_MAYBE_UNUSED_VAR -# if defined(__cplusplus) - template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } -# else -# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) -# endif -#endif -#ifndef CYTHON_NCP_UNUSED -# if CYTHON_COMPILING_IN_CPYTHON -# define CYTHON_NCP_UNUSED -# else -# define CYTHON_NCP_UNUSED CYTHON_UNUSED -# endif -#endif -#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) -#ifdef _MSC_VER - #ifndef _MSC_STDINT_H_ - #if _MSC_VER < 1300 - typedef unsigned char uint8_t; - typedef unsigned int uint32_t; - #else - typedef unsigned __int8 uint8_t; - typedef unsigned __int32 uint32_t; - #endif - #endif -#else - #include -#endif -#ifndef CYTHON_FALLTHROUGH - #if defined(__cplusplus) && __cplusplus >= 201103L - #if __has_cpp_attribute(fallthrough) - #define CYTHON_FALLTHROUGH [[fallthrough]] - #elif __has_cpp_attribute(clang::fallthrough) - #define CYTHON_FALLTHROUGH [[clang::fallthrough]] - #elif __has_cpp_attribute(gnu::fallthrough) - #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] - #endif - #endif - #ifndef CYTHON_FALLTHROUGH - #if __has_attribute(fallthrough) - #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) - #else - #define CYTHON_FALLTHROUGH - #endif - #endif - #if defined(__clang__ ) && defined(__apple_build_version__) - #if __apple_build_version__ < 7000000 - #undef CYTHON_FALLTHROUGH - #define CYTHON_FALLTHROUGH - #endif - #endif -#endif - -#ifndef CYTHON_INLINE - #if defined(__clang__) - #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) - #elif defined(__GNUC__) - #define CYTHON_INLINE __inline__ - #elif defined(_MSC_VER) - #define CYTHON_INLINE __inline - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_INLINE inline - #else - #define CYTHON_INLINE - #endif -#endif - -#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) - #define Py_OptimizeFlag 0 -#endif -#define __PYX_BUILD_PY_SSIZE_T "n" -#define CYTHON_FORMAT_SSIZE_T "z" -#if PY_MAJOR_VERSION < 3 - #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) - #define __Pyx_DefaultClassType PyClass_Type -#else - #define __Pyx_BUILTIN_MODULE_NAME "builtins" -#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#else - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#endif - #define __Pyx_DefaultClassType PyType_Type -#endif -#ifndef Py_TPFLAGS_CHECKTYPES - #define Py_TPFLAGS_CHECKTYPES 0 -#endif -#ifndef Py_TPFLAGS_HAVE_INDEX - #define Py_TPFLAGS_HAVE_INDEX 0 -#endif -#ifndef Py_TPFLAGS_HAVE_NEWBUFFER - #define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif -#ifndef Py_TPFLAGS_HAVE_FINALIZE - #define Py_TPFLAGS_HAVE_FINALIZE 0 -#endif -#ifndef METH_STACKLESS - #define METH_STACKLESS 0 -#endif -#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) - #ifndef METH_FASTCALL - #define METH_FASTCALL 0x80 - #endif - typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); - typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, - Py_ssize_t nargs, PyObject *kwnames); -#else - #define __Pyx_PyCFunctionFast _PyCFunctionFast - #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords -#endif -#if CYTHON_FAST_PYCCALL -#define __Pyx_PyFastCFunction_Check(func)\ - ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) -#else -#define __Pyx_PyFastCFunction_Check(func) 0 -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) - #define PyObject_Malloc(s) PyMem_Malloc(s) - #define PyObject_Free(p) PyMem_Free(p) - #define PyObject_Realloc(p) PyMem_Realloc(p) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 - #define PyMem_RawMalloc(n) PyMem_Malloc(n) - #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) - #define PyMem_RawFree(p) PyMem_Free(p) -#endif -#if CYTHON_COMPILING_IN_PYSTON - #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) -#else - #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) -#endif -#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#elif PY_VERSION_HEX >= 0x03060000 - #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() -#elif PY_VERSION_HEX >= 0x03000000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#else - #define __Pyx_PyThreadState_Current _PyThreadState_Current -#endif -#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) -#include "pythread.h" -#define Py_tss_NEEDS_INIT 0 -typedef int Py_tss_t; -static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { - *key = PyThread_create_key(); - return 0; -} -static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { - Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); - *key = Py_tss_NEEDS_INIT; - return key; -} -static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { - PyObject_Free(key); -} -static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { - return *key != Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { - PyThread_delete_key(*key); - *key = Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { - return PyThread_set_key_value(*key, value); -} -static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { - return PyThread_get_key_value(*key); -} -#endif -#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) -#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) -#else -#define __Pyx_PyDict_NewPresized(n) PyDict_New() -#endif -#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION - #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) -#else - #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS -#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) -#else -#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) -#endif -#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) - #define CYTHON_PEP393_ENABLED 1 - #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ - 0 : _PyUnicode_Ready((PyObject *)(op))) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) - #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) - #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) - #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) - #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) - #endif -#else - #define CYTHON_PEP393_ENABLED 0 - #define PyUnicode_1BYTE_KIND 1 - #define PyUnicode_2BYTE_KIND 2 - #define PyUnicode_4BYTE_KIND 4 - #define __Pyx_PyUnicode_READY(op) (0) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) - #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) - #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) - #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) -#endif -#if CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) -#else - #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ - PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) - #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) - #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) - #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) -#endif -#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) -#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) -#else - #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) -#endif -#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) - #define PyObject_ASCII(o) PyObject_Repr(o) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBaseString_Type PyUnicode_Type - #define PyStringObject PyUnicodeObject - #define PyString_Type PyUnicode_Type - #define PyString_Check PyUnicode_Check - #define PyString_CheckExact PyUnicode_CheckExact -#ifndef PyObject_Unicode - #define PyObject_Unicode PyObject_Str -#endif -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) - #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) -#else - #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) - #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) -#endif -#ifndef PySet_CheckExact - #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) -#endif -#if PY_VERSION_HEX >= 0x030900A4 - #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) -#else - #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) -#endif -#if CYTHON_ASSUME_SAFE_MACROS - #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) -#else - #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyIntObject PyLongObject - #define PyInt_Type PyLong_Type - #define PyInt_Check(op) PyLong_Check(op) - #define PyInt_CheckExact(op) PyLong_CheckExact(op) - #define PyInt_FromString PyLong_FromString - #define PyInt_FromUnicode PyLong_FromUnicode - #define PyInt_FromLong PyLong_FromLong - #define PyInt_FromSize_t PyLong_FromSize_t - #define PyInt_FromSsize_t PyLong_FromSsize_t - #define PyInt_AsLong PyLong_AsLong - #define PyInt_AS_LONG PyLong_AS_LONG - #define PyInt_AsSsize_t PyLong_AsSsize_t - #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask - #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask - #define PyNumber_Int PyNumber_Long -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBoolObject PyLongObject -#endif -#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY - #ifndef PyUnicode_InternFromString - #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) - #endif -#endif -#if PY_VERSION_HEX < 0x030200A4 - typedef long Py_hash_t; - #define __Pyx_PyInt_FromHash_t PyInt_FromLong - #define __Pyx_PyInt_AsHash_t PyInt_AsLong -#else - #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t - #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) -#else - #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) -#endif -#if CYTHON_USE_ASYNC_SLOTS - #if PY_VERSION_HEX >= 0x030500B1 - #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods - #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) - #else - #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) - #endif -#else - #define __Pyx_PyType_AsAsync(obj) NULL -#endif -#ifndef __Pyx_PyAsyncMethodsStruct - typedef struct { - unaryfunc am_await; - unaryfunc am_aiter; - unaryfunc am_anext; - } __Pyx_PyAsyncMethodsStruct; -#endif - -#if defined(WIN32) || defined(MS_WINDOWS) - #define _USE_MATH_DEFINES -#endif -#include -#ifdef NAN -#define __PYX_NAN() ((float) NAN) -#else -static CYTHON_INLINE float __PYX_NAN() { - float value; - memset(&value, 0xFF, sizeof(value)); - return value; -} -#endif -#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) -#define __Pyx_truncl trunc -#else -#define __Pyx_truncl truncl -#endif - -#define __PYX_MARK_ERR_POS(f_index, lineno) \ - { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } -#define __PYX_ERR(f_index, lineno, Ln_error) \ - { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } - -#ifndef __PYX_EXTERN_C - #ifdef __cplusplus - #define __PYX_EXTERN_C extern "C" - #else - #define __PYX_EXTERN_C extern - #endif -#endif - -#define __PYX_HAVE__easyCore__Utils__coord_cython -#define __PYX_HAVE_API__easyCore__Utils__coord_cython -/* Early includes */ -#include -#include -#include -#include -#include "numpy/arrayobject.h" -#include "numpy/ufuncobject.h" - - /* NumPy API declarations from "numpy/__init__.pxd" */ - -#include "pythread.h" -#include "pystate.h" -#ifdef _OPENMP -#include -#endif /* _OPENMP */ - -#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) -#define CYTHON_WITHOUT_ASSERTIONS -#endif - -typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; - const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; - -#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) -#define __PYX_DEFAULT_STRING_ENCODING "" -#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString -#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#define __Pyx_uchar_cast(c) ((unsigned char)c) -#define __Pyx_long_cast(x) ((long)x) -#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ - (sizeof(type) < sizeof(Py_ssize_t)) ||\ - (sizeof(type) > sizeof(Py_ssize_t) &&\ - likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX) &&\ - (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ - v == (type)PY_SSIZE_T_MIN))) ||\ - (sizeof(type) == sizeof(Py_ssize_t) &&\ - (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX))) ) -static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { - return (size_t) i < (size_t) limit; -} -#if defined (__cplusplus) && __cplusplus >= 201103L - #include - #define __Pyx_sst_abs(value) std::abs(value) -#elif SIZEOF_INT >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) abs(value) -#elif SIZEOF_LONG >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) labs(value) -#elif defined (_MSC_VER) - #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) -#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define __Pyx_sst_abs(value) llabs(value) -#elif defined (__GNUC__) - #define __Pyx_sst_abs(value) __builtin_llabs(value) -#else - #define __Pyx_sst_abs(value) ((value<0) ? -value : value) -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); -#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) -#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) -#define __Pyx_PyBytes_FromString PyBytes_FromString -#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); -#if PY_MAJOR_VERSION < 3 - #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#else - #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize -#endif -#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) -#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) -#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) -#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) -#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode -#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode -#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) -#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); -#define __Pyx_PySequence_Tuple(obj)\ - (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); -#if CYTHON_ASSUME_SAFE_MACROS -#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) -#else -#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) -#endif -#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) -#if PY_MAJOR_VERSION >= 3 -#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) -#else -#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) -#endif -#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII -static int __Pyx_sys_getdefaultencoding_not_ascii; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - PyObject* ascii_chars_u = NULL; - PyObject* ascii_chars_b = NULL; - const char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - if (strcmp(default_encoding_c, "ascii") == 0) { - __Pyx_sys_getdefaultencoding_not_ascii = 0; - } else { - char ascii_chars[128]; - int c; - for (c = 0; c < 128; c++) { - ascii_chars[c] = c; - } - __Pyx_sys_getdefaultencoding_not_ascii = 1; - ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); - if (!ascii_chars_u) goto bad; - ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); - if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { - PyErr_Format( - PyExc_ValueError, - "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", - default_encoding_c); - goto bad; - } - Py_DECREF(ascii_chars_u); - Py_DECREF(ascii_chars_b); - } - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - Py_XDECREF(ascii_chars_u); - Py_XDECREF(ascii_chars_b); - return -1; -} -#endif -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) -#else -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -static char* __PYX_DEFAULT_STRING_ENCODING; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); - if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; - strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - return -1; -} -#endif -#endif - - -/* Test for GCC > 2.95 */ -#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) - #define likely(x) __builtin_expect(!!(x), 1) - #define unlikely(x) __builtin_expect(!!(x), 0) -#else /* !__GNUC__ or GCC < 2.95 */ - #define likely(x) (x) - #define unlikely(x) (x) -#endif /* __GNUC__ */ -static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } - -static PyObject *__pyx_m = NULL; -static PyObject *__pyx_d; -static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime = NULL; -static PyObject *__pyx_empty_tuple; -static PyObject *__pyx_empty_bytes; -static PyObject *__pyx_empty_unicode; -static int __pyx_lineno; -static int __pyx_clineno = 0; -static const char * __pyx_cfilenm= __FILE__; -static const char *__pyx_filename; - -/* Header.proto */ -#if !defined(CYTHON_CCOMPLEX) - #if defined(__cplusplus) - #define CYTHON_CCOMPLEX 1 - #elif defined(_Complex_I) - #define CYTHON_CCOMPLEX 1 - #else - #define CYTHON_CCOMPLEX 0 - #endif -#endif -#if CYTHON_CCOMPLEX - #ifdef __cplusplus - #include - #else - #include - #endif -#endif -#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) - #undef _Complex_I - #define _Complex_I 1.0fj -#endif - - -static const char *__pyx_f[] = { - "easyCore/Utils/coord_cython.pyx", - "__init__.pxd", - "stringsource", - "type.pxd", -}; -/* MemviewSliceStruct.proto */ -struct __pyx_memoryview_obj; -typedef struct { - struct __pyx_memoryview_obj *memview; - char *data; - Py_ssize_t shape[8]; - Py_ssize_t strides[8]; - Py_ssize_t suboffsets[8]; -} __Pyx_memviewslice; -#define __Pyx_MemoryView_Len(m) (m.shape[0]) - -/* Atomics.proto */ -#include -#ifndef CYTHON_ATOMICS - #define CYTHON_ATOMICS 1 -#endif -#define __pyx_atomic_int_type int -#if CYTHON_ATOMICS && __GNUC__ >= 4 && (__GNUC_MINOR__ > 1 ||\ - (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL >= 2)) &&\ - !defined(__i386__) - #define __pyx_atomic_incr_aligned(value, lock) __sync_fetch_and_add(value, 1) - #define __pyx_atomic_decr_aligned(value, lock) __sync_fetch_and_sub(value, 1) - #ifdef __PYX_DEBUG_ATOMICS - #warning "Using GNU atomics" - #endif -#elif CYTHON_ATOMICS && defined(_MSC_VER) && 0 - #include - #undef __pyx_atomic_int_type - #define __pyx_atomic_int_type LONG - #define __pyx_atomic_incr_aligned(value, lock) InterlockedIncrement(value) - #define __pyx_atomic_decr_aligned(value, lock) InterlockedDecrement(value) - #ifdef __PYX_DEBUG_ATOMICS - #pragma message ("Using MSVC atomics") - #endif -#elif CYTHON_ATOMICS && (defined(__ICC) || defined(__INTEL_COMPILER)) && 0 - #define __pyx_atomic_incr_aligned(value, lock) _InterlockedIncrement(value) - #define __pyx_atomic_decr_aligned(value, lock) _InterlockedDecrement(value) - #ifdef __PYX_DEBUG_ATOMICS - #warning "Using Intel atomics" - #endif -#else - #undef CYTHON_ATOMICS - #define CYTHON_ATOMICS 0 - #ifdef __PYX_DEBUG_ATOMICS - #warning "Not using atomics" - #endif -#endif -typedef volatile __pyx_atomic_int_type __pyx_atomic_int; -#if CYTHON_ATOMICS - #define __pyx_add_acquisition_count(memview)\ - __pyx_atomic_incr_aligned(__pyx_get_slice_count_pointer(memview), memview->lock) - #define __pyx_sub_acquisition_count(memview)\ - __pyx_atomic_decr_aligned(__pyx_get_slice_count_pointer(memview), memview->lock) -#else - #define __pyx_add_acquisition_count(memview)\ - __pyx_add_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) - #define __pyx_sub_acquisition_count(memview)\ - __pyx_sub_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) -#endif - -/* ForceInitThreads.proto */ -#ifndef __PYX_FORCE_INIT_THREADS - #define __PYX_FORCE_INIT_THREADS 0 -#endif - -/* NoFastGil.proto */ -#define __Pyx_PyGILState_Ensure PyGILState_Ensure -#define __Pyx_PyGILState_Release PyGILState_Release -#define __Pyx_FastGIL_Remember() -#define __Pyx_FastGIL_Forget() -#define __Pyx_FastGilFuncInit() - -/* BufferFormatStructs.proto */ -#define IS_UNSIGNED(type) (((type) -1) > 0) -struct __Pyx_StructField_; -#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) -typedef struct { - const char* name; - struct __Pyx_StructField_* fields; - size_t size; - size_t arraysize[8]; - int ndim; - char typegroup; - char is_unsigned; - int flags; -} __Pyx_TypeInfo; -typedef struct __Pyx_StructField_ { - __Pyx_TypeInfo* type; - const char* name; - size_t offset; -} __Pyx_StructField; -typedef struct { - __Pyx_StructField* field; - size_t parent_offset; -} __Pyx_BufFmt_StackElem; -typedef struct { - __Pyx_StructField root; - __Pyx_BufFmt_StackElem* head; - size_t fmt_offset; - size_t new_count, enc_count; - size_t struct_alignment; - int is_complex; - char enc_type; - char new_packmode; - char enc_packmode; - char is_valid_array; -} __Pyx_BufFmt_Context; - - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":697 - * # in Cython to enable them only on the right systems. - * - * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< - * ctypedef npy_int16 int16_t - * ctypedef npy_int32 int32_t - */ -typedef npy_int8 __pyx_t_5numpy_int8_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":698 - * - * ctypedef npy_int8 int8_t - * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< - * ctypedef npy_int32 int32_t - * ctypedef npy_int64 int64_t - */ -typedef npy_int16 __pyx_t_5numpy_int16_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":699 - * ctypedef npy_int8 int8_t - * ctypedef npy_int16 int16_t - * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< - * ctypedef npy_int64 int64_t - * #ctypedef npy_int96 int96_t - */ -typedef npy_int32 __pyx_t_5numpy_int32_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":700 - * ctypedef npy_int16 int16_t - * ctypedef npy_int32 int32_t - * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< - * #ctypedef npy_int96 int96_t - * #ctypedef npy_int128 int128_t - */ -typedef npy_int64 __pyx_t_5numpy_int64_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":704 - * #ctypedef npy_int128 int128_t - * - * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< - * ctypedef npy_uint16 uint16_t - * ctypedef npy_uint32 uint32_t - */ -typedef npy_uint8 __pyx_t_5numpy_uint8_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":705 - * - * ctypedef npy_uint8 uint8_t - * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< - * ctypedef npy_uint32 uint32_t - * ctypedef npy_uint64 uint64_t - */ -typedef npy_uint16 __pyx_t_5numpy_uint16_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":706 - * ctypedef npy_uint8 uint8_t - * ctypedef npy_uint16 uint16_t - * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< - * ctypedef npy_uint64 uint64_t - * #ctypedef npy_uint96 uint96_t - */ -typedef npy_uint32 __pyx_t_5numpy_uint32_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":707 - * ctypedef npy_uint16 uint16_t - * ctypedef npy_uint32 uint32_t - * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< - * #ctypedef npy_uint96 uint96_t - * #ctypedef npy_uint128 uint128_t - */ -typedef npy_uint64 __pyx_t_5numpy_uint64_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":711 - * #ctypedef npy_uint128 uint128_t - * - * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< - * ctypedef npy_float64 float64_t - * #ctypedef npy_float80 float80_t - */ -typedef npy_float32 __pyx_t_5numpy_float32_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":712 - * - * ctypedef npy_float32 float32_t - * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< - * #ctypedef npy_float80 float80_t - * #ctypedef npy_float128 float128_t - */ -typedef npy_float64 __pyx_t_5numpy_float64_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":721 - * # The int types are mapped a bit surprising -- - * # numpy.int corresponds to 'l' and numpy.long to 'q' - * ctypedef npy_long int_t # <<<<<<<<<<<<<< - * ctypedef npy_longlong long_t - * ctypedef npy_longlong longlong_t - */ -typedef npy_long __pyx_t_5numpy_int_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":722 - * # numpy.int corresponds to 'l' and numpy.long to 'q' - * ctypedef npy_long int_t - * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< - * ctypedef npy_longlong longlong_t - * - */ -typedef npy_longlong __pyx_t_5numpy_long_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":723 - * ctypedef npy_long int_t - * ctypedef npy_longlong long_t - * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< - * - * ctypedef npy_ulong uint_t - */ -typedef npy_longlong __pyx_t_5numpy_longlong_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":725 - * ctypedef npy_longlong longlong_t - * - * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< - * ctypedef npy_ulonglong ulong_t - * ctypedef npy_ulonglong ulonglong_t - */ -typedef npy_ulong __pyx_t_5numpy_uint_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":726 - * - * ctypedef npy_ulong uint_t - * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< - * ctypedef npy_ulonglong ulonglong_t - * - */ -typedef npy_ulonglong __pyx_t_5numpy_ulong_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":727 - * ctypedef npy_ulong uint_t - * ctypedef npy_ulonglong ulong_t - * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< - * - * ctypedef npy_intp intp_t - */ -typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":729 - * ctypedef npy_ulonglong ulonglong_t - * - * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< - * ctypedef npy_uintp uintp_t - * - */ -typedef npy_intp __pyx_t_5numpy_intp_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":730 - * - * ctypedef npy_intp intp_t - * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< - * - * ctypedef npy_double float_t - */ -typedef npy_uintp __pyx_t_5numpy_uintp_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":732 - * ctypedef npy_uintp uintp_t - * - * ctypedef npy_double float_t # <<<<<<<<<<<<<< - * ctypedef npy_double double_t - * ctypedef npy_longdouble longdouble_t - */ -typedef npy_double __pyx_t_5numpy_float_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":733 - * - * ctypedef npy_double float_t - * ctypedef npy_double double_t # <<<<<<<<<<<<<< - * ctypedef npy_longdouble longdouble_t - * - */ -typedef npy_double __pyx_t_5numpy_double_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":734 - * ctypedef npy_double float_t - * ctypedef npy_double double_t - * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< - * - * ctypedef npy_cfloat cfloat_t - */ -typedef npy_longdouble __pyx_t_5numpy_longdouble_t; -/* Declarations.proto */ -#if CYTHON_CCOMPLEX - #ifdef __cplusplus - typedef ::std::complex< float > __pyx_t_float_complex; - #else - typedef float _Complex __pyx_t_float_complex; - #endif -#else - typedef struct { float real, imag; } __pyx_t_float_complex; -#endif -static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); - -/* Declarations.proto */ -#if CYTHON_CCOMPLEX - #ifdef __cplusplus - typedef ::std::complex< double > __pyx_t_double_complex; - #else - typedef double _Complex __pyx_t_double_complex; - #endif -#else - typedef struct { double real, imag; } __pyx_t_double_complex; -#endif -static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); - - -/*--- Type declarations ---*/ -struct __pyx_array_obj; -struct __pyx_MemviewEnum_obj; -struct __pyx_memoryview_obj; -struct __pyx_memoryviewslice_obj; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":736 - * ctypedef npy_longdouble longdouble_t - * - * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< - * ctypedef npy_cdouble cdouble_t - * ctypedef npy_clongdouble clongdouble_t - */ -typedef npy_cfloat __pyx_t_5numpy_cfloat_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":737 - * - * ctypedef npy_cfloat cfloat_t - * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< - * ctypedef npy_clongdouble clongdouble_t - * - */ -typedef npy_cdouble __pyx_t_5numpy_cdouble_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":738 - * ctypedef npy_cfloat cfloat_t - * ctypedef npy_cdouble cdouble_t - * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< - * - * ctypedef npy_cdouble complex_t - */ -typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":740 - * ctypedef npy_clongdouble clongdouble_t - * - * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< - * - * cdef inline object PyArray_MultiIterNew1(a): - */ -typedef npy_cdouble __pyx_t_5numpy_complex_t; - -/* "View.MemoryView":105 - * - * @cname("__pyx_array") - * cdef class array: # <<<<<<<<<<<<<< - * - * cdef: - */ -struct __pyx_array_obj { - PyObject_HEAD - struct __pyx_vtabstruct_array *__pyx_vtab; - char *data; - Py_ssize_t len; - char *format; - int ndim; - Py_ssize_t *_shape; - Py_ssize_t *_strides; - Py_ssize_t itemsize; - PyObject *mode; - PyObject *_format; - void (*callback_free_data)(void *); - int free_data; - int dtype_is_object; -}; - - -/* "View.MemoryView":279 - * - * @cname('__pyx_MemviewEnum') - * cdef class Enum(object): # <<<<<<<<<<<<<< - * cdef object name - * def __init__(self, name): - */ -struct __pyx_MemviewEnum_obj { - PyObject_HEAD - PyObject *name; -}; - - -/* "View.MemoryView":330 - * - * @cname('__pyx_memoryview') - * cdef class memoryview(object): # <<<<<<<<<<<<<< - * - * cdef object obj - */ -struct __pyx_memoryview_obj { - PyObject_HEAD - struct __pyx_vtabstruct_memoryview *__pyx_vtab; - PyObject *obj; - PyObject *_size; - PyObject *_array_interface; - PyThread_type_lock lock; - __pyx_atomic_int acquisition_count[2]; - __pyx_atomic_int *acquisition_count_aligned_p; - Py_buffer view; - int flags; - int dtype_is_object; - __Pyx_TypeInfo *typeinfo; -}; - - -/* "View.MemoryView":965 - * - * @cname('__pyx_memoryviewslice') - * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< - * "Internal class for passing memoryview slices to Python" - * - */ -struct __pyx_memoryviewslice_obj { - struct __pyx_memoryview_obj __pyx_base; - __Pyx_memviewslice from_slice; - PyObject *from_object; - PyObject *(*to_object_func)(char *); - int (*to_dtype_func)(char *, PyObject *); -}; - - - -/* "View.MemoryView":105 - * - * @cname("__pyx_array") - * cdef class array: # <<<<<<<<<<<<<< - * - * cdef: - */ - -struct __pyx_vtabstruct_array { - PyObject *(*get_memview)(struct __pyx_array_obj *); -}; -static struct __pyx_vtabstruct_array *__pyx_vtabptr_array; - - -/* "View.MemoryView":330 - * - * @cname('__pyx_memoryview') - * cdef class memoryview(object): # <<<<<<<<<<<<<< - * - * cdef object obj - */ - -struct __pyx_vtabstruct_memoryview { - char *(*get_item_pointer)(struct __pyx_memoryview_obj *, PyObject *); - PyObject *(*is_slice)(struct __pyx_memoryview_obj *, PyObject *); - PyObject *(*setitem_slice_assignment)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); - PyObject *(*setitem_slice_assign_scalar)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *); - PyObject *(*setitem_indexed)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); - PyObject *(*convert_item_to_object)(struct __pyx_memoryview_obj *, char *); - PyObject *(*assign_item_from_object)(struct __pyx_memoryview_obj *, char *, PyObject *); -}; -static struct __pyx_vtabstruct_memoryview *__pyx_vtabptr_memoryview; - - -/* "View.MemoryView":965 - * - * @cname('__pyx_memoryviewslice') - * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< - * "Internal class for passing memoryview slices to Python" - * - */ - -struct __pyx_vtabstruct__memoryviewslice { - struct __pyx_vtabstruct_memoryview __pyx_base; -}; -static struct __pyx_vtabstruct__memoryviewslice *__pyx_vtabptr__memoryviewslice; - -/* --- Runtime support code (head) --- */ -/* Refnanny.proto */ -#ifndef CYTHON_REFNANNY - #define CYTHON_REFNANNY 0 -#endif -#if CYTHON_REFNANNY - typedef struct { - void (*INCREF)(void*, PyObject*, int); - void (*DECREF)(void*, PyObject*, int); - void (*GOTREF)(void*, PyObject*, int); - void (*GIVEREF)(void*, PyObject*, int); - void* (*SetupContext)(const char*, int, const char*); - void (*FinishContext)(void**); - } __Pyx_RefNannyAPIStruct; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); - #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; -#ifdef WITH_THREAD - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - if (acquire_gil) {\ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ - PyGILState_Release(__pyx_gilstate_save);\ - } else {\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ - } -#else - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) -#endif - #define __Pyx_RefNannyFinishContext()\ - __Pyx_RefNanny->FinishContext(&__pyx_refnanny) - #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) - #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) - #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) - #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) -#else - #define __Pyx_RefNannyDeclarations - #define __Pyx_RefNannySetupContext(name, acquire_gil) - #define __Pyx_RefNannyFinishContext() - #define __Pyx_INCREF(r) Py_INCREF(r) - #define __Pyx_DECREF(r) Py_DECREF(r) - #define __Pyx_GOTREF(r) - #define __Pyx_GIVEREF(r) - #define __Pyx_XINCREF(r) Py_XINCREF(r) - #define __Pyx_XDECREF(r) Py_XDECREF(r) - #define __Pyx_XGOTREF(r) - #define __Pyx_XGIVEREF(r) -#endif -#define __Pyx_XDECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_XDECREF(tmp);\ - } while (0) -#define __Pyx_DECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_DECREF(tmp);\ - } while (0) -#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) -#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) - -/* PyObjectGetAttrStr.proto */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) -#endif - -/* GetBuiltinName.proto */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name); - -/* None.proto */ -static CYTHON_INLINE __pyx_t_5numpy_float_t __Pyx_mod___pyx_t_5numpy_float_t(__pyx_t_5numpy_float_t, __pyx_t_5numpy_float_t); - -/* RaiseArgTupleInvalid.proto */ -static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, - Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); - -/* RaiseDoubleKeywords.proto */ -static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); - -/* ParseKeywords.proto */ -static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ - PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ - const char* function_name); - -/* PyDictVersioning.proto */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) -#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ - (version_var) = __PYX_GET_DICT_VERSION(dict);\ - (cache_var) = (value); -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ - (VAR) = __pyx_dict_cached_value;\ - } else {\ - (VAR) = __pyx_dict_cached_value = (LOOKUP);\ - __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ - }\ -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); -#else -#define __PYX_GET_DICT_VERSION(dict) (0) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); -#endif - -/* GetModuleGlobalName.proto */ -#if CYTHON_USE_DICT_VERSIONS -#define __Pyx_GetModuleGlobalName(var, name) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ - (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ - __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} -#define __Pyx_GetModuleGlobalNameUncached(var, name) {\ - PY_UINT64_T __pyx_dict_version;\ - PyObject *__pyx_dict_cached_value;\ - (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); -#else -#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) -#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); -#endif - -/* PyFunctionFastCall.proto */ -#if CYTHON_FAST_PYCALL -#define __Pyx_PyFunction_FastCall(func, args, nargs)\ - __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); -#else -#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) -#endif -#define __Pyx_BUILD_ASSERT_EXPR(cond)\ - (sizeof(char [1 - 2*!(cond)]) - 1) -#ifndef Py_MEMBER_SIZE -#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) -#endif - static size_t __pyx_pyframe_localsplus_offset = 0; - #include "frameobject.h" - #define __Pxy_PyFrame_Initialize_Offsets()\ - ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ - (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) - #define __Pyx_PyFrame_GetLocalsplus(frame)\ - (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) -#endif - -/* PyCFunctionFastCall.proto */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); -#else -#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) -#endif - -/* PyObjectCall.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); -#else -#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) -#endif - -/* RaiseTooManyValuesToUnpack.proto */ -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); - -/* RaiseNeedMoreValuesToUnpack.proto */ -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); - -/* IterFinish.proto */ -static CYTHON_INLINE int __Pyx_IterFinish(void); - -/* UnpackItemEndCheck.proto */ -static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); - -/* PyObjectCall2Args.proto */ -static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); - -/* PyObjectCallMethO.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); -#endif - -/* PyObjectCallOneArg.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); - -/* MemviewSliceInit.proto */ -#define __Pyx_BUF_MAX_NDIMS %(BUF_MAX_NDIMS)d -#define __Pyx_MEMVIEW_DIRECT 1 -#define __Pyx_MEMVIEW_PTR 2 -#define __Pyx_MEMVIEW_FULL 4 -#define __Pyx_MEMVIEW_CONTIG 8 -#define __Pyx_MEMVIEW_STRIDED 16 -#define __Pyx_MEMVIEW_FOLLOW 32 -#define __Pyx_IS_C_CONTIG 1 -#define __Pyx_IS_F_CONTIG 2 -static int __Pyx_init_memviewslice( - struct __pyx_memoryview_obj *memview, - int ndim, - __Pyx_memviewslice *memviewslice, - int memview_is_new_reference); -static CYTHON_INLINE int __pyx_add_acquisition_count_locked( - __pyx_atomic_int *acquisition_count, PyThread_type_lock lock); -static CYTHON_INLINE int __pyx_sub_acquisition_count_locked( - __pyx_atomic_int *acquisition_count, PyThread_type_lock lock); -#define __pyx_get_slice_count_pointer(memview) (memview->acquisition_count_aligned_p) -#define __pyx_get_slice_count(memview) (*__pyx_get_slice_count_pointer(memview)) -#define __PYX_INC_MEMVIEW(slice, have_gil) __Pyx_INC_MEMVIEW(slice, have_gil, __LINE__) -#define __PYX_XDEC_MEMVIEW(slice, have_gil) __Pyx_XDEC_MEMVIEW(slice, have_gil, __LINE__) -static CYTHON_INLINE void __Pyx_INC_MEMVIEW(__Pyx_memviewslice *, int, int); -static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *, int, int); - -/* PyIntBinop.proto */ -#if !CYTHON_COMPILING_IN_PYPY -static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); -#else -#define __Pyx_PyInt_SubtractObjC(op1, op2, intval, inplace, zerodivision_check)\ - (inplace ? PyNumber_InPlaceSubtract(op1, op2) : PyNumber_Subtract(op1, op2)) -#endif - -/* PyThreadStateGet.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; -#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; -#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type -#else -#define __Pyx_PyThreadState_declare -#define __Pyx_PyThreadState_assign -#define __Pyx_PyErr_Occurred() PyErr_Occurred() -#endif - -/* PyErrFetchRestore.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) -#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) -#else -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#endif -#else -#define __Pyx_PyErr_Clear() PyErr_Clear() -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) -#endif - -/* RaiseException.proto */ -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); - -/* DictGetItem.proto */ -#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY -static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); -#define __Pyx_PyObject_Dict_GetItem(obj, name)\ - (likely(PyDict_CheckExact(obj)) ?\ - __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) -#else -#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) -#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) -#endif - -/* RaiseNoneIterError.proto */ -static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); - -/* ExtTypeTest.proto */ -static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); - -/* GetTopmostException.proto */ -#if CYTHON_USE_EXC_INFO_STACK -static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); -#endif - -/* SaveResetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -#else -#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) -#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) -#endif - -/* PyErrExceptionMatches.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) -static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); -#else -#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) -#endif - -/* GetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* ArgTypeTest.proto */ -#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ - ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\ - __Pyx__ArgTypeTest(obj, type, name, exact)) -static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); - -/* IncludeStringH.proto */ -#include - -/* BytesEquals.proto */ -static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); - -/* UnicodeEquals.proto */ -static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); - -/* StrEquals.proto */ -#if PY_MAJOR_VERSION >= 3 -#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals -#else -#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals -#endif - -/* None.proto */ -static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t); - -/* UnaryNegOverflows.proto */ -#define UNARY_NEG_WOULD_OVERFLOW(x)\ - (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x))) - -static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ -static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *); /*proto*/ -/* GetAttr.proto */ -static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); - -/* GetItemInt.proto */ -#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ - (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ - __Pyx_GetItemInt_Generic(o, to_py_func(i)))) -#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ - (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck); -#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ - (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck); -static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, - int is_list, int wraparound, int boundscheck); - -/* ObjectGetItem.proto */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key); -#else -#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) -#endif - -/* decode_c_string_utf16.proto */ -static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors) { - int byteorder = 0; - return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); -} -static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16LE(const char *s, Py_ssize_t size, const char *errors) { - int byteorder = -1; - return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); -} -static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16BE(const char *s, Py_ssize_t size, const char *errors) { - int byteorder = 1; - return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); -} - -/* decode_c_string.proto */ -static CYTHON_INLINE PyObject* __Pyx_decode_c_string( - const char* cstring, Py_ssize_t start, Py_ssize_t stop, - const char* encoding, const char* errors, - PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); - -/* GetAttr3.proto */ -static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); - -/* SwapException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* Import.proto */ -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); - -/* FastTypeChecks.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); -#else -#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) -#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) -#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) -#endif -#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) - -static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ -/* ListCompAppend.proto */ -#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS -static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { - PyListObject* L = (PyListObject*) list; - Py_ssize_t len = Py_SIZE(list); - if (likely(L->allocated > len)) { - Py_INCREF(x); - PyList_SET_ITEM(list, len, x); - __Pyx_SET_SIZE(list, len + 1); - return 0; - } - return PyList_Append(list, x); -} -#else -#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) -#endif - -/* PyIntBinop.proto */ -#if !CYTHON_COMPILING_IN_PYPY -static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); -#else -#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace, zerodivision_check)\ - (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2)) -#endif - -/* ListExtend.proto */ -static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) { -#if CYTHON_COMPILING_IN_CPYTHON - PyObject* none = _PyList_Extend((PyListObject*)L, v); - if (unlikely(!none)) - return -1; - Py_DECREF(none); - return 0; -#else - return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v); -#endif -} - -/* ListAppend.proto */ -#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS -static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { - PyListObject* L = (PyListObject*) list; - Py_ssize_t len = Py_SIZE(list); - if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { - Py_INCREF(x); - PyList_SET_ITEM(list, len, x); - __Pyx_SET_SIZE(list, len + 1); - return 0; - } - return PyList_Append(list, x); -} -#else -#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) -#endif - -/* None.proto */ -static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); - -/* None.proto */ -static CYTHON_INLINE long __Pyx_div_long(long, long); - -/* ImportFrom.proto */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); - -/* HasAttr.proto */ -static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); - -/* StringJoin.proto */ -#if PY_MAJOR_VERSION < 3 -#define __Pyx_PyString_Join __Pyx_PyBytes_Join -#define __Pyx_PyBaseString_Join(s, v) (PyUnicode_CheckExact(s) ? PyUnicode_Join(s, v) : __Pyx_PyBytes_Join(s, v)) -#else -#define __Pyx_PyString_Join PyUnicode_Join -#define __Pyx_PyBaseString_Join PyUnicode_Join -#endif -#if CYTHON_COMPILING_IN_CPYTHON - #if PY_MAJOR_VERSION < 3 - #define __Pyx_PyBytes_Join _PyString_Join - #else - #define __Pyx_PyBytes_Join _PyBytes_Join - #endif -#else -static CYTHON_INLINE PyObject* __Pyx_PyBytes_Join(PyObject* sep, PyObject* values); -#endif - -/* PyObject_Unicode.proto */ -#if PY_MAJOR_VERSION >= 3 -#define __Pyx_PyObject_Unicode(obj)\ - (likely(PyUnicode_CheckExact(obj)) ? __Pyx_NewRef(obj) : PyObject_Str(obj)) -#else -#define __Pyx_PyObject_Unicode(obj)\ - (likely(PyUnicode_CheckExact(obj)) ? __Pyx_NewRef(obj) : PyObject_Unicode(obj)) -#endif - -/* PyObject_GenericGetAttrNoDict.proto */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr -#endif - -/* PyObject_GenericGetAttr.proto */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr -#endif - -/* SetVTable.proto */ -static int __Pyx_SetVtable(PyObject *dict, void *vtable); - -/* PyObjectGetAttrStrNoError.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); - -/* SetupReduce.proto */ -static int __Pyx_setup_reduce(PyObject* type_obj); - -/* TypeImport.proto */ -#ifndef __PYX_HAVE_RT_ImportType_proto -#define __PYX_HAVE_RT_ImportType_proto -enum __Pyx_ImportType_CheckSize { - __Pyx_ImportType_CheckSize_Error = 0, - __Pyx_ImportType_CheckSize_Warn = 1, - __Pyx_ImportType_CheckSize_Ignore = 2 -}; -static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); -#endif - -/* CLineInTraceback.proto */ -#ifdef CYTHON_CLINE_IN_TRACEBACK -#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) -#else -static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); -#endif - -/* CodeObjectCache.proto */ -typedef struct { - PyCodeObject* code_object; - int code_line; -} __Pyx_CodeObjectCacheEntry; -struct __Pyx_CodeObjectCache { - int count; - int max_count; - __Pyx_CodeObjectCacheEntry* entries; -}; -static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); -static PyCodeObject *__pyx_find_code_object(int code_line); -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); - -/* AddTraceback.proto */ -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename); - -#if PY_MAJOR_VERSION < 3 - static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); - static void __Pyx_ReleaseBuffer(Py_buffer *view); -#else - #define __Pyx_GetBuffer PyObject_GetBuffer - #define __Pyx_ReleaseBuffer PyBuffer_Release -#endif - - -/* BufferStructDeclare.proto */ -typedef struct { - Py_ssize_t shape, strides, suboffsets; -} __Pyx_Buf_DimInfo; -typedef struct { - size_t refcount; - Py_buffer pybuffer; -} __Pyx_Buffer; -typedef struct { - __Pyx_Buffer *rcbuffer; - char *data; - __Pyx_Buf_DimInfo diminfo[8]; -} __Pyx_LocalBuf_ND; - -/* MemviewSliceIsContig.proto */ -static int __pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim); - -/* OverlappingSlices.proto */ -static int __pyx_slices_overlap(__Pyx_memviewslice *slice1, - __Pyx_memviewslice *slice2, - int ndim, size_t itemsize); - -/* Capsule.proto */ -static CYTHON_INLINE PyObject *__pyx_capsule_create(void *p, const char *sig); - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); - -/* RealImag.proto */ -#if CYTHON_CCOMPLEX - #ifdef __cplusplus - #define __Pyx_CREAL(z) ((z).real()) - #define __Pyx_CIMAG(z) ((z).imag()) - #else - #define __Pyx_CREAL(z) (__real__(z)) - #define __Pyx_CIMAG(z) (__imag__(z)) - #endif -#else - #define __Pyx_CREAL(z) ((z).real) - #define __Pyx_CIMAG(z) ((z).imag) -#endif -#if defined(__cplusplus) && CYTHON_CCOMPLEX\ - && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) - #define __Pyx_SET_CREAL(z,x) ((z).real(x)) - #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) -#else - #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) - #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) -#endif - -/* Arithmetic.proto */ -#if CYTHON_CCOMPLEX - #define __Pyx_c_eq_float(a, b) ((a)==(b)) - #define __Pyx_c_sum_float(a, b) ((a)+(b)) - #define __Pyx_c_diff_float(a, b) ((a)-(b)) - #define __Pyx_c_prod_float(a, b) ((a)*(b)) - #define __Pyx_c_quot_float(a, b) ((a)/(b)) - #define __Pyx_c_neg_float(a) (-(a)) - #ifdef __cplusplus - #define __Pyx_c_is_zero_float(z) ((z)==(float)0) - #define __Pyx_c_conj_float(z) (::std::conj(z)) - #if 1 - #define __Pyx_c_abs_float(z) (::std::abs(z)) - #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) - #endif - #else - #define __Pyx_c_is_zero_float(z) ((z)==0) - #define __Pyx_c_conj_float(z) (conjf(z)) - #if 1 - #define __Pyx_c_abs_float(z) (cabsf(z)) - #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) - #endif - #endif -#else - static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); - static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); - #if 1 - static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); - #endif -#endif - -/* Arithmetic.proto */ -#if CYTHON_CCOMPLEX - #define __Pyx_c_eq_double(a, b) ((a)==(b)) - #define __Pyx_c_sum_double(a, b) ((a)+(b)) - #define __Pyx_c_diff_double(a, b) ((a)-(b)) - #define __Pyx_c_prod_double(a, b) ((a)*(b)) - #define __Pyx_c_quot_double(a, b) ((a)/(b)) - #define __Pyx_c_neg_double(a) (-(a)) - #ifdef __cplusplus - #define __Pyx_c_is_zero_double(z) ((z)==(double)0) - #define __Pyx_c_conj_double(z) (::std::conj(z)) - #if 1 - #define __Pyx_c_abs_double(z) (::std::abs(z)) - #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) - #endif - #else - #define __Pyx_c_is_zero_double(z) ((z)==0) - #define __Pyx_c_conj_double(z) (conj(z)) - #if 1 - #define __Pyx_c_abs_double(z) (cabs(z)) - #define __Pyx_c_pow_double(a, b) (cpow(a, b)) - #endif - #endif -#else - static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); - static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); - #if 1 - static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); - #endif -#endif - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value); - -/* MemviewSliceCopyTemplate.proto */ -static __Pyx_memviewslice -__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, - const char *mode, int ndim, - size_t sizeof_dtype, int contig_flag, - int dtype_is_object); - -/* TypeInfoToFormat.proto */ -struct __pyx_typeinfo_string { - char string[3]; -}; -static struct __pyx_typeinfo_string __Pyx_TypeInfoToFormat(__Pyx_TypeInfo *type); - -/* CIntFromPy.proto */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); - -/* CIntFromPy.proto */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); - -/* CIntFromPy.proto */ -static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); - -/* IsLittleEndian.proto */ -static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); - -/* BufferFormatCheck.proto */ -static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); -static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, - __Pyx_BufFmt_StackElem* stack, - __Pyx_TypeInfo* type); - -/* TypeInfoCompare.proto */ -static int __pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b); - -/* MemviewSliceValidateAndInit.proto */ -static int __Pyx_ValidateAndInit_memviewslice( - int *axes_specs, - int c_or_f_flag, - int buf_flags, - int ndim, - __Pyx_TypeInfo *dtype, - __Pyx_BufFmt_StackElem stack[], - __Pyx_memviewslice *memviewslice, - PyObject *original_obj); - -/* ObjectToMemviewSlice.proto */ -static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float_t(PyObject *, int writable_flag); - -/* ObjectToMemviewSlice.proto */ -static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int_t(PyObject *, int writable_flag); - -/* ObjectToMemviewSlice.proto */ -static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_float_t(PyObject *, int writable_flag); - -/* ObjectToMemviewSlice.proto */ -static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float_t(PyObject *, int writable_flag); - -/* ObjectToMemviewSlice.proto */ -static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float_t(PyObject *, int writable_flag); - -/* ObjectToMemviewSlice.proto */ -static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_int_t(PyObject *, int writable_flag); - -/* CheckBinaryVersion.proto */ -static int __Pyx_check_binary_version(void); - -/* InitStrings.proto */ -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); - -static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self); /* proto*/ -static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto*/ -static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj); /* proto*/ -static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src); /* proto*/ -static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value); /* proto*/ -static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto*/ -static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ -static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ -static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ -static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ - -/* Module declarations from 'libc.string' */ - -/* Module declarations from 'libc.stdlib' */ - -/* Module declarations from 'libc.math' */ - -/* Module declarations from 'cpython.buffer' */ - -/* Module declarations from 'libc.stdio' */ - -/* Module declarations from '__builtin__' */ - -/* Module declarations from 'cpython.type' */ -static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; - -/* Module declarations from 'cpython' */ - -/* Module declarations from 'cpython.object' */ - -/* Module declarations from 'cpython.ref' */ - -/* Module declarations from 'cpython.mem' */ - -/* Module declarations from 'numpy' */ - -/* Module declarations from 'numpy' */ -static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; -static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; -static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; -static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; -static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; -static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ - -/* Module declarations from 'cython.view' */ -static struct __pyx_array_obj *__pyx_array_new(PyObject *, Py_ssize_t, char *, char *, char *); /*proto*/ - -/* Module declarations from 'cython' */ - -/* Module declarations from 'easyCore.Utils.coord_cython' */ -static PyTypeObject *__pyx_array_type = 0; -static PyTypeObject *__pyx_MemviewEnum_type = 0; -static PyTypeObject *__pyx_memoryview_type = 0; -static PyTypeObject *__pyx_memoryviewslice_type = 0; -static __Pyx_memviewslice __pyx_v_8easyCore_5Utils_12coord_cython_images_view = { 0, 0, { 0 }, { 0 }, { 0 } }; -static PyObject *generic = 0; -static PyObject *strided = 0; -static PyObject *indirect = 0; -static PyObject *contiguous = 0; -static PyObject *indirect_contiguous = 0; -static int __pyx_memoryview_thread_locks_used; -static PyThread_type_lock __pyx_memoryview_thread_locks[8]; -static void __pyx_f_8easyCore_5Utils_12coord_cython_dot_2d(__Pyx_memviewslice, __Pyx_memviewslice, __Pyx_memviewslice); /*proto*/ -static void __pyx_f_8easyCore_5Utils_12coord_cython_dot_2d_mod(__Pyx_memviewslice, __Pyx_memviewslice, __Pyx_memviewslice); /*proto*/ -static struct __pyx_array_obj *__pyx_array_new(PyObject *, Py_ssize_t, char *, char *, char *); /*proto*/ -static void *__pyx_align_pointer(void *, size_t); /*proto*/ -static PyObject *__pyx_memoryview_new(PyObject *, int, int, __Pyx_TypeInfo *); /*proto*/ -static CYTHON_INLINE int __pyx_memoryview_check(PyObject *); /*proto*/ -static PyObject *_unellipsify(PyObject *, int); /*proto*/ -static PyObject *assert_direct_dimensions(Py_ssize_t *, int); /*proto*/ -static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *, PyObject *); /*proto*/ -static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int, int); /*proto*/ -static char *__pyx_pybuffer_index(Py_buffer *, char *, Py_ssize_t, Py_ssize_t); /*proto*/ -static int __pyx_memslice_transpose(__Pyx_memviewslice *); /*proto*/ -static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice, int, PyObject *(*)(char *), int (*)(char *, PyObject *), int); /*proto*/ -static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ -static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ -static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *); /*proto*/ -static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ -static Py_ssize_t abs_py_ssize_t(Py_ssize_t); /*proto*/ -static char __pyx_get_best_slice_order(__Pyx_memviewslice *, int); /*proto*/ -static void _copy_strided_to_strided(char *, Py_ssize_t *, char *, Py_ssize_t *, Py_ssize_t *, Py_ssize_t *, int, size_t); /*proto*/ -static void copy_strided_to_strided(__Pyx_memviewslice *, __Pyx_memviewslice *, int, size_t); /*proto*/ -static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *, int); /*proto*/ -static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *, Py_ssize_t *, Py_ssize_t, int, char); /*proto*/ -static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *, __Pyx_memviewslice *, char, int); /*proto*/ -static int __pyx_memoryview_err_extents(int, Py_ssize_t, Py_ssize_t); /*proto*/ -static int __pyx_memoryview_err_dim(PyObject *, char *, int); /*proto*/ -static int __pyx_memoryview_err(PyObject *, char *); /*proto*/ -static int __pyx_memoryview_copy_contents(__Pyx_memviewslice, __Pyx_memviewslice, int, int, int); /*proto*/ -static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *, int, int); /*proto*/ -static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *, int, int, int); /*proto*/ -static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ -static void __pyx_memoryview_refcount_objects_in_slice(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ -static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *, int, size_t, void *, int); /*proto*/ -static void __pyx_memoryview__slice_assign_scalar(char *, Py_ssize_t *, Py_ssize_t *, int, size_t, void *); /*proto*/ -static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *, PyObject *); /*proto*/ -static PyObject *__pyx_format_from_typeinfo(__Pyx_TypeInfo *); /*proto*/ -static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float_t = { "float_t", NULL, sizeof(__pyx_t_5numpy_float_t), { 0 }, 0, 'R', 0, 0 }; -static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int_t = { "int_t", NULL, sizeof(__pyx_t_5numpy_int_t), { 0 }, 0, IS_UNSIGNED(__pyx_t_5numpy_int_t) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_5numpy_int_t), 0 }; -#define __Pyx_MODULE_NAME "easyCore.Utils.coord_cython" -extern int __pyx_module_is_main_easyCore__Utils__coord_cython; -int __pyx_module_is_main_easyCore__Utils__coord_cython = 0; - -/* Implementation of 'easyCore.Utils.coord_cython' */ -static PyObject *__pyx_builtin_range; -static PyObject *__pyx_builtin_ValueError; -static PyObject *__pyx_builtin_RuntimeError; -static PyObject *__pyx_builtin_ImportError; -static PyObject *__pyx_builtin_MemoryError; -static PyObject *__pyx_builtin_enumerate; -static PyObject *__pyx_builtin_TypeError; -static PyObject *__pyx_builtin_Ellipsis; -static PyObject *__pyx_builtin_id; -static PyObject *__pyx_builtin_IndexError; -static const char __pyx_k_C[] = "C"; -static const char __pyx_k_I[] = "I"; -static const char __pyx_k_J[] = "J"; -static const char __pyx_k_O[] = "O"; -static const char __pyx_k_T[] = "T{"; - static const char __pyx_k_c[] = "c"; - static const char __pyx_k_d[] = "d"; - static const char __pyx_k_i[] = "i"; - static const char __pyx_k_j[] = "j"; - static const char __pyx_k_k[] = "k"; - static const char __pyx_k_l[] = "l"; - static const char __pyx_k_m[] = "m"; - static const char __pyx_k_r[] = "r"; - static const char __pyx_k_s[] = "(%s)"; - static const char __pyx_k_t[] = "t"; - static const char __pyx_k_d2[] = "d2"; - static const char __pyx_k_da[] = "da"; - static const char __pyx_k_db[] = "db"; - static const char __pyx_k_dc[] = "dc"; - static const char __pyx_k_ds[] = "ds"; - static const char __pyx_k_id[] = "id"; - static const char __pyx_k_np[] = "np"; - static const char __pyx_k_ok[] = "ok"; - static const char __pyx_k_vs[] = "vs"; - static const char __pyx_k_1_0[] = "1.0"; - static const char __pyx_k__26[] = "^"; - static const char __pyx_k__27[] = ""; - static const char __pyx_k__28[] = ":"; -static const char __pyx_k__29[] = "}"; -static const char __pyx_k__30[] = ","; -static const char __pyx_k_fc1[] = "fc1"; -static const char __pyx_k_fc2[] = "fc2"; -static const char __pyx_k_int[] = "int_"; -static const char __pyx_k_lat[] = "lat"; -static const char __pyx_k_new[] = "__new__"; -static const char __pyx_k_obj[] = "obj"; -static const char __pyx_k_zip[] = "zip"; -static const char __pyx_k_atol[] = "atol"; -static const char __pyx_k_base[] = "base"; -static const char __pyx_k_best[] = "best"; -static const char __pyx_k_copy[] = "copy"; -static const char __pyx_k_date[] = "__date__"; -static const char __pyx_k_dict[] = "__dict__"; -static const char __pyx_k_ftol[] = "ftol"; -static const char __pyx_k_inds[] = "inds"; -static const char __pyx_k_join[] = "join"; -static const char __pyx_k_main[] = "__main__"; -static const char __pyx_k_mask[] = "mask"; -static const char __pyx_k_mode[] = "mode"; -static const char __pyx_k_name[] = "name"; -static const char __pyx_k_ndim[] = "ndim"; -static const char __pyx_k_pack[] = "pack"; -static const char __pyx_k_size[] = "size"; -static const char __pyx_k_step[] = "step"; -static const char __pyx_k_stop[] = "stop"; -static const char __pyx_k_test[] = "__test__"; -static const char __pyx_k_ASCII[] = "ASCII"; -static const char __pyx_k_array[] = "array"; -static const char __pyx_k_bestK[] = "bestK"; -static const char __pyx_k_bestk[] = "bestk"; -static const char __pyx_k_class[] = "__class__"; -static const char __pyx_k_dtype[] = "dtype"; -static const char __pyx_k_email[] = "__email__"; -static const char __pyx_k_empty[] = "empty"; -static const char __pyx_k_error[] = "error"; -static const char __pyx_k_fdist[] = "fdist"; -static const char __pyx_k_flags[] = "flags"; -static const char __pyx_k_float[] = "float_"; -static const char __pyx_k_inc_d[] = "inc_d"; -static const char __pyx_k_int_2[] = "int"; -static const char __pyx_k_numpy[] = "numpy"; -static const char __pyx_k_order[] = "order"; -static const char __pyx_k_range[] = "range"; -static const char __pyx_k_shape[] = "shape"; -static const char __pyx_k_start[] = "start"; -static const char __pyx_k_zeros[] = "zeros"; -static const char __pyx_k_arange[] = "arange"; -static const char __pyx_k_author[] = "__author__"; -static const char __pyx_k_brange[] = "brange"; -static const char __pyx_k_c_inds[] = "c_inds"; -static const char __pyx_k_crange[] = "crange"; -static const char __pyx_k_encode[] = "encode"; -static const char __pyx_k_format[] = "format"; -static const char __pyx_k_images[] = "images"; -static const char __pyx_k_import[] = "__import__"; -static const char __pyx_k_name_2[] = "__name__"; -static const char __pyx_k_pickle[] = "pickle"; -static const char __pyx_k_pre_im[] = "pre_im"; -static const char __pyx_k_reduce[] = "__reduce__"; -static const char __pyx_k_struct[] = "struct"; -static const char __pyx_k_subset[] = "subset"; -static const char __pyx_k_unpack[] = "unpack"; -static const char __pyx_k_update[] = "update"; -static const char __pyx_k_cart_f1[] = "cart_f1"; -static const char __pyx_k_cart_f2[] = "cart_f2"; -static const char __pyx_k_cart_im[] = "cart_im"; -static const char __pyx_k_fortran[] = "fortran"; -static const char __pyx_k_lattice[] = "lattice"; -static const char __pyx_k_memview[] = "memview"; -static const char __pyx_k_reshape[] = "reshape"; -static const char __pyx_k_vectors[] = "vectors"; -static const char __pyx_k_version[] = "__version__"; -static const char __pyx_k_Ellipsis[] = "Ellipsis"; -static const char __pyx_k_fcoords1[] = "fcoords1"; -static const char __pyx_k_fcoords2[] = "fcoords2"; -static const char __pyx_k_getstate[] = "__getstate__"; -static const char __pyx_k_has_ftol[] = "has_ftol"; -static const char __pyx_k_has_mask[] = "has_mask"; -static const char __pyx_k_images_t[] = "images_t"; -static const char __pyx_k_itemsize[] = "itemsize"; -static const char __pyx_k_ok_inner[] = "ok_inner"; -static const char __pyx_k_ok_outer[] = "ok_outer"; -static const char __pyx_k_pyx_type[] = "__pyx_type"; -static const char __pyx_k_setstate[] = "__setstate__"; -static const char __pyx_k_superset[] = "superset"; -static const char __pyx_k_TypeError[] = "TypeError"; -static const char __pyx_k_copyright[] = "__copyright__"; -static const char __pyx_k_enumerate[] = "enumerate"; -static const char __pyx_k_pyx_state[] = "__pyx_state"; -static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; -static const char __pyx_k_return_d2[] = "return_d2"; -static const char __pyx_k_six_moves[] = "six.moves"; -static const char __pyx_k_IndexError[] = "IndexError"; -static const char __pyx_k_ValueError[] = "ValueError"; -static const char __pyx_k_atleast_2d[] = "atleast_2d"; -static const char __pyx_k_lll_matrix[] = "lll_matrix"; -static const char __pyx_k_maintainer[] = "__maintainer__"; -static const char __pyx_k_pyx_result[] = "__pyx_result"; -static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; -static const char __pyx_k_ImportError[] = "ImportError"; -static const char __pyx_k_MemoryError[] = "MemoryError"; -static const char __pyx_k_Nov_27_2011[] = "Nov 27, 2011"; -static const char __pyx_k_PickleError[] = "PickleError"; -static const char __pyx_k_within_frac[] = "within_frac"; -static const char __pyx_k_RuntimeError[] = "RuntimeError"; -static const char __pyx_k_lll_frac_tol[] = "lll_frac_tol"; -static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; -static const char __pyx_k_stringsource[] = "stringsource"; -static const char __pyx_k_Will_Richards[] = "Will Richards"; -static const char __pyx_k_pyx_getbuffer[] = "__pyx_getbuffer"; -static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; -static const char __pyx_k_View_MemoryView[] = "View.MemoryView"; -static const char __pyx_k_allocate_buffer[] = "allocate_buffer"; -static const char __pyx_k_dtype_is_object[] = "dtype_is_object"; -static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; -static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; -static const char __pyx_k_pyx_unpickle_Enum[] = "__pyx_unpickle_Enum"; -static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; -static const char __pyx_k_strided_and_direct[] = ""; -static const char __pyx_k_get_lll_frac_coords[] = "get_lll_frac_coords"; -static const char __pyx_k_is_coord_subset_pbc[] = "is_coord_subset_pbc"; -static const char __pyx_k_pbc_shortest_vectors[] = "pbc_shortest_vectors"; -static const char __pyx_k_strided_and_indirect[] = ""; -static const char __pyx_k_contiguous_and_direct[] = ""; -static const char __pyx_k_wmdrichards_gmail_com[] = "wmdrichards@gmail.com"; -static const char __pyx_k_MemoryView_of_r_object[] = ""; -static const char __pyx_k_coord_list_mapping_pbc[] = "coord_list_mapping_pbc"; -static const char __pyx_k_MemoryView_of_r_at_0x_x[] = ""; -static const char __pyx_k_contiguous_and_indirect[] = ""; -static const char __pyx_k_Cannot_index_with_type_s[] = "Cannot index with type '%s'"; -static const char __pyx_k_Invalid_shape_in_axis_d_d[] = "Invalid shape in axis %d: %d."; -static const char __pyx_k_easyCore_Utils_coord_cython[] = "easyCore.Utils.coord_cython"; -static const char __pyx_k_itemsize_0_for_cython_array[] = "itemsize <= 0 for cython.array"; -static const char __pyx_k_unable_to_allocate_array_data[] = "unable to allocate array data."; -static const char __pyx_k_strided_and_direct_or_indirect[] = ""; -static const char __pyx_k_Something_wrong_with_the_inputs[] = "Something wrong with the inputs, likely duplicates in superset"; -static const char __pyx_k_Utilities_for_manipulating_coor[] = "\nUtilities for manipulating coordinates or list of coordinates, under periodic\nboundary conditions or otherwise.\n"; -static const char __pyx_k_easyCore_Utils_coord_cython_pyx[] = "easyCore/Utils/coord_cython.pyx"; -static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; -static const char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; -static const char __pyx_k_Buffer_view_does_not_expose_stri[] = "Buffer view does not expose strides"; -static const char __pyx_k_Can_only_create_a_buffer_that_is[] = "Can only create a buffer that is contiguous in memory."; -static const char __pyx_k_Cannot_assign_to_read_only_memor[] = "Cannot assign to read-only memoryview"; -static const char __pyx_k_Cannot_create_writable_memory_vi[] = "Cannot create writable memory view from read-only memoryview"; -static const char __pyx_k_Copyright_2011_The_Materials_Pro[] = "Copyright 2011, The Materials Project"; -static const char __pyx_k_Empty_shape_tuple_for_cython_arr[] = "Empty shape tuple for cython.array"; -static const char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; -static const char __pyx_k_Incompatible_checksums_s_vs_0xb0[] = "Incompatible checksums (%s vs 0xb068931 = (name))"; -static const char __pyx_k_Indirect_dimensions_not_supporte[] = "Indirect dimensions not supported"; -static const char __pyx_k_Invalid_mode_expected_c_or_fortr[] = "Invalid mode, expected 'c' or 'fortran', got %s"; -static const char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; -static const char __pyx_k_Out_of_bounds_on_buffer_access_a[] = "Out of bounds on buffer access (axis %d)"; -static const char __pyx_k_Unable_to_convert_item_to_object[] = "Unable to convert item to object"; -static const char __pyx_k_got_differing_extents_in_dimensi[] = "got differing extents in dimension %d (got %d and %d)"; -static const char __pyx_k_no_default___reduce___due_to_non[] = "no default __reduce__ due to non-trivial __cinit__"; -static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; -static const char __pyx_k_subset_is_not_a_subset_of_supers[] = "subset is not a subset of superset"; -static const char __pyx_k_unable_to_allocate_shape_and_str[] = "unable to allocate shape and strides."; -static const char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; -static PyObject *__pyx_kp_s_1_0; -static PyObject *__pyx_n_s_ASCII; -static PyObject *__pyx_kp_s_Buffer_view_does_not_expose_stri; -static PyObject *__pyx_n_s_C; -static PyObject *__pyx_kp_s_Can_only_create_a_buffer_that_is; -static PyObject *__pyx_kp_s_Cannot_assign_to_read_only_memor; -static PyObject *__pyx_kp_s_Cannot_create_writable_memory_vi; -static PyObject *__pyx_kp_s_Cannot_index_with_type_s; -static PyObject *__pyx_kp_s_Copyright_2011_The_Materials_Pro; -static PyObject *__pyx_n_s_Ellipsis; -static PyObject *__pyx_kp_s_Empty_shape_tuple_for_cython_arr; -static PyObject *__pyx_kp_u_Format_string_allocated_too_shor; -static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2; -static PyObject *__pyx_n_s_I; -static PyObject *__pyx_n_s_ImportError; -static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0xb0; -static PyObject *__pyx_n_s_IndexError; -static PyObject *__pyx_kp_s_Indirect_dimensions_not_supporte; -static PyObject *__pyx_kp_s_Invalid_mode_expected_c_or_fortr; -static PyObject *__pyx_kp_s_Invalid_shape_in_axis_d_d; -static PyObject *__pyx_n_s_J; -static PyObject *__pyx_n_s_MemoryError; -static PyObject *__pyx_kp_s_MemoryView_of_r_at_0x_x; -static PyObject *__pyx_kp_s_MemoryView_of_r_object; -static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor; -static PyObject *__pyx_kp_s_Nov_27_2011; -static PyObject *__pyx_n_b_O; -static PyObject *__pyx_kp_s_Out_of_bounds_on_buffer_access_a; -static PyObject *__pyx_n_s_PickleError; -static PyObject *__pyx_n_s_RuntimeError; -static PyObject *__pyx_kp_s_Something_wrong_with_the_inputs; -static PyObject *__pyx_kp_b_T; -static PyObject *__pyx_n_s_TypeError; -static PyObject *__pyx_kp_s_Unable_to_convert_item_to_object; -static PyObject *__pyx_n_s_ValueError; -static PyObject *__pyx_n_s_View_MemoryView; -static PyObject *__pyx_kp_s_Will_Richards; -static PyObject *__pyx_kp_b__26; -static PyObject *__pyx_kp_b__27; -static PyObject *__pyx_kp_b__28; -static PyObject *__pyx_kp_b__29; -static PyObject *__pyx_kp_u__30; -static PyObject *__pyx_n_s_allocate_buffer; -static PyObject *__pyx_n_s_arange; -static PyObject *__pyx_n_s_array; -static PyObject *__pyx_n_s_atleast_2d; -static PyObject *__pyx_n_s_atol; -static PyObject *__pyx_n_s_author; -static PyObject *__pyx_n_s_base; -static PyObject *__pyx_n_s_best; -static PyObject *__pyx_n_s_bestK; -static PyObject *__pyx_n_s_bestk; -static PyObject *__pyx_n_s_brange; -static PyObject *__pyx_n_s_c; -static PyObject *__pyx_n_u_c; -static PyObject *__pyx_n_s_c_inds; -static PyObject *__pyx_n_s_cart_f1; -static PyObject *__pyx_n_s_cart_f2; -static PyObject *__pyx_n_s_cart_im; -static PyObject *__pyx_n_s_class; -static PyObject *__pyx_n_s_cline_in_traceback; -static PyObject *__pyx_kp_s_contiguous_and_direct; -static PyObject *__pyx_kp_s_contiguous_and_indirect; -static PyObject *__pyx_n_s_coord_list_mapping_pbc; -static PyObject *__pyx_n_s_copy; -static PyObject *__pyx_n_s_copyright; -static PyObject *__pyx_n_s_crange; -static PyObject *__pyx_n_s_d; -static PyObject *__pyx_n_s_d2; -static PyObject *__pyx_n_s_da; -static PyObject *__pyx_n_s_date; -static PyObject *__pyx_n_s_db; -static PyObject *__pyx_n_s_dc; -static PyObject *__pyx_n_s_dict; -static PyObject *__pyx_n_s_ds; -static PyObject *__pyx_n_s_dtype; -static PyObject *__pyx_n_s_dtype_is_object; -static PyObject *__pyx_n_s_easyCore_Utils_coord_cython; -static PyObject *__pyx_kp_s_easyCore_Utils_coord_cython_pyx; -static PyObject *__pyx_n_s_email; -static PyObject *__pyx_n_s_empty; -static PyObject *__pyx_n_s_encode; -static PyObject *__pyx_n_s_enumerate; -static PyObject *__pyx_n_s_error; -static PyObject *__pyx_n_s_fc1; -static PyObject *__pyx_n_s_fc2; -static PyObject *__pyx_n_s_fcoords1; -static PyObject *__pyx_n_s_fcoords2; -static PyObject *__pyx_n_s_fdist; -static PyObject *__pyx_n_s_flags; -static PyObject *__pyx_n_s_float; -static PyObject *__pyx_n_s_format; -static PyObject *__pyx_n_s_fortran; -static PyObject *__pyx_n_u_fortran; -static PyObject *__pyx_n_s_ftol; -static PyObject *__pyx_n_s_get_lll_frac_coords; -static PyObject *__pyx_n_s_getstate; -static PyObject *__pyx_kp_s_got_differing_extents_in_dimensi; -static PyObject *__pyx_n_s_has_ftol; -static PyObject *__pyx_n_s_has_mask; -static PyObject *__pyx_n_s_i; -static PyObject *__pyx_n_s_id; -static PyObject *__pyx_n_s_images; -static PyObject *__pyx_n_s_images_t; -static PyObject *__pyx_n_s_import; -static PyObject *__pyx_n_s_inc_d; -static PyObject *__pyx_n_s_inds; -static PyObject *__pyx_n_s_int; -static PyObject *__pyx_n_s_int_2; -static PyObject *__pyx_n_s_is_coord_subset_pbc; -static PyObject *__pyx_n_s_itemsize; -static PyObject *__pyx_kp_s_itemsize_0_for_cython_array; -static PyObject *__pyx_n_s_j; -static PyObject *__pyx_n_s_join; -static PyObject *__pyx_n_s_k; -static PyObject *__pyx_n_s_l; -static PyObject *__pyx_n_s_lat; -static PyObject *__pyx_n_s_lattice; -static PyObject *__pyx_n_s_lll_frac_tol; -static PyObject *__pyx_n_s_lll_matrix; -static PyObject *__pyx_n_s_m; -static PyObject *__pyx_n_s_main; -static PyObject *__pyx_n_s_maintainer; -static PyObject *__pyx_n_s_mask; -static PyObject *__pyx_n_s_memview; -static PyObject *__pyx_n_s_mode; -static PyObject *__pyx_n_s_name; -static PyObject *__pyx_n_s_name_2; -static PyObject *__pyx_n_s_ndim; -static PyObject *__pyx_n_s_new; -static PyObject *__pyx_kp_s_no_default___reduce___due_to_non; -static PyObject *__pyx_n_s_np; -static PyObject *__pyx_n_s_numpy; -static PyObject *__pyx_kp_s_numpy_core_multiarray_failed_to; -static PyObject *__pyx_kp_s_numpy_core_umath_failed_to_impor; -static PyObject *__pyx_n_s_obj; -static PyObject *__pyx_n_s_ok; -static PyObject *__pyx_n_s_ok_inner; -static PyObject *__pyx_n_s_ok_outer; -static PyObject *__pyx_n_s_order; -static PyObject *__pyx_n_s_pack; -static PyObject *__pyx_n_s_pbc_shortest_vectors; -static PyObject *__pyx_n_s_pickle; -static PyObject *__pyx_n_s_pre_im; -static PyObject *__pyx_n_s_pyx_PickleError; -static PyObject *__pyx_n_s_pyx_checksum; -static PyObject *__pyx_n_s_pyx_getbuffer; -static PyObject *__pyx_n_s_pyx_result; -static PyObject *__pyx_n_s_pyx_state; -static PyObject *__pyx_n_s_pyx_type; -static PyObject *__pyx_n_s_pyx_unpickle_Enum; -static PyObject *__pyx_n_s_pyx_vtable; -static PyObject *__pyx_n_s_r; -static PyObject *__pyx_n_s_range; -static PyObject *__pyx_n_s_reduce; -static PyObject *__pyx_n_s_reduce_cython; -static PyObject *__pyx_n_s_reduce_ex; -static PyObject *__pyx_n_s_reshape; -static PyObject *__pyx_n_s_return_d2; -static PyObject *__pyx_kp_u_s; -static PyObject *__pyx_n_s_setstate; -static PyObject *__pyx_n_s_setstate_cython; -static PyObject *__pyx_n_s_shape; -static PyObject *__pyx_n_s_six_moves; -static PyObject *__pyx_n_s_size; -static PyObject *__pyx_n_s_start; -static PyObject *__pyx_n_s_step; -static PyObject *__pyx_n_s_stop; -static PyObject *__pyx_kp_s_strided_and_direct; -static PyObject *__pyx_kp_s_strided_and_direct_or_indirect; -static PyObject *__pyx_kp_s_strided_and_indirect; -static PyObject *__pyx_kp_s_stringsource; -static PyObject *__pyx_n_s_struct; -static PyObject *__pyx_n_s_subset; -static PyObject *__pyx_kp_s_subset_is_not_a_subset_of_supers; -static PyObject *__pyx_n_s_superset; -static PyObject *__pyx_n_s_t; -static PyObject *__pyx_n_s_test; -static PyObject *__pyx_kp_s_unable_to_allocate_array_data; -static PyObject *__pyx_kp_s_unable_to_allocate_shape_and_str; -static PyObject *__pyx_kp_u_unknown_dtype_code_in_numpy_pxd; -static PyObject *__pyx_n_s_unpack; -static PyObject *__pyx_n_s_update; -static PyObject *__pyx_n_s_vectors; -static PyObject *__pyx_n_s_version; -static PyObject *__pyx_n_s_vs; -static PyObject *__pyx_n_s_within_frac; -static PyObject *__pyx_kp_s_wmdrichards_gmail_com; -static PyObject *__pyx_n_s_zeros; -static PyObject *__pyx_n_s_zip; -static PyObject *__pyx_pf_8easyCore_5Utils_12coord_cython_pbc_shortest_vectors(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_lattice, PyObject *__pyx_v_fcoords1, PyObject *__pyx_v_fcoords2, PyObject *__pyx_v_mask, PyObject *__pyx_v_return_d2, PyObject *__pyx_v_lll_frac_tol); /* proto */ -static PyObject *__pyx_pf_8easyCore_5Utils_12coord_cython_2is_coord_subset_pbc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_subset, PyObject *__pyx_v_superset, PyObject *__pyx_v_atol, PyObject *__pyx_v_mask); /* proto */ -static PyObject *__pyx_pf_8easyCore_5Utils_12coord_cython_4coord_list_mapping_pbc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_subset, PyObject *__pyx_v_superset, PyObject *__pyx_v_atol); /* proto */ -static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer); /* proto */ -static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ -static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self); /* proto */ -static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr); /* proto */ -static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item); /* proto */ -static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /* proto */ -static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ -static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name); /* proto */ -static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ -static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object); /* proto */ -static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto */ -static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto */ -static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ -static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ -static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ -static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ -static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ -static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ -static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ -static PyObject *__pyx_float_1eneg_8; -static PyObject *__pyx_int_0; -static PyObject *__pyx_int_1; -static PyObject *__pyx_int_2; -static PyObject *__pyx_int_3; -static PyObject *__pyx_int_27; -static PyObject *__pyx_int_184977713; -static PyObject *__pyx_int_neg_1; -static PyObject *__pyx_tuple_; -static PyObject *__pyx_tuple__2; -static PyObject *__pyx_tuple__3; -static PyObject *__pyx_tuple__4; -static PyObject *__pyx_tuple__5; -static PyObject *__pyx_tuple__6; -static PyObject *__pyx_tuple__7; -static PyObject *__pyx_tuple__8; -static PyObject *__pyx_tuple__9; -static PyObject *__pyx_slice__22; -static PyObject *__pyx_tuple__10; -static PyObject *__pyx_tuple__11; -static PyObject *__pyx_tuple__12; -static PyObject *__pyx_tuple__13; -static PyObject *__pyx_tuple__14; -static PyObject *__pyx_tuple__15; -static PyObject *__pyx_tuple__16; -static PyObject *__pyx_tuple__17; -static PyObject *__pyx_tuple__18; -static PyObject *__pyx_tuple__19; -static PyObject *__pyx_tuple__20; -static PyObject *__pyx_tuple__21; -static PyObject *__pyx_tuple__23; -static PyObject *__pyx_tuple__24; -static PyObject *__pyx_tuple__25; -static PyObject *__pyx_tuple__31; -static PyObject *__pyx_tuple__32; -static PyObject *__pyx_tuple__33; -static PyObject *__pyx_tuple__34; -static PyObject *__pyx_tuple__35; -static PyObject *__pyx_tuple__36; -static PyObject *__pyx_tuple__37; -static PyObject *__pyx_tuple__38; -static PyObject *__pyx_tuple__39; -static PyObject *__pyx_tuple__41; -static PyObject *__pyx_tuple__43; -static PyObject *__pyx_tuple__45; -static PyObject *__pyx_tuple__46; -static PyObject *__pyx_tuple__47; -static PyObject *__pyx_tuple__48; -static PyObject *__pyx_tuple__49; -static PyObject *__pyx_tuple__50; -static PyObject *__pyx_codeobj__40; -static PyObject *__pyx_codeobj__42; -static PyObject *__pyx_codeobj__44; -static PyObject *__pyx_codeobj__51; -/* Late includes */ - -/* "easyCore/Utils/coord_cython.pyx":39 - * @cython.boundscheck(False) - * @cython.wraparound(False) - * cdef void dot_2d(np.float_t[:, ::1] a, np.float_t[:, ::1] b, np.float_t[:, ::1] o) nogil: # <<<<<<<<<<<<<< - * cdef int i, j, k, I, J, K - * I = a.shape[0] - */ - -static void __pyx_f_8easyCore_5Utils_12coord_cython_dot_2d(__Pyx_memviewslice __pyx_v_a, __Pyx_memviewslice __pyx_v_b, __Pyx_memviewslice __pyx_v_o) { - int __pyx_v_i; - int __pyx_v_j; - int __pyx_v_k; - int __pyx_v_I; - int __pyx_v_J; - int __pyx_v_K; - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_t_4; - int __pyx_t_5; - int __pyx_t_6; - Py_ssize_t __pyx_t_7; - Py_ssize_t __pyx_t_8; - int __pyx_t_9; - int __pyx_t_10; - int __pyx_t_11; - Py_ssize_t __pyx_t_12; - Py_ssize_t __pyx_t_13; - Py_ssize_t __pyx_t_14; - Py_ssize_t __pyx_t_15; - - /* "easyCore/Utils/coord_cython.pyx":41 - * cdef void dot_2d(np.float_t[:, ::1] a, np.float_t[:, ::1] b, np.float_t[:, ::1] o) nogil: - * cdef int i, j, k, I, J, K - * I = a.shape[0] # <<<<<<<<<<<<<< - * J = b.shape[1] - * K = a.shape[1] - */ - __pyx_v_I = (__pyx_v_a.shape[0]); - - /* "easyCore/Utils/coord_cython.pyx":42 - * cdef int i, j, k, I, J, K - * I = a.shape[0] - * J = b.shape[1] # <<<<<<<<<<<<<< - * K = a.shape[1] - * - */ - __pyx_v_J = (__pyx_v_b.shape[1]); - - /* "easyCore/Utils/coord_cython.pyx":43 - * I = a.shape[0] - * J = b.shape[1] - * K = a.shape[1] # <<<<<<<<<<<<<< - * - * for j in range(J): - */ - __pyx_v_K = (__pyx_v_a.shape[1]); - - /* "easyCore/Utils/coord_cython.pyx":45 - * K = a.shape[1] - * - * for j in range(J): # <<<<<<<<<<<<<< - * for i in range(I): - * o[i, j] = 0 - */ - __pyx_t_1 = __pyx_v_J; - __pyx_t_2 = __pyx_t_1; - for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { - __pyx_v_j = __pyx_t_3; - - /* "easyCore/Utils/coord_cython.pyx":46 - * - * for j in range(J): - * for i in range(I): # <<<<<<<<<<<<<< - * o[i, j] = 0 - * for k in range(K): - */ - __pyx_t_4 = __pyx_v_I; - __pyx_t_5 = __pyx_t_4; - for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_i = __pyx_t_6; - - /* "easyCore/Utils/coord_cython.pyx":47 - * for j in range(J): - * for i in range(I): - * o[i, j] = 0 # <<<<<<<<<<<<<< - * for k in range(K): - * for i in range(I): - */ - __pyx_t_7 = __pyx_v_i; - __pyx_t_8 = __pyx_v_j; - *((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_o.data + __pyx_t_7 * __pyx_v_o.strides[0]) )) + __pyx_t_8)) )) = 0.0; - } - - /* "easyCore/Utils/coord_cython.pyx":48 - * for i in range(I): - * o[i, j] = 0 - * for k in range(K): # <<<<<<<<<<<<<< - * for i in range(I): - * o[i, j] += a[i, k] * b[k, j] - */ - __pyx_t_4 = __pyx_v_K; - __pyx_t_5 = __pyx_t_4; - for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_k = __pyx_t_6; - - /* "easyCore/Utils/coord_cython.pyx":49 - * o[i, j] = 0 - * for k in range(K): - * for i in range(I): # <<<<<<<<<<<<<< - * o[i, j] += a[i, k] * b[k, j] - * - */ - __pyx_t_9 = __pyx_v_I; - __pyx_t_10 = __pyx_t_9; - for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { - __pyx_v_i = __pyx_t_11; - - /* "easyCore/Utils/coord_cython.pyx":50 - * for k in range(K): - * for i in range(I): - * o[i, j] += a[i, k] * b[k, j] # <<<<<<<<<<<<<< - * - * @cython.boundscheck(False) - */ - __pyx_t_8 = __pyx_v_i; - __pyx_t_7 = __pyx_v_k; - __pyx_t_12 = __pyx_v_k; - __pyx_t_13 = __pyx_v_j; - __pyx_t_14 = __pyx_v_i; - __pyx_t_15 = __pyx_v_j; - *((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_o.data + __pyx_t_14 * __pyx_v_o.strides[0]) )) + __pyx_t_15)) )) += ((*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_a.data + __pyx_t_8 * __pyx_v_a.strides[0]) )) + __pyx_t_7)) ))) * (*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_b.data + __pyx_t_12 * __pyx_v_b.strides[0]) )) + __pyx_t_13)) )))); - } - } - } - - /* "easyCore/Utils/coord_cython.pyx":39 - * @cython.boundscheck(False) - * @cython.wraparound(False) - * cdef void dot_2d(np.float_t[:, ::1] a, np.float_t[:, ::1] b, np.float_t[:, ::1] o) nogil: # <<<<<<<<<<<<<< - * cdef int i, j, k, I, J, K - * I = a.shape[0] - */ - - /* function exit code */ -} - -/* "easyCore/Utils/coord_cython.pyx":54 - * @cython.boundscheck(False) - * @cython.wraparound(False) - * cdef void dot_2d_mod(np.float_t[:, ::1] a, np.float_t[:, ::1] b, np.float_t[:, ::1] o) nogil: # <<<<<<<<<<<<<< - * cdef int i, j, k, I, J, K - * I = a.shape[0] - */ - -static void __pyx_f_8easyCore_5Utils_12coord_cython_dot_2d_mod(__Pyx_memviewslice __pyx_v_a, __Pyx_memviewslice __pyx_v_b, __Pyx_memviewslice __pyx_v_o) { - int __pyx_v_i; - int __pyx_v_j; - int __pyx_v_k; - int __pyx_v_I; - int __pyx_v_J; - int __pyx_v_K; - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_t_4; - int __pyx_t_5; - int __pyx_t_6; - Py_ssize_t __pyx_t_7; - Py_ssize_t __pyx_t_8; - int __pyx_t_9; - int __pyx_t_10; - int __pyx_t_11; - Py_ssize_t __pyx_t_12; - Py_ssize_t __pyx_t_13; - Py_ssize_t __pyx_t_14; - Py_ssize_t __pyx_t_15; - - /* "easyCore/Utils/coord_cython.pyx":56 - * cdef void dot_2d_mod(np.float_t[:, ::1] a, np.float_t[:, ::1] b, np.float_t[:, ::1] o) nogil: - * cdef int i, j, k, I, J, K - * I = a.shape[0] # <<<<<<<<<<<<<< - * J = b.shape[1] - * K = a.shape[1] - */ - __pyx_v_I = (__pyx_v_a.shape[0]); - - /* "easyCore/Utils/coord_cython.pyx":57 - * cdef int i, j, k, I, J, K - * I = a.shape[0] - * J = b.shape[1] # <<<<<<<<<<<<<< - * K = a.shape[1] - * - */ - __pyx_v_J = (__pyx_v_b.shape[1]); - - /* "easyCore/Utils/coord_cython.pyx":58 - * I = a.shape[0] - * J = b.shape[1] - * K = a.shape[1] # <<<<<<<<<<<<<< - * - * for j in range(J): - */ - __pyx_v_K = (__pyx_v_a.shape[1]); - - /* "easyCore/Utils/coord_cython.pyx":60 - * K = a.shape[1] - * - * for j in range(J): # <<<<<<<<<<<<<< - * for i in range(I): - * o[i, j] = 0 - */ - __pyx_t_1 = __pyx_v_J; - __pyx_t_2 = __pyx_t_1; - for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { - __pyx_v_j = __pyx_t_3; - - /* "easyCore/Utils/coord_cython.pyx":61 - * - * for j in range(J): - * for i in range(I): # <<<<<<<<<<<<<< - * o[i, j] = 0 - * for k in range(K): - */ - __pyx_t_4 = __pyx_v_I; - __pyx_t_5 = __pyx_t_4; - for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_i = __pyx_t_6; - - /* "easyCore/Utils/coord_cython.pyx":62 - * for j in range(J): - * for i in range(I): - * o[i, j] = 0 # <<<<<<<<<<<<<< - * for k in range(K): - * for i in range(I): - */ - __pyx_t_7 = __pyx_v_i; - __pyx_t_8 = __pyx_v_j; - *((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_o.data + __pyx_t_7 * __pyx_v_o.strides[0]) )) + __pyx_t_8)) )) = 0.0; - } - - /* "easyCore/Utils/coord_cython.pyx":63 - * for i in range(I): - * o[i, j] = 0 - * for k in range(K): # <<<<<<<<<<<<<< - * for i in range(I): - * o[i, j] += a[i, k] % 1 * b[k, j] - */ - __pyx_t_4 = __pyx_v_K; - __pyx_t_5 = __pyx_t_4; - for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_k = __pyx_t_6; - - /* "easyCore/Utils/coord_cython.pyx":64 - * o[i, j] = 0 - * for k in range(K): - * for i in range(I): # <<<<<<<<<<<<<< - * o[i, j] += a[i, k] % 1 * b[k, j] - * - */ - __pyx_t_9 = __pyx_v_I; - __pyx_t_10 = __pyx_t_9; - for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { - __pyx_v_i = __pyx_t_11; - - /* "easyCore/Utils/coord_cython.pyx":65 - * for k in range(K): - * for i in range(I): - * o[i, j] += a[i, k] % 1 * b[k, j] # <<<<<<<<<<<<<< - * - * @cython.boundscheck(False) - */ - __pyx_t_8 = __pyx_v_i; - __pyx_t_7 = __pyx_v_k; - __pyx_t_12 = __pyx_v_k; - __pyx_t_13 = __pyx_v_j; - __pyx_t_14 = __pyx_v_i; - __pyx_t_15 = __pyx_v_j; - *((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_o.data + __pyx_t_14 * __pyx_v_o.strides[0]) )) + __pyx_t_15)) )) += (__Pyx_mod___pyx_t_5numpy_float_t((*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_a.data + __pyx_t_8 * __pyx_v_a.strides[0]) )) + __pyx_t_7)) ))), 1.0) * (*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_b.data + __pyx_t_12 * __pyx_v_b.strides[0]) )) + __pyx_t_13)) )))); - } - } - } - - /* "easyCore/Utils/coord_cython.pyx":54 - * @cython.boundscheck(False) - * @cython.wraparound(False) - * cdef void dot_2d_mod(np.float_t[:, ::1] a, np.float_t[:, ::1] b, np.float_t[:, ::1] o) nogil: # <<<<<<<<<<<<<< - * cdef int i, j, k, I, J, K - * I = a.shape[0] - */ - - /* function exit code */ -} - -/* "easyCore/Utils/coord_cython.pyx":70 - * @cython.wraparound(False) - * @cython.initializedcheck(False) - * def pbc_shortest_vectors(lattice, fcoords1, fcoords2, mask=None, return_d2=False, lll_frac_tol=None): # <<<<<<<<<<<<<< - * """ - * Returns the shortest vectors between two lists of coordinates taking into - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_8easyCore_5Utils_12coord_cython_1pbc_shortest_vectors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_8easyCore_5Utils_12coord_cython_pbc_shortest_vectors[] = "\n Returns the shortest vectors between two lists of coordinates taking into\n account periodic boundary conditions and the lattice.\n\n Args:\n lattice: lattice to use\n fcoords1: First set of fractional coordinates. e.g., [0.5, 0.6, 0.7]\n or [[1.1, 1.2, 4.3], [0.5, 0.6, 0.7]]. Must be np.float_\n fcoords2: Second set of fractional coordinates.\n mask (int_ array): Mask of matches that are not allowed.\n i.e. if mask[1,2] == True, then subset[1] cannot be matched\n to superset[2]\n lll_frac_tol (float_ array of length 3): Fractional tolerance (per LLL lattice vector) over which\n the calculation of minimum vectors will be skipped.\n Can speed up calculation considerably for large structures.\n\n Returns:\n array of displacement vectors from fcoords1 to fcoords2\n first index is fcoords1 index, second is fcoords2 index\n "; -static PyMethodDef __pyx_mdef_8easyCore_5Utils_12coord_cython_1pbc_shortest_vectors = {"pbc_shortest_vectors", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8easyCore_5Utils_12coord_cython_1pbc_shortest_vectors, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8easyCore_5Utils_12coord_cython_pbc_shortest_vectors}; -static PyObject *__pyx_pw_8easyCore_5Utils_12coord_cython_1pbc_shortest_vectors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_lattice = 0; - PyObject *__pyx_v_fcoords1 = 0; - PyObject *__pyx_v_fcoords2 = 0; - PyObject *__pyx_v_mask = 0; - PyObject *__pyx_v_return_d2 = 0; - PyObject *__pyx_v_lll_frac_tol = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("pbc_shortest_vectors (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_lattice,&__pyx_n_s_fcoords1,&__pyx_n_s_fcoords2,&__pyx_n_s_mask,&__pyx_n_s_return_d2,&__pyx_n_s_lll_frac_tol,0}; - PyObject* values[6] = {0,0,0,0,0,0}; - values[3] = ((PyObject *)Py_None); - values[4] = ((PyObject *)Py_False); - values[5] = ((PyObject *)Py_None); - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); - CYTHON_FALLTHROUGH; - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - CYTHON_FALLTHROUGH; - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lattice)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_fcoords1)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("pbc_shortest_vectors", 0, 3, 6, 1); __PYX_ERR(0, 70, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_fcoords2)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("pbc_shortest_vectors", 0, 3, 6, 2); __PYX_ERR(0, 70, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 3: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_mask); - if (value) { values[3] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 4: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_return_d2); - if (value) { values[4] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 5: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lll_frac_tol); - if (value) { values[5] = value; kw_args--; } - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pbc_shortest_vectors") < 0)) __PYX_ERR(0, 70, __pyx_L3_error) - } - } else { - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); - CYTHON_FALLTHROUGH; - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - CYTHON_FALLTHROUGH; - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - break; - default: goto __pyx_L5_argtuple_error; - } - } - __pyx_v_lattice = values[0]; - __pyx_v_fcoords1 = values[1]; - __pyx_v_fcoords2 = values[2]; - __pyx_v_mask = values[3]; - __pyx_v_return_d2 = values[4]; - __pyx_v_lll_frac_tol = values[5]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("pbc_shortest_vectors", 0, 3, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 70, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("easyCore.Utils.coord_cython.pbc_shortest_vectors", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_8easyCore_5Utils_12coord_cython_pbc_shortest_vectors(__pyx_self, __pyx_v_lattice, __pyx_v_fcoords1, __pyx_v_fcoords2, __pyx_v_mask, __pyx_v_return_d2, __pyx_v_lll_frac_tol); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_8easyCore_5Utils_12coord_cython_pbc_shortest_vectors(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_lattice, PyObject *__pyx_v_fcoords1, PyObject *__pyx_v_fcoords2, PyObject *__pyx_v_mask, PyObject *__pyx_v_return_d2, PyObject *__pyx_v_lll_frac_tol) { - __Pyx_memviewslice __pyx_v_lat = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_v_i; - int __pyx_v_j; - int __pyx_v_k; - int __pyx_v_l; - int __pyx_v_I; - int __pyx_v_J; - __Pyx_memviewslice __pyx_v_fc1 = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_v_fc2 = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_v_cart_f1 = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_v_cart_f2 = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_v_cart_im = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_v_has_mask; - __Pyx_memviewslice __pyx_v_m = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_v_has_ftol; - __Pyx_memviewslice __pyx_v_ftol = { 0, 0, { 0 }, { 0 }, { 0 } }; - PyObject *__pyx_v_vectors = NULL; - PyObject *__pyx_v_d2 = NULL; - __Pyx_memviewslice __pyx_v_vs = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_v_ds = { 0, 0, { 0 }, { 0 }, { 0 } }; - __pyx_t_5numpy_float_t __pyx_v_best; - __pyx_t_5numpy_float_t __pyx_v_d; - __pyx_t_5numpy_float_t __pyx_v_da; - __pyx_t_5numpy_float_t __pyx_v_db; - __pyx_t_5numpy_float_t __pyx_v_dc; - __pyx_t_5numpy_float_t __pyx_v_fdist; - int __pyx_v_within_frac; - __Pyx_memviewslice __pyx_v_pre_im = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_v_bestk; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *(*__pyx_t_6)(PyObject *); - PyObject *__pyx_t_7 = NULL; - __Pyx_memviewslice __pyx_t_8 = { 0, 0, { 0 }, { 0 }, { 0 } }; - Py_ssize_t __pyx_t_9; - void *__pyx_t_10; - struct __pyx_array_obj *__pyx_t_11 = NULL; - int __pyx_t_12; - __Pyx_memviewslice __pyx_t_13 = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_t_14 = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_t_15 = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_t_16; - int __pyx_t_17; - int __pyx_t_18; - int __pyx_t_19; - int __pyx_t_20; - int __pyx_t_21; - Py_ssize_t __pyx_t_22; - Py_ssize_t __pyx_t_23; - int __pyx_t_24; - Py_ssize_t __pyx_t_25; - Py_ssize_t __pyx_t_26; - Py_ssize_t __pyx_t_27; - Py_ssize_t __pyx_t_28; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("pbc_shortest_vectors", 0); - __Pyx_INCREF(__pyx_v_fcoords1); - __Pyx_INCREF(__pyx_v_fcoords2); - - /* "easyCore/Utils/coord_cython.pyx":93 - * - * #ensure correct shape - * fcoords1, fcoords2 = np.atleast_2d(fcoords1, fcoords2) # <<<<<<<<<<<<<< - * - * - */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 93, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_atleast_2d); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 93, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = NULL; - __pyx_t_4 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { - __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); - if (likely(__pyx_t_2)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); - __Pyx_INCREF(__pyx_t_2); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_3, function); - __pyx_t_4 = 1; - } - } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[3] = {__pyx_t_2, __pyx_v_fcoords1, __pyx_v_fcoords2}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 93, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[3] = {__pyx_t_2, __pyx_v_fcoords1, __pyx_v_fcoords2}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 93, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - { - __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 93, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - if (__pyx_t_2) { - __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2); __pyx_t_2 = NULL; - } - __Pyx_INCREF(__pyx_v_fcoords1); - __Pyx_GIVEREF(__pyx_v_fcoords1); - PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_v_fcoords1); - __Pyx_INCREF(__pyx_v_fcoords2); - __Pyx_GIVEREF(__pyx_v_fcoords2); - PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_fcoords2); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 93, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) { - PyObject* sequence = __pyx_t_1; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 2)) { - if (size > 2) __Pyx_RaiseTooManyValuesError(2); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(0, 93, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - if (likely(PyTuple_CheckExact(sequence))) { - __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); - } else { - __pyx_t_3 = PyList_GET_ITEM(sequence, 0); - __pyx_t_5 = PyList_GET_ITEM(sequence, 1); - } - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(__pyx_t_5); - #else - __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 93, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 93, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - } else { - Py_ssize_t index = -1; - __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 93, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_6 = Py_TYPE(__pyx_t_2)->tp_iternext; - index = 0; __pyx_t_3 = __pyx_t_6(__pyx_t_2); if (unlikely(!__pyx_t_3)) goto __pyx_L3_unpacking_failed; - __Pyx_GOTREF(__pyx_t_3); - index = 1; __pyx_t_5 = __pyx_t_6(__pyx_t_2); if (unlikely(!__pyx_t_5)) goto __pyx_L3_unpacking_failed; - __Pyx_GOTREF(__pyx_t_5); - if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_2), 2) < 0) __PYX_ERR(0, 93, __pyx_L1_error) - __pyx_t_6 = NULL; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - goto __pyx_L4_unpacking_done; - __pyx_L3_unpacking_failed:; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_6 = NULL; - if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); - __PYX_ERR(0, 93, __pyx_L1_error) - __pyx_L4_unpacking_done:; - } - __Pyx_DECREF_SET(__pyx_v_fcoords1, __pyx_t_3); - __pyx_t_3 = 0; - __Pyx_DECREF_SET(__pyx_v_fcoords2, __pyx_t_5); - __pyx_t_5 = 0; - - /* "easyCore/Utils/coord_cython.pyx":96 - * - * - * fcoords1 = lattice.get_lll_frac_coords(fcoords1) # <<<<<<<<<<<<<< - * fcoords2 = lattice.get_lll_frac_coords(fcoords2) - * - */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_lattice, __pyx_n_s_get_lll_frac_coords); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 96, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { - __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_5); - if (likely(__pyx_t_3)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_5, function); - } - } - __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_3, __pyx_v_fcoords1) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_fcoords1); - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 96, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF_SET(__pyx_v_fcoords1, __pyx_t_1); - __pyx_t_1 = 0; - - /* "easyCore/Utils/coord_cython.pyx":97 - * - * fcoords1 = lattice.get_lll_frac_coords(fcoords1) - * fcoords2 = lattice.get_lll_frac_coords(fcoords2) # <<<<<<<<<<<<<< - * - * cdef np.float_t[:, ::1] lat = np.array(lattice.lll_matrix, dtype=np.float_, copy=False, order='C') - */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_lattice, __pyx_n_s_get_lll_frac_coords); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 97, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { - __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_5); - if (likely(__pyx_t_3)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_5, function); - } - } - __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_3, __pyx_v_fcoords2) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_fcoords2); - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 97, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF_SET(__pyx_v_fcoords2, __pyx_t_1); - __pyx_t_1 = 0; - - /* "easyCore/Utils/coord_cython.pyx":99 - * fcoords2 = lattice.get_lll_frac_coords(fcoords2) - * - * cdef np.float_t[:, ::1] lat = np.array(lattice.lll_matrix, dtype=np.float_, copy=False, order='C') # <<<<<<<<<<<<<< - * - * cdef int i, j, k, l, I, J, bestK - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 99, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_lattice, __pyx_n_s_lll_matrix); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 99, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); - __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 99, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 99, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_7) < 0) __PYX_ERR(0, 99, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_copy, Py_False) < 0) __PYX_ERR(0, 99, __pyx_L1_error) - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_order, __pyx_n_s_C) < 0) __PYX_ERR(0, 99, __pyx_L1_error) - __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 99, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float_t(__pyx_t_7, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 99, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_v_lat = __pyx_t_8; - __pyx_t_8.memview = NULL; - __pyx_t_8.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":103 - * cdef int i, j, k, l, I, J, bestK - * - * I = len(fcoords1) # <<<<<<<<<<<<<< - * J = len(fcoords2) - * - */ - __pyx_t_9 = PyObject_Length(__pyx_v_fcoords1); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 103, __pyx_L1_error) - __pyx_v_I = __pyx_t_9; - - /* "easyCore/Utils/coord_cython.pyx":104 - * - * I = len(fcoords1) - * J = len(fcoords2) # <<<<<<<<<<<<<< - * - * cdef np.float_t[:, ::1] fc1 = fcoords1 - */ - __pyx_t_9 = PyObject_Length(__pyx_v_fcoords2); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 104, __pyx_L1_error) - __pyx_v_J = __pyx_t_9; - - /* "easyCore/Utils/coord_cython.pyx":106 - * J = len(fcoords2) - * - * cdef np.float_t[:, ::1] fc1 = fcoords1 # <<<<<<<<<<<<<< - * cdef np.float_t[:, ::1] fc2 = fcoords2 - * - */ - __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float_t(__pyx_v_fcoords1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 106, __pyx_L1_error) - __pyx_v_fc1 = __pyx_t_8; - __pyx_t_8.memview = NULL; - __pyx_t_8.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":107 - * - * cdef np.float_t[:, ::1] fc1 = fcoords1 - * cdef np.float_t[:, ::1] fc2 = fcoords2 # <<<<<<<<<<<<<< - * - * cdef np.float_t[:, ::1] cart_f1 = malloc(3 * I * sizeof(np.float_t)) - */ - __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float_t(__pyx_v_fcoords2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 107, __pyx_L1_error) - __pyx_v_fc2 = __pyx_t_8; - __pyx_t_8.memview = NULL; - __pyx_t_8.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":109 - * cdef np.float_t[:, ::1] fc2 = fcoords2 - * - * cdef np.float_t[:, ::1] cart_f1 = malloc(3 * I * sizeof(np.float_t)) # <<<<<<<<<<<<<< - * cdef np.float_t[:, ::1] cart_f2 = malloc(3 * J * sizeof(np.float_t)) - * cdef np.float_t[:, ::1] cart_im = malloc(81 * sizeof(np.float_t)) - */ - __pyx_t_10 = malloc(((3 * __pyx_v_I) * (sizeof(__pyx_t_5numpy_float_t)))); - if (!__pyx_t_10) { - PyErr_SetString(PyExc_ValueError,"Cannot create cython.array from NULL pointer"); - __PYX_ERR(0, 109, __pyx_L1_error) - } - __pyx_t_1 = __pyx_format_from_typeinfo(&__Pyx_TypeInfo_nn___pyx_t_5numpy_float_t); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 109, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_7 = Py_BuildValue((char*) "(" __PYX_BUILD_PY_SSIZE_T __PYX_BUILD_PY_SSIZE_T ")", ((Py_ssize_t)__pyx_v_I), ((Py_ssize_t)3)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 109, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_11 = __pyx_array_new(__pyx_t_7, sizeof(__pyx_t_5numpy_float_t), PyBytes_AS_STRING(__pyx_t_1), (char *) "c", (char *) __pyx_t_10); - if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 109, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float_t(((PyObject *)__pyx_t_11), PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 109, __pyx_L1_error) - __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0; - __pyx_v_cart_f1 = __pyx_t_8; - __pyx_t_8.memview = NULL; - __pyx_t_8.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":110 - * - * cdef np.float_t[:, ::1] cart_f1 = malloc(3 * I * sizeof(np.float_t)) - * cdef np.float_t[:, ::1] cart_f2 = malloc(3 * J * sizeof(np.float_t)) # <<<<<<<<<<<<<< - * cdef np.float_t[:, ::1] cart_im = malloc(81 * sizeof(np.float_t)) - * - */ - __pyx_t_10 = malloc(((3 * __pyx_v_J) * (sizeof(__pyx_t_5numpy_float_t)))); - if (!__pyx_t_10) { - PyErr_SetString(PyExc_ValueError,"Cannot create cython.array from NULL pointer"); - __PYX_ERR(0, 110, __pyx_L1_error) - } - __pyx_t_7 = __pyx_format_from_typeinfo(&__Pyx_TypeInfo_nn___pyx_t_5numpy_float_t); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 110, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_1 = Py_BuildValue((char*) "(" __PYX_BUILD_PY_SSIZE_T __PYX_BUILD_PY_SSIZE_T ")", ((Py_ssize_t)__pyx_v_J), ((Py_ssize_t)3)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 110, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_11 = __pyx_array_new(__pyx_t_1, sizeof(__pyx_t_5numpy_float_t), PyBytes_AS_STRING(__pyx_t_7), (char *) "c", (char *) __pyx_t_10); - if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 110, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float_t(((PyObject *)__pyx_t_11), PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 110, __pyx_L1_error) - __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0; - __pyx_v_cart_f2 = __pyx_t_8; - __pyx_t_8.memview = NULL; - __pyx_t_8.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":111 - * cdef np.float_t[:, ::1] cart_f1 = malloc(3 * I * sizeof(np.float_t)) - * cdef np.float_t[:, ::1] cart_f2 = malloc(3 * J * sizeof(np.float_t)) - * cdef np.float_t[:, ::1] cart_im = malloc(81 * sizeof(np.float_t)) # <<<<<<<<<<<<<< - * - * cdef bint has_mask = mask is not None - */ - __pyx_t_10 = malloc((81 * (sizeof(__pyx_t_5numpy_float_t)))); - if (!__pyx_t_10) { - PyErr_SetString(PyExc_ValueError,"Cannot create cython.array from NULL pointer"); - __PYX_ERR(0, 111, __pyx_L1_error) - } - __pyx_t_1 = __pyx_format_from_typeinfo(&__Pyx_TypeInfo_nn___pyx_t_5numpy_float_t); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 111, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_7 = Py_BuildValue((char*) "(" __PYX_BUILD_PY_SSIZE_T __PYX_BUILD_PY_SSIZE_T ")", ((Py_ssize_t)27), ((Py_ssize_t)3)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 111, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_11 = __pyx_array_new(__pyx_t_7, sizeof(__pyx_t_5numpy_float_t), PyBytes_AS_STRING(__pyx_t_1), (char *) "c", (char *) __pyx_t_10); - if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 111, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float_t(((PyObject *)__pyx_t_11), PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 111, __pyx_L1_error) - __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0; - __pyx_v_cart_im = __pyx_t_8; - __pyx_t_8.memview = NULL; - __pyx_t_8.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":113 - * cdef np.float_t[:, ::1] cart_im = malloc(81 * sizeof(np.float_t)) - * - * cdef bint has_mask = mask is not None # <<<<<<<<<<<<<< - * cdef np.int_t[:, :] m - * if has_mask: - */ - __pyx_t_12 = (__pyx_v_mask != Py_None); - __pyx_v_has_mask = __pyx_t_12; - - /* "easyCore/Utils/coord_cython.pyx":115 - * cdef bint has_mask = mask is not None - * cdef np.int_t[:, :] m - * if has_mask: # <<<<<<<<<<<<<< - * m = np.array(mask, dtype=np.int_, copy=False, order='C') - * - */ - __pyx_t_12 = (__pyx_v_has_mask != 0); - if (__pyx_t_12) { - - /* "easyCore/Utils/coord_cython.pyx":116 - * cdef np.int_t[:, :] m - * if has_mask: - * m = np.array(mask, dtype=np.int_, copy=False, order='C') # <<<<<<<<<<<<<< - * - * cdef bint has_ftol = (lll_frac_tol is not None) - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 116, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 116, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 116, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_v_mask); - __Pyx_GIVEREF(__pyx_v_mask); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_mask); - __pyx_t_3 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 116, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 116, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_int); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 116, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_copy, Py_False) < 0) __PYX_ERR(0, 116, __pyx_L1_error) - if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_order, __pyx_n_s_C) < 0) __PYX_ERR(0, 116, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_13 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int_t(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_13.memview)) __PYX_ERR(0, 116, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v_m = __pyx_t_13; - __pyx_t_13.memview = NULL; - __pyx_t_13.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":115 - * cdef bint has_mask = mask is not None - * cdef np.int_t[:, :] m - * if has_mask: # <<<<<<<<<<<<<< - * m = np.array(mask, dtype=np.int_, copy=False, order='C') - * - */ - } - - /* "easyCore/Utils/coord_cython.pyx":118 - * m = np.array(mask, dtype=np.int_, copy=False, order='C') - * - * cdef bint has_ftol = (lll_frac_tol is not None) # <<<<<<<<<<<<<< - * cdef np.float_t[:] ftol - * if has_ftol: - */ - __pyx_t_12 = (__pyx_v_lll_frac_tol != Py_None); - __pyx_v_has_ftol = __pyx_t_12; - - /* "easyCore/Utils/coord_cython.pyx":120 - * cdef bint has_ftol = (lll_frac_tol is not None) - * cdef np.float_t[:] ftol - * if has_ftol: # <<<<<<<<<<<<<< - * ftol = np.array(lll_frac_tol, dtype=np.float_, order='C', copy=False) - * - */ - __pyx_t_12 = (__pyx_v_has_ftol != 0); - if (__pyx_t_12) { - - /* "easyCore/Utils/coord_cython.pyx":121 - * cdef np.float_t[:] ftol - * if has_ftol: - * ftol = np.array(lll_frac_tol, dtype=np.float_, order='C', copy=False) # <<<<<<<<<<<<<< - * - * - */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_array); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_v_lll_frac_tol); - __Pyx_GIVEREF(__pyx_v_lll_frac_tol); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_lll_frac_tol); - __pyx_t_1 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_float); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_order, __pyx_n_s_C) < 0) __PYX_ERR(0, 121, __pyx_L1_error) - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_copy, Py_False) < 0) __PYX_ERR(0, 121, __pyx_L1_error) - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_14 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_float_t(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_14.memview)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_v_ftol = __pyx_t_14; - __pyx_t_14.memview = NULL; - __pyx_t_14.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":120 - * cdef bint has_ftol = (lll_frac_tol is not None) - * cdef np.float_t[:] ftol - * if has_ftol: # <<<<<<<<<<<<<< - * ftol = np.array(lll_frac_tol, dtype=np.float_, order='C', copy=False) - * - */ - } - - /* "easyCore/Utils/coord_cython.pyx":124 - * - * - * dot_2d_mod(fc1, lat, cart_f1) # <<<<<<<<<<<<<< - * dot_2d_mod(fc2, lat, cart_f2) - * dot_2d(images_view, lat, cart_im) - */ - __pyx_f_8easyCore_5Utils_12coord_cython_dot_2d_mod(__pyx_v_fc1, __pyx_v_lat, __pyx_v_cart_f1); - - /* "easyCore/Utils/coord_cython.pyx":125 - * - * dot_2d_mod(fc1, lat, cart_f1) - * dot_2d_mod(fc2, lat, cart_f2) # <<<<<<<<<<<<<< - * dot_2d(images_view, lat, cart_im) - * - */ - __pyx_f_8easyCore_5Utils_12coord_cython_dot_2d_mod(__pyx_v_fc2, __pyx_v_lat, __pyx_v_cart_f2); - - /* "easyCore/Utils/coord_cython.pyx":126 - * dot_2d_mod(fc1, lat, cart_f1) - * dot_2d_mod(fc2, lat, cart_f2) - * dot_2d(images_view, lat, cart_im) # <<<<<<<<<<<<<< - * - * vectors = np.empty((I, J, 3)) - */ - __pyx_f_8easyCore_5Utils_12coord_cython_dot_2d(__pyx_v_8easyCore_5Utils_12coord_cython_images_view, __pyx_v_lat, __pyx_v_cart_im); - - /* "easyCore/Utils/coord_cython.pyx":128 - * dot_2d(images_view, lat, cart_im) - * - * vectors = np.empty((I, J, 3)) # <<<<<<<<<<<<<< - * d2 = np.empty((I, J)) - * cdef np.float_t[:, :, ::1] vs = vectors - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 128, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 128, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_I); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 128, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_J); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 128, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 128, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_3); - __Pyx_INCREF(__pyx_int_3); - __Pyx_GIVEREF(__pyx_int_3); - PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_int_3); - __pyx_t_1 = 0; - __pyx_t_3 = 0; - __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_3)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_5 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_t_7) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_7); - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 128, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v_vectors = __pyx_t_5; - __pyx_t_5 = 0; - - /* "easyCore/Utils/coord_cython.pyx":129 - * - * vectors = np.empty((I, J, 3)) - * d2 = np.empty((I, J)) # <<<<<<<<<<<<<< - * cdef np.float_t[:, :, ::1] vs = vectors - * cdef np.float_t[:, ::1] ds = d2 - */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 129, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 129, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_I); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 129, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_J); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 129, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3); - __pyx_t_2 = 0; - __pyx_t_3 = 0; - __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) { - __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_7); - if (likely(__pyx_t_3)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_7, function); - } - } - __pyx_t_5 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_3, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_1); - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 129, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_v_d2 = __pyx_t_5; - __pyx_t_5 = 0; - - /* "easyCore/Utils/coord_cython.pyx":130 - * vectors = np.empty((I, J, 3)) - * d2 = np.empty((I, J)) - * cdef np.float_t[:, :, ::1] vs = vectors # <<<<<<<<<<<<<< - * cdef np.float_t[:, ::1] ds = d2 - * cdef np.float_t best, d, inc_d, da, db, dc, fdist - */ - __pyx_t_15 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float_t(__pyx_v_vectors, PyBUF_WRITABLE); if (unlikely(!__pyx_t_15.memview)) __PYX_ERR(0, 130, __pyx_L1_error) - __pyx_v_vs = __pyx_t_15; - __pyx_t_15.memview = NULL; - __pyx_t_15.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":131 - * d2 = np.empty((I, J)) - * cdef np.float_t[:, :, ::1] vs = vectors - * cdef np.float_t[:, ::1] ds = d2 # <<<<<<<<<<<<<< - * cdef np.float_t best, d, inc_d, da, db, dc, fdist - * cdef bint within_frac = True - */ - __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float_t(__pyx_v_d2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 131, __pyx_L1_error) - __pyx_v_ds = __pyx_t_8; - __pyx_t_8.memview = NULL; - __pyx_t_8.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":133 - * cdef np.float_t[:, ::1] ds = d2 - * cdef np.float_t best, d, inc_d, da, db, dc, fdist - * cdef bint within_frac = True # <<<<<<<<<<<<<< - * cdef np.float_t[:] pre_im = malloc(3 * sizeof(np.float_t)) - * - */ - __pyx_v_within_frac = 1; - - /* "easyCore/Utils/coord_cython.pyx":134 - * cdef np.float_t best, d, inc_d, da, db, dc, fdist - * cdef bint within_frac = True - * cdef np.float_t[:] pre_im = malloc(3 * sizeof(np.float_t)) # <<<<<<<<<<<<<< - * - * for i in range(I): - */ - __pyx_t_10 = malloc((3 * (sizeof(__pyx_t_5numpy_float_t)))); - if (!__pyx_t_10) { - PyErr_SetString(PyExc_ValueError,"Cannot create cython.array from NULL pointer"); - __PYX_ERR(0, 134, __pyx_L1_error) - } - __pyx_t_7 = __pyx_format_from_typeinfo(&__Pyx_TypeInfo_nn___pyx_t_5numpy_float_t); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 134, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_5 = Py_BuildValue((char*) "(" __PYX_BUILD_PY_SSIZE_T ")", ((Py_ssize_t)3)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 134, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_11 = __pyx_array_new(__pyx_t_5, sizeof(__pyx_t_5numpy_float_t), PyBytes_AS_STRING(__pyx_t_7), (char *) "c", (char *) __pyx_t_10); - if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 134, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_14 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_float_t(((PyObject *)__pyx_t_11), PyBUF_WRITABLE); if (unlikely(!__pyx_t_14.memview)) __PYX_ERR(0, 134, __pyx_L1_error) - __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0; - __pyx_v_pre_im = __pyx_t_14; - __pyx_t_14.memview = NULL; - __pyx_t_14.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":136 - * cdef np.float_t[:] pre_im = malloc(3 * sizeof(np.float_t)) - * - * for i in range(I): # <<<<<<<<<<<<<< - * for j in range(J): - * within_frac = False - */ - __pyx_t_4 = __pyx_v_I; - __pyx_t_16 = __pyx_t_4; - for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) { - __pyx_v_i = __pyx_t_17; - - /* "easyCore/Utils/coord_cython.pyx":137 - * - * for i in range(I): - * for j in range(J): # <<<<<<<<<<<<<< - * within_frac = False - * if (not has_mask) or (m[i, j] == 0): - */ - __pyx_t_18 = __pyx_v_J; - __pyx_t_19 = __pyx_t_18; - for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) { - __pyx_v_j = __pyx_t_20; - - /* "easyCore/Utils/coord_cython.pyx":138 - * for i in range(I): - * for j in range(J): - * within_frac = False # <<<<<<<<<<<<<< - * if (not has_mask) or (m[i, j] == 0): - * within_frac = True - */ - __pyx_v_within_frac = 0; - - /* "easyCore/Utils/coord_cython.pyx":139 - * for j in range(J): - * within_frac = False - * if (not has_mask) or (m[i, j] == 0): # <<<<<<<<<<<<<< - * within_frac = True - * if has_ftol: - */ - __pyx_t_21 = ((!(__pyx_v_has_mask != 0)) != 0); - if (!__pyx_t_21) { - } else { - __pyx_t_12 = __pyx_t_21; - goto __pyx_L12_bool_binop_done; - } - __pyx_t_22 = __pyx_v_i; - __pyx_t_23 = __pyx_v_j; - __pyx_t_21 = (((*((__pyx_t_5numpy_int_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_m.data + __pyx_t_22 * __pyx_v_m.strides[0]) ) + __pyx_t_23 * __pyx_v_m.strides[1]) ))) == 0) != 0); - __pyx_t_12 = __pyx_t_21; - __pyx_L12_bool_binop_done:; - if (__pyx_t_12) { - - /* "easyCore/Utils/coord_cython.pyx":140 - * within_frac = False - * if (not has_mask) or (m[i, j] == 0): - * within_frac = True # <<<<<<<<<<<<<< - * if has_ftol: - * for l in range(3): - */ - __pyx_v_within_frac = 1; - - /* "easyCore/Utils/coord_cython.pyx":141 - * if (not has_mask) or (m[i, j] == 0): - * within_frac = True - * if has_ftol: # <<<<<<<<<<<<<< - * for l in range(3): - * fdist = fc2[j, l] - fc1[i, l] - */ - __pyx_t_12 = (__pyx_v_has_ftol != 0); - if (__pyx_t_12) { - - /* "easyCore/Utils/coord_cython.pyx":142 - * within_frac = True - * if has_ftol: - * for l in range(3): # <<<<<<<<<<<<<< - * fdist = fc2[j, l] - fc1[i, l] - * if fabs(fdist - round(fdist)) > ftol[l]: - */ - for (__pyx_t_24 = 0; __pyx_t_24 < 3; __pyx_t_24+=1) { - __pyx_v_l = __pyx_t_24; - - /* "easyCore/Utils/coord_cython.pyx":143 - * if has_ftol: - * for l in range(3): - * fdist = fc2[j, l] - fc1[i, l] # <<<<<<<<<<<<<< - * if fabs(fdist - round(fdist)) > ftol[l]: - * within_frac = False - */ - __pyx_t_23 = __pyx_v_j; - __pyx_t_22 = __pyx_v_l; - __pyx_t_25 = __pyx_v_i; - __pyx_t_26 = __pyx_v_l; - __pyx_v_fdist = ((*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_fc2.data + __pyx_t_23 * __pyx_v_fc2.strides[0]) )) + __pyx_t_22)) ))) - (*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_fc1.data + __pyx_t_25 * __pyx_v_fc1.strides[0]) )) + __pyx_t_26)) )))); - - /* "easyCore/Utils/coord_cython.pyx":144 - * for l in range(3): - * fdist = fc2[j, l] - fc1[i, l] - * if fabs(fdist - round(fdist)) > ftol[l]: # <<<<<<<<<<<<<< - * within_frac = False - * break - */ - __pyx_t_26 = __pyx_v_l; - __pyx_t_12 = ((fabs((__pyx_v_fdist - round(__pyx_v_fdist))) > (*((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_ftol.data + __pyx_t_26 * __pyx_v_ftol.strides[0]) )))) != 0); - if (__pyx_t_12) { - - /* "easyCore/Utils/coord_cython.pyx":145 - * fdist = fc2[j, l] - fc1[i, l] - * if fabs(fdist - round(fdist)) > ftol[l]: - * within_frac = False # <<<<<<<<<<<<<< - * break - * if within_frac: - */ - __pyx_v_within_frac = 0; - - /* "easyCore/Utils/coord_cython.pyx":146 - * if fabs(fdist - round(fdist)) > ftol[l]: - * within_frac = False - * break # <<<<<<<<<<<<<< - * if within_frac: - * for l in range(3): - */ - goto __pyx_L16_break; - - /* "easyCore/Utils/coord_cython.pyx":144 - * for l in range(3): - * fdist = fc2[j, l] - fc1[i, l] - * if fabs(fdist - round(fdist)) > ftol[l]: # <<<<<<<<<<<<<< - * within_frac = False - * break - */ - } - } - __pyx_L16_break:; - - /* "easyCore/Utils/coord_cython.pyx":141 - * if (not has_mask) or (m[i, j] == 0): - * within_frac = True - * if has_ftol: # <<<<<<<<<<<<<< - * for l in range(3): - * fdist = fc2[j, l] - fc1[i, l] - */ - } - - /* "easyCore/Utils/coord_cython.pyx":147 - * within_frac = False - * break - * if within_frac: # <<<<<<<<<<<<<< - * for l in range(3): - * pre_im[l] = cart_f2[j, l] - cart_f1[i, l] - */ - __pyx_t_12 = (__pyx_v_within_frac != 0); - if (__pyx_t_12) { - - /* "easyCore/Utils/coord_cython.pyx":148 - * break - * if within_frac: - * for l in range(3): # <<<<<<<<<<<<<< - * pre_im[l] = cart_f2[j, l] - cart_f1[i, l] - * best = 1e100 - */ - for (__pyx_t_24 = 0; __pyx_t_24 < 3; __pyx_t_24+=1) { - __pyx_v_l = __pyx_t_24; - - /* "easyCore/Utils/coord_cython.pyx":149 - * if within_frac: - * for l in range(3): - * pre_im[l] = cart_f2[j, l] - cart_f1[i, l] # <<<<<<<<<<<<<< - * best = 1e100 - * for k in range(27): - */ - __pyx_t_26 = __pyx_v_j; - __pyx_t_25 = __pyx_v_l; - __pyx_t_22 = __pyx_v_i; - __pyx_t_23 = __pyx_v_l; - __pyx_t_27 = __pyx_v_l; - *((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_pre_im.data + __pyx_t_27 * __pyx_v_pre_im.strides[0]) )) = ((*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_cart_f2.data + __pyx_t_26 * __pyx_v_cart_f2.strides[0]) )) + __pyx_t_25)) ))) - (*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_cart_f1.data + __pyx_t_22 * __pyx_v_cart_f1.strides[0]) )) + __pyx_t_23)) )))); - } - - /* "easyCore/Utils/coord_cython.pyx":150 - * for l in range(3): - * pre_im[l] = cart_f2[j, l] - cart_f1[i, l] - * best = 1e100 # <<<<<<<<<<<<<< - * for k in range(27): - * # compilers have a hard time unrolling this - */ - __pyx_v_best = 1e100; - - /* "easyCore/Utils/coord_cython.pyx":151 - * pre_im[l] = cart_f2[j, l] - cart_f1[i, l] - * best = 1e100 - * for k in range(27): # <<<<<<<<<<<<<< - * # compilers have a hard time unrolling this - * da = pre_im[0] + cart_im[k, 0] - */ - for (__pyx_t_24 = 0; __pyx_t_24 < 27; __pyx_t_24+=1) { - __pyx_v_k = __pyx_t_24; - - /* "easyCore/Utils/coord_cython.pyx":153 - * for k in range(27): - * # compilers have a hard time unrolling this - * da = pre_im[0] + cart_im[k, 0] # <<<<<<<<<<<<<< - * db = pre_im[1] + cart_im[k, 1] - * dc = pre_im[2] + cart_im[k, 2] - */ - __pyx_t_23 = 0; - __pyx_t_22 = __pyx_v_k; - __pyx_t_25 = 0; - __pyx_v_da = ((*((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_pre_im.data + __pyx_t_23 * __pyx_v_pre_im.strides[0]) ))) + (*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_cart_im.data + __pyx_t_22 * __pyx_v_cart_im.strides[0]) )) + __pyx_t_25)) )))); - - /* "easyCore/Utils/coord_cython.pyx":154 - * # compilers have a hard time unrolling this - * da = pre_im[0] + cart_im[k, 0] - * db = pre_im[1] + cart_im[k, 1] # <<<<<<<<<<<<<< - * dc = pre_im[2] + cart_im[k, 2] - * d = da * da + db * db + dc * dc - */ - __pyx_t_25 = 1; - __pyx_t_22 = __pyx_v_k; - __pyx_t_23 = 1; - __pyx_v_db = ((*((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_pre_im.data + __pyx_t_25 * __pyx_v_pre_im.strides[0]) ))) + (*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_cart_im.data + __pyx_t_22 * __pyx_v_cart_im.strides[0]) )) + __pyx_t_23)) )))); - - /* "easyCore/Utils/coord_cython.pyx":155 - * da = pre_im[0] + cart_im[k, 0] - * db = pre_im[1] + cart_im[k, 1] - * dc = pre_im[2] + cart_im[k, 2] # <<<<<<<<<<<<<< - * d = da * da + db * db + dc * dc - * if d < best: - */ - __pyx_t_23 = 2; - __pyx_t_22 = __pyx_v_k; - __pyx_t_25 = 2; - __pyx_v_dc = ((*((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_pre_im.data + __pyx_t_23 * __pyx_v_pre_im.strides[0]) ))) + (*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_cart_im.data + __pyx_t_22 * __pyx_v_cart_im.strides[0]) )) + __pyx_t_25)) )))); - - /* "easyCore/Utils/coord_cython.pyx":156 - * db = pre_im[1] + cart_im[k, 1] - * dc = pre_im[2] + cart_im[k, 2] - * d = da * da + db * db + dc * dc # <<<<<<<<<<<<<< - * if d < best: - * best = d - */ - __pyx_v_d = (((__pyx_v_da * __pyx_v_da) + (__pyx_v_db * __pyx_v_db)) + (__pyx_v_dc * __pyx_v_dc)); - - /* "easyCore/Utils/coord_cython.pyx":157 - * dc = pre_im[2] + cart_im[k, 2] - * d = da * da + db * db + dc * dc - * if d < best: # <<<<<<<<<<<<<< - * best = d - * bestk = k - */ - __pyx_t_12 = ((__pyx_v_d < __pyx_v_best) != 0); - if (__pyx_t_12) { - - /* "easyCore/Utils/coord_cython.pyx":158 - * d = da * da + db * db + dc * dc - * if d < best: - * best = d # <<<<<<<<<<<<<< - * bestk = k - * ds[i, j] = best - */ - __pyx_v_best = __pyx_v_d; - - /* "easyCore/Utils/coord_cython.pyx":159 - * if d < best: - * best = d - * bestk = k # <<<<<<<<<<<<<< - * ds[i, j] = best - * for l in range(3): - */ - __pyx_v_bestk = __pyx_v_k; - - /* "easyCore/Utils/coord_cython.pyx":157 - * dc = pre_im[2] + cart_im[k, 2] - * d = da * da + db * db + dc * dc - * if d < best: # <<<<<<<<<<<<<< - * best = d - * bestk = k - */ - } - } - - /* "easyCore/Utils/coord_cython.pyx":160 - * best = d - * bestk = k - * ds[i, j] = best # <<<<<<<<<<<<<< - * for l in range(3): - * vs[i, j, l] = pre_im[l] + cart_im[bestk, l] - */ - __pyx_t_25 = __pyx_v_i; - __pyx_t_22 = __pyx_v_j; - *((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_ds.data + __pyx_t_25 * __pyx_v_ds.strides[0]) )) + __pyx_t_22)) )) = __pyx_v_best; - - /* "easyCore/Utils/coord_cython.pyx":161 - * bestk = k - * ds[i, j] = best - * for l in range(3): # <<<<<<<<<<<<<< - * vs[i, j, l] = pre_im[l] + cart_im[bestk, l] - * if not within_frac: - */ - for (__pyx_t_24 = 0; __pyx_t_24 < 3; __pyx_t_24+=1) { - __pyx_v_l = __pyx_t_24; - - /* "easyCore/Utils/coord_cython.pyx":162 - * ds[i, j] = best - * for l in range(3): - * vs[i, j, l] = pre_im[l] + cart_im[bestk, l] # <<<<<<<<<<<<<< - * if not within_frac: - * ds[i, j] = 1e20 - */ - __pyx_t_22 = __pyx_v_l; - __pyx_t_25 = __pyx_v_bestk; - __pyx_t_23 = __pyx_v_l; - __pyx_t_26 = __pyx_v_i; - __pyx_t_27 = __pyx_v_j; - __pyx_t_28 = __pyx_v_l; - *((__pyx_t_5numpy_float_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_vs.data + __pyx_t_26 * __pyx_v_vs.strides[0]) ) + __pyx_t_27 * __pyx_v_vs.strides[1]) )) + __pyx_t_28)) )) = ((*((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_pre_im.data + __pyx_t_22 * __pyx_v_pre_im.strides[0]) ))) + (*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_cart_im.data + __pyx_t_25 * __pyx_v_cart_im.strides[0]) )) + __pyx_t_23)) )))); - } - - /* "easyCore/Utils/coord_cython.pyx":147 - * within_frac = False - * break - * if within_frac: # <<<<<<<<<<<<<< - * for l in range(3): - * pre_im[l] = cart_f2[j, l] - cart_f1[i, l] - */ - } - - /* "easyCore/Utils/coord_cython.pyx":139 - * for j in range(J): - * within_frac = False - * if (not has_mask) or (m[i, j] == 0): # <<<<<<<<<<<<<< - * within_frac = True - * if has_ftol: - */ - } - - /* "easyCore/Utils/coord_cython.pyx":163 - * for l in range(3): - * vs[i, j, l] = pre_im[l] + cart_im[bestk, l] - * if not within_frac: # <<<<<<<<<<<<<< - * ds[i, j] = 1e20 - * for l in range(3): - */ - __pyx_t_12 = ((!(__pyx_v_within_frac != 0)) != 0); - if (__pyx_t_12) { - - /* "easyCore/Utils/coord_cython.pyx":164 - * vs[i, j, l] = pre_im[l] + cart_im[bestk, l] - * if not within_frac: - * ds[i, j] = 1e20 # <<<<<<<<<<<<<< - * for l in range(3): - * vs[i, j, l] = 1e20 - */ - __pyx_t_23 = __pyx_v_i; - __pyx_t_25 = __pyx_v_j; - *((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_ds.data + __pyx_t_23 * __pyx_v_ds.strides[0]) )) + __pyx_t_25)) )) = 1e20; - - /* "easyCore/Utils/coord_cython.pyx":165 - * if not within_frac: - * ds[i, j] = 1e20 - * for l in range(3): # <<<<<<<<<<<<<< - * vs[i, j, l] = 1e20 - * - */ - for (__pyx_t_24 = 0; __pyx_t_24 < 3; __pyx_t_24+=1) { - __pyx_v_l = __pyx_t_24; - - /* "easyCore/Utils/coord_cython.pyx":166 - * ds[i, j] = 1e20 - * for l in range(3): - * vs[i, j, l] = 1e20 # <<<<<<<<<<<<<< - * - * free(&cart_f1[0,0]) - */ - __pyx_t_25 = __pyx_v_i; - __pyx_t_23 = __pyx_v_j; - __pyx_t_22 = __pyx_v_l; - *((__pyx_t_5numpy_float_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_vs.data + __pyx_t_25 * __pyx_v_vs.strides[0]) ) + __pyx_t_23 * __pyx_v_vs.strides[1]) )) + __pyx_t_22)) )) = 1e20; - } - - /* "easyCore/Utils/coord_cython.pyx":163 - * for l in range(3): - * vs[i, j, l] = pre_im[l] + cart_im[bestk, l] - * if not within_frac: # <<<<<<<<<<<<<< - * ds[i, j] = 1e20 - * for l in range(3): - */ - } - } - } - - /* "easyCore/Utils/coord_cython.pyx":168 - * vs[i, j, l] = 1e20 - * - * free(&cart_f1[0,0]) # <<<<<<<<<<<<<< - * free(&cart_f2[0,0]) - * free(&cart_im[0,0]) - */ - __pyx_t_22 = 0; - __pyx_t_23 = 0; - free((&(*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_cart_f1.data + __pyx_t_22 * __pyx_v_cart_f1.strides[0]) )) + __pyx_t_23)) ))))); - - /* "easyCore/Utils/coord_cython.pyx":169 - * - * free(&cart_f1[0,0]) - * free(&cart_f2[0,0]) # <<<<<<<<<<<<<< - * free(&cart_im[0,0]) - * free(&pre_im[0]) - */ - __pyx_t_23 = 0; - __pyx_t_22 = 0; - free((&(*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_cart_f2.data + __pyx_t_23 * __pyx_v_cart_f2.strides[0]) )) + __pyx_t_22)) ))))); - - /* "easyCore/Utils/coord_cython.pyx":170 - * free(&cart_f1[0,0]) - * free(&cart_f2[0,0]) - * free(&cart_im[0,0]) # <<<<<<<<<<<<<< - * free(&pre_im[0]) - * - */ - __pyx_t_22 = 0; - __pyx_t_23 = 0; - free((&(*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_cart_im.data + __pyx_t_22 * __pyx_v_cart_im.strides[0]) )) + __pyx_t_23)) ))))); - - /* "easyCore/Utils/coord_cython.pyx":171 - * free(&cart_f2[0,0]) - * free(&cart_im[0,0]) - * free(&pre_im[0]) # <<<<<<<<<<<<<< - * - * if return_d2: - */ - __pyx_t_23 = 0; - free((&(*((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_pre_im.data + __pyx_t_23 * __pyx_v_pre_im.strides[0]) ))))); - - /* "easyCore/Utils/coord_cython.pyx":173 - * free(&pre_im[0]) - * - * if return_d2: # <<<<<<<<<<<<<< - * return vectors, d2 - * else: - */ - __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_v_return_d2); if (unlikely(__pyx_t_12 < 0)) __PYX_ERR(0, 173, __pyx_L1_error) - if (__pyx_t_12) { - - /* "easyCore/Utils/coord_cython.pyx":174 - * - * if return_d2: - * return vectors, d2 # <<<<<<<<<<<<<< - * else: - * return vectors - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 174, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_INCREF(__pyx_v_vectors); - __Pyx_GIVEREF(__pyx_v_vectors); - PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_vectors); - __Pyx_INCREF(__pyx_v_d2); - __Pyx_GIVEREF(__pyx_v_d2); - PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_v_d2); - __pyx_r = __pyx_t_7; - __pyx_t_7 = 0; - goto __pyx_L0; - - /* "easyCore/Utils/coord_cython.pyx":173 - * free(&pre_im[0]) - * - * if return_d2: # <<<<<<<<<<<<<< - * return vectors, d2 - * else: - */ - } - - /* "easyCore/Utils/coord_cython.pyx":176 - * return vectors, d2 - * else: - * return vectors # <<<<<<<<<<<<<< - * - * @cython.boundscheck(False) - */ - /*else*/ { - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_vectors); - __pyx_r = __pyx_v_vectors; - goto __pyx_L0; - } - - /* "easyCore/Utils/coord_cython.pyx":70 - * @cython.wraparound(False) - * @cython.initializedcheck(False) - * def pbc_shortest_vectors(lattice, fcoords1, fcoords2, mask=None, return_d2=False, lll_frac_tol=None): # <<<<<<<<<<<<<< - * """ - * Returns the shortest vectors between two lists of coordinates taking into - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_7); - __PYX_XDEC_MEMVIEW(&__pyx_t_8, 1); - __Pyx_XDECREF(((PyObject *)__pyx_t_11)); - __PYX_XDEC_MEMVIEW(&__pyx_t_13, 1); - __PYX_XDEC_MEMVIEW(&__pyx_t_14, 1); - __PYX_XDEC_MEMVIEW(&__pyx_t_15, 1); - __Pyx_AddTraceback("easyCore.Utils.coord_cython.pbc_shortest_vectors", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __PYX_XDEC_MEMVIEW(&__pyx_v_lat, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_fc1, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_fc2, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_cart_f1, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_cart_f2, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_cart_im, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_m, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_ftol, 1); - __Pyx_XDECREF(__pyx_v_vectors); - __Pyx_XDECREF(__pyx_v_d2); - __PYX_XDEC_MEMVIEW(&__pyx_v_vs, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_ds, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_pre_im, 1); - __Pyx_XDECREF(__pyx_v_fcoords1); - __Pyx_XDECREF(__pyx_v_fcoords2); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "easyCore/Utils/coord_cython.pyx":181 - * @cython.wraparound(False) - * @cython.initializedcheck(False) - * def is_coord_subset_pbc(subset, superset, atol, mask): # <<<<<<<<<<<<<< - * """ - * Tests if all fractional coords in subset are contained in superset. - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_8easyCore_5Utils_12coord_cython_3is_coord_subset_pbc(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_8easyCore_5Utils_12coord_cython_2is_coord_subset_pbc[] = "\n Tests if all fractional coords in subset are contained in superset.\n Allows specification of a mask determining pairs that are not\n allowed to match to each other\n\n Args:\n subset, superset: List of fractional coords\n\n Returns:\n True if all of subset is in superset.\n "; -static PyMethodDef __pyx_mdef_8easyCore_5Utils_12coord_cython_3is_coord_subset_pbc = {"is_coord_subset_pbc", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8easyCore_5Utils_12coord_cython_3is_coord_subset_pbc, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8easyCore_5Utils_12coord_cython_2is_coord_subset_pbc}; -static PyObject *__pyx_pw_8easyCore_5Utils_12coord_cython_3is_coord_subset_pbc(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_subset = 0; - PyObject *__pyx_v_superset = 0; - PyObject *__pyx_v_atol = 0; - PyObject *__pyx_v_mask = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("is_coord_subset_pbc (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_subset,&__pyx_n_s_superset,&__pyx_n_s_atol,&__pyx_n_s_mask,0}; - PyObject* values[4] = {0,0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_subset)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_superset)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("is_coord_subset_pbc", 1, 4, 4, 1); __PYX_ERR(0, 181, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_atol)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("is_coord_subset_pbc", 1, 4, 4, 2); __PYX_ERR(0, 181, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 3: - if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_mask)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("is_coord_subset_pbc", 1, 4, 4, 3); __PYX_ERR(0, 181, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "is_coord_subset_pbc") < 0)) __PYX_ERR(0, 181, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - } - __pyx_v_subset = values[0]; - __pyx_v_superset = values[1]; - __pyx_v_atol = values[2]; - __pyx_v_mask = values[3]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("is_coord_subset_pbc", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 181, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("easyCore.Utils.coord_cython.is_coord_subset_pbc", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_8easyCore_5Utils_12coord_cython_2is_coord_subset_pbc(__pyx_self, __pyx_v_subset, __pyx_v_superset, __pyx_v_atol, __pyx_v_mask); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_8easyCore_5Utils_12coord_cython_2is_coord_subset_pbc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_subset, PyObject *__pyx_v_superset, PyObject *__pyx_v_atol, PyObject *__pyx_v_mask) { - __Pyx_memviewslice __pyx_v_fc1 = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_v_fc2 = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_v_t = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_v_m = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_v_i; - int __pyx_v_j; - int __pyx_v_k; - int __pyx_v_I; - int __pyx_v_J; - __pyx_t_5numpy_float_t __pyx_v_d; - int __pyx_v_ok; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_memviewslice __pyx_t_1 = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_t_2 = { 0, 0, { 0 }, { 0 }, { 0 } }; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - __Pyx_memviewslice __pyx_t_8 = { 0, 0, { 0 }, { 0 }, { 0 } }; - int __pyx_t_9; - int __pyx_t_10; - int __pyx_t_11; - int __pyx_t_12; - int __pyx_t_13; - int __pyx_t_14; - Py_ssize_t __pyx_t_15; - Py_ssize_t __pyx_t_16; - int __pyx_t_17; - int __pyx_t_18; - Py_ssize_t __pyx_t_19; - Py_ssize_t __pyx_t_20; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("is_coord_subset_pbc", 0); - - /* "easyCore/Utils/coord_cython.pyx":194 - * """ - * - * cdef np.float_t[:, :] fc1 = subset # <<<<<<<<<<<<<< - * cdef np.float_t[:, :] fc2 = superset - * cdef np.float_t[:] t = atol - */ - __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float_t(__pyx_v_subset, PyBUF_WRITABLE); if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 194, __pyx_L1_error) - __pyx_v_fc1 = __pyx_t_1; - __pyx_t_1.memview = NULL; - __pyx_t_1.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":195 - * - * cdef np.float_t[:, :] fc1 = subset - * cdef np.float_t[:, :] fc2 = superset # <<<<<<<<<<<<<< - * cdef np.float_t[:] t = atol - * cdef np.int_t[:, :] m = np.array(mask, dtype=np.int_, copy=False, order='C') - */ - __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float_t(__pyx_v_superset, PyBUF_WRITABLE); if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 195, __pyx_L1_error) - __pyx_v_fc2 = __pyx_t_1; - __pyx_t_1.memview = NULL; - __pyx_t_1.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":196 - * cdef np.float_t[:, :] fc1 = subset - * cdef np.float_t[:, :] fc2 = superset - * cdef np.float_t[:] t = atol # <<<<<<<<<<<<<< - * cdef np.int_t[:, :] m = np.array(mask, dtype=np.int_, copy=False, order='C') - * - */ - __pyx_t_2 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_float_t(__pyx_v_atol, PyBUF_WRITABLE); if (unlikely(!__pyx_t_2.memview)) __PYX_ERR(0, 196, __pyx_L1_error) - __pyx_v_t = __pyx_t_2; - __pyx_t_2.memview = NULL; - __pyx_t_2.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":197 - * cdef np.float_t[:, :] fc2 = superset - * cdef np.float_t[:] t = atol - * cdef np.int_t[:, :] m = np.array(mask, dtype=np.int_, copy=False, order='C') # <<<<<<<<<<<<<< - * - * cdef int i, j, k, I, J - */ - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 197, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 197, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 197, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_v_mask); - __Pyx_GIVEREF(__pyx_v_mask); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_mask); - __pyx_t_5 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 197, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 197, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_int); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 197, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_dtype, __pyx_t_7) < 0) __PYX_ERR(0, 197, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_copy, Py_False) < 0) __PYX_ERR(0, 197, __pyx_L1_error) - if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_order, __pyx_n_s_C) < 0) __PYX_ERR(0, 197, __pyx_L1_error) - __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 197, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int_t(__pyx_t_7, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 197, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_v_m = __pyx_t_8; - __pyx_t_8.memview = NULL; - __pyx_t_8.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":203 - * cdef bint ok - * - * I = fc1.shape[0] # <<<<<<<<<<<<<< - * J = fc2.shape[0] - * - */ - __pyx_v_I = (__pyx_v_fc1.shape[0]); - - /* "easyCore/Utils/coord_cython.pyx":204 - * - * I = fc1.shape[0] - * J = fc2.shape[0] # <<<<<<<<<<<<<< - * - * for i in range(I): - */ - __pyx_v_J = (__pyx_v_fc2.shape[0]); - - /* "easyCore/Utils/coord_cython.pyx":206 - * J = fc2.shape[0] - * - * for i in range(I): # <<<<<<<<<<<<<< - * ok = False - * for j in range(J): - */ - __pyx_t_9 = __pyx_v_I; - __pyx_t_10 = __pyx_t_9; - for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { - __pyx_v_i = __pyx_t_11; - - /* "easyCore/Utils/coord_cython.pyx":207 - * - * for i in range(I): - * ok = False # <<<<<<<<<<<<<< - * for j in range(J): - * if m[i, j]: - */ - __pyx_v_ok = 0; - - /* "easyCore/Utils/coord_cython.pyx":208 - * for i in range(I): - * ok = False - * for j in range(J): # <<<<<<<<<<<<<< - * if m[i, j]: - * continue - */ - __pyx_t_12 = __pyx_v_J; - __pyx_t_13 = __pyx_t_12; - for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { - __pyx_v_j = __pyx_t_14; - - /* "easyCore/Utils/coord_cython.pyx":209 - * ok = False - * for j in range(J): - * if m[i, j]: # <<<<<<<<<<<<<< - * continue - * ok = True - */ - __pyx_t_15 = __pyx_v_i; - __pyx_t_16 = __pyx_v_j; - __pyx_t_17 = ((*((__pyx_t_5numpy_int_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_m.data + __pyx_t_15 * __pyx_v_m.strides[0]) ) + __pyx_t_16 * __pyx_v_m.strides[1]) ))) != 0); - if (__pyx_t_17) { - - /* "easyCore/Utils/coord_cython.pyx":210 - * for j in range(J): - * if m[i, j]: - * continue # <<<<<<<<<<<<<< - * ok = True - * for k in range(3): - */ - goto __pyx_L5_continue; - - /* "easyCore/Utils/coord_cython.pyx":209 - * ok = False - * for j in range(J): - * if m[i, j]: # <<<<<<<<<<<<<< - * continue - * ok = True - */ - } - - /* "easyCore/Utils/coord_cython.pyx":211 - * if m[i, j]: - * continue - * ok = True # <<<<<<<<<<<<<< - * for k in range(3): - * d = fc1[i, k] - fc2[j, k] - */ - __pyx_v_ok = 1; - - /* "easyCore/Utils/coord_cython.pyx":212 - * continue - * ok = True - * for k in range(3): # <<<<<<<<<<<<<< - * d = fc1[i, k] - fc2[j, k] - * if fabs(d - round(d)) > t[k]: - */ - for (__pyx_t_18 = 0; __pyx_t_18 < 3; __pyx_t_18+=1) { - __pyx_v_k = __pyx_t_18; - - /* "easyCore/Utils/coord_cython.pyx":213 - * ok = True - * for k in range(3): - * d = fc1[i, k] - fc2[j, k] # <<<<<<<<<<<<<< - * if fabs(d - round(d)) > t[k]: - * ok = False - */ - __pyx_t_16 = __pyx_v_i; - __pyx_t_15 = __pyx_v_k; - __pyx_t_19 = __pyx_v_j; - __pyx_t_20 = __pyx_v_k; - __pyx_v_d = ((*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fc1.data + __pyx_t_16 * __pyx_v_fc1.strides[0]) ) + __pyx_t_15 * __pyx_v_fc1.strides[1]) ))) - (*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fc2.data + __pyx_t_19 * __pyx_v_fc2.strides[0]) ) + __pyx_t_20 * __pyx_v_fc2.strides[1]) )))); - - /* "easyCore/Utils/coord_cython.pyx":214 - * for k in range(3): - * d = fc1[i, k] - fc2[j, k] - * if fabs(d - round(d)) > t[k]: # <<<<<<<<<<<<<< - * ok = False - * break - */ - __pyx_t_20 = __pyx_v_k; - __pyx_t_17 = ((fabs((__pyx_v_d - round(__pyx_v_d))) > (*((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_t.data + __pyx_t_20 * __pyx_v_t.strides[0]) )))) != 0); - if (__pyx_t_17) { - - /* "easyCore/Utils/coord_cython.pyx":215 - * d = fc1[i, k] - fc2[j, k] - * if fabs(d - round(d)) > t[k]: - * ok = False # <<<<<<<<<<<<<< - * break - * if ok: - */ - __pyx_v_ok = 0; - - /* "easyCore/Utils/coord_cython.pyx":216 - * if fabs(d - round(d)) > t[k]: - * ok = False - * break # <<<<<<<<<<<<<< - * if ok: - * break - */ - goto __pyx_L9_break; - - /* "easyCore/Utils/coord_cython.pyx":214 - * for k in range(3): - * d = fc1[i, k] - fc2[j, k] - * if fabs(d - round(d)) > t[k]: # <<<<<<<<<<<<<< - * ok = False - * break - */ - } - } - __pyx_L9_break:; - - /* "easyCore/Utils/coord_cython.pyx":217 - * ok = False - * break - * if ok: # <<<<<<<<<<<<<< - * break - * if not ok: - */ - __pyx_t_17 = (__pyx_v_ok != 0); - if (__pyx_t_17) { - - /* "easyCore/Utils/coord_cython.pyx":218 - * break - * if ok: - * break # <<<<<<<<<<<<<< - * if not ok: - * break - */ - goto __pyx_L6_break; - - /* "easyCore/Utils/coord_cython.pyx":217 - * ok = False - * break - * if ok: # <<<<<<<<<<<<<< - * break - * if not ok: - */ - } - __pyx_L5_continue:; - } - __pyx_L6_break:; - - /* "easyCore/Utils/coord_cython.pyx":219 - * if ok: - * break - * if not ok: # <<<<<<<<<<<<<< - * break - * return bool(ok) - */ - __pyx_t_17 = ((!(__pyx_v_ok != 0)) != 0); - if (__pyx_t_17) { - - /* "easyCore/Utils/coord_cython.pyx":220 - * break - * if not ok: - * break # <<<<<<<<<<<<<< - * return bool(ok) - * - */ - goto __pyx_L4_break; - - /* "easyCore/Utils/coord_cython.pyx":219 - * if ok: - * break - * if not ok: # <<<<<<<<<<<<<< - * break - * return bool(ok) - */ - } - } - __pyx_L4_break:; - - /* "easyCore/Utils/coord_cython.pyx":221 - * if not ok: - * break - * return bool(ok) # <<<<<<<<<<<<<< - * - * @cython.boundscheck(False) - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_17 = __pyx_v_ok; - __pyx_t_7 = __Pyx_PyBool_FromLong((!(!__pyx_t_17))); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 221, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_r = __pyx_t_7; - __pyx_t_7 = 0; - goto __pyx_L0; - - /* "easyCore/Utils/coord_cython.pyx":181 - * @cython.wraparound(False) - * @cython.initializedcheck(False) - * def is_coord_subset_pbc(subset, superset, atol, mask): # <<<<<<<<<<<<<< - * """ - * Tests if all fractional coords in subset are contained in superset. - */ - - /* function exit code */ - __pyx_L1_error:; - __PYX_XDEC_MEMVIEW(&__pyx_t_1, 1); - __PYX_XDEC_MEMVIEW(&__pyx_t_2, 1); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __PYX_XDEC_MEMVIEW(&__pyx_t_8, 1); - __Pyx_AddTraceback("easyCore.Utils.coord_cython.is_coord_subset_pbc", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __PYX_XDEC_MEMVIEW(&__pyx_v_fc1, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_fc2, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_t, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_m, 1); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "easyCore/Utils/coord_cython.pyx":226 - * @cython.wraparound(False) - * @cython.initializedcheck(False) - * def coord_list_mapping_pbc(subset, superset, atol=1e-8): # <<<<<<<<<<<<<< - * """ - * Gives the index mapping from a subset to a superset. - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_8easyCore_5Utils_12coord_cython_5coord_list_mapping_pbc(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_8easyCore_5Utils_12coord_cython_4coord_list_mapping_pbc[] = "\n Gives the index mapping from a subset to a superset.\n Superset cannot contain duplicate matching rows\n\n Args:\n subset, superset: List of frac_coords\n\n Returns:\n list of indices such that superset[indices] = subset\n "; -static PyMethodDef __pyx_mdef_8easyCore_5Utils_12coord_cython_5coord_list_mapping_pbc = {"coord_list_mapping_pbc", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8easyCore_5Utils_12coord_cython_5coord_list_mapping_pbc, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8easyCore_5Utils_12coord_cython_4coord_list_mapping_pbc}; -static PyObject *__pyx_pw_8easyCore_5Utils_12coord_cython_5coord_list_mapping_pbc(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_subset = 0; - PyObject *__pyx_v_superset = 0; - PyObject *__pyx_v_atol = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("coord_list_mapping_pbc (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_subset,&__pyx_n_s_superset,&__pyx_n_s_atol,0}; - PyObject* values[3] = {0,0,0}; - values[2] = ((PyObject *)__pyx_float_1eneg_8); - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_subset)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_superset)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("coord_list_mapping_pbc", 0, 2, 3, 1); __PYX_ERR(0, 226, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_atol); - if (value) { values[2] = value; kw_args--; } - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "coord_list_mapping_pbc") < 0)) __PYX_ERR(0, 226, __pyx_L3_error) - } - } else { - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - break; - default: goto __pyx_L5_argtuple_error; - } - } - __pyx_v_subset = values[0]; - __pyx_v_superset = values[1]; - __pyx_v_atol = values[2]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("coord_list_mapping_pbc", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 226, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("easyCore.Utils.coord_cython.coord_list_mapping_pbc", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_8easyCore_5Utils_12coord_cython_4coord_list_mapping_pbc(__pyx_self, __pyx_v_subset, __pyx_v_superset, __pyx_v_atol); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_8easyCore_5Utils_12coord_cython_4coord_list_mapping_pbc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_subset, PyObject *__pyx_v_superset, PyObject *__pyx_v_atol) { - PyObject *__pyx_v_inds = NULL; - __Pyx_memviewslice __pyx_v_fc1 = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_v_fc2 = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_v_t = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_v_c_inds = { 0, 0, { 0 }, { 0 }, { 0 } }; - __pyx_t_5numpy_float_t __pyx_v_d; - int __pyx_v_ok_inner; - int __pyx_v_ok_outer; - Py_ssize_t __pyx_v_I; - Py_ssize_t __pyx_v_J; - Py_ssize_t __pyx_v_i; - Py_ssize_t __pyx_v_j; - long __pyx_v_k; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - Py_ssize_t __pyx_t_3; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - __Pyx_memviewslice __pyx_t_7 = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_t_8 = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_memviewslice __pyx_t_9 = { 0, 0, { 0 }, { 0 }, { 0 } }; - Py_ssize_t __pyx_t_10; - Py_ssize_t __pyx_t_11; - Py_ssize_t __pyx_t_12; - Py_ssize_t __pyx_t_13; - Py_ssize_t __pyx_t_14; - long __pyx_t_15; - Py_ssize_t __pyx_t_16; - Py_ssize_t __pyx_t_17; - Py_ssize_t __pyx_t_18; - Py_ssize_t __pyx_t_19; - int __pyx_t_20; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("coord_list_mapping_pbc", 0); - __Pyx_INCREF(__pyx_v_subset); - __Pyx_INCREF(__pyx_v_superset); - - /* "easyCore/Utils/coord_cython.pyx":237 - * list of indices such that superset[indices] = subset - * """ - * inds = np.zeros(len(subset), dtype=np.int) - 1 # <<<<<<<<<<<<<< - * subset = np.atleast_2d(subset) - * superset = np.atleast_2d(superset) - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_3 = PyObject_Length(__pyx_v_subset); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(0, 237, __pyx_L1_error) - __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); - __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_int_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_6) < 0) __PYX_ERR(0, 237, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyInt_SubtractObjC(__pyx_t_6, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_v_inds = __pyx_t_1; - __pyx_t_1 = 0; - - /* "easyCore/Utils/coord_cython.pyx":238 - * """ - * inds = np.zeros(len(subset), dtype=np.int) - 1 - * subset = np.atleast_2d(subset) # <<<<<<<<<<<<<< - * superset = np.atleast_2d(superset) - * - */ - __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 238, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_atleast_2d); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 238, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { - __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4); - if (likely(__pyx_t_6)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); - __Pyx_INCREF(__pyx_t_6); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_4, function); - } - } - __pyx_t_1 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_6, __pyx_v_subset) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_subset); - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 238, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF_SET(__pyx_v_subset, __pyx_t_1); - __pyx_t_1 = 0; - - /* "easyCore/Utils/coord_cython.pyx":239 - * inds = np.zeros(len(subset), dtype=np.int) - 1 - * subset = np.atleast_2d(subset) - * superset = np.atleast_2d(superset) # <<<<<<<<<<<<<< - * - * cdef np.float_t[:, :] fc1 = subset - */ - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 239, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_atleast_2d); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 239, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_6); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_6, function); - } - } - __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_6, __pyx_t_4, __pyx_v_superset) : __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_v_superset); - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 239, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_DECREF_SET(__pyx_v_superset, __pyx_t_1); - __pyx_t_1 = 0; - - /* "easyCore/Utils/coord_cython.pyx":241 - * superset = np.atleast_2d(superset) - * - * cdef np.float_t[:, :] fc1 = subset # <<<<<<<<<<<<<< - * cdef np.float_t[:, :] fc2 = superset - * cdef np.float_t[:] t = atol - */ - __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float_t(__pyx_v_subset, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 241, __pyx_L1_error) - __pyx_v_fc1 = __pyx_t_7; - __pyx_t_7.memview = NULL; - __pyx_t_7.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":242 - * - * cdef np.float_t[:, :] fc1 = subset - * cdef np.float_t[:, :] fc2 = superset # <<<<<<<<<<<<<< - * cdef np.float_t[:] t = atol - * cdef np.int_t[:] c_inds = inds - */ - __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float_t(__pyx_v_superset, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 242, __pyx_L1_error) - __pyx_v_fc2 = __pyx_t_7; - __pyx_t_7.memview = NULL; - __pyx_t_7.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":243 - * cdef np.float_t[:, :] fc1 = subset - * cdef np.float_t[:, :] fc2 = superset - * cdef np.float_t[:] t = atol # <<<<<<<<<<<<<< - * cdef np.int_t[:] c_inds = inds - * cdef np.float_t d - */ - __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_float_t(__pyx_v_atol, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 243, __pyx_L1_error) - __pyx_v_t = __pyx_t_8; - __pyx_t_8.memview = NULL; - __pyx_t_8.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":244 - * cdef np.float_t[:, :] fc2 = superset - * cdef np.float_t[:] t = atol - * cdef np.int_t[:] c_inds = inds # <<<<<<<<<<<<<< - * cdef np.float_t d - * cdef bint ok_inner, ok_outer - */ - __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_int_t(__pyx_v_inds, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 244, __pyx_L1_error) - __pyx_v_c_inds = __pyx_t_9; - __pyx_t_9.memview = NULL; - __pyx_t_9.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":248 - * cdef bint ok_inner, ok_outer - * - * I = fc1.shape[0] # <<<<<<<<<<<<<< - * J = fc2.shape[0] - * - */ - __pyx_v_I = (__pyx_v_fc1.shape[0]); - - /* "easyCore/Utils/coord_cython.pyx":249 - * - * I = fc1.shape[0] - * J = fc2.shape[0] # <<<<<<<<<<<<<< - * - * for i in range(I): - */ - __pyx_v_J = (__pyx_v_fc2.shape[0]); - - /* "easyCore/Utils/coord_cython.pyx":251 - * J = fc2.shape[0] - * - * for i in range(I): # <<<<<<<<<<<<<< - * ok_outer = False - * for j in range(J): - */ - __pyx_t_3 = __pyx_v_I; - __pyx_t_10 = __pyx_t_3; - for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { - __pyx_v_i = __pyx_t_11; - - /* "easyCore/Utils/coord_cython.pyx":252 - * - * for i in range(I): - * ok_outer = False # <<<<<<<<<<<<<< - * for j in range(J): - * ok_inner = True - */ - __pyx_v_ok_outer = 0; - - /* "easyCore/Utils/coord_cython.pyx":253 - * for i in range(I): - * ok_outer = False - * for j in range(J): # <<<<<<<<<<<<<< - * ok_inner = True - * for k in range(3): - */ - __pyx_t_12 = __pyx_v_J; - __pyx_t_13 = __pyx_t_12; - for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { - __pyx_v_j = __pyx_t_14; - - /* "easyCore/Utils/coord_cython.pyx":254 - * ok_outer = False - * for j in range(J): - * ok_inner = True # <<<<<<<<<<<<<< - * for k in range(3): - * d = fc1[i, k] - fc2[j, k] - */ - __pyx_v_ok_inner = 1; - - /* "easyCore/Utils/coord_cython.pyx":255 - * for j in range(J): - * ok_inner = True - * for k in range(3): # <<<<<<<<<<<<<< - * d = fc1[i, k] - fc2[j, k] - * if fabs(d - round(d)) > t[k]: - */ - for (__pyx_t_15 = 0; __pyx_t_15 < 3; __pyx_t_15+=1) { - __pyx_v_k = __pyx_t_15; - - /* "easyCore/Utils/coord_cython.pyx":256 - * ok_inner = True - * for k in range(3): - * d = fc1[i, k] - fc2[j, k] # <<<<<<<<<<<<<< - * if fabs(d - round(d)) > t[k]: - * ok_inner = False - */ - __pyx_t_16 = __pyx_v_i; - __pyx_t_17 = __pyx_v_k; - __pyx_t_18 = __pyx_v_j; - __pyx_t_19 = __pyx_v_k; - __pyx_v_d = ((*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fc1.data + __pyx_t_16 * __pyx_v_fc1.strides[0]) ) + __pyx_t_17 * __pyx_v_fc1.strides[1]) ))) - (*((__pyx_t_5numpy_float_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fc2.data + __pyx_t_18 * __pyx_v_fc2.strides[0]) ) + __pyx_t_19 * __pyx_v_fc2.strides[1]) )))); - - /* "easyCore/Utils/coord_cython.pyx":257 - * for k in range(3): - * d = fc1[i, k] - fc2[j, k] - * if fabs(d - round(d)) > t[k]: # <<<<<<<<<<<<<< - * ok_inner = False - * break - */ - __pyx_t_19 = __pyx_v_k; - __pyx_t_20 = ((fabs((__pyx_v_d - round(__pyx_v_d))) > (*((__pyx_t_5numpy_float_t *) ( /* dim=0 */ (__pyx_v_t.data + __pyx_t_19 * __pyx_v_t.strides[0]) )))) != 0); - if (__pyx_t_20) { - - /* "easyCore/Utils/coord_cython.pyx":258 - * d = fc1[i, k] - fc2[j, k] - * if fabs(d - round(d)) > t[k]: - * ok_inner = False # <<<<<<<<<<<<<< - * break - * if ok_inner: - */ - __pyx_v_ok_inner = 0; - - /* "easyCore/Utils/coord_cython.pyx":259 - * if fabs(d - round(d)) > t[k]: - * ok_inner = False - * break # <<<<<<<<<<<<<< - * if ok_inner: - * if c_inds[i] >= 0: - */ - goto __pyx_L8_break; - - /* "easyCore/Utils/coord_cython.pyx":257 - * for k in range(3): - * d = fc1[i, k] - fc2[j, k] - * if fabs(d - round(d)) > t[k]: # <<<<<<<<<<<<<< - * ok_inner = False - * break - */ - } - } - __pyx_L8_break:; - - /* "easyCore/Utils/coord_cython.pyx":260 - * ok_inner = False - * break - * if ok_inner: # <<<<<<<<<<<<<< - * if c_inds[i] >= 0: - * raise ValueError("Something wrong with the inputs, likely duplicates " - */ - __pyx_t_20 = (__pyx_v_ok_inner != 0); - if (__pyx_t_20) { - - /* "easyCore/Utils/coord_cython.pyx":261 - * break - * if ok_inner: - * if c_inds[i] >= 0: # <<<<<<<<<<<<<< - * raise ValueError("Something wrong with the inputs, likely duplicates " - * "in superset") - */ - __pyx_t_19 = __pyx_v_i; - __pyx_t_20 = (((*((__pyx_t_5numpy_int_t *) ( /* dim=0 */ (__pyx_v_c_inds.data + __pyx_t_19 * __pyx_v_c_inds.strides[0]) ))) >= 0) != 0); - if (unlikely(__pyx_t_20)) { - - /* "easyCore/Utils/coord_cython.pyx":262 - * if ok_inner: - * if c_inds[i] >= 0: - * raise ValueError("Something wrong with the inputs, likely duplicates " # <<<<<<<<<<<<<< - * "in superset") - * c_inds[i] = j - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 262, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(0, 262, __pyx_L1_error) - - /* "easyCore/Utils/coord_cython.pyx":261 - * break - * if ok_inner: - * if c_inds[i] >= 0: # <<<<<<<<<<<<<< - * raise ValueError("Something wrong with the inputs, likely duplicates " - * "in superset") - */ - } - - /* "easyCore/Utils/coord_cython.pyx":264 - * raise ValueError("Something wrong with the inputs, likely duplicates " - * "in superset") - * c_inds[i] = j # <<<<<<<<<<<<<< - * ok_outer = True - * # we don't break here so we can check for duplicates in superset - */ - __pyx_t_19 = __pyx_v_i; - *((__pyx_t_5numpy_int_t *) ( /* dim=0 */ (__pyx_v_c_inds.data + __pyx_t_19 * __pyx_v_c_inds.strides[0]) )) = __pyx_v_j; - - /* "easyCore/Utils/coord_cython.pyx":265 - * "in superset") - * c_inds[i] = j - * ok_outer = True # <<<<<<<<<<<<<< - * # we don't break here so we can check for duplicates in superset - * if not ok_outer: - */ - __pyx_v_ok_outer = 1; - - /* "easyCore/Utils/coord_cython.pyx":260 - * ok_inner = False - * break - * if ok_inner: # <<<<<<<<<<<<<< - * if c_inds[i] >= 0: - * raise ValueError("Something wrong with the inputs, likely duplicates " - */ - } - } - - /* "easyCore/Utils/coord_cython.pyx":267 - * ok_outer = True - * # we don't break here so we can check for duplicates in superset - * if not ok_outer: # <<<<<<<<<<<<<< - * break - * - */ - __pyx_t_20 = ((!(__pyx_v_ok_outer != 0)) != 0); - if (__pyx_t_20) { - - /* "easyCore/Utils/coord_cython.pyx":268 - * # we don't break here so we can check for duplicates in superset - * if not ok_outer: - * break # <<<<<<<<<<<<<< - * - * if not ok_outer: - */ - goto __pyx_L4_break; - - /* "easyCore/Utils/coord_cython.pyx":267 - * ok_outer = True - * # we don't break here so we can check for duplicates in superset - * if not ok_outer: # <<<<<<<<<<<<<< - * break - * - */ - } - } - __pyx_L4_break:; - - /* "easyCore/Utils/coord_cython.pyx":270 - * break - * - * if not ok_outer: # <<<<<<<<<<<<<< - * raise ValueError("subset is not a subset of superset") - * - */ - __pyx_t_20 = ((!(__pyx_v_ok_outer != 0)) != 0); - if (unlikely(__pyx_t_20)) { - - /* "easyCore/Utils/coord_cython.pyx":271 - * - * if not ok_outer: - * raise ValueError("subset is not a subset of superset") # <<<<<<<<<<<<<< - * - * return inds - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 271, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(0, 271, __pyx_L1_error) - - /* "easyCore/Utils/coord_cython.pyx":270 - * break - * - * if not ok_outer: # <<<<<<<<<<<<<< - * raise ValueError("subset is not a subset of superset") - * - */ - } - - /* "easyCore/Utils/coord_cython.pyx":273 - * raise ValueError("subset is not a subset of superset") - * - * return inds # <<<<<<<<<<<<<< - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_inds); - __pyx_r = __pyx_v_inds; - goto __pyx_L0; - - /* "easyCore/Utils/coord_cython.pyx":226 - * @cython.wraparound(False) - * @cython.initializedcheck(False) - * def coord_list_mapping_pbc(subset, superset, atol=1e-8): # <<<<<<<<<<<<<< - * """ - * Gives the index mapping from a subset to a superset. - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1); - __PYX_XDEC_MEMVIEW(&__pyx_t_8, 1); - __PYX_XDEC_MEMVIEW(&__pyx_t_9, 1); - __Pyx_AddTraceback("easyCore.Utils.coord_cython.coord_list_mapping_pbc", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_inds); - __PYX_XDEC_MEMVIEW(&__pyx_v_fc1, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_fc2, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_t, 1); - __PYX_XDEC_MEMVIEW(&__pyx_v_c_inds, 1); - __Pyx_XDECREF(__pyx_v_subset); - __Pyx_XDECREF(__pyx_v_superset); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":742 - * ctypedef npy_cdouble complex_t - * - * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(1, a) - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":743 - * - * cdef inline object PyArray_MultiIterNew1(a): - * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< - * - * cdef inline object PyArray_MultiIterNew2(a, b): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 743, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":742 - * ctypedef npy_cdouble complex_t - * - * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(1, a) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":745 - * return PyArray_MultiIterNew(1, a) - * - * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(2, a, b) - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":746 - * - * cdef inline object PyArray_MultiIterNew2(a, b): - * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< - * - * cdef inline object PyArray_MultiIterNew3(a, b, c): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 746, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":745 - * return PyArray_MultiIterNew(1, a) - * - * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(2, a, b) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":748 - * return PyArray_MultiIterNew(2, a, b) - * - * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(3, a, b, c) - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":749 - * - * cdef inline object PyArray_MultiIterNew3(a, b, c): - * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< - * - * cdef inline object PyArray_MultiIterNew4(a, b, c, d): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 749, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":748 - * return PyArray_MultiIterNew(2, a, b) - * - * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(3, a, b, c) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":751 - * return PyArray_MultiIterNew(3, a, b, c) - * - * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(4, a, b, c, d) - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":752 - * - * cdef inline object PyArray_MultiIterNew4(a, b, c, d): - * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< - * - * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 752, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":751 - * return PyArray_MultiIterNew(3, a, b, c) - * - * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(4, a, b, c, d) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":754 - * return PyArray_MultiIterNew(4, a, b, c, d) - * - * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(5, a, b, c, d, e) - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":755 - * - * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): - * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< - * - * cdef inline tuple PyDataType_SHAPE(dtype d): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 755, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":754 - * return PyArray_MultiIterNew(4, a, b, c, d) - * - * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(5, a, b, c, d, e) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":757 - * return PyArray_MultiIterNew(5, a, b, c, d, e) - * - * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< - * if PyDataType_HASSUBARRAY(d): - * return d.subarray.shape - */ - -static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":758 - * - * cdef inline tuple PyDataType_SHAPE(dtype d): - * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< - * return d.subarray.shape - * else: - */ - __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); - if (__pyx_t_1) { - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":759 - * cdef inline tuple PyDataType_SHAPE(dtype d): - * if PyDataType_HASSUBARRAY(d): - * return d.subarray.shape # <<<<<<<<<<<<<< - * else: - * return () - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); - __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); - goto __pyx_L0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":758 - * - * cdef inline tuple PyDataType_SHAPE(dtype d): - * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< - * return d.subarray.shape - * else: - */ - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":761 - * return d.subarray.shape - * else: - * return () # <<<<<<<<<<<<<< - * - * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: - */ - /*else*/ { - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_empty_tuple); - __pyx_r = __pyx_empty_tuple; - goto __pyx_L0; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":757 - * return PyArray_MultiIterNew(5, a, b, c, d, e) - * - * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< - * if PyDataType_HASSUBARRAY(d): - * return d.subarray.shape - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":763 - * return () - * - * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< - * # Recursive utility function used in __getbuffer__ to get format - * # string. The new location in the format string is returned. - */ - -static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { - PyArray_Descr *__pyx_v_child = 0; - int __pyx_v_endian_detector; - int __pyx_v_little_endian; - PyObject *__pyx_v_fields = 0; - PyObject *__pyx_v_childname = NULL; - PyObject *__pyx_v_new_offset = NULL; - PyObject *__pyx_v_t = NULL; - char *__pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - Py_ssize_t __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - int __pyx_t_6; - int __pyx_t_7; - long __pyx_t_8; - char *__pyx_t_9; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_util_dtypestring", 0); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":768 - * - * cdef dtype child - * cdef int endian_detector = 1 # <<<<<<<<<<<<<< - * cdef bint little_endian = ((&endian_detector)[0] != 0) - * cdef tuple fields - */ - __pyx_v_endian_detector = 1; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":769 - * cdef dtype child - * cdef int endian_detector = 1 - * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< - * cdef tuple fields - * - */ - __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":772 - * cdef tuple fields - * - * for childname in descr.names: # <<<<<<<<<<<<<< - * fields = descr.fields[childname] - * child, new_offset = fields - */ - if (unlikely(__pyx_v_descr->names == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); - __PYX_ERR(1, 772, __pyx_L1_error) - } - __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; - for (;;) { - if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 772, __pyx_L1_error) - #else - __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 772, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - #endif - __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); - __pyx_t_3 = 0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":773 - * - * for childname in descr.names: - * fields = descr.fields[childname] # <<<<<<<<<<<<<< - * child, new_offset = fields - * - */ - if (unlikely(__pyx_v_descr->fields == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 773, __pyx_L1_error) - } - __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 773, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(1, 773, __pyx_L1_error) - __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); - __pyx_t_3 = 0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":774 - * for childname in descr.names: - * fields = descr.fields[childname] - * child, new_offset = fields # <<<<<<<<<<<<<< - * - * if (end - f) - (new_offset - offset[0]) < 15: - */ - if (likely(__pyx_v_fields != Py_None)) { - PyObject* sequence = __pyx_v_fields; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 2)) { - if (size > 2) __Pyx_RaiseTooManyValuesError(2); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(1, 774, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(__pyx_t_4); - #else - __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 774, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 774, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - #endif - } else { - __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 774, __pyx_L1_error) - } - if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) __PYX_ERR(1, 774, __pyx_L1_error) - __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3)); - __pyx_t_3 = 0; - __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); - __pyx_t_4 = 0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":776 - * child, new_offset = fields - * - * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * - */ - __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 776, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 776, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 776, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); - if (unlikely(__pyx_t_6)) { - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":777 - * - * if (end - f) - (new_offset - offset[0]) < 15: - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< - * - * if ((child.byteorder == c'>' and little_endian) or - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 777, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 777, __pyx_L1_error) - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":776 - * child, new_offset = fields - * - * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * - */ - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":779 - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * - * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< - * (child.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") - */ - __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0); - if (!__pyx_t_7) { - goto __pyx_L8_next_or; - } else { - } - __pyx_t_7 = (__pyx_v_little_endian != 0); - if (!__pyx_t_7) { - } else { - __pyx_t_6 = __pyx_t_7; - goto __pyx_L7_bool_binop_done; - } - __pyx_L8_next_or:; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":780 - * - * if ((child.byteorder == c'>' and little_endian) or - * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< - * raise ValueError(u"Non-native byte order not supported") - * # One could encode it in the format string and have Cython - */ - __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0); - if (__pyx_t_7) { - } else { - __pyx_t_6 = __pyx_t_7; - goto __pyx_L7_bool_binop_done; - } - __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0); - __pyx_t_6 = __pyx_t_7; - __pyx_L7_bool_binop_done:; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":779 - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * - * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< - * (child.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") - */ - if (unlikely(__pyx_t_6)) { - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":781 - * if ((child.byteorder == c'>' and little_endian) or - * (child.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< - * # One could encode it in the format string and have Cython - * # complain instead, BUT: < and > in format strings also imply - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 781, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 781, __pyx_L1_error) - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":779 - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * - * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< - * (child.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") - */ - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":791 - * - * # Output padding bytes - * while offset[0] < new_offset: # <<<<<<<<<<<<<< - * f[0] = 120 # "x"; pad byte - * f += 1 - */ - while (1) { - __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 791, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 791, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 791, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (!__pyx_t_6) break; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":792 - * # Output padding bytes - * while offset[0] < new_offset: - * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< - * f += 1 - * offset[0] += 1 - */ - (__pyx_v_f[0]) = 0x78; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":793 - * while offset[0] < new_offset: - * f[0] = 120 # "x"; pad byte - * f += 1 # <<<<<<<<<<<<<< - * offset[0] += 1 - * - */ - __pyx_v_f = (__pyx_v_f + 1); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":794 - * f[0] = 120 # "x"; pad byte - * f += 1 - * offset[0] += 1 # <<<<<<<<<<<<<< - * - * offset[0] += child.itemsize - */ - __pyx_t_8 = 0; - (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":796 - * offset[0] += 1 - * - * offset[0] += child.itemsize # <<<<<<<<<<<<<< - * - * if not PyDataType_HASFIELDS(child): - */ - __pyx_t_8 = 0; - (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":798 - * offset[0] += child.itemsize - * - * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< - * t = child.type_num - * if end - f < 5: - */ - __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); - if (__pyx_t_6) { - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":799 - * - * if not PyDataType_HASFIELDS(child): - * t = child.type_num # <<<<<<<<<<<<<< - * if end - f < 5: - * raise RuntimeError(u"Format string allocated too short.") - */ - __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 799, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); - __pyx_t_4 = 0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":800 - * if not PyDataType_HASFIELDS(child): - * t = child.type_num - * if end - f < 5: # <<<<<<<<<<<<<< - * raise RuntimeError(u"Format string allocated too short.") - * - */ - __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); - if (unlikely(__pyx_t_6)) { - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":801 - * t = child.type_num - * if end - f < 5: - * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< - * - * # Until ticket #99 is fixed, use integers to avoid warnings - */ - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 801, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 801, __pyx_L1_error) - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":800 - * if not PyDataType_HASFIELDS(child): - * t = child.type_num - * if end - f < 5: # <<<<<<<<<<<<<< - * raise RuntimeError(u"Format string allocated too short.") - * - */ - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":804 - * - * # Until ticket #99 is fixed, use integers to avoid warnings - * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< - * elif t == NPY_UBYTE: f[0] = 66 #"B" - * elif t == NPY_SHORT: f[0] = 104 #"h" - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_BYTE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 804, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 804, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 804, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 98; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":805 - * # Until ticket #99 is fixed, use integers to avoid warnings - * if t == NPY_BYTE: f[0] = 98 #"b" - * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< - * elif t == NPY_SHORT: f[0] = 104 #"h" - * elif t == NPY_USHORT: f[0] = 72 #"H" - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UBYTE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 805, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 805, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 805, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 66; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":806 - * if t == NPY_BYTE: f[0] = 98 #"b" - * elif t == NPY_UBYTE: f[0] = 66 #"B" - * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< - * elif t == NPY_USHORT: f[0] = 72 #"H" - * elif t == NPY_INT: f[0] = 105 #"i" - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_SHORT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 806, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 806, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 806, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x68; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":807 - * elif t == NPY_UBYTE: f[0] = 66 #"B" - * elif t == NPY_SHORT: f[0] = 104 #"h" - * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< - * elif t == NPY_INT: f[0] = 105 #"i" - * elif t == NPY_UINT: f[0] = 73 #"I" - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_USHORT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 807, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 807, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 807, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 72; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":808 - * elif t == NPY_SHORT: f[0] = 104 #"h" - * elif t == NPY_USHORT: f[0] = 72 #"H" - * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< - * elif t == NPY_UINT: f[0] = 73 #"I" - * elif t == NPY_LONG: f[0] = 108 #"l" - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_INT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 808, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 808, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 808, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x69; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":809 - * elif t == NPY_USHORT: f[0] = 72 #"H" - * elif t == NPY_INT: f[0] = 105 #"i" - * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< - * elif t == NPY_LONG: f[0] = 108 #"l" - * elif t == NPY_ULONG: f[0] = 76 #"L" - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UINT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 809, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 809, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 809, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 73; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":810 - * elif t == NPY_INT: f[0] = 105 #"i" - * elif t == NPY_UINT: f[0] = 73 #"I" - * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< - * elif t == NPY_ULONG: f[0] = 76 #"L" - * elif t == NPY_LONGLONG: f[0] = 113 #"q" - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 810, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 810, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 810, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x6C; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":811 - * elif t == NPY_UINT: f[0] = 73 #"I" - * elif t == NPY_LONG: f[0] = 108 #"l" - * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< - * elif t == NPY_LONGLONG: f[0] = 113 #"q" - * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 811, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 811, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 811, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 76; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":812 - * elif t == NPY_LONG: f[0] = 108 #"l" - * elif t == NPY_ULONG: f[0] = 76 #"L" - * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< - * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" - * elif t == NPY_FLOAT: f[0] = 102 #"f" - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 812, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 812, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 812, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x71; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":813 - * elif t == NPY_ULONG: f[0] = 76 #"L" - * elif t == NPY_LONGLONG: f[0] = 113 #"q" - * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< - * elif t == NPY_FLOAT: f[0] = 102 #"f" - * elif t == NPY_DOUBLE: f[0] = 100 #"d" - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 813, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 813, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 813, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 81; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":814 - * elif t == NPY_LONGLONG: f[0] = 113 #"q" - * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" - * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< - * elif t == NPY_DOUBLE: f[0] = 100 #"d" - * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_FLOAT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 814, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 814, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 814, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x66; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":815 - * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" - * elif t == NPY_FLOAT: f[0] = 102 #"f" - * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< - * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" - * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 815, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 815, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 815, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x64; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":816 - * elif t == NPY_FLOAT: f[0] = 102 #"f" - * elif t == NPY_DOUBLE: f[0] = 100 #"d" - * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< - * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf - * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 816, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 816, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 816, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x67; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":817 - * elif t == NPY_DOUBLE: f[0] = 100 #"d" - * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" - * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< - * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd - * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 817, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 817, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 817, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 90; - (__pyx_v_f[1]) = 0x66; - __pyx_v_f = (__pyx_v_f + 1); - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":818 - * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" - * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf - * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< - * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg - * elif t == NPY_OBJECT: f[0] = 79 #"O" - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 818, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 818, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 818, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 90; - (__pyx_v_f[1]) = 0x64; - __pyx_v_f = (__pyx_v_f + 1); - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":819 - * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf - * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd - * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< - * elif t == NPY_OBJECT: f[0] = 79 #"O" - * else: - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 819, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 819, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 819, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 90; - (__pyx_v_f[1]) = 0x67; - __pyx_v_f = (__pyx_v_f + 1); - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":820 - * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd - * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg - * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< - * else: - * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_OBJECT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 820, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 820, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 820, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (likely(__pyx_t_6)) { - (__pyx_v_f[0]) = 79; - goto __pyx_L15; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":822 - * elif t == NPY_OBJECT: f[0] = 79 #"O" - * else: - * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< - * f += 1 - * else: - */ - /*else*/ { - __pyx_t_3 = __Pyx_PyUnicode_FormatSafe(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 822, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 822, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 822, __pyx_L1_error) - } - __pyx_L15:; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":823 - * else: - * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) - * f += 1 # <<<<<<<<<<<<<< - * else: - * # Cython ignores struct boundary information ("T{...}"), - */ - __pyx_v_f = (__pyx_v_f + 1); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":798 - * offset[0] += child.itemsize - * - * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< - * t = child.type_num - * if end - f < 5: - */ - goto __pyx_L13; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":827 - * # Cython ignores struct boundary information ("T{...}"), - * # so don't output it - * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< - * return f - * - */ - /*else*/ { - __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == ((char *)NULL))) __PYX_ERR(1, 827, __pyx_L1_error) - __pyx_v_f = __pyx_t_9; - } - __pyx_L13:; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":772 - * cdef tuple fields - * - * for childname in descr.names: # <<<<<<<<<<<<<< - * fields = descr.fields[childname] - * child, new_offset = fields - */ - } - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":828 - * # so don't output it - * f = _util_dtypestring(child, f, end, offset) - * return f # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = __pyx_v_f; - goto __pyx_L0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":763 - * return () - * - * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< - * # Recursive utility function used in __getbuffer__ to get format - * # string. The new location in the format string is returned. - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_child); - __Pyx_XDECREF(__pyx_v_fields); - __Pyx_XDECREF(__pyx_v_childname); - __Pyx_XDECREF(__pyx_v_new_offset); - __Pyx_XDECREF(__pyx_v_t); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":943 - * int _import_umath() except -1 - * - * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< - * Py_INCREF(base) # important to do this before stealing the reference below! - * PyArray_SetBaseObject(arr, base) - */ - -static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("set_array_base", 0); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":944 - * - * cdef inline void set_array_base(ndarray arr, object base): - * Py_INCREF(base) # important to do this before stealing the reference below! # <<<<<<<<<<<<<< - * PyArray_SetBaseObject(arr, base) - * - */ - Py_INCREF(__pyx_v_base); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":945 - * cdef inline void set_array_base(ndarray arr, object base): - * Py_INCREF(base) # important to do this before stealing the reference below! - * PyArray_SetBaseObject(arr, base) # <<<<<<<<<<<<<< - * - * cdef inline object get_array_base(ndarray arr): - */ - (void)(PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base)); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":943 - * int _import_umath() except -1 - * - * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< - * Py_INCREF(base) # important to do this before stealing the reference below! - * PyArray_SetBaseObject(arr, base) - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":947 - * PyArray_SetBaseObject(arr, base) - * - * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< - * base = PyArray_BASE(arr) - * if base is NULL: - */ - -static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { - PyObject *__pyx_v_base; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - __Pyx_RefNannySetupContext("get_array_base", 0); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":948 - * - * cdef inline object get_array_base(ndarray arr): - * base = PyArray_BASE(arr) # <<<<<<<<<<<<<< - * if base is NULL: - * return None - */ - __pyx_v_base = PyArray_BASE(__pyx_v_arr); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":949 - * cdef inline object get_array_base(ndarray arr): - * base = PyArray_BASE(arr) - * if base is NULL: # <<<<<<<<<<<<<< - * return None - * return base - */ - __pyx_t_1 = ((__pyx_v_base == NULL) != 0); - if (__pyx_t_1) { - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":950 - * base = PyArray_BASE(arr) - * if base is NULL: - * return None # <<<<<<<<<<<<<< - * return base - * - */ - __Pyx_XDECREF(__pyx_r); - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":949 - * cdef inline object get_array_base(ndarray arr): - * base = PyArray_BASE(arr) - * if base is NULL: # <<<<<<<<<<<<<< - * return None - * return base - */ - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":951 - * if base is NULL: - * return None - * return base # <<<<<<<<<<<<<< - * - * # Versions of the import_* functions which are more suitable for - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_base)); - __pyx_r = ((PyObject *)__pyx_v_base); - goto __pyx_L0; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":947 - * PyArray_SetBaseObject(arr, base) - * - * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< - * base = PyArray_BASE(arr) - * if base is NULL: - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":955 - * # Versions of the import_* functions which are more suitable for - * # Cython code. - * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< - * try: - * __pyx_import_array() - */ - -static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("import_array", 0); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":956 - * # Cython code. - * cdef inline int import_array() except -1: - * try: # <<<<<<<<<<<<<< - * __pyx_import_array() - * except Exception: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - /*try:*/ { - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":957 - * cdef inline int import_array() except -1: - * try: - * __pyx_import_array() # <<<<<<<<<<<<<< - * except Exception: - * raise ImportError("numpy.core.multiarray failed to import") - */ - __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 957, __pyx_L3_error) - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":956 - * # Cython code. - * cdef inline int import_array() except -1: - * try: # <<<<<<<<<<<<<< - * __pyx_import_array() - * except Exception: - */ - } - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - goto __pyx_L8_try_end; - __pyx_L3_error:; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":958 - * try: - * __pyx_import_array() - * except Exception: # <<<<<<<<<<<<<< - * raise ImportError("numpy.core.multiarray failed to import") - * - */ - __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); - if (__pyx_t_4) { - __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 958, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GOTREF(__pyx_t_7); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":959 - * __pyx_import_array() - * except Exception: - * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< - * - * cdef inline int import_umath() except -1: - */ - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 959, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_Raise(__pyx_t_8, 0, 0, 0); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __PYX_ERR(1, 959, __pyx_L5_except_error) - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":956 - * # Cython code. - * cdef inline int import_array() except -1: - * try: # <<<<<<<<<<<<<< - * __pyx_import_array() - * except Exception: - */ - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - goto __pyx_L1_error; - __pyx_L8_try_end:; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":955 - * # Versions of the import_* functions which are more suitable for - * # Cython code. - * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< - * try: - * __pyx_import_array() - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":961 - * raise ImportError("numpy.core.multiarray failed to import") - * - * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< - * try: - * _import_umath() - */ - -static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("import_umath", 0); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":962 - * - * cdef inline int import_umath() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - /*try:*/ { - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":963 - * cdef inline int import_umath() except -1: - * try: - * _import_umath() # <<<<<<<<<<<<<< - * except Exception: - * raise ImportError("numpy.core.umath failed to import") - */ - __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 963, __pyx_L3_error) - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":962 - * - * cdef inline int import_umath() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: - */ - } - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - goto __pyx_L8_try_end; - __pyx_L3_error:; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":964 - * try: - * _import_umath() - * except Exception: # <<<<<<<<<<<<<< - * raise ImportError("numpy.core.umath failed to import") - * - */ - __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); - if (__pyx_t_4) { - __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 964, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GOTREF(__pyx_t_7); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":965 - * _import_umath() - * except Exception: - * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< - * - * cdef inline int import_ufunc() except -1: - */ - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 965, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_Raise(__pyx_t_8, 0, 0, 0); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __PYX_ERR(1, 965, __pyx_L5_except_error) - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":962 - * - * cdef inline int import_umath() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: - */ - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - goto __pyx_L1_error; - __pyx_L8_try_end:; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":961 - * raise ImportError("numpy.core.multiarray failed to import") - * - * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< - * try: - * _import_umath() - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":967 - * raise ImportError("numpy.core.umath failed to import") - * - * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< - * try: - * _import_umath() - */ - -static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("import_ufunc", 0); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":968 - * - * cdef inline int import_ufunc() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - /*try:*/ { - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":969 - * cdef inline int import_ufunc() except -1: - * try: - * _import_umath() # <<<<<<<<<<<<<< - * except Exception: - * raise ImportError("numpy.core.umath failed to import") - */ - __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 969, __pyx_L3_error) - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":968 - * - * cdef inline int import_ufunc() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: - */ - } - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - goto __pyx_L8_try_end; - __pyx_L3_error:; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":970 - * try: - * _import_umath() - * except Exception: # <<<<<<<<<<<<<< - * raise ImportError("numpy.core.umath failed to import") - * - */ - __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); - if (__pyx_t_4) { - __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 970, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GOTREF(__pyx_t_7); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":971 - * _import_umath() - * except Exception: - * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< - * - * cdef extern from *: - */ - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 971, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_Raise(__pyx_t_8, 0, 0, 0); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __PYX_ERR(1, 971, __pyx_L5_except_error) - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":968 - * - * cdef inline int import_ufunc() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: - */ - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - goto __pyx_L1_error; - __pyx_L8_try_end:; - } - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":967 - * raise ImportError("numpy.core.umath failed to import") - * - * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< - * try: - * _import_umath() - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":122 - * cdef bint dtype_is_object - * - * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< - * mode="c", bint allocate_buffer=True): - * - */ - -/* Python wrapper */ -static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_shape = 0; - Py_ssize_t __pyx_v_itemsize; - PyObject *__pyx_v_format = 0; - PyObject *__pyx_v_mode = 0; - int __pyx_v_allocate_buffer; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_shape,&__pyx_n_s_itemsize,&__pyx_n_s_format,&__pyx_n_s_mode,&__pyx_n_s_allocate_buffer,0}; - PyObject* values[5] = {0,0,0,0,0}; - values[3] = ((PyObject *)__pyx_n_s_c); - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - CYTHON_FALLTHROUGH; - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_shape)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_itemsize)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); __PYX_ERR(2, 122, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_format)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); __PYX_ERR(2, 122, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 3: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_mode); - if (value) { values[3] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 4: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_allocate_buffer); - if (value) { values[4] = value; kw_args--; } - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(2, 122, __pyx_L3_error) - } - } else { - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - CYTHON_FALLTHROUGH; - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - break; - default: goto __pyx_L5_argtuple_error; - } - } - __pyx_v_shape = ((PyObject*)values[0]); - __pyx_v_itemsize = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_itemsize == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 122, __pyx_L3_error) - __pyx_v_format = values[2]; - __pyx_v_mode = values[3]; - if (values[4]) { - __pyx_v_allocate_buffer = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_allocate_buffer == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 123, __pyx_L3_error) - } else { - - /* "View.MemoryView":123 - * - * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, - * mode="c", bint allocate_buffer=True): # <<<<<<<<<<<<<< - * - * cdef int idx - */ - __pyx_v_allocate_buffer = ((int)1); - } - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 122, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_shape), (&PyTuple_Type), 1, "shape", 1))) __PYX_ERR(2, 122, __pyx_L1_error) - if (unlikely(((PyObject *)__pyx_v_format) == Py_None)) { - PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "format"); __PYX_ERR(2, 122, __pyx_L1_error) - } - __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v_shape, __pyx_v_itemsize, __pyx_v_format, __pyx_v_mode, __pyx_v_allocate_buffer); - - /* "View.MemoryView":122 - * cdef bint dtype_is_object - * - * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< - * mode="c", bint allocate_buffer=True): - * - */ - - /* function exit code */ - goto __pyx_L0; - __pyx_L1_error:; - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer) { - int __pyx_v_idx; - Py_ssize_t __pyx_v_i; - Py_ssize_t __pyx_v_dim; - PyObject **__pyx_v_p; - char __pyx_v_order; - int __pyx_r; - __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - char *__pyx_t_7; - int __pyx_t_8; - Py_ssize_t __pyx_t_9; - PyObject *__pyx_t_10 = NULL; - Py_ssize_t __pyx_t_11; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__cinit__", 0); - __Pyx_INCREF(__pyx_v_format); - - /* "View.MemoryView":129 - * cdef PyObject **p - * - * self.ndim = len(shape) # <<<<<<<<<<<<<< - * self.itemsize = itemsize - * - */ - if (unlikely(__pyx_v_shape == Py_None)) { - PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); - __PYX_ERR(2, 129, __pyx_L1_error) - } - __pyx_t_1 = PyTuple_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(2, 129, __pyx_L1_error) - __pyx_v_self->ndim = ((int)__pyx_t_1); - - /* "View.MemoryView":130 - * - * self.ndim = len(shape) - * self.itemsize = itemsize # <<<<<<<<<<<<<< - * - * if not self.ndim: - */ - __pyx_v_self->itemsize = __pyx_v_itemsize; - - /* "View.MemoryView":132 - * self.itemsize = itemsize - * - * if not self.ndim: # <<<<<<<<<<<<<< - * raise ValueError("Empty shape tuple for cython.array") - * - */ - __pyx_t_2 = ((!(__pyx_v_self->ndim != 0)) != 0); - if (unlikely(__pyx_t_2)) { - - /* "View.MemoryView":133 - * - * if not self.ndim: - * raise ValueError("Empty shape tuple for cython.array") # <<<<<<<<<<<<<< - * - * if itemsize <= 0: - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 133, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 133, __pyx_L1_error) - - /* "View.MemoryView":132 - * self.itemsize = itemsize - * - * if not self.ndim: # <<<<<<<<<<<<<< - * raise ValueError("Empty shape tuple for cython.array") - * - */ - } - - /* "View.MemoryView":135 - * raise ValueError("Empty shape tuple for cython.array") - * - * if itemsize <= 0: # <<<<<<<<<<<<<< - * raise ValueError("itemsize <= 0 for cython.array") - * - */ - __pyx_t_2 = ((__pyx_v_itemsize <= 0) != 0); - if (unlikely(__pyx_t_2)) { - - /* "View.MemoryView":136 - * - * if itemsize <= 0: - * raise ValueError("itemsize <= 0 for cython.array") # <<<<<<<<<<<<<< - * - * if not isinstance(format, bytes): - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 136, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 136, __pyx_L1_error) - - /* "View.MemoryView":135 - * raise ValueError("Empty shape tuple for cython.array") - * - * if itemsize <= 0: # <<<<<<<<<<<<<< - * raise ValueError("itemsize <= 0 for cython.array") - * - */ - } - - /* "View.MemoryView":138 - * raise ValueError("itemsize <= 0 for cython.array") - * - * if not isinstance(format, bytes): # <<<<<<<<<<<<<< - * format = format.encode('ASCII') - * self._format = format # keep a reference to the byte string - */ - __pyx_t_2 = PyBytes_Check(__pyx_v_format); - __pyx_t_4 = ((!(__pyx_t_2 != 0)) != 0); - if (__pyx_t_4) { - - /* "View.MemoryView":139 - * - * if not isinstance(format, bytes): - * format = format.encode('ASCII') # <<<<<<<<<<<<<< - * self._format = format # keep a reference to the byte string - * self.format = self._format - */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 139, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { - __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); - if (likely(__pyx_t_6)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); - __Pyx_INCREF(__pyx_t_6); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_5, function); - } - } - __pyx_t_3 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_6, __pyx_n_s_ASCII) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_n_s_ASCII); - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 139, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF_SET(__pyx_v_format, __pyx_t_3); - __pyx_t_3 = 0; - - /* "View.MemoryView":138 - * raise ValueError("itemsize <= 0 for cython.array") - * - * if not isinstance(format, bytes): # <<<<<<<<<<<<<< - * format = format.encode('ASCII') - * self._format = format # keep a reference to the byte string - */ - } - - /* "View.MemoryView":140 - * if not isinstance(format, bytes): - * format = format.encode('ASCII') - * self._format = format # keep a reference to the byte string # <<<<<<<<<<<<<< - * self.format = self._format - * - */ - if (!(likely(PyBytes_CheckExact(__pyx_v_format))||((__pyx_v_format) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_v_format)->tp_name), 0))) __PYX_ERR(2, 140, __pyx_L1_error) - __pyx_t_3 = __pyx_v_format; - __Pyx_INCREF(__pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __Pyx_GOTREF(__pyx_v_self->_format); - __Pyx_DECREF(__pyx_v_self->_format); - __pyx_v_self->_format = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "View.MemoryView":141 - * format = format.encode('ASCII') - * self._format = format # keep a reference to the byte string - * self.format = self._format # <<<<<<<<<<<<<< - * - * - */ - if (unlikely(__pyx_v_self->_format == Py_None)) { - PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found"); - __PYX_ERR(2, 141, __pyx_L1_error) - } - __pyx_t_7 = __Pyx_PyBytes_AsWritableString(__pyx_v_self->_format); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) __PYX_ERR(2, 141, __pyx_L1_error) - __pyx_v_self->format = __pyx_t_7; - - /* "View.MemoryView":144 - * - * - * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) # <<<<<<<<<<<<<< - * self._strides = self._shape + self.ndim - * - */ - __pyx_v_self->_shape = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * __pyx_v_self->ndim) * 2))); - - /* "View.MemoryView":145 - * - * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) - * self._strides = self._shape + self.ndim # <<<<<<<<<<<<<< - * - * if not self._shape: - */ - __pyx_v_self->_strides = (__pyx_v_self->_shape + __pyx_v_self->ndim); - - /* "View.MemoryView":147 - * self._strides = self._shape + self.ndim - * - * if not self._shape: # <<<<<<<<<<<<<< - * raise MemoryError("unable to allocate shape and strides.") - * - */ - __pyx_t_4 = ((!(__pyx_v_self->_shape != 0)) != 0); - if (unlikely(__pyx_t_4)) { - - /* "View.MemoryView":148 - * - * if not self._shape: - * raise MemoryError("unable to allocate shape and strides.") # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 148, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 148, __pyx_L1_error) - - /* "View.MemoryView":147 - * self._strides = self._shape + self.ndim - * - * if not self._shape: # <<<<<<<<<<<<<< - * raise MemoryError("unable to allocate shape and strides.") - * - */ - } - - /* "View.MemoryView":151 - * - * - * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< - * if dim <= 0: - * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) - */ - __pyx_t_8 = 0; - __pyx_t_3 = __pyx_v_shape; __Pyx_INCREF(__pyx_t_3); __pyx_t_1 = 0; - for (;;) { - if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_3)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(2, 151, __pyx_L1_error) - #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 151, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 151, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_v_dim = __pyx_t_9; - __pyx_v_idx = __pyx_t_8; - __pyx_t_8 = (__pyx_t_8 + 1); - - /* "View.MemoryView":152 - * - * for idx, dim in enumerate(shape): - * if dim <= 0: # <<<<<<<<<<<<<< - * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) - * self._shape[idx] = dim - */ - __pyx_t_4 = ((__pyx_v_dim <= 0) != 0); - if (unlikely(__pyx_t_4)) { - - /* "View.MemoryView":153 - * for idx, dim in enumerate(shape): - * if dim <= 0: - * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) # <<<<<<<<<<<<<< - * self._shape[idx] = dim - * - */ - __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_idx); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 153, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 153, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 153, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_GIVEREF(__pyx_t_5); - PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_5); - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_6); - __pyx_t_5 = 0; - __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Invalid_shape_in_axis_d_d, __pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 153, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_6); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 153, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(2, 153, __pyx_L1_error) - - /* "View.MemoryView":152 - * - * for idx, dim in enumerate(shape): - * if dim <= 0: # <<<<<<<<<<<<<< - * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) - * self._shape[idx] = dim - */ - } - - /* "View.MemoryView":154 - * if dim <= 0: - * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) - * self._shape[idx] = dim # <<<<<<<<<<<<<< - * - * cdef char order - */ - (__pyx_v_self->_shape[__pyx_v_idx]) = __pyx_v_dim; - - /* "View.MemoryView":151 - * - * - * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< - * if dim <= 0: - * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) - */ - } - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "View.MemoryView":157 - * - * cdef char order - * if mode == 'fortran': # <<<<<<<<<<<<<< - * order = b'F' - * self.mode = u'fortran' - */ - __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_fortran, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(2, 157, __pyx_L1_error) - if (__pyx_t_4) { - - /* "View.MemoryView":158 - * cdef char order - * if mode == 'fortran': - * order = b'F' # <<<<<<<<<<<<<< - * self.mode = u'fortran' - * elif mode == 'c': - */ - __pyx_v_order = 'F'; - - /* "View.MemoryView":159 - * if mode == 'fortran': - * order = b'F' - * self.mode = u'fortran' # <<<<<<<<<<<<<< - * elif mode == 'c': - * order = b'C' - */ - __Pyx_INCREF(__pyx_n_u_fortran); - __Pyx_GIVEREF(__pyx_n_u_fortran); - __Pyx_GOTREF(__pyx_v_self->mode); - __Pyx_DECREF(__pyx_v_self->mode); - __pyx_v_self->mode = __pyx_n_u_fortran; - - /* "View.MemoryView":157 - * - * cdef char order - * if mode == 'fortran': # <<<<<<<<<<<<<< - * order = b'F' - * self.mode = u'fortran' - */ - goto __pyx_L10; - } - - /* "View.MemoryView":160 - * order = b'F' - * self.mode = u'fortran' - * elif mode == 'c': # <<<<<<<<<<<<<< - * order = b'C' - * self.mode = u'c' - */ - __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_c, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(2, 160, __pyx_L1_error) - if (likely(__pyx_t_4)) { - - /* "View.MemoryView":161 - * self.mode = u'fortran' - * elif mode == 'c': - * order = b'C' # <<<<<<<<<<<<<< - * self.mode = u'c' - * else: - */ - __pyx_v_order = 'C'; - - /* "View.MemoryView":162 - * elif mode == 'c': - * order = b'C' - * self.mode = u'c' # <<<<<<<<<<<<<< - * else: - * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) - */ - __Pyx_INCREF(__pyx_n_u_c); - __Pyx_GIVEREF(__pyx_n_u_c); - __Pyx_GOTREF(__pyx_v_self->mode); - __Pyx_DECREF(__pyx_v_self->mode); - __pyx_v_self->mode = __pyx_n_u_c; - - /* "View.MemoryView":160 - * order = b'F' - * self.mode = u'fortran' - * elif mode == 'c': # <<<<<<<<<<<<<< - * order = b'C' - * self.mode = u'c' - */ - goto __pyx_L10; - } - - /* "View.MemoryView":164 - * self.mode = u'c' - * else: - * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) # <<<<<<<<<<<<<< - * - * self.len = fill_contig_strides_array(self._shape, self._strides, - */ - /*else*/ { - __pyx_t_3 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Invalid_mode_expected_c_or_fortr, __pyx_v_mode); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 164, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 164, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(2, 164, __pyx_L1_error) - } - __pyx_L10:; - - /* "View.MemoryView":166 - * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) - * - * self.len = fill_contig_strides_array(self._shape, self._strides, # <<<<<<<<<<<<<< - * itemsize, self.ndim, order) - * - */ - __pyx_v_self->len = __pyx_fill_contig_strides_array(__pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_itemsize, __pyx_v_self->ndim, __pyx_v_order); - - /* "View.MemoryView":169 - * itemsize, self.ndim, order) - * - * self.free_data = allocate_buffer # <<<<<<<<<<<<<< - * self.dtype_is_object = format == b'O' - * if allocate_buffer: - */ - __pyx_v_self->free_data = __pyx_v_allocate_buffer; - - /* "View.MemoryView":170 - * - * self.free_data = allocate_buffer - * self.dtype_is_object = format == b'O' # <<<<<<<<<<<<<< - * if allocate_buffer: - * - */ - __pyx_t_10 = PyObject_RichCompare(__pyx_v_format, __pyx_n_b_O, Py_EQ); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 170, __pyx_L1_error) - __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 170, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_v_self->dtype_is_object = __pyx_t_4; - - /* "View.MemoryView":171 - * self.free_data = allocate_buffer - * self.dtype_is_object = format == b'O' - * if allocate_buffer: # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_4 = (__pyx_v_allocate_buffer != 0); - if (__pyx_t_4) { - - /* "View.MemoryView":174 - * - * - * self.data = malloc(self.len) # <<<<<<<<<<<<<< - * if not self.data: - * raise MemoryError("unable to allocate array data.") - */ - __pyx_v_self->data = ((char *)malloc(__pyx_v_self->len)); - - /* "View.MemoryView":175 - * - * self.data = malloc(self.len) - * if not self.data: # <<<<<<<<<<<<<< - * raise MemoryError("unable to allocate array data.") - * - */ - __pyx_t_4 = ((!(__pyx_v_self->data != 0)) != 0); - if (unlikely(__pyx_t_4)) { - - /* "View.MemoryView":176 - * self.data = malloc(self.len) - * if not self.data: - * raise MemoryError("unable to allocate array data.") # <<<<<<<<<<<<<< - * - * if self.dtype_is_object: - */ - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 176, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(2, 176, __pyx_L1_error) - - /* "View.MemoryView":175 - * - * self.data = malloc(self.len) - * if not self.data: # <<<<<<<<<<<<<< - * raise MemoryError("unable to allocate array data.") - * - */ - } - - /* "View.MemoryView":178 - * raise MemoryError("unable to allocate array data.") - * - * if self.dtype_is_object: # <<<<<<<<<<<<<< - * p = self.data - * for i in range(self.len / itemsize): - */ - __pyx_t_4 = (__pyx_v_self->dtype_is_object != 0); - if (__pyx_t_4) { - - /* "View.MemoryView":179 - * - * if self.dtype_is_object: - * p = self.data # <<<<<<<<<<<<<< - * for i in range(self.len / itemsize): - * p[i] = Py_None - */ - __pyx_v_p = ((PyObject **)__pyx_v_self->data); - - /* "View.MemoryView":180 - * if self.dtype_is_object: - * p = self.data - * for i in range(self.len / itemsize): # <<<<<<<<<<<<<< - * p[i] = Py_None - * Py_INCREF(Py_None) - */ - if (unlikely(__pyx_v_itemsize == 0)) { - PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); - __PYX_ERR(2, 180, __pyx_L1_error) - } - else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_self->len))) { - PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); - __PYX_ERR(2, 180, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_div_Py_ssize_t(__pyx_v_self->len, __pyx_v_itemsize); - __pyx_t_9 = __pyx_t_1; - for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_9; __pyx_t_11+=1) { - __pyx_v_i = __pyx_t_11; - - /* "View.MemoryView":181 - * p = self.data - * for i in range(self.len / itemsize): - * p[i] = Py_None # <<<<<<<<<<<<<< - * Py_INCREF(Py_None) - * - */ - (__pyx_v_p[__pyx_v_i]) = Py_None; - - /* "View.MemoryView":182 - * for i in range(self.len / itemsize): - * p[i] = Py_None - * Py_INCREF(Py_None) # <<<<<<<<<<<<<< - * - * @cname('getbuffer') - */ - Py_INCREF(Py_None); - } - - /* "View.MemoryView":178 - * raise MemoryError("unable to allocate array data.") - * - * if self.dtype_is_object: # <<<<<<<<<<<<<< - * p = self.data - * for i in range(self.len / itemsize): - */ - } - - /* "View.MemoryView":171 - * self.free_data = allocate_buffer - * self.dtype_is_object = format == b'O' - * if allocate_buffer: # <<<<<<<<<<<<<< - * - * - */ - } - - /* "View.MemoryView":122 - * cdef bint dtype_is_object - * - * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< - * mode="c", bint allocate_buffer=True): - * - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_format); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":185 - * - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< - * cdef int bufmode = -1 - * if self.mode == u"c": - */ - -/* Python wrapper */ -static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ -static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); - __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(((struct __pyx_array_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { - int __pyx_v_bufmode; - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - char *__pyx_t_4; - Py_ssize_t __pyx_t_5; - int __pyx_t_6; - Py_ssize_t *__pyx_t_7; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - if (__pyx_v_info == NULL) { - PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); - return -1; - } - __Pyx_RefNannySetupContext("__getbuffer__", 0); - __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(__pyx_v_info->obj); - - /* "View.MemoryView":186 - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): - * cdef int bufmode = -1 # <<<<<<<<<<<<<< - * if self.mode == u"c": - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - */ - __pyx_v_bufmode = -1; - - /* "View.MemoryView":187 - * def __getbuffer__(self, Py_buffer *info, int flags): - * cdef int bufmode = -1 - * if self.mode == u"c": # <<<<<<<<<<<<<< - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * elif self.mode == u"fortran": - */ - __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_c, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 187, __pyx_L1_error) - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":188 - * cdef int bufmode = -1 - * if self.mode == u"c": - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< - * elif self.mode == u"fortran": - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - */ - __pyx_v_bufmode = (PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); - - /* "View.MemoryView":187 - * def __getbuffer__(self, Py_buffer *info, int flags): - * cdef int bufmode = -1 - * if self.mode == u"c": # <<<<<<<<<<<<<< - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * elif self.mode == u"fortran": - */ - goto __pyx_L3; - } - - /* "View.MemoryView":189 - * if self.mode == u"c": - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * elif self.mode == u"fortran": # <<<<<<<<<<<<<< - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * if not (flags & bufmode): - */ - __pyx_t_2 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_fortran, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(2, 189, __pyx_L1_error) - __pyx_t_1 = (__pyx_t_2 != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":190 - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * elif self.mode == u"fortran": - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< - * if not (flags & bufmode): - * raise ValueError("Can only create a buffer that is contiguous in memory.") - */ - __pyx_v_bufmode = (PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); - - /* "View.MemoryView":189 - * if self.mode == u"c": - * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * elif self.mode == u"fortran": # <<<<<<<<<<<<<< - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * if not (flags & bufmode): - */ - } - __pyx_L3:; - - /* "View.MemoryView":191 - * elif self.mode == u"fortran": - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * if not (flags & bufmode): # <<<<<<<<<<<<<< - * raise ValueError("Can only create a buffer that is contiguous in memory.") - * info.buf = self.data - */ - __pyx_t_1 = ((!((__pyx_v_flags & __pyx_v_bufmode) != 0)) != 0); - if (unlikely(__pyx_t_1)) { - - /* "View.MemoryView":192 - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * if not (flags & bufmode): - * raise ValueError("Can only create a buffer that is contiguous in memory.") # <<<<<<<<<<<<<< - * info.buf = self.data - * info.len = self.len - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 192, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 192, __pyx_L1_error) - - /* "View.MemoryView":191 - * elif self.mode == u"fortran": - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * if not (flags & bufmode): # <<<<<<<<<<<<<< - * raise ValueError("Can only create a buffer that is contiguous in memory.") - * info.buf = self.data - */ - } - - /* "View.MemoryView":193 - * if not (flags & bufmode): - * raise ValueError("Can only create a buffer that is contiguous in memory.") - * info.buf = self.data # <<<<<<<<<<<<<< - * info.len = self.len - * info.ndim = self.ndim - */ - __pyx_t_4 = __pyx_v_self->data; - __pyx_v_info->buf = __pyx_t_4; - - /* "View.MemoryView":194 - * raise ValueError("Can only create a buffer that is contiguous in memory.") - * info.buf = self.data - * info.len = self.len # <<<<<<<<<<<<<< - * info.ndim = self.ndim - * info.shape = self._shape - */ - __pyx_t_5 = __pyx_v_self->len; - __pyx_v_info->len = __pyx_t_5; - - /* "View.MemoryView":195 - * info.buf = self.data - * info.len = self.len - * info.ndim = self.ndim # <<<<<<<<<<<<<< - * info.shape = self._shape - * info.strides = self._strides - */ - __pyx_t_6 = __pyx_v_self->ndim; - __pyx_v_info->ndim = __pyx_t_6; - - /* "View.MemoryView":196 - * info.len = self.len - * info.ndim = self.ndim - * info.shape = self._shape # <<<<<<<<<<<<<< - * info.strides = self._strides - * info.suboffsets = NULL - */ - __pyx_t_7 = __pyx_v_self->_shape; - __pyx_v_info->shape = __pyx_t_7; - - /* "View.MemoryView":197 - * info.ndim = self.ndim - * info.shape = self._shape - * info.strides = self._strides # <<<<<<<<<<<<<< - * info.suboffsets = NULL - * info.itemsize = self.itemsize - */ - __pyx_t_7 = __pyx_v_self->_strides; - __pyx_v_info->strides = __pyx_t_7; - - /* "View.MemoryView":198 - * info.shape = self._shape - * info.strides = self._strides - * info.suboffsets = NULL # <<<<<<<<<<<<<< - * info.itemsize = self.itemsize - * info.readonly = 0 - */ - __pyx_v_info->suboffsets = NULL; - - /* "View.MemoryView":199 - * info.strides = self._strides - * info.suboffsets = NULL - * info.itemsize = self.itemsize # <<<<<<<<<<<<<< - * info.readonly = 0 - * - */ - __pyx_t_5 = __pyx_v_self->itemsize; - __pyx_v_info->itemsize = __pyx_t_5; - - /* "View.MemoryView":200 - * info.suboffsets = NULL - * info.itemsize = self.itemsize - * info.readonly = 0 # <<<<<<<<<<<<<< - * - * if flags & PyBUF_FORMAT: - */ - __pyx_v_info->readonly = 0; - - /* "View.MemoryView":202 - * info.readonly = 0 - * - * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< - * info.format = self.format - * else: - */ - __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":203 - * - * if flags & PyBUF_FORMAT: - * info.format = self.format # <<<<<<<<<<<<<< - * else: - * info.format = NULL - */ - __pyx_t_4 = __pyx_v_self->format; - __pyx_v_info->format = __pyx_t_4; - - /* "View.MemoryView":202 - * info.readonly = 0 - * - * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< - * info.format = self.format - * else: - */ - goto __pyx_L5; - } - - /* "View.MemoryView":205 - * info.format = self.format - * else: - * info.format = NULL # <<<<<<<<<<<<<< - * - * info.obj = self - */ - /*else*/ { - __pyx_v_info->format = NULL; - } - __pyx_L5:; - - /* "View.MemoryView":207 - * info.format = NULL - * - * info.obj = self # <<<<<<<<<<<<<< - * - * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") - */ - __Pyx_INCREF(((PyObject *)__pyx_v_self)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); - __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - - /* "View.MemoryView":185 - * - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< - * cdef int bufmode = -1 - * if self.mode == u"c": - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.array.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - if (__pyx_v_info->obj != NULL) { - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; - } - goto __pyx_L2; - __pyx_L0:; - if (__pyx_v_info->obj == Py_None) { - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; - } - __pyx_L2:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":211 - * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") - * - * def __dealloc__(array self): # <<<<<<<<<<<<<< - * if self.callback_free_data != NULL: - * self.callback_free_data(self.data) - */ - -/* Python wrapper */ -static void __pyx_array___dealloc__(PyObject *__pyx_v_self); /*proto*/ -static void __pyx_array___dealloc__(PyObject *__pyx_v_self) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); - __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(((struct __pyx_array_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self) { - __Pyx_RefNannyDeclarations - int __pyx_t_1; - __Pyx_RefNannySetupContext("__dealloc__", 0); - - /* "View.MemoryView":212 - * - * def __dealloc__(array self): - * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< - * self.callback_free_data(self.data) - * elif self.free_data: - */ - __pyx_t_1 = ((__pyx_v_self->callback_free_data != NULL) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":213 - * def __dealloc__(array self): - * if self.callback_free_data != NULL: - * self.callback_free_data(self.data) # <<<<<<<<<<<<<< - * elif self.free_data: - * if self.dtype_is_object: - */ - __pyx_v_self->callback_free_data(__pyx_v_self->data); - - /* "View.MemoryView":212 - * - * def __dealloc__(array self): - * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< - * self.callback_free_data(self.data) - * elif self.free_data: - */ - goto __pyx_L3; - } - - /* "View.MemoryView":214 - * if self.callback_free_data != NULL: - * self.callback_free_data(self.data) - * elif self.free_data: # <<<<<<<<<<<<<< - * if self.dtype_is_object: - * refcount_objects_in_slice(self.data, self._shape, - */ - __pyx_t_1 = (__pyx_v_self->free_data != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":215 - * self.callback_free_data(self.data) - * elif self.free_data: - * if self.dtype_is_object: # <<<<<<<<<<<<<< - * refcount_objects_in_slice(self.data, self._shape, - * self._strides, self.ndim, False) - */ - __pyx_t_1 = (__pyx_v_self->dtype_is_object != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":216 - * elif self.free_data: - * if self.dtype_is_object: - * refcount_objects_in_slice(self.data, self._shape, # <<<<<<<<<<<<<< - * self._strides, self.ndim, False) - * free(self.data) - */ - __pyx_memoryview_refcount_objects_in_slice(__pyx_v_self->data, __pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_self->ndim, 0); - - /* "View.MemoryView":215 - * self.callback_free_data(self.data) - * elif self.free_data: - * if self.dtype_is_object: # <<<<<<<<<<<<<< - * refcount_objects_in_slice(self.data, self._shape, - * self._strides, self.ndim, False) - */ - } - - /* "View.MemoryView":218 - * refcount_objects_in_slice(self.data, self._shape, - * self._strides, self.ndim, False) - * free(self.data) # <<<<<<<<<<<<<< - * PyObject_Free(self._shape) - * - */ - free(__pyx_v_self->data); - - /* "View.MemoryView":214 - * if self.callback_free_data != NULL: - * self.callback_free_data(self.data) - * elif self.free_data: # <<<<<<<<<<<<<< - * if self.dtype_is_object: - * refcount_objects_in_slice(self.data, self._shape, - */ - } - __pyx_L3:; - - /* "View.MemoryView":219 - * self._strides, self.ndim, False) - * free(self.data) - * PyObject_Free(self._shape) # <<<<<<<<<<<<<< - * - * @property - */ - PyObject_Free(__pyx_v_self->_shape); - - /* "View.MemoryView":211 - * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") - * - * def __dealloc__(array self): # <<<<<<<<<<<<<< - * if self.callback_free_data != NULL: - * self.callback_free_data(self.data) - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "View.MemoryView":222 - * - * @property - * def memview(self): # <<<<<<<<<<<<<< - * return self.get_memview() - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_5array_7memview___get__(((struct __pyx_array_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__", 0); - - /* "View.MemoryView":223 - * @property - * def memview(self): - * return self.get_memview() # <<<<<<<<<<<<<< - * - * @cname('get_memview') - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((struct __pyx_vtabstruct_array *)__pyx_v_self->__pyx_vtab)->get_memview(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 223, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "View.MemoryView":222 - * - * @property - * def memview(self): # <<<<<<<<<<<<<< - * return self.get_memview() - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.array.memview.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":226 - * - * @cname('get_memview') - * cdef get_memview(self): # <<<<<<<<<<<<<< - * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE - * return memoryview(self, flags, self.dtype_is_object) - */ - -static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { - int __pyx_v_flags; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("get_memview", 0); - - /* "View.MemoryView":227 - * @cname('get_memview') - * cdef get_memview(self): - * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE # <<<<<<<<<<<<<< - * return memoryview(self, flags, self.dtype_is_object) - * - */ - __pyx_v_flags = ((PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) | PyBUF_WRITABLE); - - /* "View.MemoryView":228 - * cdef get_memview(self): - * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE - * return memoryview(self, flags, self.dtype_is_object) # <<<<<<<<<<<<<< - * - * def __len__(self): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 228, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 228, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 228, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(((PyObject *)__pyx_v_self)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); - PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self)); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); - __pyx_t_1 = 0; - __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 228, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "View.MemoryView":226 - * - * @cname('get_memview') - * cdef get_memview(self): # <<<<<<<<<<<<<< - * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE - * return memoryview(self, flags, self.dtype_is_object) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.array.get_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":230 - * return memoryview(self, flags, self.dtype_is_object) - * - * def __len__(self): # <<<<<<<<<<<<<< - * return self._shape[0] - * - */ - -/* Python wrapper */ -static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self); /*proto*/ -static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self) { - Py_ssize_t __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); - __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(((struct __pyx_array_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self) { - Py_ssize_t __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__len__", 0); - - /* "View.MemoryView":231 - * - * def __len__(self): - * return self._shape[0] # <<<<<<<<<<<<<< - * - * def __getattr__(self, attr): - */ - __pyx_r = (__pyx_v_self->_shape[0]); - goto __pyx_L0; - - /* "View.MemoryView":230 - * return memoryview(self, flags, self.dtype_is_object) - * - * def __len__(self): # <<<<<<<<<<<<<< - * return self._shape[0] - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":233 - * return self._shape[0] - * - * def __getattr__(self, attr): # <<<<<<<<<<<<<< - * return getattr(self.memview, attr) - * - */ - -/* Python wrapper */ -static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr); /*proto*/ -static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__getattr__ (wrapper)", 0); - __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_attr)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__getattr__", 0); - - /* "View.MemoryView":234 - * - * def __getattr__(self, attr): - * return getattr(self.memview, attr) # <<<<<<<<<<<<<< - * - * def __getitem__(self, item): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 234, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_GetAttr(__pyx_t_1, __pyx_v_attr); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 234, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "View.MemoryView":233 - * return self._shape[0] - * - * def __getattr__(self, attr): # <<<<<<<<<<<<<< - * return getattr(self.memview, attr) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.array.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":236 - * return getattr(self.memview, attr) - * - * def __getitem__(self, item): # <<<<<<<<<<<<<< - * return self.memview[item] - * - */ - -/* Python wrapper */ -static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/ -static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); - __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__getitem__", 0); - - /* "View.MemoryView":237 - * - * def __getitem__(self, item): - * return self.memview[item] # <<<<<<<<<<<<<< - * - * def __setitem__(self, item, value): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_v_item); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "View.MemoryView":236 - * return getattr(self.memview, attr) - * - * def __getitem__(self, item): # <<<<<<<<<<<<<< - * return self.memview[item] - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.array.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":239 - * return self.memview[item] - * - * def __setitem__(self, item, value): # <<<<<<<<<<<<<< - * self.memview[item] = value - * - */ - -/* Python wrapper */ -static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /*proto*/ -static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); - __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item), ((PyObject *)__pyx_v_value)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setitem__", 0); - - /* "View.MemoryView":240 - * - * def __setitem__(self, item, value): - * self.memview[item] = value # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 240, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (unlikely(PyObject_SetItem(__pyx_t_1, __pyx_v_item, __pyx_v_value) < 0)) __PYX_ERR(2, 240, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "View.MemoryView":239 - * return self.memview[item] - * - * def __setitem__(self, item, value): # <<<<<<<<<<<<<< - * self.memview[item] = value - * - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.array.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - */ - -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_array___reduce_cython__(((struct __pyx_array_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 2, __pyx_L1_error) - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.array.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_array_2__setstate_cython__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 4, __pyx_L1_error) - - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":244 - * - * @cname("__pyx_array_new") - * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< - * char *mode, char *buf): - * cdef array result - */ - -static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, char *__pyx_v_format, char *__pyx_v_mode, char *__pyx_v_buf) { - struct __pyx_array_obj *__pyx_v_result = 0; - struct __pyx_array_obj *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("array_cwrapper", 0); - - /* "View.MemoryView":248 - * cdef array result - * - * if buf == NULL: # <<<<<<<<<<<<<< - * result = array(shape, itemsize, format, mode.decode('ASCII')) - * else: - */ - __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":249 - * - * if buf == NULL: - * result = array(shape, itemsize, format, mode.decode('ASCII')) # <<<<<<<<<<<<<< - * else: - * result = array(shape, itemsize, format, mode.decode('ASCII'), - */ - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 249, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 249, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 249, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 249, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_INCREF(__pyx_v_shape); - __Pyx_GIVEREF(__pyx_v_shape); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_shape); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_4); - __pyx_t_2 = 0; - __pyx_t_3 = 0; - __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 249, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_4); - __pyx_t_4 = 0; - - /* "View.MemoryView":248 - * cdef array result - * - * if buf == NULL: # <<<<<<<<<<<<<< - * result = array(shape, itemsize, format, mode.decode('ASCII')) - * else: - */ - goto __pyx_L3; - } - - /* "View.MemoryView":251 - * result = array(shape, itemsize, format, mode.decode('ASCII')) - * else: - * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< - * allocate_buffer=False) - * result.data = buf - */ - /*else*/ { - __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 251, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 251, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 251, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 251, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_v_shape); - __Pyx_GIVEREF(__pyx_v_shape); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_shape); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_5); - PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_5); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_3); - __pyx_t_4 = 0; - __pyx_t_5 = 0; - __pyx_t_3 = 0; - - /* "View.MemoryView":252 - * else: - * result = array(shape, itemsize, format, mode.decode('ASCII'), - * allocate_buffer=False) # <<<<<<<<<<<<<< - * result.data = buf - * - */ - __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 252, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_allocate_buffer, Py_False) < 0) __PYX_ERR(2, 252, __pyx_L1_error) - - /* "View.MemoryView":251 - * result = array(shape, itemsize, format, mode.decode('ASCII')) - * else: - * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< - * allocate_buffer=False) - * result.data = buf - */ - __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 251, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_5); - __pyx_t_5 = 0; - - /* "View.MemoryView":253 - * result = array(shape, itemsize, format, mode.decode('ASCII'), - * allocate_buffer=False) - * result.data = buf # <<<<<<<<<<<<<< - * - * return result - */ - __pyx_v_result->data = __pyx_v_buf; - } - __pyx_L3:; - - /* "View.MemoryView":255 - * result.data = buf - * - * return result # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(((PyObject *)__pyx_r)); - __Pyx_INCREF(((PyObject *)__pyx_v_result)); - __pyx_r = __pyx_v_result; - goto __pyx_L0; - - /* "View.MemoryView":244 - * - * @cname("__pyx_array_new") - * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< - * char *mode, char *buf): - * cdef array result - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.array_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_result); - __Pyx_XGIVEREF((PyObject *)__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":281 - * cdef class Enum(object): - * cdef object name - * def __init__(self, name): # <<<<<<<<<<<<<< - * self.name = name - * def __repr__(self): - */ - -/* Python wrapper */ -static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_name = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,0}; - PyObject* values[1] = {0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(2, 281, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - } - __pyx_v_name = values[0]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 281, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("View.MemoryView.Enum.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v_name); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__init__", 0); - - /* "View.MemoryView":282 - * cdef object name - * def __init__(self, name): - * self.name = name # <<<<<<<<<<<<<< - * def __repr__(self): - * return self.name - */ - __Pyx_INCREF(__pyx_v_name); - __Pyx_GIVEREF(__pyx_v_name); - __Pyx_GOTREF(__pyx_v_self->name); - __Pyx_DECREF(__pyx_v_self->name); - __pyx_v_self->name = __pyx_v_name; - - /* "View.MemoryView":281 - * cdef class Enum(object): - * cdef object name - * def __init__(self, name): # <<<<<<<<<<<<<< - * self.name = name - * def __repr__(self): - */ - - /* function exit code */ - __pyx_r = 0; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":283 - * def __init__(self, name): - * self.name = name - * def __repr__(self): # <<<<<<<<<<<<<< - * return self.name - * - */ - -/* Python wrapper */ -static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); - __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__repr__", 0); - - /* "View.MemoryView":284 - * self.name = name - * def __repr__(self): - * return self.name # <<<<<<<<<<<<<< - * - * cdef generic = Enum("") - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->name); - __pyx_r = __pyx_v_self->name; - goto __pyx_L0; - - /* "View.MemoryView":283 - * def __init__(self, name): - * self.name = name - * def __repr__(self): # <<<<<<<<<<<<<< - * return self.name - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * cdef tuple state - * cdef object _dict - */ - -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_MemviewEnum___reduce_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { - PyObject *__pyx_v_state = 0; - PyObject *__pyx_v__dict = 0; - int __pyx_v_use_setstate; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - int __pyx_t_3; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":5 - * cdef object _dict - * cdef bint use_setstate - * state = (self.name,) # <<<<<<<<<<<<<< - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: - */ - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_v_self->name); - __Pyx_GIVEREF(__pyx_v_self->name); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name); - __pyx_v_state = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "(tree fragment)":6 - * cdef bint use_setstate - * state = (self.name,) - * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< - * if _dict is not None: - * state += (_dict,) - */ - __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v__dict = __pyx_t_1; - __pyx_t_1 = 0; - - /* "(tree fragment)":7 - * state = (self.name,) - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: # <<<<<<<<<<<<<< - * state += (_dict,) - * use_setstate = True - */ - __pyx_t_2 = (__pyx_v__dict != Py_None); - __pyx_t_3 = (__pyx_t_2 != 0); - if (__pyx_t_3) { - - /* "(tree fragment)":8 - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: - * state += (_dict,) # <<<<<<<<<<<<<< - * use_setstate = True - * else: - */ - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_v__dict); - __Pyx_GIVEREF(__pyx_v__dict); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict); - __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4)); - __pyx_t_4 = 0; - - /* "(tree fragment)":9 - * if _dict is not None: - * state += (_dict,) - * use_setstate = True # <<<<<<<<<<<<<< - * else: - * use_setstate = self.name is not None - */ - __pyx_v_use_setstate = 1; - - /* "(tree fragment)":7 - * state = (self.name,) - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: # <<<<<<<<<<<<<< - * state += (_dict,) - * use_setstate = True - */ - goto __pyx_L3; - } - - /* "(tree fragment)":11 - * use_setstate = True - * else: - * use_setstate = self.name is not None # <<<<<<<<<<<<<< - * if use_setstate: - * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state - */ - /*else*/ { - __pyx_t_3 = (__pyx_v_self->name != Py_None); - __pyx_v_use_setstate = __pyx_t_3; - } - __pyx_L3:; - - /* "(tree fragment)":12 - * else: - * use_setstate = self.name is not None - * if use_setstate: # <<<<<<<<<<<<<< - * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state - * else: - */ - __pyx_t_3 = (__pyx_v_use_setstate != 0); - if (__pyx_t_3) { - - /* "(tree fragment)":13 - * use_setstate = self.name is not None - * if use_setstate: - * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state # <<<<<<<<<<<<<< - * else: - * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_INCREF(__pyx_int_184977713); - __Pyx_GIVEREF(__pyx_int_184977713); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_184977713); - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None); - __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); - __Pyx_INCREF(__pyx_v_state); - __Pyx_GIVEREF(__pyx_v_state); - PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state); - __pyx_t_4 = 0; - __pyx_t_1 = 0; - __pyx_r = __pyx_t_5; - __pyx_t_5 = 0; - goto __pyx_L0; - - /* "(tree fragment)":12 - * else: - * use_setstate = self.name is not None - * if use_setstate: # <<<<<<<<<<<<<< - * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state - * else: - */ - } - - /* "(tree fragment)":15 - * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state - * else: - * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * __pyx_unpickle_Enum__set_state(self, __pyx_state) - */ - /*else*/ { - __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_INCREF(__pyx_int_184977713); - __Pyx_GIVEREF(__pyx_int_184977713); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_184977713); - __Pyx_INCREF(__pyx_v_state); - __Pyx_GIVEREF(__pyx_v_state); - PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state); - __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_5); - PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); - __pyx_t_5 = 0; - __pyx_t_1 = 0; - __pyx_r = __pyx_t_4; - __pyx_t_4 = 0; - goto __pyx_L0; - } - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * cdef tuple state - * cdef object _dict - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.Enum.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_state); - __Pyx_XDECREF(__pyx_v__dict); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":16 - * else: - * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * __pyx_unpickle_Enum__set_state(self, __pyx_state) - */ - -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_MemviewEnum_2__setstate_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":17 - * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) - * def __setstate_cython__(self, __pyx_state): - * __pyx_unpickle_Enum__set_state(self, __pyx_state) # <<<<<<<<<<<<<< - */ - if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(2, 17, __pyx_L1_error) - __pyx_t_1 = __pyx_unpickle_Enum__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 17, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "(tree fragment)":16 - * else: - * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * __pyx_unpickle_Enum__set_state(self, __pyx_state) - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":298 - * - * @cname('__pyx_align_pointer') - * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< - * "Align pointer memory on a given boundary" - * cdef Py_intptr_t aligned_p = memory - */ - -static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) { - Py_intptr_t __pyx_v_aligned_p; - size_t __pyx_v_offset; - void *__pyx_r; - int __pyx_t_1; - - /* "View.MemoryView":300 - * cdef void *align_pointer(void *memory, size_t alignment) nogil: - * "Align pointer memory on a given boundary" - * cdef Py_intptr_t aligned_p = memory # <<<<<<<<<<<<<< - * cdef size_t offset - * - */ - __pyx_v_aligned_p = ((Py_intptr_t)__pyx_v_memory); - - /* "View.MemoryView":304 - * - * with cython.cdivision(True): - * offset = aligned_p % alignment # <<<<<<<<<<<<<< - * - * if offset > 0: - */ - __pyx_v_offset = (__pyx_v_aligned_p % __pyx_v_alignment); - - /* "View.MemoryView":306 - * offset = aligned_p % alignment - * - * if offset > 0: # <<<<<<<<<<<<<< - * aligned_p += alignment - offset - * - */ - __pyx_t_1 = ((__pyx_v_offset > 0) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":307 - * - * if offset > 0: - * aligned_p += alignment - offset # <<<<<<<<<<<<<< - * - * return aligned_p - */ - __pyx_v_aligned_p = (__pyx_v_aligned_p + (__pyx_v_alignment - __pyx_v_offset)); - - /* "View.MemoryView":306 - * offset = aligned_p % alignment - * - * if offset > 0: # <<<<<<<<<<<<<< - * aligned_p += alignment - offset - * - */ - } - - /* "View.MemoryView":309 - * aligned_p += alignment - offset - * - * return aligned_p # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = ((void *)__pyx_v_aligned_p); - goto __pyx_L0; - - /* "View.MemoryView":298 - * - * @cname('__pyx_align_pointer') - * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< - * "Align pointer memory on a given boundary" - * cdef Py_intptr_t aligned_p = memory - */ - - /* function exit code */ - __pyx_L0:; - return __pyx_r; -} - -/* "View.MemoryView":345 - * cdef __Pyx_TypeInfo *typeinfo - * - * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< - * self.obj = obj - * self.flags = flags - */ - -/* Python wrapper */ -static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_obj = 0; - int __pyx_v_flags; - int __pyx_v_dtype_is_object; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_obj,&__pyx_n_s_flags,&__pyx_n_s_dtype_is_object,0}; - PyObject* values[3] = {0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_obj)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_flags)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, 1); __PYX_ERR(2, 345, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dtype_is_object); - if (value) { values[2] = value; kw_args--; } - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(2, 345, __pyx_L3_error) - } - } else { - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - break; - default: goto __pyx_L5_argtuple_error; - } - } - __pyx_v_obj = values[0]; - __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 345, __pyx_L3_error) - if (values[2]) { - __pyx_v_dtype_is_object = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_dtype_is_object == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 345, __pyx_L3_error) - } else { - __pyx_v_dtype_is_object = ((int)0); - } - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 345, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_obj, __pyx_v_flags, __pyx_v_dtype_is_object); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object) { - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_t_4; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__cinit__", 0); - - /* "View.MemoryView":346 - * - * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): - * self.obj = obj # <<<<<<<<<<<<<< - * self.flags = flags - * if type(self) is memoryview or obj is not None: - */ - __Pyx_INCREF(__pyx_v_obj); - __Pyx_GIVEREF(__pyx_v_obj); - __Pyx_GOTREF(__pyx_v_self->obj); - __Pyx_DECREF(__pyx_v_self->obj); - __pyx_v_self->obj = __pyx_v_obj; - - /* "View.MemoryView":347 - * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): - * self.obj = obj - * self.flags = flags # <<<<<<<<<<<<<< - * if type(self) is memoryview or obj is not None: - * __Pyx_GetBuffer(obj, &self.view, flags) - */ - __pyx_v_self->flags = __pyx_v_flags; - - /* "View.MemoryView":348 - * self.obj = obj - * self.flags = flags - * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< - * __Pyx_GetBuffer(obj, &self.view, flags) - * if self.view.obj == NULL: - */ - __pyx_t_2 = (((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))) == ((PyObject *)__pyx_memoryview_type)); - __pyx_t_3 = (__pyx_t_2 != 0); - if (!__pyx_t_3) { - } else { - __pyx_t_1 = __pyx_t_3; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_3 = (__pyx_v_obj != Py_None); - __pyx_t_2 = (__pyx_t_3 != 0); - __pyx_t_1 = __pyx_t_2; - __pyx_L4_bool_binop_done:; - if (__pyx_t_1) { - - /* "View.MemoryView":349 - * self.flags = flags - * if type(self) is memoryview or obj is not None: - * __Pyx_GetBuffer(obj, &self.view, flags) # <<<<<<<<<<<<<< - * if self.view.obj == NULL: - * (<__pyx_buffer *> &self.view).obj = Py_None - */ - __pyx_t_4 = __Pyx_GetBuffer(__pyx_v_obj, (&__pyx_v_self->view), __pyx_v_flags); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 349, __pyx_L1_error) - - /* "View.MemoryView":350 - * if type(self) is memoryview or obj is not None: - * __Pyx_GetBuffer(obj, &self.view, flags) - * if self.view.obj == NULL: # <<<<<<<<<<<<<< - * (<__pyx_buffer *> &self.view).obj = Py_None - * Py_INCREF(Py_None) - */ - __pyx_t_1 = ((((PyObject *)__pyx_v_self->view.obj) == NULL) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":351 - * __Pyx_GetBuffer(obj, &self.view, flags) - * if self.view.obj == NULL: - * (<__pyx_buffer *> &self.view).obj = Py_None # <<<<<<<<<<<<<< - * Py_INCREF(Py_None) - * - */ - ((Py_buffer *)(&__pyx_v_self->view))->obj = Py_None; - - /* "View.MemoryView":352 - * if self.view.obj == NULL: - * (<__pyx_buffer *> &self.view).obj = Py_None - * Py_INCREF(Py_None) # <<<<<<<<<<<<<< - * - * global __pyx_memoryview_thread_locks_used - */ - Py_INCREF(Py_None); - - /* "View.MemoryView":350 - * if type(self) is memoryview or obj is not None: - * __Pyx_GetBuffer(obj, &self.view, flags) - * if self.view.obj == NULL: # <<<<<<<<<<<<<< - * (<__pyx_buffer *> &self.view).obj = Py_None - * Py_INCREF(Py_None) - */ - } - - /* "View.MemoryView":348 - * self.obj = obj - * self.flags = flags - * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< - * __Pyx_GetBuffer(obj, &self.view, flags) - * if self.view.obj == NULL: - */ - } - - /* "View.MemoryView":355 - * - * global __pyx_memoryview_thread_locks_used - * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 - */ - __pyx_t_1 = ((__pyx_memoryview_thread_locks_used < 8) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":356 - * global __pyx_memoryview_thread_locks_used - * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] # <<<<<<<<<<<<<< - * __pyx_memoryview_thread_locks_used += 1 - * if self.lock is NULL: - */ - __pyx_v_self->lock = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); - - /* "View.MemoryView":357 - * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 # <<<<<<<<<<<<<< - * if self.lock is NULL: - * self.lock = PyThread_allocate_lock() - */ - __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used + 1); - - /* "View.MemoryView":355 - * - * global __pyx_memoryview_thread_locks_used - * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 - */ - } - - /* "View.MemoryView":358 - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 - * if self.lock is NULL: # <<<<<<<<<<<<<< - * self.lock = PyThread_allocate_lock() - * if self.lock is NULL: - */ - __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":359 - * __pyx_memoryview_thread_locks_used += 1 - * if self.lock is NULL: - * self.lock = PyThread_allocate_lock() # <<<<<<<<<<<<<< - * if self.lock is NULL: - * raise MemoryError - */ - __pyx_v_self->lock = PyThread_allocate_lock(); - - /* "View.MemoryView":360 - * if self.lock is NULL: - * self.lock = PyThread_allocate_lock() - * if self.lock is NULL: # <<<<<<<<<<<<<< - * raise MemoryError - * - */ - __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); - if (unlikely(__pyx_t_1)) { - - /* "View.MemoryView":361 - * self.lock = PyThread_allocate_lock() - * if self.lock is NULL: - * raise MemoryError # <<<<<<<<<<<<<< - * - * if flags & PyBUF_FORMAT: - */ - PyErr_NoMemory(); __PYX_ERR(2, 361, __pyx_L1_error) - - /* "View.MemoryView":360 - * if self.lock is NULL: - * self.lock = PyThread_allocate_lock() - * if self.lock is NULL: # <<<<<<<<<<<<<< - * raise MemoryError - * - */ - } - - /* "View.MemoryView":358 - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 - * if self.lock is NULL: # <<<<<<<<<<<<<< - * self.lock = PyThread_allocate_lock() - * if self.lock is NULL: - */ - } - - /* "View.MemoryView":363 - * raise MemoryError - * - * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< - * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') - * else: - */ - __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":364 - * - * if flags & PyBUF_FORMAT: - * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') # <<<<<<<<<<<<<< - * else: - * self.dtype_is_object = dtype_is_object - */ - __pyx_t_2 = (((__pyx_v_self->view.format[0]) == 'O') != 0); - if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L11_bool_binop_done; - } - __pyx_t_2 = (((__pyx_v_self->view.format[1]) == '\x00') != 0); - __pyx_t_1 = __pyx_t_2; - __pyx_L11_bool_binop_done:; - __pyx_v_self->dtype_is_object = __pyx_t_1; - - /* "View.MemoryView":363 - * raise MemoryError - * - * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< - * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') - * else: - */ - goto __pyx_L10; - } - - /* "View.MemoryView":366 - * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') - * else: - * self.dtype_is_object = dtype_is_object # <<<<<<<<<<<<<< - * - * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( - */ - /*else*/ { - __pyx_v_self->dtype_is_object = __pyx_v_dtype_is_object; - } - __pyx_L10:; - - /* "View.MemoryView":368 - * self.dtype_is_object = dtype_is_object - * - * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( # <<<<<<<<<<<<<< - * &self.acquisition_count[0], sizeof(__pyx_atomic_int)) - * self.typeinfo = NULL - */ - __pyx_v_self->acquisition_count_aligned_p = ((__pyx_atomic_int *)__pyx_align_pointer(((void *)(&(__pyx_v_self->acquisition_count[0]))), (sizeof(__pyx_atomic_int)))); - - /* "View.MemoryView":370 - * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( - * &self.acquisition_count[0], sizeof(__pyx_atomic_int)) - * self.typeinfo = NULL # <<<<<<<<<<<<<< - * - * def __dealloc__(memoryview self): - */ - __pyx_v_self->typeinfo = NULL; - - /* "View.MemoryView":345 - * cdef __Pyx_TypeInfo *typeinfo - * - * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< - * self.obj = obj - * self.flags = flags - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":372 - * self.typeinfo = NULL - * - * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< - * if self.obj is not None: - * __Pyx_ReleaseBuffer(&self.view) - */ - -/* Python wrapper */ -static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self); /*proto*/ -static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); - __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self) { - int __pyx_v_i; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_t_4; - int __pyx_t_5; - PyThread_type_lock __pyx_t_6; - PyThread_type_lock __pyx_t_7; - __Pyx_RefNannySetupContext("__dealloc__", 0); - - /* "View.MemoryView":373 - * - * def __dealloc__(memoryview self): - * if self.obj is not None: # <<<<<<<<<<<<<< - * __Pyx_ReleaseBuffer(&self.view) - * elif (<__pyx_buffer *> &self.view).obj == Py_None: - */ - __pyx_t_1 = (__pyx_v_self->obj != Py_None); - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":374 - * def __dealloc__(memoryview self): - * if self.obj is not None: - * __Pyx_ReleaseBuffer(&self.view) # <<<<<<<<<<<<<< - * elif (<__pyx_buffer *> &self.view).obj == Py_None: - * - */ - __Pyx_ReleaseBuffer((&__pyx_v_self->view)); - - /* "View.MemoryView":373 - * - * def __dealloc__(memoryview self): - * if self.obj is not None: # <<<<<<<<<<<<<< - * __Pyx_ReleaseBuffer(&self.view) - * elif (<__pyx_buffer *> &self.view).obj == Py_None: - */ - goto __pyx_L3; - } - - /* "View.MemoryView":375 - * if self.obj is not None: - * __Pyx_ReleaseBuffer(&self.view) - * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< - * - * (<__pyx_buffer *> &self.view).obj = NULL - */ - __pyx_t_2 = ((((Py_buffer *)(&__pyx_v_self->view))->obj == Py_None) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":377 - * elif (<__pyx_buffer *> &self.view).obj == Py_None: - * - * (<__pyx_buffer *> &self.view).obj = NULL # <<<<<<<<<<<<<< - * Py_DECREF(Py_None) - * - */ - ((Py_buffer *)(&__pyx_v_self->view))->obj = NULL; - - /* "View.MemoryView":378 - * - * (<__pyx_buffer *> &self.view).obj = NULL - * Py_DECREF(Py_None) # <<<<<<<<<<<<<< - * - * cdef int i - */ - Py_DECREF(Py_None); - - /* "View.MemoryView":375 - * if self.obj is not None: - * __Pyx_ReleaseBuffer(&self.view) - * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< - * - * (<__pyx_buffer *> &self.view).obj = NULL - */ - } - __pyx_L3:; - - /* "View.MemoryView":382 - * cdef int i - * global __pyx_memoryview_thread_locks_used - * if self.lock != NULL: # <<<<<<<<<<<<<< - * for i in range(__pyx_memoryview_thread_locks_used): - * if __pyx_memoryview_thread_locks[i] is self.lock: - */ - __pyx_t_2 = ((__pyx_v_self->lock != NULL) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":383 - * global __pyx_memoryview_thread_locks_used - * if self.lock != NULL: - * for i in range(__pyx_memoryview_thread_locks_used): # <<<<<<<<<<<<<< - * if __pyx_memoryview_thread_locks[i] is self.lock: - * __pyx_memoryview_thread_locks_used -= 1 - */ - __pyx_t_3 = __pyx_memoryview_thread_locks_used; - __pyx_t_4 = __pyx_t_3; - for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { - __pyx_v_i = __pyx_t_5; - - /* "View.MemoryView":384 - * if self.lock != NULL: - * for i in range(__pyx_memoryview_thread_locks_used): - * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< - * __pyx_memoryview_thread_locks_used -= 1 - * if i != __pyx_memoryview_thread_locks_used: - */ - __pyx_t_2 = (((__pyx_memoryview_thread_locks[__pyx_v_i]) == __pyx_v_self->lock) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":385 - * for i in range(__pyx_memoryview_thread_locks_used): - * if __pyx_memoryview_thread_locks[i] is self.lock: - * __pyx_memoryview_thread_locks_used -= 1 # <<<<<<<<<<<<<< - * if i != __pyx_memoryview_thread_locks_used: - * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( - */ - __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used - 1); - - /* "View.MemoryView":386 - * if __pyx_memoryview_thread_locks[i] is self.lock: - * __pyx_memoryview_thread_locks_used -= 1 - * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< - * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( - * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) - */ - __pyx_t_2 = ((__pyx_v_i != __pyx_memoryview_thread_locks_used) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":388 - * if i != __pyx_memoryview_thread_locks_used: - * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( - * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) # <<<<<<<<<<<<<< - * break - * else: - */ - __pyx_t_6 = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); - __pyx_t_7 = (__pyx_memoryview_thread_locks[__pyx_v_i]); - - /* "View.MemoryView":387 - * __pyx_memoryview_thread_locks_used -= 1 - * if i != __pyx_memoryview_thread_locks_used: - * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( # <<<<<<<<<<<<<< - * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) - * break - */ - (__pyx_memoryview_thread_locks[__pyx_v_i]) = __pyx_t_6; - (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]) = __pyx_t_7; - - /* "View.MemoryView":386 - * if __pyx_memoryview_thread_locks[i] is self.lock: - * __pyx_memoryview_thread_locks_used -= 1 - * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< - * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( - * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) - */ - } - - /* "View.MemoryView":389 - * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( - * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) - * break # <<<<<<<<<<<<<< - * else: - * PyThread_free_lock(self.lock) - */ - goto __pyx_L6_break; - - /* "View.MemoryView":384 - * if self.lock != NULL: - * for i in range(__pyx_memoryview_thread_locks_used): - * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< - * __pyx_memoryview_thread_locks_used -= 1 - * if i != __pyx_memoryview_thread_locks_used: - */ - } - } - /*else*/ { - - /* "View.MemoryView":391 - * break - * else: - * PyThread_free_lock(self.lock) # <<<<<<<<<<<<<< - * - * cdef char *get_item_pointer(memoryview self, object index) except NULL: - */ - PyThread_free_lock(__pyx_v_self->lock); - } - __pyx_L6_break:; - - /* "View.MemoryView":382 - * cdef int i - * global __pyx_memoryview_thread_locks_used - * if self.lock != NULL: # <<<<<<<<<<<<<< - * for i in range(__pyx_memoryview_thread_locks_used): - * if __pyx_memoryview_thread_locks[i] is self.lock: - */ - } - - /* "View.MemoryView":372 - * self.typeinfo = NULL - * - * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< - * if self.obj is not None: - * __Pyx_ReleaseBuffer(&self.view) - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "View.MemoryView":393 - * PyThread_free_lock(self.lock) - * - * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< - * cdef Py_ssize_t dim - * cdef char *itemp = self.view.buf - */ - -static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { - Py_ssize_t __pyx_v_dim; - char *__pyx_v_itemp; - PyObject *__pyx_v_idx = NULL; - char *__pyx_r; - __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - Py_ssize_t __pyx_t_3; - PyObject *(*__pyx_t_4)(PyObject *); - PyObject *__pyx_t_5 = NULL; - Py_ssize_t __pyx_t_6; - char *__pyx_t_7; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("get_item_pointer", 0); - - /* "View.MemoryView":395 - * cdef char *get_item_pointer(memoryview self, object index) except NULL: - * cdef Py_ssize_t dim - * cdef char *itemp = self.view.buf # <<<<<<<<<<<<<< - * - * for dim, idx in enumerate(index): - */ - __pyx_v_itemp = ((char *)__pyx_v_self->view.buf); - - /* "View.MemoryView":397 - * cdef char *itemp = self.view.buf - * - * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< - * itemp = pybuffer_index(&self.view, itemp, idx, dim) - * - */ - __pyx_t_1 = 0; - if (likely(PyList_CheckExact(__pyx_v_index)) || PyTuple_CheckExact(__pyx_v_index)) { - __pyx_t_2 = __pyx_v_index; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0; - __pyx_t_4 = NULL; - } else { - __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 397, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 397, __pyx_L1_error) - } - for (;;) { - if (likely(!__pyx_t_4)) { - if (likely(PyList_CheckExact(__pyx_t_2))) { - if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(2, 397, __pyx_L1_error) - #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 397, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - } else { - if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(2, 397, __pyx_L1_error) - #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 397, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - } - } else { - __pyx_t_5 = __pyx_t_4(__pyx_t_2); - if (unlikely(!__pyx_t_5)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(2, 397, __pyx_L1_error) - } - break; - } - __Pyx_GOTREF(__pyx_t_5); - } - __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_5); - __pyx_t_5 = 0; - __pyx_v_dim = __pyx_t_1; - __pyx_t_1 = (__pyx_t_1 + 1); - - /* "View.MemoryView":398 - * - * for dim, idx in enumerate(index): - * itemp = pybuffer_index(&self.view, itemp, idx, dim) # <<<<<<<<<<<<<< - * - * return itemp - */ - __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 398, __pyx_L1_error) - __pyx_t_7 = __pyx_pybuffer_index((&__pyx_v_self->view), __pyx_v_itemp, __pyx_t_6, __pyx_v_dim); if (unlikely(__pyx_t_7 == ((char *)NULL))) __PYX_ERR(2, 398, __pyx_L1_error) - __pyx_v_itemp = __pyx_t_7; - - /* "View.MemoryView":397 - * cdef char *itemp = self.view.buf - * - * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< - * itemp = pybuffer_index(&self.view, itemp, idx, dim) - * - */ - } - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "View.MemoryView":400 - * itemp = pybuffer_index(&self.view, itemp, idx, dim) - * - * return itemp # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = __pyx_v_itemp; - goto __pyx_L0; - - /* "View.MemoryView":393 - * PyThread_free_lock(self.lock) - * - * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< - * cdef Py_ssize_t dim - * cdef char *itemp = self.view.buf - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.memoryview.get_item_pointer", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_idx); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":403 - * - * - * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< - * if index is Ellipsis: - * return self - */ - -/* Python wrapper */ -static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/ -static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { - PyObject *__pyx_v_have_slices = NULL; - PyObject *__pyx_v_indices = NULL; - char *__pyx_v_itemp; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - char *__pyx_t_6; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__getitem__", 0); - - /* "View.MemoryView":404 - * - * def __getitem__(memoryview self, object index): - * if index is Ellipsis: # <<<<<<<<<<<<<< - * return self - * - */ - __pyx_t_1 = (__pyx_v_index == __pyx_builtin_Ellipsis); - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":405 - * def __getitem__(memoryview self, object index): - * if index is Ellipsis: - * return self # <<<<<<<<<<<<<< - * - * have_slices, indices = _unellipsify(index, self.view.ndim) - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_self)); - __pyx_r = ((PyObject *)__pyx_v_self); - goto __pyx_L0; - - /* "View.MemoryView":404 - * - * def __getitem__(memoryview self, object index): - * if index is Ellipsis: # <<<<<<<<<<<<<< - * return self - * - */ - } - - /* "View.MemoryView":407 - * return self - * - * have_slices, indices = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< - * - * cdef char *itemp - */ - __pyx_t_3 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 407, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (likely(__pyx_t_3 != Py_None)) { - PyObject* sequence = __pyx_t_3; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 2)) { - if (size > 2) __Pyx_RaiseTooManyValuesError(2); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(2, 407, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(__pyx_t_5); - #else - __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 407, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 407, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } else { - __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(2, 407, __pyx_L1_error) - } - __pyx_v_have_slices = __pyx_t_4; - __pyx_t_4 = 0; - __pyx_v_indices = __pyx_t_5; - __pyx_t_5 = 0; - - /* "View.MemoryView":410 - * - * cdef char *itemp - * if have_slices: # <<<<<<<<<<<<<< - * return memview_slice(self, indices) - * else: - */ - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(2, 410, __pyx_L1_error) - if (__pyx_t_2) { - - /* "View.MemoryView":411 - * cdef char *itemp - * if have_slices: - * return memview_slice(self, indices) # <<<<<<<<<<<<<< - * else: - * itemp = self.get_item_pointer(indices) - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = ((PyObject *)__pyx_memview_slice(__pyx_v_self, __pyx_v_indices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 411, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_r = __pyx_t_3; - __pyx_t_3 = 0; - goto __pyx_L0; - - /* "View.MemoryView":410 - * - * cdef char *itemp - * if have_slices: # <<<<<<<<<<<<<< - * return memview_slice(self, indices) - * else: - */ - } - - /* "View.MemoryView":413 - * return memview_slice(self, indices) - * else: - * itemp = self.get_item_pointer(indices) # <<<<<<<<<<<<<< - * return self.convert_item_to_object(itemp) - * - */ - /*else*/ { - __pyx_t_6 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_indices); if (unlikely(__pyx_t_6 == ((char *)NULL))) __PYX_ERR(2, 413, __pyx_L1_error) - __pyx_v_itemp = __pyx_t_6; - - /* "View.MemoryView":414 - * else: - * itemp = self.get_item_pointer(indices) - * return self.convert_item_to_object(itemp) # <<<<<<<<<<<<<< - * - * def __setitem__(memoryview self, object index, object value): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->convert_item_to_object(__pyx_v_self, __pyx_v_itemp); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 414, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_r = __pyx_t_3; - __pyx_t_3 = 0; - goto __pyx_L0; - } - - /* "View.MemoryView":403 - * - * - * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< - * if index is Ellipsis: - * return self - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.memoryview.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_have_slices); - __Pyx_XDECREF(__pyx_v_indices); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":416 - * return self.convert_item_to_object(itemp) - * - * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< - * if self.view.readonly: - * raise TypeError("Cannot assign to read-only memoryview") - */ - -/* Python wrapper */ -static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /*proto*/ -static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index), ((PyObject *)__pyx_v_value)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { - PyObject *__pyx_v_have_slices = NULL; - PyObject *__pyx_v_obj = NULL; - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setitem__", 0); - __Pyx_INCREF(__pyx_v_index); - - /* "View.MemoryView":417 - * - * def __setitem__(memoryview self, object index, object value): - * if self.view.readonly: # <<<<<<<<<<<<<< - * raise TypeError("Cannot assign to read-only memoryview") - * - */ - __pyx_t_1 = (__pyx_v_self->view.readonly != 0); - if (unlikely(__pyx_t_1)) { - - /* "View.MemoryView":418 - * def __setitem__(memoryview self, object index, object value): - * if self.view.readonly: - * raise TypeError("Cannot assign to read-only memoryview") # <<<<<<<<<<<<<< - * - * have_slices, index = _unellipsify(index, self.view.ndim) - */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 418, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(2, 418, __pyx_L1_error) - - /* "View.MemoryView":417 - * - * def __setitem__(memoryview self, object index, object value): - * if self.view.readonly: # <<<<<<<<<<<<<< - * raise TypeError("Cannot assign to read-only memoryview") - * - */ - } - - /* "View.MemoryView":420 - * raise TypeError("Cannot assign to read-only memoryview") - * - * have_slices, index = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< - * - * if have_slices: - */ - __pyx_t_2 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 420, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (likely(__pyx_t_2 != Py_None)) { - PyObject* sequence = __pyx_t_2; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 2)) { - if (size > 2) __Pyx_RaiseTooManyValuesError(2); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(2, 420, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(__pyx_t_4); - #else - __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 420, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 420, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - #endif - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } else { - __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(2, 420, __pyx_L1_error) - } - __pyx_v_have_slices = __pyx_t_3; - __pyx_t_3 = 0; - __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_4); - __pyx_t_4 = 0; - - /* "View.MemoryView":422 - * have_slices, index = _unellipsify(index, self.view.ndim) - * - * if have_slices: # <<<<<<<<<<<<<< - * obj = self.is_slice(value) - * if obj: - */ - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 422, __pyx_L1_error) - if (__pyx_t_1) { - - /* "View.MemoryView":423 - * - * if have_slices: - * obj = self.is_slice(value) # <<<<<<<<<<<<<< - * if obj: - * self.setitem_slice_assignment(self[index], obj) - */ - __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->is_slice(__pyx_v_self, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 423, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_v_obj = __pyx_t_2; - __pyx_t_2 = 0; - - /* "View.MemoryView":424 - * if have_slices: - * obj = self.is_slice(value) - * if obj: # <<<<<<<<<<<<<< - * self.setitem_slice_assignment(self[index], obj) - * else: - */ - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_obj); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 424, __pyx_L1_error) - if (__pyx_t_1) { - - /* "View.MemoryView":425 - * obj = self.is_slice(value) - * if obj: - * self.setitem_slice_assignment(self[index], obj) # <<<<<<<<<<<<<< - * else: - * self.setitem_slice_assign_scalar(self[index], value) - */ - __pyx_t_2 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 425, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assignment(__pyx_v_self, __pyx_t_2, __pyx_v_obj); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 425, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - - /* "View.MemoryView":424 - * if have_slices: - * obj = self.is_slice(value) - * if obj: # <<<<<<<<<<<<<< - * self.setitem_slice_assignment(self[index], obj) - * else: - */ - goto __pyx_L5; - } - - /* "View.MemoryView":427 - * self.setitem_slice_assignment(self[index], obj) - * else: - * self.setitem_slice_assign_scalar(self[index], value) # <<<<<<<<<<<<<< - * else: - * self.setitem_indexed(index, value) - */ - /*else*/ { - __pyx_t_4 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 427, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_memoryview_type))))) __PYX_ERR(2, 427, __pyx_L1_error) - __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assign_scalar(__pyx_v_self, ((struct __pyx_memoryview_obj *)__pyx_t_4), __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 427, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } - __pyx_L5:; - - /* "View.MemoryView":422 - * have_slices, index = _unellipsify(index, self.view.ndim) - * - * if have_slices: # <<<<<<<<<<<<<< - * obj = self.is_slice(value) - * if obj: - */ - goto __pyx_L4; - } - - /* "View.MemoryView":429 - * self.setitem_slice_assign_scalar(self[index], value) - * else: - * self.setitem_indexed(index, value) # <<<<<<<<<<<<<< - * - * cdef is_slice(self, obj): - */ - /*else*/ { - __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_indexed(__pyx_v_self, __pyx_v_index, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 429, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } - __pyx_L4:; - - /* "View.MemoryView":416 - * return self.convert_item_to_object(itemp) - * - * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< - * if self.view.readonly: - * raise TypeError("Cannot assign to read-only memoryview") - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("View.MemoryView.memoryview.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_have_slices); - __Pyx_XDECREF(__pyx_v_obj); - __Pyx_XDECREF(__pyx_v_index); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":431 - * self.setitem_indexed(index, value) - * - * cdef is_slice(self, obj): # <<<<<<<<<<<<<< - * if not isinstance(obj, memoryview): - * try: - */ - -static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - int __pyx_t_9; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("is_slice", 0); - __Pyx_INCREF(__pyx_v_obj); - - /* "View.MemoryView":432 - * - * cdef is_slice(self, obj): - * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< - * try: - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, - */ - __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_obj, __pyx_memoryview_type); - __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":433 - * cdef is_slice(self, obj): - * if not isinstance(obj, memoryview): - * try: # <<<<<<<<<<<<<< - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, - * self.dtype_is_object) - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_5); - /*try:*/ { - - /* "View.MemoryView":434 - * if not isinstance(obj, memoryview): - * try: - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< - * self.dtype_is_object) - * except TypeError: - */ - __pyx_t_6 = __Pyx_PyInt_From_int(((__pyx_v_self->flags & (~PyBUF_WRITABLE)) | PyBUF_ANY_CONTIGUOUS)); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 434, __pyx_L4_error) - __Pyx_GOTREF(__pyx_t_6); - - /* "View.MemoryView":435 - * try: - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, - * self.dtype_is_object) # <<<<<<<<<<<<<< - * except TypeError: - * return None - */ - __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 435, __pyx_L4_error) - __Pyx_GOTREF(__pyx_t_7); - - /* "View.MemoryView":434 - * if not isinstance(obj, memoryview): - * try: - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< - * self.dtype_is_object) - * except TypeError: - */ - __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 434, __pyx_L4_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_INCREF(__pyx_v_obj); - __Pyx_GIVEREF(__pyx_v_obj); - PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_obj); - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6); - __Pyx_GIVEREF(__pyx_t_7); - PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7); - __pyx_t_6 = 0; - __pyx_t_7 = 0; - __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 434, __pyx_L4_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF_SET(__pyx_v_obj, __pyx_t_7); - __pyx_t_7 = 0; - - /* "View.MemoryView":433 - * cdef is_slice(self, obj): - * if not isinstance(obj, memoryview): - * try: # <<<<<<<<<<<<<< - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, - * self.dtype_is_object) - */ - } - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - goto __pyx_L9_try_end; - __pyx_L4_error:; - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - - /* "View.MemoryView":436 - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, - * self.dtype_is_object) - * except TypeError: # <<<<<<<<<<<<<< - * return None - * - */ - __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError); - if (__pyx_t_9) { - __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_6) < 0) __PYX_ERR(2, 436, __pyx_L6_except_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GOTREF(__pyx_t_8); - __Pyx_GOTREF(__pyx_t_6); - - /* "View.MemoryView":437 - * self.dtype_is_object) - * except TypeError: - * return None # <<<<<<<<<<<<<< - * - * return obj - */ - __Pyx_XDECREF(__pyx_r); - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - goto __pyx_L7_except_return; - } - goto __pyx_L6_except_error; - __pyx_L6_except_error:; - - /* "View.MemoryView":433 - * cdef is_slice(self, obj): - * if not isinstance(obj, memoryview): - * try: # <<<<<<<<<<<<<< - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, - * self.dtype_is_object) - */ - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_XGIVEREF(__pyx_t_5); - __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); - goto __pyx_L1_error; - __pyx_L7_except_return:; - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_XGIVEREF(__pyx_t_5); - __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); - goto __pyx_L0; - __pyx_L9_try_end:; - } - - /* "View.MemoryView":432 - * - * cdef is_slice(self, obj): - * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< - * try: - * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, - */ - } - - /* "View.MemoryView":439 - * return None - * - * return obj # <<<<<<<<<<<<<< - * - * cdef setitem_slice_assignment(self, dst, src): - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_obj); - __pyx_r = __pyx_v_obj; - goto __pyx_L0; - - /* "View.MemoryView":431 - * self.setitem_indexed(index, value) - * - * cdef is_slice(self, obj): # <<<<<<<<<<<<<< - * if not isinstance(obj, memoryview): - * try: - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_obj); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":441 - * return obj - * - * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice dst_slice - * cdef __Pyx_memviewslice src_slice - */ - -static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src) { - __Pyx_memviewslice __pyx_v_dst_slice; - __Pyx_memviewslice __pyx_v_src_slice; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_memviewslice *__pyx_t_1; - __Pyx_memviewslice *__pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - int __pyx_t_5; - int __pyx_t_6; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("setitem_slice_assignment", 0); - - /* "View.MemoryView":445 - * cdef __Pyx_memviewslice src_slice - * - * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< - * get_slice_from_memview(dst, &dst_slice)[0], - * src.ndim, dst.ndim, self.dtype_is_object) - */ - if (!(likely(((__pyx_v_src) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_src, __pyx_memoryview_type))))) __PYX_ERR(2, 445, __pyx_L1_error) - __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_src), (&__pyx_v_src_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 445, __pyx_L1_error) - - /* "View.MemoryView":446 - * - * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], - * get_slice_from_memview(dst, &dst_slice)[0], # <<<<<<<<<<<<<< - * src.ndim, dst.ndim, self.dtype_is_object) - * - */ - if (!(likely(((__pyx_v_dst) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_dst, __pyx_memoryview_type))))) __PYX_ERR(2, 446, __pyx_L1_error) - __pyx_t_2 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_dst), (&__pyx_v_dst_slice)); if (unlikely(__pyx_t_2 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 446, __pyx_L1_error) - - /* "View.MemoryView":447 - * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], - * get_slice_from_memview(dst, &dst_slice)[0], - * src.ndim, dst.ndim, self.dtype_is_object) # <<<<<<<<<<<<<< - * - * cdef setitem_slice_assign_scalar(self, memoryview dst, value): - */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_src, __pyx_n_s_ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 447, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 447, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_dst, __pyx_n_s_ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 447, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 447, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "View.MemoryView":445 - * cdef __Pyx_memviewslice src_slice - * - * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< - * get_slice_from_memview(dst, &dst_slice)[0], - * src.ndim, dst.ndim, self.dtype_is_object) - */ - __pyx_t_6 = __pyx_memoryview_copy_contents((__pyx_t_1[0]), (__pyx_t_2[0]), __pyx_t_4, __pyx_t_5, __pyx_v_self->dtype_is_object); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 445, __pyx_L1_error) - - /* "View.MemoryView":441 - * return obj - * - * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice dst_slice - * cdef __Pyx_memviewslice src_slice - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assignment", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":449 - * src.ndim, dst.ndim, self.dtype_is_object) - * - * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< - * cdef int array[128] - * cdef void *tmp = NULL - */ - -static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value) { - int __pyx_v_array[0x80]; - void *__pyx_v_tmp; - void *__pyx_v_item; - __Pyx_memviewslice *__pyx_v_dst_slice; - __Pyx_memviewslice __pyx_v_tmp_slice; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_memviewslice *__pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - int __pyx_t_5; - char const *__pyx_t_6; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - PyObject *__pyx_t_10 = NULL; - PyObject *__pyx_t_11 = NULL; - PyObject *__pyx_t_12 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("setitem_slice_assign_scalar", 0); - - /* "View.MemoryView":451 - * cdef setitem_slice_assign_scalar(self, memoryview dst, value): - * cdef int array[128] - * cdef void *tmp = NULL # <<<<<<<<<<<<<< - * cdef void *item - * - */ - __pyx_v_tmp = NULL; - - /* "View.MemoryView":456 - * cdef __Pyx_memviewslice *dst_slice - * cdef __Pyx_memviewslice tmp_slice - * dst_slice = get_slice_from_memview(dst, &tmp_slice) # <<<<<<<<<<<<<< - * - * if self.view.itemsize > sizeof(array): - */ - __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_dst, (&__pyx_v_tmp_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 456, __pyx_L1_error) - __pyx_v_dst_slice = __pyx_t_1; - - /* "View.MemoryView":458 - * dst_slice = get_slice_from_memview(dst, &tmp_slice) - * - * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< - * tmp = PyMem_Malloc(self.view.itemsize) - * if tmp == NULL: - */ - __pyx_t_2 = ((((size_t)__pyx_v_self->view.itemsize) > (sizeof(__pyx_v_array))) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":459 - * - * if self.view.itemsize > sizeof(array): - * tmp = PyMem_Malloc(self.view.itemsize) # <<<<<<<<<<<<<< - * if tmp == NULL: - * raise MemoryError - */ - __pyx_v_tmp = PyMem_Malloc(__pyx_v_self->view.itemsize); - - /* "View.MemoryView":460 - * if self.view.itemsize > sizeof(array): - * tmp = PyMem_Malloc(self.view.itemsize) - * if tmp == NULL: # <<<<<<<<<<<<<< - * raise MemoryError - * item = tmp - */ - __pyx_t_2 = ((__pyx_v_tmp == NULL) != 0); - if (unlikely(__pyx_t_2)) { - - /* "View.MemoryView":461 - * tmp = PyMem_Malloc(self.view.itemsize) - * if tmp == NULL: - * raise MemoryError # <<<<<<<<<<<<<< - * item = tmp - * else: - */ - PyErr_NoMemory(); __PYX_ERR(2, 461, __pyx_L1_error) - - /* "View.MemoryView":460 - * if self.view.itemsize > sizeof(array): - * tmp = PyMem_Malloc(self.view.itemsize) - * if tmp == NULL: # <<<<<<<<<<<<<< - * raise MemoryError - * item = tmp - */ - } - - /* "View.MemoryView":462 - * if tmp == NULL: - * raise MemoryError - * item = tmp # <<<<<<<<<<<<<< - * else: - * item = array - */ - __pyx_v_item = __pyx_v_tmp; - - /* "View.MemoryView":458 - * dst_slice = get_slice_from_memview(dst, &tmp_slice) - * - * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< - * tmp = PyMem_Malloc(self.view.itemsize) - * if tmp == NULL: - */ - goto __pyx_L3; - } - - /* "View.MemoryView":464 - * item = tmp - * else: - * item = array # <<<<<<<<<<<<<< - * - * try: - */ - /*else*/ { - __pyx_v_item = ((void *)__pyx_v_array); - } - __pyx_L3:; - - /* "View.MemoryView":466 - * item = array - * - * try: # <<<<<<<<<<<<<< - * if self.dtype_is_object: - * ( item)[0] = value - */ - /*try:*/ { - - /* "View.MemoryView":467 - * - * try: - * if self.dtype_is_object: # <<<<<<<<<<<<<< - * ( item)[0] = value - * else: - */ - __pyx_t_2 = (__pyx_v_self->dtype_is_object != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":468 - * try: - * if self.dtype_is_object: - * ( item)[0] = value # <<<<<<<<<<<<<< - * else: - * self.assign_item_from_object( item, value) - */ - (((PyObject **)__pyx_v_item)[0]) = ((PyObject *)__pyx_v_value); - - /* "View.MemoryView":467 - * - * try: - * if self.dtype_is_object: # <<<<<<<<<<<<<< - * ( item)[0] = value - * else: - */ - goto __pyx_L8; - } - - /* "View.MemoryView":470 - * ( item)[0] = value - * else: - * self.assign_item_from_object( item, value) # <<<<<<<<<<<<<< - * - * - */ - /*else*/ { - __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, ((char *)__pyx_v_item), __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 470, __pyx_L6_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } - __pyx_L8:; - - /* "View.MemoryView":474 - * - * - * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< - * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) - * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, - */ - __pyx_t_2 = ((__pyx_v_self->view.suboffsets != NULL) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":475 - * - * if self.view.suboffsets != NULL: - * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) # <<<<<<<<<<<<<< - * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, - * item, self.dtype_is_object) - */ - __pyx_t_3 = assert_direct_dimensions(__pyx_v_self->view.suboffsets, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 475, __pyx_L6_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "View.MemoryView":474 - * - * - * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< - * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) - * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, - */ - } - - /* "View.MemoryView":476 - * if self.view.suboffsets != NULL: - * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) - * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, # <<<<<<<<<<<<<< - * item, self.dtype_is_object) - * finally: - */ - __pyx_memoryview_slice_assign_scalar(__pyx_v_dst_slice, __pyx_v_dst->view.ndim, __pyx_v_self->view.itemsize, __pyx_v_item, __pyx_v_self->dtype_is_object); - } - - /* "View.MemoryView":479 - * item, self.dtype_is_object) - * finally: - * PyMem_Free(tmp) # <<<<<<<<<<<<<< - * - * cdef setitem_indexed(self, index, value): - */ - /*finally:*/ { - /*normal exit:*/{ - PyMem_Free(__pyx_v_tmp); - goto __pyx_L7; - } - __pyx_L6_error:; - /*exception exit:*/{ - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); - if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9) < 0)) __Pyx_ErrFetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9); - __Pyx_XGOTREF(__pyx_t_7); - __Pyx_XGOTREF(__pyx_t_8); - __Pyx_XGOTREF(__pyx_t_9); - __Pyx_XGOTREF(__pyx_t_10); - __Pyx_XGOTREF(__pyx_t_11); - __Pyx_XGOTREF(__pyx_t_12); - __pyx_t_4 = __pyx_lineno; __pyx_t_5 = __pyx_clineno; __pyx_t_6 = __pyx_filename; - { - PyMem_Free(__pyx_v_tmp); - } - if (PY_MAJOR_VERSION >= 3) { - __Pyx_XGIVEREF(__pyx_t_10); - __Pyx_XGIVEREF(__pyx_t_11); - __Pyx_XGIVEREF(__pyx_t_12); - __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); - } - __Pyx_XGIVEREF(__pyx_t_7); - __Pyx_XGIVEREF(__pyx_t_8); - __Pyx_XGIVEREF(__pyx_t_9); - __Pyx_ErrRestore(__pyx_t_7, __pyx_t_8, __pyx_t_9); - __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; - __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_5; __pyx_filename = __pyx_t_6; - goto __pyx_L1_error; - } - __pyx_L7:; - } - - /* "View.MemoryView":449 - * src.ndim, dst.ndim, self.dtype_is_object) - * - * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< - * cdef int array[128] - * cdef void *tmp = NULL - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assign_scalar", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":481 - * PyMem_Free(tmp) - * - * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< - * cdef char *itemp = self.get_item_pointer(index) - * self.assign_item_from_object(itemp, value) - */ - -static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { - char *__pyx_v_itemp; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - char *__pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("setitem_indexed", 0); - - /* "View.MemoryView":482 - * - * cdef setitem_indexed(self, index, value): - * cdef char *itemp = self.get_item_pointer(index) # <<<<<<<<<<<<<< - * self.assign_item_from_object(itemp, value) - * - */ - __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_index); if (unlikely(__pyx_t_1 == ((char *)NULL))) __PYX_ERR(2, 482, __pyx_L1_error) - __pyx_v_itemp = __pyx_t_1; - - /* "View.MemoryView":483 - * cdef setitem_indexed(self, index, value): - * cdef char *itemp = self.get_item_pointer(index) - * self.assign_item_from_object(itemp, value) # <<<<<<<<<<<<<< - * - * cdef convert_item_to_object(self, char *itemp): - */ - __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 483, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "View.MemoryView":481 - * PyMem_Free(tmp) - * - * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< - * cdef char *itemp = self.get_item_pointer(index) - * self.assign_item_from_object(itemp, value) - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_indexed", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":485 - * self.assign_item_from_object(itemp, value) - * - * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< - * """Only used if instantiated manually by the user, or if Cython doesn't - * know how to convert the type""" - */ - -static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp) { - PyObject *__pyx_v_struct = NULL; - PyObject *__pyx_v_bytesitem = 0; - PyObject *__pyx_v_result = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - int __pyx_t_8; - PyObject *__pyx_t_9 = NULL; - size_t __pyx_t_10; - int __pyx_t_11; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("convert_item_to_object", 0); - - /* "View.MemoryView":488 - * """Only used if instantiated manually by the user, or if Cython doesn't - * know how to convert the type""" - * import struct # <<<<<<<<<<<<<< - * cdef bytes bytesitem - * - */ - __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 488, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_struct = __pyx_t_1; - __pyx_t_1 = 0; - - /* "View.MemoryView":491 - * cdef bytes bytesitem - * - * bytesitem = itemp[:self.view.itemsize] # <<<<<<<<<<<<<< - * try: - * result = struct.unpack(self.view.format, bytesitem) - */ - __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_itemp + 0, __pyx_v_self->view.itemsize - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 491, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_bytesitem = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "View.MemoryView":492 - * - * bytesitem = itemp[:self.view.itemsize] - * try: # <<<<<<<<<<<<<< - * result = struct.unpack(self.view.format, bytesitem) - * except struct.error: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - /*try:*/ { - - /* "View.MemoryView":493 - * bytesitem = itemp[:self.view.itemsize] - * try: - * result = struct.unpack(self.view.format, bytesitem) # <<<<<<<<<<<<<< - * except struct.error: - * raise ValueError("Unable to convert item to object") - */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_unpack); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 493, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 493, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = NULL; - __pyx_t_8 = 0; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { - __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); - if (likely(__pyx_t_7)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); - __Pyx_INCREF(__pyx_t_7); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_5, function); - __pyx_t_8 = 1; - } - } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 493, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 493, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - { - __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 493, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_9); - if (__pyx_t_7) { - __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; - } - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_t_6); - __Pyx_INCREF(__pyx_v_bytesitem); - __Pyx_GIVEREF(__pyx_v_bytesitem); - PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_v_bytesitem); - __pyx_t_6 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 493, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_v_result = __pyx_t_1; - __pyx_t_1 = 0; - - /* "View.MemoryView":492 - * - * bytesitem = itemp[:self.view.itemsize] - * try: # <<<<<<<<<<<<<< - * result = struct.unpack(self.view.format, bytesitem) - * except struct.error: - */ - } - - /* "View.MemoryView":497 - * raise ValueError("Unable to convert item to object") - * else: - * if len(self.view.format) == 1: # <<<<<<<<<<<<<< - * return result[0] - * return result - */ - /*else:*/ { - __pyx_t_10 = strlen(__pyx_v_self->view.format); - __pyx_t_11 = ((__pyx_t_10 == 1) != 0); - if (__pyx_t_11) { - - /* "View.MemoryView":498 - * else: - * if len(self.view.format) == 1: - * return result[0] # <<<<<<<<<<<<<< - * return result - * - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_result, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 498, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L6_except_return; - - /* "View.MemoryView":497 - * raise ValueError("Unable to convert item to object") - * else: - * if len(self.view.format) == 1: # <<<<<<<<<<<<<< - * return result[0] - * return result - */ - } - - /* "View.MemoryView":499 - * if len(self.view.format) == 1: - * return result[0] - * return result # <<<<<<<<<<<<<< - * - * cdef assign_item_from_object(self, char *itemp, object value): - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_result); - __pyx_r = __pyx_v_result; - goto __pyx_L6_except_return; - } - __pyx_L3_error:; - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - - /* "View.MemoryView":494 - * try: - * result = struct.unpack(self.view.format, bytesitem) - * except struct.error: # <<<<<<<<<<<<<< - * raise ValueError("Unable to convert item to object") - * else: - */ - __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_5, &__pyx_t_9); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_error); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 494, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_8 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_6); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_ErrRestore(__pyx_t_1, __pyx_t_5, __pyx_t_9); - __pyx_t_1 = 0; __pyx_t_5 = 0; __pyx_t_9 = 0; - if (__pyx_t_8) { - __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_9, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(2, 494, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_9); - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GOTREF(__pyx_t_1); - - /* "View.MemoryView":495 - * result = struct.unpack(self.view.format, bytesitem) - * except struct.error: - * raise ValueError("Unable to convert item to object") # <<<<<<<<<<<<<< - * else: - * if len(self.view.format) == 1: - */ - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 495, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_Raise(__pyx_t_6, 0, 0, 0); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __PYX_ERR(2, 495, __pyx_L5_except_error) - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "View.MemoryView":492 - * - * bytesitem = itemp[:self.view.itemsize] - * try: # <<<<<<<<<<<<<< - * result = struct.unpack(self.view.format, bytesitem) - * except struct.error: - */ - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L1_error; - __pyx_L6_except_return:; - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L0; - } - - /* "View.MemoryView":485 - * self.assign_item_from_object(itemp, value) - * - * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< - * """Only used if instantiated manually by the user, or if Cython doesn't - * know how to convert the type""" - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_struct); - __Pyx_XDECREF(__pyx_v_bytesitem); - __Pyx_XDECREF(__pyx_v_result); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":501 - * return result - * - * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< - * """Only used if instantiated manually by the user, or if Cython doesn't - * know how to convert the type""" - */ - -static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { - PyObject *__pyx_v_struct = NULL; - char __pyx_v_c; - PyObject *__pyx_v_bytesvalue = 0; - Py_ssize_t __pyx_v_i; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - int __pyx_t_3; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - int __pyx_t_7; - PyObject *__pyx_t_8 = NULL; - Py_ssize_t __pyx_t_9; - PyObject *__pyx_t_10 = NULL; - char *__pyx_t_11; - char *__pyx_t_12; - char *__pyx_t_13; - char *__pyx_t_14; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("assign_item_from_object", 0); - - /* "View.MemoryView":504 - * """Only used if instantiated manually by the user, or if Cython doesn't - * know how to convert the type""" - * import struct # <<<<<<<<<<<<<< - * cdef char c - * cdef bytes bytesvalue - */ - __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 504, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_struct = __pyx_t_1; - __pyx_t_1 = 0; - - /* "View.MemoryView":509 - * cdef Py_ssize_t i - * - * if isinstance(value, tuple): # <<<<<<<<<<<<<< - * bytesvalue = struct.pack(self.view.format, *value) - * else: - */ - __pyx_t_2 = PyTuple_Check(__pyx_v_value); - __pyx_t_3 = (__pyx_t_2 != 0); - if (__pyx_t_3) { - - /* "View.MemoryView":510 - * - * if isinstance(value, tuple): - * bytesvalue = struct.pack(self.view.format, *value) # <<<<<<<<<<<<<< - * else: - * bytesvalue = struct.pack(self.view.format, value) - */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); - __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PySequence_Tuple(__pyx_v_value); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_6 = PyNumber_Add(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(2, 510, __pyx_L1_error) - __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); - __pyx_t_4 = 0; - - /* "View.MemoryView":509 - * cdef Py_ssize_t i - * - * if isinstance(value, tuple): # <<<<<<<<<<<<<< - * bytesvalue = struct.pack(self.view.format, *value) - * else: - */ - goto __pyx_L3; - } - - /* "View.MemoryView":512 - * bytesvalue = struct.pack(self.view.format, *value) - * else: - * bytesvalue = struct.pack(self.view.format, value) # <<<<<<<<<<<<<< - * - * for i, c in enumerate(bytesvalue): - */ - /*else*/ { - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 512, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 512, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = NULL; - __pyx_t_7 = 0; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_6, function); - __pyx_t_7 = 1; - } - } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_6)) { - PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 512, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { - PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 512, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - } else - #endif - { - __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 512, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - if (__pyx_t_5) { - __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_5); __pyx_t_5 = NULL; - } - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_t_1); - __Pyx_INCREF(__pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_v_value); - __pyx_t_1 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 512, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - } - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(2, 512, __pyx_L1_error) - __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); - __pyx_t_4 = 0; - } - __pyx_L3:; - - /* "View.MemoryView":514 - * bytesvalue = struct.pack(self.view.format, value) - * - * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< - * itemp[i] = c - * - */ - __pyx_t_9 = 0; - if (unlikely(__pyx_v_bytesvalue == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); - __PYX_ERR(2, 514, __pyx_L1_error) - } - __Pyx_INCREF(__pyx_v_bytesvalue); - __pyx_t_10 = __pyx_v_bytesvalue; - __pyx_t_12 = PyBytes_AS_STRING(__pyx_t_10); - __pyx_t_13 = (__pyx_t_12 + PyBytes_GET_SIZE(__pyx_t_10)); - for (__pyx_t_14 = __pyx_t_12; __pyx_t_14 < __pyx_t_13; __pyx_t_14++) { - __pyx_t_11 = __pyx_t_14; - __pyx_v_c = (__pyx_t_11[0]); - - /* "View.MemoryView":515 - * - * for i, c in enumerate(bytesvalue): - * itemp[i] = c # <<<<<<<<<<<<<< - * - * @cname('getbuffer') - */ - __pyx_v_i = __pyx_t_9; - - /* "View.MemoryView":514 - * bytesvalue = struct.pack(self.view.format, value) - * - * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< - * itemp[i] = c - * - */ - __pyx_t_9 = (__pyx_t_9 + 1); - - /* "View.MemoryView":515 - * - * for i, c in enumerate(bytesvalue): - * itemp[i] = c # <<<<<<<<<<<<<< - * - * @cname('getbuffer') - */ - (__pyx_v_itemp[__pyx_v_i]) = __pyx_v_c; - } - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - - /* "View.MemoryView":501 - * return result - * - * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< - * """Only used if instantiated manually by the user, or if Cython doesn't - * know how to convert the type""" - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_AddTraceback("View.MemoryView.memoryview.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_struct); - __Pyx_XDECREF(__pyx_v_bytesvalue); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":518 - * - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< - * if flags & PyBUF_WRITABLE and self.view.readonly: - * raise ValueError("Cannot create writable memory view from read-only memoryview") - */ - -/* Python wrapper */ -static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ -static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - Py_ssize_t *__pyx_t_4; - char *__pyx_t_5; - void *__pyx_t_6; - int __pyx_t_7; - Py_ssize_t __pyx_t_8; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - if (__pyx_v_info == NULL) { - PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); - return -1; - } - __Pyx_RefNannySetupContext("__getbuffer__", 0); - __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(__pyx_v_info->obj); - - /* "View.MemoryView":519 - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): - * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< - * raise ValueError("Cannot create writable memory view from read-only memoryview") - * - */ - __pyx_t_2 = ((__pyx_v_flags & PyBUF_WRITABLE) != 0); - if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_2 = (__pyx_v_self->view.readonly != 0); - __pyx_t_1 = __pyx_t_2; - __pyx_L4_bool_binop_done:; - if (unlikely(__pyx_t_1)) { - - /* "View.MemoryView":520 - * def __getbuffer__(self, Py_buffer *info, int flags): - * if flags & PyBUF_WRITABLE and self.view.readonly: - * raise ValueError("Cannot create writable memory view from read-only memoryview") # <<<<<<<<<<<<<< - * - * if flags & PyBUF_ND: - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 520, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 520, __pyx_L1_error) - - /* "View.MemoryView":519 - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): - * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< - * raise ValueError("Cannot create writable memory view from read-only memoryview") - * - */ - } - - /* "View.MemoryView":522 - * raise ValueError("Cannot create writable memory view from read-only memoryview") - * - * if flags & PyBUF_ND: # <<<<<<<<<<<<<< - * info.shape = self.view.shape - * else: - */ - __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":523 - * - * if flags & PyBUF_ND: - * info.shape = self.view.shape # <<<<<<<<<<<<<< - * else: - * info.shape = NULL - */ - __pyx_t_4 = __pyx_v_self->view.shape; - __pyx_v_info->shape = __pyx_t_4; - - /* "View.MemoryView":522 - * raise ValueError("Cannot create writable memory view from read-only memoryview") - * - * if flags & PyBUF_ND: # <<<<<<<<<<<<<< - * info.shape = self.view.shape - * else: - */ - goto __pyx_L6; - } - - /* "View.MemoryView":525 - * info.shape = self.view.shape - * else: - * info.shape = NULL # <<<<<<<<<<<<<< - * - * if flags & PyBUF_STRIDES: - */ - /*else*/ { - __pyx_v_info->shape = NULL; - } - __pyx_L6:; - - /* "View.MemoryView":527 - * info.shape = NULL - * - * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< - * info.strides = self.view.strides - * else: - */ - __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":528 - * - * if flags & PyBUF_STRIDES: - * info.strides = self.view.strides # <<<<<<<<<<<<<< - * else: - * info.strides = NULL - */ - __pyx_t_4 = __pyx_v_self->view.strides; - __pyx_v_info->strides = __pyx_t_4; - - /* "View.MemoryView":527 - * info.shape = NULL - * - * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< - * info.strides = self.view.strides - * else: - */ - goto __pyx_L7; - } - - /* "View.MemoryView":530 - * info.strides = self.view.strides - * else: - * info.strides = NULL # <<<<<<<<<<<<<< - * - * if flags & PyBUF_INDIRECT: - */ - /*else*/ { - __pyx_v_info->strides = NULL; - } - __pyx_L7:; - - /* "View.MemoryView":532 - * info.strides = NULL - * - * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< - * info.suboffsets = self.view.suboffsets - * else: - */ - __pyx_t_1 = ((__pyx_v_flags & PyBUF_INDIRECT) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":533 - * - * if flags & PyBUF_INDIRECT: - * info.suboffsets = self.view.suboffsets # <<<<<<<<<<<<<< - * else: - * info.suboffsets = NULL - */ - __pyx_t_4 = __pyx_v_self->view.suboffsets; - __pyx_v_info->suboffsets = __pyx_t_4; - - /* "View.MemoryView":532 - * info.strides = NULL - * - * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< - * info.suboffsets = self.view.suboffsets - * else: - */ - goto __pyx_L8; - } - - /* "View.MemoryView":535 - * info.suboffsets = self.view.suboffsets - * else: - * info.suboffsets = NULL # <<<<<<<<<<<<<< - * - * if flags & PyBUF_FORMAT: - */ - /*else*/ { - __pyx_v_info->suboffsets = NULL; - } - __pyx_L8:; - - /* "View.MemoryView":537 - * info.suboffsets = NULL - * - * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< - * info.format = self.view.format - * else: - */ - __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":538 - * - * if flags & PyBUF_FORMAT: - * info.format = self.view.format # <<<<<<<<<<<<<< - * else: - * info.format = NULL - */ - __pyx_t_5 = __pyx_v_self->view.format; - __pyx_v_info->format = __pyx_t_5; - - /* "View.MemoryView":537 - * info.suboffsets = NULL - * - * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< - * info.format = self.view.format - * else: - */ - goto __pyx_L9; - } - - /* "View.MemoryView":540 - * info.format = self.view.format - * else: - * info.format = NULL # <<<<<<<<<<<<<< - * - * info.buf = self.view.buf - */ - /*else*/ { - __pyx_v_info->format = NULL; - } - __pyx_L9:; - - /* "View.MemoryView":542 - * info.format = NULL - * - * info.buf = self.view.buf # <<<<<<<<<<<<<< - * info.ndim = self.view.ndim - * info.itemsize = self.view.itemsize - */ - __pyx_t_6 = __pyx_v_self->view.buf; - __pyx_v_info->buf = __pyx_t_6; - - /* "View.MemoryView":543 - * - * info.buf = self.view.buf - * info.ndim = self.view.ndim # <<<<<<<<<<<<<< - * info.itemsize = self.view.itemsize - * info.len = self.view.len - */ - __pyx_t_7 = __pyx_v_self->view.ndim; - __pyx_v_info->ndim = __pyx_t_7; - - /* "View.MemoryView":544 - * info.buf = self.view.buf - * info.ndim = self.view.ndim - * info.itemsize = self.view.itemsize # <<<<<<<<<<<<<< - * info.len = self.view.len - * info.readonly = self.view.readonly - */ - __pyx_t_8 = __pyx_v_self->view.itemsize; - __pyx_v_info->itemsize = __pyx_t_8; - - /* "View.MemoryView":545 - * info.ndim = self.view.ndim - * info.itemsize = self.view.itemsize - * info.len = self.view.len # <<<<<<<<<<<<<< - * info.readonly = self.view.readonly - * info.obj = self - */ - __pyx_t_8 = __pyx_v_self->view.len; - __pyx_v_info->len = __pyx_t_8; - - /* "View.MemoryView":546 - * info.itemsize = self.view.itemsize - * info.len = self.view.len - * info.readonly = self.view.readonly # <<<<<<<<<<<<<< - * info.obj = self - * - */ - __pyx_t_1 = __pyx_v_self->view.readonly; - __pyx_v_info->readonly = __pyx_t_1; - - /* "View.MemoryView":547 - * info.len = self.view.len - * info.readonly = self.view.readonly - * info.obj = self # <<<<<<<<<<<<<< - * - * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") - */ - __Pyx_INCREF(((PyObject *)__pyx_v_self)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); - __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - - /* "View.MemoryView":518 - * - * @cname('getbuffer') - * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< - * if flags & PyBUF_WRITABLE and self.view.readonly: - * raise ValueError("Cannot create writable memory view from read-only memoryview") - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - if (__pyx_v_info->obj != NULL) { - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; - } - goto __pyx_L2; - __pyx_L0:; - if (__pyx_v_info->obj == Py_None) { - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; - } - __pyx_L2:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":553 - * - * @property - * def T(self): # <<<<<<<<<<<<<< - * cdef _memoryviewslice result = memoryview_copy(self) - * transpose_memslice(&result.from_slice) - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__", 0); - - /* "View.MemoryView":554 - * @property - * def T(self): - * cdef _memoryviewslice result = memoryview_copy(self) # <<<<<<<<<<<<<< - * transpose_memslice(&result.from_slice) - * return result - */ - __pyx_t_1 = __pyx_memoryview_copy_object(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 554, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_memoryviewslice_type))))) __PYX_ERR(2, 554, __pyx_L1_error) - __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "View.MemoryView":555 - * def T(self): - * cdef _memoryviewslice result = memoryview_copy(self) - * transpose_memslice(&result.from_slice) # <<<<<<<<<<<<<< - * return result - * - */ - __pyx_t_2 = __pyx_memslice_transpose((&__pyx_v_result->from_slice)); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(2, 555, __pyx_L1_error) - - /* "View.MemoryView":556 - * cdef _memoryviewslice result = memoryview_copy(self) - * transpose_memslice(&result.from_slice) - * return result # <<<<<<<<<<<<<< - * - * @property - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_result)); - __pyx_r = ((PyObject *)__pyx_v_result); - goto __pyx_L0; - - /* "View.MemoryView":553 - * - * @property - * def T(self): # <<<<<<<<<<<<<< - * cdef _memoryviewslice result = memoryview_copy(self) - * transpose_memslice(&result.from_slice) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.memoryview.T.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_result); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":559 - * - * @property - * def base(self): # <<<<<<<<<<<<<< - * return self.obj - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - - /* "View.MemoryView":560 - * @property - * def base(self): - * return self.obj # <<<<<<<<<<<<<< - * - * @property - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->obj); - __pyx_r = __pyx_v_self->obj; - goto __pyx_L0; - - /* "View.MemoryView":559 - * - * @property - * def base(self): # <<<<<<<<<<<<<< - * return self.obj - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":563 - * - * @property - * def shape(self): # <<<<<<<<<<<<<< - * return tuple([length for length in self.view.shape[:self.view.ndim]]) - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - Py_ssize_t __pyx_v_length; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - Py_ssize_t *__pyx_t_2; - Py_ssize_t *__pyx_t_3; - Py_ssize_t *__pyx_t_4; - PyObject *__pyx_t_5 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__", 0); - - /* "View.MemoryView":564 - * @property - * def shape(self): - * return tuple([length for length in self.view.shape[:self.view.ndim]]) # <<<<<<<<<<<<<< - * - * @property - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 564, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); - for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { - __pyx_t_2 = __pyx_t_4; - __pyx_v_length = (__pyx_t_2[0]); - __pyx_t_5 = PyInt_FromSsize_t(__pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 564, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(2, 564, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } - __pyx_t_5 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 564, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_r = __pyx_t_5; - __pyx_t_5 = 0; - goto __pyx_L0; - - /* "View.MemoryView":563 - * - * @property - * def shape(self): # <<<<<<<<<<<<<< - * return tuple([length for length in self.view.shape[:self.view.ndim]]) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.memoryview.shape.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":567 - * - * @property - * def strides(self): # <<<<<<<<<<<<<< - * if self.view.strides == NULL: - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - Py_ssize_t __pyx_v_stride; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - Py_ssize_t *__pyx_t_3; - Py_ssize_t *__pyx_t_4; - Py_ssize_t *__pyx_t_5; - PyObject *__pyx_t_6 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__", 0); - - /* "View.MemoryView":568 - * @property - * def strides(self): - * if self.view.strides == NULL: # <<<<<<<<<<<<<< - * - * raise ValueError("Buffer view does not expose strides") - */ - __pyx_t_1 = ((__pyx_v_self->view.strides == NULL) != 0); - if (unlikely(__pyx_t_1)) { - - /* "View.MemoryView":570 - * if self.view.strides == NULL: - * - * raise ValueError("Buffer view does not expose strides") # <<<<<<<<<<<<<< - * - * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) - */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 570, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(2, 570, __pyx_L1_error) - - /* "View.MemoryView":568 - * @property - * def strides(self): - * if self.view.strides == NULL: # <<<<<<<<<<<<<< - * - * raise ValueError("Buffer view does not expose strides") - */ - } - - /* "View.MemoryView":572 - * raise ValueError("Buffer view does not expose strides") - * - * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) # <<<<<<<<<<<<<< - * - * @property - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 572, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = (__pyx_v_self->view.strides + __pyx_v_self->view.ndim); - for (__pyx_t_5 = __pyx_v_self->view.strides; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { - __pyx_t_3 = __pyx_t_5; - __pyx_v_stride = (__pyx_t_3[0]); - __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_stride); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 572, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(2, 572, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } - __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 572, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_r = __pyx_t_6; - __pyx_t_6 = 0; - goto __pyx_L0; - - /* "View.MemoryView":567 - * - * @property - * def strides(self): # <<<<<<<<<<<<<< - * if self.view.strides == NULL: - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("View.MemoryView.memoryview.strides.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":575 - * - * @property - * def suboffsets(self): # <<<<<<<<<<<<<< - * if self.view.suboffsets == NULL: - * return (-1,) * self.view.ndim - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - Py_ssize_t __pyx_v_suboffset; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - Py_ssize_t *__pyx_t_4; - Py_ssize_t *__pyx_t_5; - Py_ssize_t *__pyx_t_6; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__", 0); - - /* "View.MemoryView":576 - * @property - * def suboffsets(self): - * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< - * return (-1,) * self.view.ndim - * - */ - __pyx_t_1 = ((__pyx_v_self->view.suboffsets == NULL) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":577 - * def suboffsets(self): - * if self.view.suboffsets == NULL: - * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< - * - * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 577, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyNumber_Multiply(__pyx_tuple__19, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 577, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_r = __pyx_t_3; - __pyx_t_3 = 0; - goto __pyx_L0; - - /* "View.MemoryView":576 - * @property - * def suboffsets(self): - * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< - * return (-1,) * self.view.ndim - * - */ - } - - /* "View.MemoryView":579 - * return (-1,) * self.view.ndim - * - * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) # <<<<<<<<<<<<<< - * - * @property - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 579, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = (__pyx_v_self->view.suboffsets + __pyx_v_self->view.ndim); - for (__pyx_t_6 = __pyx_v_self->view.suboffsets; __pyx_t_6 < __pyx_t_5; __pyx_t_6++) { - __pyx_t_4 = __pyx_t_6; - __pyx_v_suboffset = (__pyx_t_4[0]); - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_suboffset); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 579, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_3, (PyObject*)__pyx_t_2))) __PYX_ERR(2, 579, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } - __pyx_t_2 = PyList_AsTuple(((PyObject*)__pyx_t_3)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 579, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "View.MemoryView":575 - * - * @property - * def suboffsets(self): # <<<<<<<<<<<<<< - * if self.view.suboffsets == NULL: - * return (-1,) * self.view.ndim - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview.suboffsets.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":582 - * - * @property - * def ndim(self): # <<<<<<<<<<<<<< - * return self.view.ndim - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__", 0); - - /* "View.MemoryView":583 - * @property - * def ndim(self): - * return self.view.ndim # <<<<<<<<<<<<<< - * - * @property - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 583, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "View.MemoryView":582 - * - * @property - * def ndim(self): # <<<<<<<<<<<<<< - * return self.view.ndim - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.memoryview.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":586 - * - * @property - * def itemsize(self): # <<<<<<<<<<<<<< - * return self.view.itemsize - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__", 0); - - /* "View.MemoryView":587 - * @property - * def itemsize(self): - * return self.view.itemsize # <<<<<<<<<<<<<< - * - * @property - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 587, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "View.MemoryView":586 - * - * @property - * def itemsize(self): # <<<<<<<<<<<<<< - * return self.view.itemsize - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.memoryview.itemsize.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":590 - * - * @property - * def nbytes(self): # <<<<<<<<<<<<<< - * return self.size * self.view.itemsize - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__", 0); - - /* "View.MemoryView":591 - * @property - * def nbytes(self): - * return self.size * self.view.itemsize # <<<<<<<<<<<<<< - * - * @property - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 591, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 591, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 591, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_r = __pyx_t_3; - __pyx_t_3 = 0; - goto __pyx_L0; - - /* "View.MemoryView":590 - * - * @property - * def nbytes(self): # <<<<<<<<<<<<<< - * return self.size * self.view.itemsize - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview.nbytes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":594 - * - * @property - * def size(self): # <<<<<<<<<<<<<< - * if self._size is None: - * result = 1 - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_v_result = NULL; - PyObject *__pyx_v_length = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - Py_ssize_t *__pyx_t_3; - Py_ssize_t *__pyx_t_4; - Py_ssize_t *__pyx_t_5; - PyObject *__pyx_t_6 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__", 0); - - /* "View.MemoryView":595 - * @property - * def size(self): - * if self._size is None: # <<<<<<<<<<<<<< - * result = 1 - * - */ - __pyx_t_1 = (__pyx_v_self->_size == Py_None); - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":596 - * def size(self): - * if self._size is None: - * result = 1 # <<<<<<<<<<<<<< - * - * for length in self.view.shape[:self.view.ndim]: - */ - __Pyx_INCREF(__pyx_int_1); - __pyx_v_result = __pyx_int_1; - - /* "View.MemoryView":598 - * result = 1 - * - * for length in self.view.shape[:self.view.ndim]: # <<<<<<<<<<<<<< - * result *= length - * - */ - __pyx_t_4 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); - for (__pyx_t_5 = __pyx_v_self->view.shape; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { - __pyx_t_3 = __pyx_t_5; - __pyx_t_6 = PyInt_FromSsize_t((__pyx_t_3[0])); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 598, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_6); - __pyx_t_6 = 0; - - /* "View.MemoryView":599 - * - * for length in self.view.shape[:self.view.ndim]: - * result *= length # <<<<<<<<<<<<<< - * - * self._size = result - */ - __pyx_t_6 = PyNumber_InPlaceMultiply(__pyx_v_result, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 599, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF_SET(__pyx_v_result, __pyx_t_6); - __pyx_t_6 = 0; - } - - /* "View.MemoryView":601 - * result *= length - * - * self._size = result # <<<<<<<<<<<<<< - * - * return self._size - */ - __Pyx_INCREF(__pyx_v_result); - __Pyx_GIVEREF(__pyx_v_result); - __Pyx_GOTREF(__pyx_v_self->_size); - __Pyx_DECREF(__pyx_v_self->_size); - __pyx_v_self->_size = __pyx_v_result; - - /* "View.MemoryView":595 - * @property - * def size(self): - * if self._size is None: # <<<<<<<<<<<<<< - * result = 1 - * - */ - } - - /* "View.MemoryView":603 - * self._size = result - * - * return self._size # <<<<<<<<<<<<<< - * - * def __len__(self): - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->_size); - __pyx_r = __pyx_v_self->_size; - goto __pyx_L0; - - /* "View.MemoryView":594 - * - * @property - * def size(self): # <<<<<<<<<<<<<< - * if self._size is None: - * result = 1 - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("View.MemoryView.memoryview.size.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_result); - __Pyx_XDECREF(__pyx_v_length); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":605 - * return self._size - * - * def __len__(self): # <<<<<<<<<<<<<< - * if self.view.ndim >= 1: - * return self.view.shape[0] - */ - -/* Python wrapper */ -static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self); /*proto*/ -static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self) { - Py_ssize_t __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self) { - Py_ssize_t __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - __Pyx_RefNannySetupContext("__len__", 0); - - /* "View.MemoryView":606 - * - * def __len__(self): - * if self.view.ndim >= 1: # <<<<<<<<<<<<<< - * return self.view.shape[0] - * - */ - __pyx_t_1 = ((__pyx_v_self->view.ndim >= 1) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":607 - * def __len__(self): - * if self.view.ndim >= 1: - * return self.view.shape[0] # <<<<<<<<<<<<<< - * - * return 0 - */ - __pyx_r = (__pyx_v_self->view.shape[0]); - goto __pyx_L0; - - /* "View.MemoryView":606 - * - * def __len__(self): - * if self.view.ndim >= 1: # <<<<<<<<<<<<<< - * return self.view.shape[0] - * - */ - } - - /* "View.MemoryView":609 - * return self.view.shape[0] - * - * return 0 # <<<<<<<<<<<<<< - * - * def __repr__(self): - */ - __pyx_r = 0; - goto __pyx_L0; - - /* "View.MemoryView":605 - * return self._size - * - * def __len__(self): # <<<<<<<<<<<<<< - * if self.view.ndim >= 1: - * return self.view.shape[0] - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":611 - * return 0 - * - * def __repr__(self): # <<<<<<<<<<<<<< - * return "" % (self.base.__class__.__name__, - * id(self)) - */ - -/* Python wrapper */ -static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__repr__", 0); - - /* "View.MemoryView":612 - * - * def __repr__(self): - * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< - * id(self)) - * - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 612, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 612, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 612, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "View.MemoryView":613 - * def __repr__(self): - * return "" % (self.base.__class__.__name__, - * id(self)) # <<<<<<<<<<<<<< - * - * def __str__(self): - */ - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 613, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - - /* "View.MemoryView":612 - * - * def __repr__(self): - * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< - * id(self)) - * - */ - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 612, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2); - __pyx_t_1 = 0; - __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 612, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "View.MemoryView":611 - * return 0 - * - * def __repr__(self): # <<<<<<<<<<<<<< - * return "" % (self.base.__class__.__name__, - * id(self)) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":615 - * id(self)) - * - * def __str__(self): # <<<<<<<<<<<<<< - * return "" % (self.base.__class__.__name__,) - * - */ - -/* Python wrapper */ -static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__str__ (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__str__", 0); - - /* "View.MemoryView":616 - * - * def __str__(self): - * return "" % (self.base.__class__.__name__,) # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 616, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 616, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 616, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 616, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); - __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_object, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 616, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "View.MemoryView":615 - * id(self)) - * - * def __str__(self): # <<<<<<<<<<<<<< - * return "" % (self.base.__class__.__name__,) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.memoryview.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":619 - * - * - * def is_c_contig(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice *mslice - * cdef __Pyx_memviewslice tmp - */ - -/* Python wrapper */ -static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("is_c_contig (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self) { - __Pyx_memviewslice *__pyx_v_mslice; - __Pyx_memviewslice __pyx_v_tmp; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_memviewslice *__pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("is_c_contig", 0); - - /* "View.MemoryView":622 - * cdef __Pyx_memviewslice *mslice - * cdef __Pyx_memviewslice tmp - * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< - * return slice_is_contig(mslice[0], 'C', self.view.ndim) - * - */ - __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 622, __pyx_L1_error) - __pyx_v_mslice = __pyx_t_1; - - /* "View.MemoryView":623 - * cdef __Pyx_memviewslice tmp - * mslice = get_slice_from_memview(self, &tmp) - * return slice_is_contig(mslice[0], 'C', self.view.ndim) # <<<<<<<<<<<<<< - * - * def is_f_contig(self): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'C', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 623, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "View.MemoryView":619 - * - * - * def is_c_contig(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice *mslice - * cdef __Pyx_memviewslice tmp - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.memoryview.is_c_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":625 - * return slice_is_contig(mslice[0], 'C', self.view.ndim) - * - * def is_f_contig(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice *mslice - * cdef __Pyx_memviewslice tmp - */ - -/* Python wrapper */ -static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("is_f_contig (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self) { - __Pyx_memviewslice *__pyx_v_mslice; - __Pyx_memviewslice __pyx_v_tmp; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_memviewslice *__pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("is_f_contig", 0); - - /* "View.MemoryView":628 - * cdef __Pyx_memviewslice *mslice - * cdef __Pyx_memviewslice tmp - * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< - * return slice_is_contig(mslice[0], 'F', self.view.ndim) - * - */ - __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 628, __pyx_L1_error) - __pyx_v_mslice = __pyx_t_1; - - /* "View.MemoryView":629 - * cdef __Pyx_memviewslice tmp - * mslice = get_slice_from_memview(self, &tmp) - * return slice_is_contig(mslice[0], 'F', self.view.ndim) # <<<<<<<<<<<<<< - * - * def copy(self): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'F', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 629, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "View.MemoryView":625 - * return slice_is_contig(mslice[0], 'C', self.view.ndim) - * - * def is_f_contig(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice *mslice - * cdef __Pyx_memviewslice tmp - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.memoryview.is_f_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":631 - * return slice_is_contig(mslice[0], 'F', self.view.ndim) - * - * def copy(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice mslice - * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS - */ - -/* Python wrapper */ -static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("copy (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self) { - __Pyx_memviewslice __pyx_v_mslice; - int __pyx_v_flags; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_memviewslice __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("copy", 0); - - /* "View.MemoryView":633 - * def copy(self): - * cdef __Pyx_memviewslice mslice - * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS # <<<<<<<<<<<<<< - * - * slice_copy(self, &mslice) - */ - __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_F_CONTIGUOUS)); - - /* "View.MemoryView":635 - * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS - * - * slice_copy(self, &mslice) # <<<<<<<<<<<<<< - * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, - * self.view.itemsize, - */ - __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_mslice)); - - /* "View.MemoryView":636 - * - * slice_copy(self, &mslice) - * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, # <<<<<<<<<<<<<< - * self.view.itemsize, - * flags|PyBUF_C_CONTIGUOUS, - */ - __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_mslice), ((char *)"c"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_C_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 636, __pyx_L1_error) - __pyx_v_mslice = __pyx_t_1; - - /* "View.MemoryView":641 - * self.dtype_is_object) - * - * return memoryview_copy_from_slice(self, &mslice) # <<<<<<<<<<<<<< - * - * def copy_fortran(self): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_mslice)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 641, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "View.MemoryView":631 - * return slice_is_contig(mslice[0], 'F', self.view.ndim) - * - * def copy(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice mslice - * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.memoryview.copy", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":643 - * return memoryview_copy_from_slice(self, &mslice) - * - * def copy_fortran(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice src, dst - * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS - */ - -/* Python wrapper */ -static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("copy_fortran (wrapper)", 0); - __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self) { - __Pyx_memviewslice __pyx_v_src; - __Pyx_memviewslice __pyx_v_dst; - int __pyx_v_flags; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_memviewslice __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("copy_fortran", 0); - - /* "View.MemoryView":645 - * def copy_fortran(self): - * cdef __Pyx_memviewslice src, dst - * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS # <<<<<<<<<<<<<< - * - * slice_copy(self, &src) - */ - __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_C_CONTIGUOUS)); - - /* "View.MemoryView":647 - * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS - * - * slice_copy(self, &src) # <<<<<<<<<<<<<< - * dst = slice_copy_contig(&src, "fortran", self.view.ndim, - * self.view.itemsize, - */ - __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_src)); - - /* "View.MemoryView":648 - * - * slice_copy(self, &src) - * dst = slice_copy_contig(&src, "fortran", self.view.ndim, # <<<<<<<<<<<<<< - * self.view.itemsize, - * flags|PyBUF_F_CONTIGUOUS, - */ - __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_src), ((char *)"fortran"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_F_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 648, __pyx_L1_error) - __pyx_v_dst = __pyx_t_1; - - /* "View.MemoryView":653 - * self.dtype_is_object) - * - * return memoryview_copy_from_slice(self, &dst) # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_dst)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 653, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "View.MemoryView":643 - * return memoryview_copy_from_slice(self, &mslice) - * - * def copy_fortran(self): # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice src, dst - * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView.memoryview.copy_fortran", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - */ - -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_memoryview___reduce_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 2, __pyx_L1_error) - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.memoryview.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_memoryview_2__setstate_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 4, __pyx_L1_error) - - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":657 - * - * @cname('__pyx_memoryview_new') - * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< - * cdef memoryview result = memoryview(o, flags, dtype_is_object) - * result.typeinfo = typeinfo - */ - -static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, int __pyx_v_dtype_is_object, __Pyx_TypeInfo *__pyx_v_typeinfo) { - struct __pyx_memoryview_obj *__pyx_v_result = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("memoryview_cwrapper", 0); - - /* "View.MemoryView":658 - * @cname('__pyx_memoryview_new') - * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): - * cdef memoryview result = memoryview(o, flags, dtype_is_object) # <<<<<<<<<<<<<< - * result.typeinfo = typeinfo - * return result - */ - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 658, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 658, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 658, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_v_o); - __Pyx_GIVEREF(__pyx_v_o); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_o); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); - __pyx_t_1 = 0; - __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 658, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_result = ((struct __pyx_memoryview_obj *)__pyx_t_2); - __pyx_t_2 = 0; - - /* "View.MemoryView":659 - * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): - * cdef memoryview result = memoryview(o, flags, dtype_is_object) - * result.typeinfo = typeinfo # <<<<<<<<<<<<<< - * return result - * - */ - __pyx_v_result->typeinfo = __pyx_v_typeinfo; - - /* "View.MemoryView":660 - * cdef memoryview result = memoryview(o, flags, dtype_is_object) - * result.typeinfo = typeinfo - * return result # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_check') - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_result)); - __pyx_r = ((PyObject *)__pyx_v_result); - goto __pyx_L0; - - /* "View.MemoryView":657 - * - * @cname('__pyx_memoryview_new') - * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< - * cdef memoryview result = memoryview(o, flags, dtype_is_object) - * result.typeinfo = typeinfo - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_result); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":663 - * - * @cname('__pyx_memoryview_check') - * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< - * return isinstance(o, memoryview) - * - */ - -static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - __Pyx_RefNannySetupContext("memoryview_check", 0); - - /* "View.MemoryView":664 - * @cname('__pyx_memoryview_check') - * cdef inline bint memoryview_check(object o): - * return isinstance(o, memoryview) # <<<<<<<<<<<<<< - * - * cdef tuple _unellipsify(object index, int ndim): - */ - __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_o, __pyx_memoryview_type); - __pyx_r = __pyx_t_1; - goto __pyx_L0; - - /* "View.MemoryView":663 - * - * @cname('__pyx_memoryview_check') - * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< - * return isinstance(o, memoryview) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":666 - * return isinstance(o, memoryview) - * - * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< - * """ - * Replace all ellipses with full slices and fill incomplete indices with - */ - -static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { - PyObject *__pyx_v_tup = NULL; - PyObject *__pyx_v_result = NULL; - int __pyx_v_have_slices; - int __pyx_v_seen_ellipsis; - CYTHON_UNUSED PyObject *__pyx_v_idx = NULL; - PyObject *__pyx_v_item = NULL; - Py_ssize_t __pyx_v_nslices; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - Py_ssize_t __pyx_t_5; - PyObject *(*__pyx_t_6)(PyObject *); - PyObject *__pyx_t_7 = NULL; - Py_ssize_t __pyx_t_8; - int __pyx_t_9; - int __pyx_t_10; - PyObject *__pyx_t_11 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_unellipsify", 0); - - /* "View.MemoryView":671 - * full slices. - * """ - * if not isinstance(index, tuple): # <<<<<<<<<<<<<< - * tup = (index,) - * else: - */ - __pyx_t_1 = PyTuple_Check(__pyx_v_index); - __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":672 - * """ - * if not isinstance(index, tuple): - * tup = (index,) # <<<<<<<<<<<<<< - * else: - * tup = index - */ - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 672, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_v_index); - __Pyx_GIVEREF(__pyx_v_index); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_index); - __pyx_v_tup = __pyx_t_3; - __pyx_t_3 = 0; - - /* "View.MemoryView":671 - * full slices. - * """ - * if not isinstance(index, tuple): # <<<<<<<<<<<<<< - * tup = (index,) - * else: - */ - goto __pyx_L3; - } - - /* "View.MemoryView":674 - * tup = (index,) - * else: - * tup = index # <<<<<<<<<<<<<< - * - * result = [] - */ - /*else*/ { - __Pyx_INCREF(__pyx_v_index); - __pyx_v_tup = __pyx_v_index; - } - __pyx_L3:; - - /* "View.MemoryView":676 - * tup = index - * - * result = [] # <<<<<<<<<<<<<< - * have_slices = False - * seen_ellipsis = False - */ - __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 676, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_v_result = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "View.MemoryView":677 - * - * result = [] - * have_slices = False # <<<<<<<<<<<<<< - * seen_ellipsis = False - * for idx, item in enumerate(tup): - */ - __pyx_v_have_slices = 0; - - /* "View.MemoryView":678 - * result = [] - * have_slices = False - * seen_ellipsis = False # <<<<<<<<<<<<<< - * for idx, item in enumerate(tup): - * if item is Ellipsis: - */ - __pyx_v_seen_ellipsis = 0; - - /* "View.MemoryView":679 - * have_slices = False - * seen_ellipsis = False - * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< - * if item is Ellipsis: - * if not seen_ellipsis: - */ - __Pyx_INCREF(__pyx_int_0); - __pyx_t_3 = __pyx_int_0; - if (likely(PyList_CheckExact(__pyx_v_tup)) || PyTuple_CheckExact(__pyx_v_tup)) { - __pyx_t_4 = __pyx_v_tup; __Pyx_INCREF(__pyx_t_4); __pyx_t_5 = 0; - __pyx_t_6 = NULL; - } else { - __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_tup); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 679, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_6 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 679, __pyx_L1_error) - } - for (;;) { - if (likely(!__pyx_t_6)) { - if (likely(PyList_CheckExact(__pyx_t_4))) { - if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_4)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(2, 679, __pyx_L1_error) - #else - __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 679, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - #endif - } else { - if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_4)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(2, 679, __pyx_L1_error) - #else - __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 679, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - #endif - } - } else { - __pyx_t_7 = __pyx_t_6(__pyx_t_4); - if (unlikely(!__pyx_t_7)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(2, 679, __pyx_L1_error) - } - break; - } - __Pyx_GOTREF(__pyx_t_7); - } - __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_7); - __pyx_t_7 = 0; - __Pyx_INCREF(__pyx_t_3); - __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_3); - __pyx_t_7 = __Pyx_PyInt_AddObjC(__pyx_t_3, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 679, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_3); - __pyx_t_3 = __pyx_t_7; - __pyx_t_7 = 0; - - /* "View.MemoryView":680 - * seen_ellipsis = False - * for idx, item in enumerate(tup): - * if item is Ellipsis: # <<<<<<<<<<<<<< - * if not seen_ellipsis: - * result.extend([slice(None)] * (ndim - len(tup) + 1)) - */ - __pyx_t_2 = (__pyx_v_item == __pyx_builtin_Ellipsis); - __pyx_t_1 = (__pyx_t_2 != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":681 - * for idx, item in enumerate(tup): - * if item is Ellipsis: - * if not seen_ellipsis: # <<<<<<<<<<<<<< - * result.extend([slice(None)] * (ndim - len(tup) + 1)) - * seen_ellipsis = True - */ - __pyx_t_1 = ((!(__pyx_v_seen_ellipsis != 0)) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":682 - * if item is Ellipsis: - * if not seen_ellipsis: - * result.extend([slice(None)] * (ndim - len(tup) + 1)) # <<<<<<<<<<<<<< - * seen_ellipsis = True - * else: - */ - __pyx_t_8 = PyObject_Length(__pyx_v_tup); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-1))) __PYX_ERR(2, 682, __pyx_L1_error) - __pyx_t_7 = PyList_New(1 * ((((__pyx_v_ndim - __pyx_t_8) + 1)<0) ? 0:((__pyx_v_ndim - __pyx_t_8) + 1))); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 682, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - { Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < ((__pyx_v_ndim - __pyx_t_8) + 1); __pyx_temp++) { - __Pyx_INCREF(__pyx_slice__22); - __Pyx_GIVEREF(__pyx_slice__22); - PyList_SET_ITEM(__pyx_t_7, __pyx_temp, __pyx_slice__22); - } - } - __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_7); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 682, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - - /* "View.MemoryView":683 - * if not seen_ellipsis: - * result.extend([slice(None)] * (ndim - len(tup) + 1)) - * seen_ellipsis = True # <<<<<<<<<<<<<< - * else: - * result.append(slice(None)) - */ - __pyx_v_seen_ellipsis = 1; - - /* "View.MemoryView":681 - * for idx, item in enumerate(tup): - * if item is Ellipsis: - * if not seen_ellipsis: # <<<<<<<<<<<<<< - * result.extend([slice(None)] * (ndim - len(tup) + 1)) - * seen_ellipsis = True - */ - goto __pyx_L7; - } - - /* "View.MemoryView":685 - * seen_ellipsis = True - * else: - * result.append(slice(None)) # <<<<<<<<<<<<<< - * have_slices = True - * else: - */ - /*else*/ { - __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_slice__22); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 685, __pyx_L1_error) - } - __pyx_L7:; - - /* "View.MemoryView":686 - * else: - * result.append(slice(None)) - * have_slices = True # <<<<<<<<<<<<<< - * else: - * if not isinstance(item, slice) and not PyIndex_Check(item): - */ - __pyx_v_have_slices = 1; - - /* "View.MemoryView":680 - * seen_ellipsis = False - * for idx, item in enumerate(tup): - * if item is Ellipsis: # <<<<<<<<<<<<<< - * if not seen_ellipsis: - * result.extend([slice(None)] * (ndim - len(tup) + 1)) - */ - goto __pyx_L6; - } - - /* "View.MemoryView":688 - * have_slices = True - * else: - * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< - * raise TypeError("Cannot index with type '%s'" % type(item)) - * - */ - /*else*/ { - __pyx_t_2 = PySlice_Check(__pyx_v_item); - __pyx_t_10 = ((!(__pyx_t_2 != 0)) != 0); - if (__pyx_t_10) { - } else { - __pyx_t_1 = __pyx_t_10; - goto __pyx_L9_bool_binop_done; - } - __pyx_t_10 = ((!(PyIndex_Check(__pyx_v_item) != 0)) != 0); - __pyx_t_1 = __pyx_t_10; - __pyx_L9_bool_binop_done:; - if (unlikely(__pyx_t_1)) { - - /* "View.MemoryView":689 - * else: - * if not isinstance(item, slice) and not PyIndex_Check(item): - * raise TypeError("Cannot index with type '%s'" % type(item)) # <<<<<<<<<<<<<< - * - * have_slices = have_slices or isinstance(item, slice) - */ - __pyx_t_7 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Cannot_index_with_type_s, ((PyObject *)Py_TYPE(__pyx_v_item))); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 689, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_11 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_7); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 689, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_Raise(__pyx_t_11, 0, 0, 0); - __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - __PYX_ERR(2, 689, __pyx_L1_error) - - /* "View.MemoryView":688 - * have_slices = True - * else: - * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< - * raise TypeError("Cannot index with type '%s'" % type(item)) - * - */ - } - - /* "View.MemoryView":691 - * raise TypeError("Cannot index with type '%s'" % type(item)) - * - * have_slices = have_slices or isinstance(item, slice) # <<<<<<<<<<<<<< - * result.append(item) - * - */ - __pyx_t_10 = (__pyx_v_have_slices != 0); - if (!__pyx_t_10) { - } else { - __pyx_t_1 = __pyx_t_10; - goto __pyx_L11_bool_binop_done; - } - __pyx_t_10 = PySlice_Check(__pyx_v_item); - __pyx_t_2 = (__pyx_t_10 != 0); - __pyx_t_1 = __pyx_t_2; - __pyx_L11_bool_binop_done:; - __pyx_v_have_slices = __pyx_t_1; - - /* "View.MemoryView":692 - * - * have_slices = have_slices or isinstance(item, slice) - * result.append(item) # <<<<<<<<<<<<<< - * - * nslices = ndim - len(result) - */ - __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_v_item); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 692, __pyx_L1_error) - } - __pyx_L6:; - - /* "View.MemoryView":679 - * have_slices = False - * seen_ellipsis = False - * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< - * if item is Ellipsis: - * if not seen_ellipsis: - */ - } - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "View.MemoryView":694 - * result.append(item) - * - * nslices = ndim - len(result) # <<<<<<<<<<<<<< - * if nslices: - * result.extend([slice(None)] * nslices) - */ - __pyx_t_5 = PyList_GET_SIZE(__pyx_v_result); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(2, 694, __pyx_L1_error) - __pyx_v_nslices = (__pyx_v_ndim - __pyx_t_5); - - /* "View.MemoryView":695 - * - * nslices = ndim - len(result) - * if nslices: # <<<<<<<<<<<<<< - * result.extend([slice(None)] * nslices) - * - */ - __pyx_t_1 = (__pyx_v_nslices != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":696 - * nslices = ndim - len(result) - * if nslices: - * result.extend([slice(None)] * nslices) # <<<<<<<<<<<<<< - * - * return have_slices or nslices, tuple(result) - */ - __pyx_t_3 = PyList_New(1 * ((__pyx_v_nslices<0) ? 0:__pyx_v_nslices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 696, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - { Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < __pyx_v_nslices; __pyx_temp++) { - __Pyx_INCREF(__pyx_slice__22); - __Pyx_GIVEREF(__pyx_slice__22); - PyList_SET_ITEM(__pyx_t_3, __pyx_temp, __pyx_slice__22); - } - } - __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_3); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 696, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "View.MemoryView":695 - * - * nslices = ndim - len(result) - * if nslices: # <<<<<<<<<<<<<< - * result.extend([slice(None)] * nslices) - * - */ - } - - /* "View.MemoryView":698 - * result.extend([slice(None)] * nslices) - * - * return have_slices or nslices, tuple(result) # <<<<<<<<<<<<<< - * - * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): - */ - __Pyx_XDECREF(__pyx_r); - if (!__pyx_v_have_slices) { - } else { - __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_have_slices); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 698, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = __pyx_t_4; - __pyx_t_4 = 0; - goto __pyx_L14_bool_binop_done; - } - __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_nslices); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 698, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = __pyx_t_4; - __pyx_t_4 = 0; - __pyx_L14_bool_binop_done:; - __pyx_t_4 = PyList_AsTuple(__pyx_v_result); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 698, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 698, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_4); - __pyx_t_3 = 0; - __pyx_t_4 = 0; - __pyx_r = ((PyObject*)__pyx_t_11); - __pyx_t_11 = 0; - goto __pyx_L0; - - /* "View.MemoryView":666 - * return isinstance(o, memoryview) - * - * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< - * """ - * Replace all ellipses with full slices and fill incomplete indices with - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_11); - __Pyx_AddTraceback("View.MemoryView._unellipsify", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_tup); - __Pyx_XDECREF(__pyx_v_result); - __Pyx_XDECREF(__pyx_v_idx); - __Pyx_XDECREF(__pyx_v_item); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":700 - * return have_slices or nslices, tuple(result) - * - * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< - * for suboffset in suboffsets[:ndim]: - * if suboffset >= 0: - */ - -static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __pyx_v_ndim) { - Py_ssize_t __pyx_v_suboffset; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - Py_ssize_t *__pyx_t_1; - Py_ssize_t *__pyx_t_2; - Py_ssize_t *__pyx_t_3; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("assert_direct_dimensions", 0); - - /* "View.MemoryView":701 - * - * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): - * for suboffset in suboffsets[:ndim]: # <<<<<<<<<<<<<< - * if suboffset >= 0: - * raise ValueError("Indirect dimensions not supported") - */ - __pyx_t_2 = (__pyx_v_suboffsets + __pyx_v_ndim); - for (__pyx_t_3 = __pyx_v_suboffsets; __pyx_t_3 < __pyx_t_2; __pyx_t_3++) { - __pyx_t_1 = __pyx_t_3; - __pyx_v_suboffset = (__pyx_t_1[0]); - - /* "View.MemoryView":702 - * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): - * for suboffset in suboffsets[:ndim]: - * if suboffset >= 0: # <<<<<<<<<<<<<< - * raise ValueError("Indirect dimensions not supported") - * - */ - __pyx_t_4 = ((__pyx_v_suboffset >= 0) != 0); - if (unlikely(__pyx_t_4)) { - - /* "View.MemoryView":703 - * for suboffset in suboffsets[:ndim]: - * if suboffset >= 0: - * raise ValueError("Indirect dimensions not supported") # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 703, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_Raise(__pyx_t_5, 0, 0, 0); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __PYX_ERR(2, 703, __pyx_L1_error) - - /* "View.MemoryView":702 - * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): - * for suboffset in suboffsets[:ndim]: - * if suboffset >= 0: # <<<<<<<<<<<<<< - * raise ValueError("Indirect dimensions not supported") - * - */ - } - } - - /* "View.MemoryView":700 - * return have_slices or nslices, tuple(result) - * - * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< - * for suboffset in suboffsets[:ndim]: - * if suboffset >= 0: - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.assert_direct_dimensions", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":710 - * - * @cname('__pyx_memview_slice') - * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< - * cdef int new_ndim = 0, suboffset_dim = -1, dim - * cdef bint negative_step - */ - -static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *__pyx_v_memview, PyObject *__pyx_v_indices) { - int __pyx_v_new_ndim; - int __pyx_v_suboffset_dim; - int __pyx_v_dim; - __Pyx_memviewslice __pyx_v_src; - __Pyx_memviewslice __pyx_v_dst; - __Pyx_memviewslice *__pyx_v_p_src; - struct __pyx_memoryviewslice_obj *__pyx_v_memviewsliceobj = 0; - __Pyx_memviewslice *__pyx_v_p_dst; - int *__pyx_v_p_suboffset_dim; - Py_ssize_t __pyx_v_start; - Py_ssize_t __pyx_v_stop; - Py_ssize_t __pyx_v_step; - int __pyx_v_have_start; - int __pyx_v_have_stop; - int __pyx_v_have_step; - PyObject *__pyx_v_index = NULL; - struct __pyx_memoryview_obj *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - struct __pyx_memoryview_obj *__pyx_t_4; - char *__pyx_t_5; - int __pyx_t_6; - Py_ssize_t __pyx_t_7; - PyObject *(*__pyx_t_8)(PyObject *); - PyObject *__pyx_t_9 = NULL; - Py_ssize_t __pyx_t_10; - int __pyx_t_11; - Py_ssize_t __pyx_t_12; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("memview_slice", 0); - - /* "View.MemoryView":711 - * @cname('__pyx_memview_slice') - * cdef memoryview memview_slice(memoryview memview, object indices): - * cdef int new_ndim = 0, suboffset_dim = -1, dim # <<<<<<<<<<<<<< - * cdef bint negative_step - * cdef __Pyx_memviewslice src, dst - */ - __pyx_v_new_ndim = 0; - __pyx_v_suboffset_dim = -1; - - /* "View.MemoryView":718 - * - * - * memset(&dst, 0, sizeof(dst)) # <<<<<<<<<<<<<< - * - * cdef _memoryviewslice memviewsliceobj - */ - (void)(memset((&__pyx_v_dst), 0, (sizeof(__pyx_v_dst)))); - - /* "View.MemoryView":722 - * cdef _memoryviewslice memviewsliceobj - * - * assert memview.view.ndim > 0 # <<<<<<<<<<<<<< - * - * if isinstance(memview, _memoryviewslice): - */ - #ifndef CYTHON_WITHOUT_ASSERTIONS - if (unlikely(!Py_OptimizeFlag)) { - if (unlikely(!((__pyx_v_memview->view.ndim > 0) != 0))) { - PyErr_SetNone(PyExc_AssertionError); - __PYX_ERR(2, 722, __pyx_L1_error) - } - } - #endif - - /* "View.MemoryView":724 - * assert memview.view.ndim > 0 - * - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * memviewsliceobj = memview - * p_src = &memviewsliceobj.from_slice - */ - __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":725 - * - * if isinstance(memview, _memoryviewslice): - * memviewsliceobj = memview # <<<<<<<<<<<<<< - * p_src = &memviewsliceobj.from_slice - * else: - */ - if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(2, 725, __pyx_L1_error) - __pyx_t_3 = ((PyObject *)__pyx_v_memview); - __Pyx_INCREF(__pyx_t_3); - __pyx_v_memviewsliceobj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); - __pyx_t_3 = 0; - - /* "View.MemoryView":726 - * if isinstance(memview, _memoryviewslice): - * memviewsliceobj = memview - * p_src = &memviewsliceobj.from_slice # <<<<<<<<<<<<<< - * else: - * slice_copy(memview, &src) - */ - __pyx_v_p_src = (&__pyx_v_memviewsliceobj->from_slice); - - /* "View.MemoryView":724 - * assert memview.view.ndim > 0 - * - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * memviewsliceobj = memview - * p_src = &memviewsliceobj.from_slice - */ - goto __pyx_L3; - } - - /* "View.MemoryView":728 - * p_src = &memviewsliceobj.from_slice - * else: - * slice_copy(memview, &src) # <<<<<<<<<<<<<< - * p_src = &src - * - */ - /*else*/ { - __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_src)); - - /* "View.MemoryView":729 - * else: - * slice_copy(memview, &src) - * p_src = &src # <<<<<<<<<<<<<< - * - * - */ - __pyx_v_p_src = (&__pyx_v_src); - } - __pyx_L3:; - - /* "View.MemoryView":735 - * - * - * dst.memview = p_src.memview # <<<<<<<<<<<<<< - * dst.data = p_src.data - * - */ - __pyx_t_4 = __pyx_v_p_src->memview; - __pyx_v_dst.memview = __pyx_t_4; - - /* "View.MemoryView":736 - * - * dst.memview = p_src.memview - * dst.data = p_src.data # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_5 = __pyx_v_p_src->data; - __pyx_v_dst.data = __pyx_t_5; - - /* "View.MemoryView":741 - * - * - * cdef __Pyx_memviewslice *p_dst = &dst # <<<<<<<<<<<<<< - * cdef int *p_suboffset_dim = &suboffset_dim - * cdef Py_ssize_t start, stop, step - */ - __pyx_v_p_dst = (&__pyx_v_dst); - - /* "View.MemoryView":742 - * - * cdef __Pyx_memviewslice *p_dst = &dst - * cdef int *p_suboffset_dim = &suboffset_dim # <<<<<<<<<<<<<< - * cdef Py_ssize_t start, stop, step - * cdef bint have_start, have_stop, have_step - */ - __pyx_v_p_suboffset_dim = (&__pyx_v_suboffset_dim); - - /* "View.MemoryView":746 - * cdef bint have_start, have_stop, have_step - * - * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< - * if PyIndex_Check(index): - * slice_memviewslice( - */ - __pyx_t_6 = 0; - if (likely(PyList_CheckExact(__pyx_v_indices)) || PyTuple_CheckExact(__pyx_v_indices)) { - __pyx_t_3 = __pyx_v_indices; __Pyx_INCREF(__pyx_t_3); __pyx_t_7 = 0; - __pyx_t_8 = NULL; - } else { - __pyx_t_7 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_indices); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 746, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 746, __pyx_L1_error) - } - for (;;) { - if (likely(!__pyx_t_8)) { - if (likely(PyList_CheckExact(__pyx_t_3))) { - if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_3)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_9 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(2, 746, __pyx_L1_error) - #else - __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 746, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - #endif - } else { - if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_3)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(2, 746, __pyx_L1_error) - #else - __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 746, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - #endif - } - } else { - __pyx_t_9 = __pyx_t_8(__pyx_t_3); - if (unlikely(!__pyx_t_9)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(2, 746, __pyx_L1_error) - } - break; - } - __Pyx_GOTREF(__pyx_t_9); - } - __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_9); - __pyx_t_9 = 0; - __pyx_v_dim = __pyx_t_6; - __pyx_t_6 = (__pyx_t_6 + 1); - - /* "View.MemoryView":747 - * - * for dim, index in enumerate(indices): - * if PyIndex_Check(index): # <<<<<<<<<<<<<< - * slice_memviewslice( - * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], - */ - __pyx_t_2 = (PyIndex_Check(__pyx_v_index) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":751 - * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], - * dim, new_ndim, p_suboffset_dim, - * index, 0, 0, # start, stop, step # <<<<<<<<<<<<<< - * 0, 0, 0, # have_{start,stop,step} - * False) - */ - __pyx_t_10 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_10 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 751, __pyx_L1_error) - - /* "View.MemoryView":748 - * for dim, index in enumerate(indices): - * if PyIndex_Check(index): - * slice_memviewslice( # <<<<<<<<<<<<<< - * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], - * dim, new_ndim, p_suboffset_dim, - */ - __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_t_10, 0, 0, 0, 0, 0, 0); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(2, 748, __pyx_L1_error) - - /* "View.MemoryView":747 - * - * for dim, index in enumerate(indices): - * if PyIndex_Check(index): # <<<<<<<<<<<<<< - * slice_memviewslice( - * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], - */ - goto __pyx_L6; - } - - /* "View.MemoryView":754 - * 0, 0, 0, # have_{start,stop,step} - * False) - * elif index is None: # <<<<<<<<<<<<<< - * p_dst.shape[new_ndim] = 1 - * p_dst.strides[new_ndim] = 0 - */ - __pyx_t_2 = (__pyx_v_index == Py_None); - __pyx_t_1 = (__pyx_t_2 != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":755 - * False) - * elif index is None: - * p_dst.shape[new_ndim] = 1 # <<<<<<<<<<<<<< - * p_dst.strides[new_ndim] = 0 - * p_dst.suboffsets[new_ndim] = -1 - */ - (__pyx_v_p_dst->shape[__pyx_v_new_ndim]) = 1; - - /* "View.MemoryView":756 - * elif index is None: - * p_dst.shape[new_ndim] = 1 - * p_dst.strides[new_ndim] = 0 # <<<<<<<<<<<<<< - * p_dst.suboffsets[new_ndim] = -1 - * new_ndim += 1 - */ - (__pyx_v_p_dst->strides[__pyx_v_new_ndim]) = 0; - - /* "View.MemoryView":757 - * p_dst.shape[new_ndim] = 1 - * p_dst.strides[new_ndim] = 0 - * p_dst.suboffsets[new_ndim] = -1 # <<<<<<<<<<<<<< - * new_ndim += 1 - * else: - */ - (__pyx_v_p_dst->suboffsets[__pyx_v_new_ndim]) = -1L; - - /* "View.MemoryView":758 - * p_dst.strides[new_ndim] = 0 - * p_dst.suboffsets[new_ndim] = -1 - * new_ndim += 1 # <<<<<<<<<<<<<< - * else: - * start = index.start or 0 - */ - __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); - - /* "View.MemoryView":754 - * 0, 0, 0, # have_{start,stop,step} - * False) - * elif index is None: # <<<<<<<<<<<<<< - * p_dst.shape[new_ndim] = 1 - * p_dst.strides[new_ndim] = 0 - */ - goto __pyx_L6; - } - - /* "View.MemoryView":760 - * new_ndim += 1 - * else: - * start = index.start or 0 # <<<<<<<<<<<<<< - * stop = index.stop or 0 - * step = index.step or 0 - */ - /*else*/ { - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 760, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 760, __pyx_L1_error) - if (!__pyx_t_1) { - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } else { - __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 760, __pyx_L1_error) - __pyx_t_10 = __pyx_t_12; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - goto __pyx_L7_bool_binop_done; - } - __pyx_t_10 = 0; - __pyx_L7_bool_binop_done:; - __pyx_v_start = __pyx_t_10; - - /* "View.MemoryView":761 - * else: - * start = index.start or 0 - * stop = index.stop or 0 # <<<<<<<<<<<<<< - * step = index.step or 0 - * - */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 761, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 761, __pyx_L1_error) - if (!__pyx_t_1) { - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } else { - __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 761, __pyx_L1_error) - __pyx_t_10 = __pyx_t_12; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - goto __pyx_L9_bool_binop_done; - } - __pyx_t_10 = 0; - __pyx_L9_bool_binop_done:; - __pyx_v_stop = __pyx_t_10; - - /* "View.MemoryView":762 - * start = index.start or 0 - * stop = index.stop or 0 - * step = index.step or 0 # <<<<<<<<<<<<<< - * - * have_start = index.start is not None - */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 762, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 762, __pyx_L1_error) - if (!__pyx_t_1) { - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } else { - __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 762, __pyx_L1_error) - __pyx_t_10 = __pyx_t_12; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - goto __pyx_L11_bool_binop_done; - } - __pyx_t_10 = 0; - __pyx_L11_bool_binop_done:; - __pyx_v_step = __pyx_t_10; - - /* "View.MemoryView":764 - * step = index.step or 0 - * - * have_start = index.start is not None # <<<<<<<<<<<<<< - * have_stop = index.stop is not None - * have_step = index.step is not None - */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 764, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = (__pyx_t_9 != Py_None); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_v_have_start = __pyx_t_1; - - /* "View.MemoryView":765 - * - * have_start = index.start is not None - * have_stop = index.stop is not None # <<<<<<<<<<<<<< - * have_step = index.step is not None - * - */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 765, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = (__pyx_t_9 != Py_None); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_v_have_stop = __pyx_t_1; - - /* "View.MemoryView":766 - * have_start = index.start is not None - * have_stop = index.stop is not None - * have_step = index.step is not None # <<<<<<<<<<<<<< - * - * slice_memviewslice( - */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 766, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = (__pyx_t_9 != Py_None); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_v_have_step = __pyx_t_1; - - /* "View.MemoryView":768 - * have_step = index.step is not None - * - * slice_memviewslice( # <<<<<<<<<<<<<< - * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], - * dim, new_ndim, p_suboffset_dim, - */ - __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_start, __pyx_v_stop, __pyx_v_step, __pyx_v_have_start, __pyx_v_have_stop, __pyx_v_have_step, 1); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(2, 768, __pyx_L1_error) - - /* "View.MemoryView":774 - * have_start, have_stop, have_step, - * True) - * new_ndim += 1 # <<<<<<<<<<<<<< - * - * if isinstance(memview, _memoryviewslice): - */ - __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); - } - __pyx_L6:; - - /* "View.MemoryView":746 - * cdef bint have_start, have_stop, have_step - * - * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< - * if PyIndex_Check(index): - * slice_memviewslice( - */ - } - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "View.MemoryView":776 - * new_ndim += 1 - * - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * return memoryview_fromslice(dst, new_ndim, - * memviewsliceobj.to_object_func, - */ - __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":777 - * - * if isinstance(memview, _memoryviewslice): - * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< - * memviewsliceobj.to_object_func, - * memviewsliceobj.to_dtype_func, - */ - __Pyx_XDECREF(((PyObject *)__pyx_r)); - - /* "View.MemoryView":778 - * if isinstance(memview, _memoryviewslice): - * return memoryview_fromslice(dst, new_ndim, - * memviewsliceobj.to_object_func, # <<<<<<<<<<<<<< - * memviewsliceobj.to_dtype_func, - * memview.dtype_is_object) - */ - if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(2, 778, __pyx_L1_error) } - - /* "View.MemoryView":779 - * return memoryview_fromslice(dst, new_ndim, - * memviewsliceobj.to_object_func, - * memviewsliceobj.to_dtype_func, # <<<<<<<<<<<<<< - * memview.dtype_is_object) - * else: - */ - if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(2, 779, __pyx_L1_error) } - - /* "View.MemoryView":777 - * - * if isinstance(memview, _memoryviewslice): - * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< - * memviewsliceobj.to_object_func, - * memviewsliceobj.to_dtype_func, - */ - __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, __pyx_v_memviewsliceobj->to_object_func, __pyx_v_memviewsliceobj->to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 777, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(2, 777, __pyx_L1_error) - __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); - __pyx_t_3 = 0; - goto __pyx_L0; - - /* "View.MemoryView":776 - * new_ndim += 1 - * - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * return memoryview_fromslice(dst, new_ndim, - * memviewsliceobj.to_object_func, - */ - } - - /* "View.MemoryView":782 - * memview.dtype_is_object) - * else: - * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< - * memview.dtype_is_object) - * - */ - /*else*/ { - __Pyx_XDECREF(((PyObject *)__pyx_r)); - - /* "View.MemoryView":783 - * else: - * return memoryview_fromslice(dst, new_ndim, NULL, NULL, - * memview.dtype_is_object) # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, NULL, NULL, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 782, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - - /* "View.MemoryView":782 - * memview.dtype_is_object) - * else: - * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< - * memview.dtype_is_object) - * - */ - if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(2, 782, __pyx_L1_error) - __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); - __pyx_t_3 = 0; - goto __pyx_L0; - } - - /* "View.MemoryView":710 - * - * @cname('__pyx_memview_slice') - * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< - * cdef int new_ndim = 0, suboffset_dim = -1, dim - * cdef bint negative_step - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_AddTraceback("View.MemoryView.memview_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_memviewsliceobj); - __Pyx_XDECREF(__pyx_v_index); - __Pyx_XGIVEREF((PyObject *)__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":807 - * - * @cname('__pyx_memoryview_slice_memviewslice') - * cdef int slice_memviewslice( # <<<<<<<<<<<<<< - * __Pyx_memviewslice *dst, - * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, - */ - -static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, Py_ssize_t __pyx_v_shape, Py_ssize_t __pyx_v_stride, Py_ssize_t __pyx_v_suboffset, int __pyx_v_dim, int __pyx_v_new_ndim, int *__pyx_v_suboffset_dim, Py_ssize_t __pyx_v_start, Py_ssize_t __pyx_v_stop, Py_ssize_t __pyx_v_step, int __pyx_v_have_start, int __pyx_v_have_stop, int __pyx_v_have_step, int __pyx_v_is_slice) { - Py_ssize_t __pyx_v_new_shape; - int __pyx_v_negative_step; - int __pyx_r; - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - - /* "View.MemoryView":827 - * cdef bint negative_step - * - * if not is_slice: # <<<<<<<<<<<<<< - * - * if start < 0: - */ - __pyx_t_1 = ((!(__pyx_v_is_slice != 0)) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":829 - * if not is_slice: - * - * if start < 0: # <<<<<<<<<<<<<< - * start += shape - * if not 0 <= start < shape: - */ - __pyx_t_1 = ((__pyx_v_start < 0) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":830 - * - * if start < 0: - * start += shape # <<<<<<<<<<<<<< - * if not 0 <= start < shape: - * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) - */ - __pyx_v_start = (__pyx_v_start + __pyx_v_shape); - - /* "View.MemoryView":829 - * if not is_slice: - * - * if start < 0: # <<<<<<<<<<<<<< - * start += shape - * if not 0 <= start < shape: - */ - } - - /* "View.MemoryView":831 - * if start < 0: - * start += shape - * if not 0 <= start < shape: # <<<<<<<<<<<<<< - * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) - * else: - */ - __pyx_t_1 = (0 <= __pyx_v_start); - if (__pyx_t_1) { - __pyx_t_1 = (__pyx_v_start < __pyx_v_shape); - } - __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":832 - * start += shape - * if not 0 <= start < shape: - * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) # <<<<<<<<<<<<<< - * else: - * - */ - __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"Index out of bounds (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 832, __pyx_L1_error) - - /* "View.MemoryView":831 - * if start < 0: - * start += shape - * if not 0 <= start < shape: # <<<<<<<<<<<<<< - * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) - * else: - */ - } - - /* "View.MemoryView":827 - * cdef bint negative_step - * - * if not is_slice: # <<<<<<<<<<<<<< - * - * if start < 0: - */ - goto __pyx_L3; - } - - /* "View.MemoryView":835 - * else: - * - * negative_step = have_step != 0 and step < 0 # <<<<<<<<<<<<<< - * - * if have_step and step == 0: - */ - /*else*/ { - __pyx_t_1 = ((__pyx_v_have_step != 0) != 0); - if (__pyx_t_1) { - } else { - __pyx_t_2 = __pyx_t_1; - goto __pyx_L6_bool_binop_done; - } - __pyx_t_1 = ((__pyx_v_step < 0) != 0); - __pyx_t_2 = __pyx_t_1; - __pyx_L6_bool_binop_done:; - __pyx_v_negative_step = __pyx_t_2; - - /* "View.MemoryView":837 - * negative_step = have_step != 0 and step < 0 - * - * if have_step and step == 0: # <<<<<<<<<<<<<< - * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) - * - */ - __pyx_t_1 = (__pyx_v_have_step != 0); - if (__pyx_t_1) { - } else { - __pyx_t_2 = __pyx_t_1; - goto __pyx_L9_bool_binop_done; - } - __pyx_t_1 = ((__pyx_v_step == 0) != 0); - __pyx_t_2 = __pyx_t_1; - __pyx_L9_bool_binop_done:; - if (__pyx_t_2) { - - /* "View.MemoryView":838 - * - * if have_step and step == 0: - * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Step may not be zero (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 838, __pyx_L1_error) - - /* "View.MemoryView":837 - * negative_step = have_step != 0 and step < 0 - * - * if have_step and step == 0: # <<<<<<<<<<<<<< - * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) - * - */ - } - - /* "View.MemoryView":841 - * - * - * if have_start: # <<<<<<<<<<<<<< - * if start < 0: - * start += shape - */ - __pyx_t_2 = (__pyx_v_have_start != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":842 - * - * if have_start: - * if start < 0: # <<<<<<<<<<<<<< - * start += shape - * if start < 0: - */ - __pyx_t_2 = ((__pyx_v_start < 0) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":843 - * if have_start: - * if start < 0: - * start += shape # <<<<<<<<<<<<<< - * if start < 0: - * start = 0 - */ - __pyx_v_start = (__pyx_v_start + __pyx_v_shape); - - /* "View.MemoryView":844 - * if start < 0: - * start += shape - * if start < 0: # <<<<<<<<<<<<<< - * start = 0 - * elif start >= shape: - */ - __pyx_t_2 = ((__pyx_v_start < 0) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":845 - * start += shape - * if start < 0: - * start = 0 # <<<<<<<<<<<<<< - * elif start >= shape: - * if negative_step: - */ - __pyx_v_start = 0; - - /* "View.MemoryView":844 - * if start < 0: - * start += shape - * if start < 0: # <<<<<<<<<<<<<< - * start = 0 - * elif start >= shape: - */ - } - - /* "View.MemoryView":842 - * - * if have_start: - * if start < 0: # <<<<<<<<<<<<<< - * start += shape - * if start < 0: - */ - goto __pyx_L12; - } - - /* "View.MemoryView":846 - * if start < 0: - * start = 0 - * elif start >= shape: # <<<<<<<<<<<<<< - * if negative_step: - * start = shape - 1 - */ - __pyx_t_2 = ((__pyx_v_start >= __pyx_v_shape) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":847 - * start = 0 - * elif start >= shape: - * if negative_step: # <<<<<<<<<<<<<< - * start = shape - 1 - * else: - */ - __pyx_t_2 = (__pyx_v_negative_step != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":848 - * elif start >= shape: - * if negative_step: - * start = shape - 1 # <<<<<<<<<<<<<< - * else: - * start = shape - */ - __pyx_v_start = (__pyx_v_shape - 1); - - /* "View.MemoryView":847 - * start = 0 - * elif start >= shape: - * if negative_step: # <<<<<<<<<<<<<< - * start = shape - 1 - * else: - */ - goto __pyx_L14; - } - - /* "View.MemoryView":850 - * start = shape - 1 - * else: - * start = shape # <<<<<<<<<<<<<< - * else: - * if negative_step: - */ - /*else*/ { - __pyx_v_start = __pyx_v_shape; - } - __pyx_L14:; - - /* "View.MemoryView":846 - * if start < 0: - * start = 0 - * elif start >= shape: # <<<<<<<<<<<<<< - * if negative_step: - * start = shape - 1 - */ - } - __pyx_L12:; - - /* "View.MemoryView":841 - * - * - * if have_start: # <<<<<<<<<<<<<< - * if start < 0: - * start += shape - */ - goto __pyx_L11; - } - - /* "View.MemoryView":852 - * start = shape - * else: - * if negative_step: # <<<<<<<<<<<<<< - * start = shape - 1 - * else: - */ - /*else*/ { - __pyx_t_2 = (__pyx_v_negative_step != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":853 - * else: - * if negative_step: - * start = shape - 1 # <<<<<<<<<<<<<< - * else: - * start = 0 - */ - __pyx_v_start = (__pyx_v_shape - 1); - - /* "View.MemoryView":852 - * start = shape - * else: - * if negative_step: # <<<<<<<<<<<<<< - * start = shape - 1 - * else: - */ - goto __pyx_L15; - } - - /* "View.MemoryView":855 - * start = shape - 1 - * else: - * start = 0 # <<<<<<<<<<<<<< - * - * if have_stop: - */ - /*else*/ { - __pyx_v_start = 0; - } - __pyx_L15:; - } - __pyx_L11:; - - /* "View.MemoryView":857 - * start = 0 - * - * if have_stop: # <<<<<<<<<<<<<< - * if stop < 0: - * stop += shape - */ - __pyx_t_2 = (__pyx_v_have_stop != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":858 - * - * if have_stop: - * if stop < 0: # <<<<<<<<<<<<<< - * stop += shape - * if stop < 0: - */ - __pyx_t_2 = ((__pyx_v_stop < 0) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":859 - * if have_stop: - * if stop < 0: - * stop += shape # <<<<<<<<<<<<<< - * if stop < 0: - * stop = 0 - */ - __pyx_v_stop = (__pyx_v_stop + __pyx_v_shape); - - /* "View.MemoryView":860 - * if stop < 0: - * stop += shape - * if stop < 0: # <<<<<<<<<<<<<< - * stop = 0 - * elif stop > shape: - */ - __pyx_t_2 = ((__pyx_v_stop < 0) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":861 - * stop += shape - * if stop < 0: - * stop = 0 # <<<<<<<<<<<<<< - * elif stop > shape: - * stop = shape - */ - __pyx_v_stop = 0; - - /* "View.MemoryView":860 - * if stop < 0: - * stop += shape - * if stop < 0: # <<<<<<<<<<<<<< - * stop = 0 - * elif stop > shape: - */ - } - - /* "View.MemoryView":858 - * - * if have_stop: - * if stop < 0: # <<<<<<<<<<<<<< - * stop += shape - * if stop < 0: - */ - goto __pyx_L17; - } - - /* "View.MemoryView":862 - * if stop < 0: - * stop = 0 - * elif stop > shape: # <<<<<<<<<<<<<< - * stop = shape - * else: - */ - __pyx_t_2 = ((__pyx_v_stop > __pyx_v_shape) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":863 - * stop = 0 - * elif stop > shape: - * stop = shape # <<<<<<<<<<<<<< - * else: - * if negative_step: - */ - __pyx_v_stop = __pyx_v_shape; - - /* "View.MemoryView":862 - * if stop < 0: - * stop = 0 - * elif stop > shape: # <<<<<<<<<<<<<< - * stop = shape - * else: - */ - } - __pyx_L17:; - - /* "View.MemoryView":857 - * start = 0 - * - * if have_stop: # <<<<<<<<<<<<<< - * if stop < 0: - * stop += shape - */ - goto __pyx_L16; - } - - /* "View.MemoryView":865 - * stop = shape - * else: - * if negative_step: # <<<<<<<<<<<<<< - * stop = -1 - * else: - */ - /*else*/ { - __pyx_t_2 = (__pyx_v_negative_step != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":866 - * else: - * if negative_step: - * stop = -1 # <<<<<<<<<<<<<< - * else: - * stop = shape - */ - __pyx_v_stop = -1L; - - /* "View.MemoryView":865 - * stop = shape - * else: - * if negative_step: # <<<<<<<<<<<<<< - * stop = -1 - * else: - */ - goto __pyx_L19; - } - - /* "View.MemoryView":868 - * stop = -1 - * else: - * stop = shape # <<<<<<<<<<<<<< - * - * if not have_step: - */ - /*else*/ { - __pyx_v_stop = __pyx_v_shape; - } - __pyx_L19:; - } - __pyx_L16:; - - /* "View.MemoryView":870 - * stop = shape - * - * if not have_step: # <<<<<<<<<<<<<< - * step = 1 - * - */ - __pyx_t_2 = ((!(__pyx_v_have_step != 0)) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":871 - * - * if not have_step: - * step = 1 # <<<<<<<<<<<<<< - * - * - */ - __pyx_v_step = 1; - - /* "View.MemoryView":870 - * stop = shape - * - * if not have_step: # <<<<<<<<<<<<<< - * step = 1 - * - */ - } - - /* "View.MemoryView":875 - * - * with cython.cdivision(True): - * new_shape = (stop - start) // step # <<<<<<<<<<<<<< - * - * if (stop - start) - step * new_shape: - */ - __pyx_v_new_shape = ((__pyx_v_stop - __pyx_v_start) / __pyx_v_step); - - /* "View.MemoryView":877 - * new_shape = (stop - start) // step - * - * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< - * new_shape += 1 - * - */ - __pyx_t_2 = (((__pyx_v_stop - __pyx_v_start) - (__pyx_v_step * __pyx_v_new_shape)) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":878 - * - * if (stop - start) - step * new_shape: - * new_shape += 1 # <<<<<<<<<<<<<< - * - * if new_shape < 0: - */ - __pyx_v_new_shape = (__pyx_v_new_shape + 1); - - /* "View.MemoryView":877 - * new_shape = (stop - start) // step - * - * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< - * new_shape += 1 - * - */ - } - - /* "View.MemoryView":880 - * new_shape += 1 - * - * if new_shape < 0: # <<<<<<<<<<<<<< - * new_shape = 0 - * - */ - __pyx_t_2 = ((__pyx_v_new_shape < 0) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":881 - * - * if new_shape < 0: - * new_shape = 0 # <<<<<<<<<<<<<< - * - * - */ - __pyx_v_new_shape = 0; - - /* "View.MemoryView":880 - * new_shape += 1 - * - * if new_shape < 0: # <<<<<<<<<<<<<< - * new_shape = 0 - * - */ - } - - /* "View.MemoryView":884 - * - * - * dst.strides[new_ndim] = stride * step # <<<<<<<<<<<<<< - * dst.shape[new_ndim] = new_shape - * dst.suboffsets[new_ndim] = suboffset - */ - (__pyx_v_dst->strides[__pyx_v_new_ndim]) = (__pyx_v_stride * __pyx_v_step); - - /* "View.MemoryView":885 - * - * dst.strides[new_ndim] = stride * step - * dst.shape[new_ndim] = new_shape # <<<<<<<<<<<<<< - * dst.suboffsets[new_ndim] = suboffset - * - */ - (__pyx_v_dst->shape[__pyx_v_new_ndim]) = __pyx_v_new_shape; - - /* "View.MemoryView":886 - * dst.strides[new_ndim] = stride * step - * dst.shape[new_ndim] = new_shape - * dst.suboffsets[new_ndim] = suboffset # <<<<<<<<<<<<<< - * - * - */ - (__pyx_v_dst->suboffsets[__pyx_v_new_ndim]) = __pyx_v_suboffset; - } - __pyx_L3:; - - /* "View.MemoryView":889 - * - * - * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< - * dst.data += start * stride - * else: - */ - __pyx_t_2 = (((__pyx_v_suboffset_dim[0]) < 0) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":890 - * - * if suboffset_dim[0] < 0: - * dst.data += start * stride # <<<<<<<<<<<<<< - * else: - * dst.suboffsets[suboffset_dim[0]] += start * stride - */ - __pyx_v_dst->data = (__pyx_v_dst->data + (__pyx_v_start * __pyx_v_stride)); - - /* "View.MemoryView":889 - * - * - * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< - * dst.data += start * stride - * else: - */ - goto __pyx_L23; - } - - /* "View.MemoryView":892 - * dst.data += start * stride - * else: - * dst.suboffsets[suboffset_dim[0]] += start * stride # <<<<<<<<<<<<<< - * - * if suboffset >= 0: - */ - /*else*/ { - __pyx_t_3 = (__pyx_v_suboffset_dim[0]); - (__pyx_v_dst->suboffsets[__pyx_t_3]) = ((__pyx_v_dst->suboffsets[__pyx_t_3]) + (__pyx_v_start * __pyx_v_stride)); - } - __pyx_L23:; - - /* "View.MemoryView":894 - * dst.suboffsets[suboffset_dim[0]] += start * stride - * - * if suboffset >= 0: # <<<<<<<<<<<<<< - * if not is_slice: - * if new_ndim == 0: - */ - __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":895 - * - * if suboffset >= 0: - * if not is_slice: # <<<<<<<<<<<<<< - * if new_ndim == 0: - * dst.data = ( dst.data)[0] + suboffset - */ - __pyx_t_2 = ((!(__pyx_v_is_slice != 0)) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":896 - * if suboffset >= 0: - * if not is_slice: - * if new_ndim == 0: # <<<<<<<<<<<<<< - * dst.data = ( dst.data)[0] + suboffset - * else: - */ - __pyx_t_2 = ((__pyx_v_new_ndim == 0) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":897 - * if not is_slice: - * if new_ndim == 0: - * dst.data = ( dst.data)[0] + suboffset # <<<<<<<<<<<<<< - * else: - * _err_dim(IndexError, "All dimensions preceding dimension %d " - */ - __pyx_v_dst->data = ((((char **)__pyx_v_dst->data)[0]) + __pyx_v_suboffset); - - /* "View.MemoryView":896 - * if suboffset >= 0: - * if not is_slice: - * if new_ndim == 0: # <<<<<<<<<<<<<< - * dst.data = ( dst.data)[0] + suboffset - * else: - */ - goto __pyx_L26; - } - - /* "View.MemoryView":899 - * dst.data = ( dst.data)[0] + suboffset - * else: - * _err_dim(IndexError, "All dimensions preceding dimension %d " # <<<<<<<<<<<<<< - * "must be indexed and not sliced", dim) - * else: - */ - /*else*/ { - - /* "View.MemoryView":900 - * else: - * _err_dim(IndexError, "All dimensions preceding dimension %d " - * "must be indexed and not sliced", dim) # <<<<<<<<<<<<<< - * else: - * suboffset_dim[0] = new_ndim - */ - __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"All dimensions preceding dimension %d must be indexed and not sliced"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 899, __pyx_L1_error) - } - __pyx_L26:; - - /* "View.MemoryView":895 - * - * if suboffset >= 0: - * if not is_slice: # <<<<<<<<<<<<<< - * if new_ndim == 0: - * dst.data = ( dst.data)[0] + suboffset - */ - goto __pyx_L25; - } - - /* "View.MemoryView":902 - * "must be indexed and not sliced", dim) - * else: - * suboffset_dim[0] = new_ndim # <<<<<<<<<<<<<< - * - * return 0 - */ - /*else*/ { - (__pyx_v_suboffset_dim[0]) = __pyx_v_new_ndim; - } - __pyx_L25:; - - /* "View.MemoryView":894 - * dst.suboffsets[suboffset_dim[0]] += start * stride - * - * if suboffset >= 0: # <<<<<<<<<<<<<< - * if not is_slice: - * if new_ndim == 0: - */ - } - - /* "View.MemoryView":904 - * suboffset_dim[0] = new_ndim - * - * return 0 # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = 0; - goto __pyx_L0; - - /* "View.MemoryView":807 - * - * @cname('__pyx_memoryview_slice_memviewslice') - * cdef int slice_memviewslice( # <<<<<<<<<<<<<< - * __Pyx_memviewslice *dst, - * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, - */ - - /* function exit code */ - __pyx_L1_error:; - { - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_AddTraceback("View.MemoryView.slice_memviewslice", __pyx_clineno, __pyx_lineno, __pyx_filename); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif - } - __pyx_r = -1; - __pyx_L0:; - return __pyx_r; -} - -/* "View.MemoryView":910 - * - * @cname('__pyx_pybuffer_index') - * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< - * Py_ssize_t dim) except NULL: - * cdef Py_ssize_t shape, stride, suboffset = -1 - */ - -static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, Py_ssize_t __pyx_v_index, Py_ssize_t __pyx_v_dim) { - Py_ssize_t __pyx_v_shape; - Py_ssize_t __pyx_v_stride; - Py_ssize_t __pyx_v_suboffset; - Py_ssize_t __pyx_v_itemsize; - char *__pyx_v_resultp; - char *__pyx_r; - __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("pybuffer_index", 0); - - /* "View.MemoryView":912 - * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, - * Py_ssize_t dim) except NULL: - * cdef Py_ssize_t shape, stride, suboffset = -1 # <<<<<<<<<<<<<< - * cdef Py_ssize_t itemsize = view.itemsize - * cdef char *resultp - */ - __pyx_v_suboffset = -1L; - - /* "View.MemoryView":913 - * Py_ssize_t dim) except NULL: - * cdef Py_ssize_t shape, stride, suboffset = -1 - * cdef Py_ssize_t itemsize = view.itemsize # <<<<<<<<<<<<<< - * cdef char *resultp - * - */ - __pyx_t_1 = __pyx_v_view->itemsize; - __pyx_v_itemsize = __pyx_t_1; - - /* "View.MemoryView":916 - * cdef char *resultp - * - * if view.ndim == 0: # <<<<<<<<<<<<<< - * shape = view.len / itemsize - * stride = itemsize - */ - __pyx_t_2 = ((__pyx_v_view->ndim == 0) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":917 - * - * if view.ndim == 0: - * shape = view.len / itemsize # <<<<<<<<<<<<<< - * stride = itemsize - * else: - */ - if (unlikely(__pyx_v_itemsize == 0)) { - PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); - __PYX_ERR(2, 917, __pyx_L1_error) - } - else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_view->len))) { - PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); - __PYX_ERR(2, 917, __pyx_L1_error) - } - __pyx_v_shape = __Pyx_div_Py_ssize_t(__pyx_v_view->len, __pyx_v_itemsize); - - /* "View.MemoryView":918 - * if view.ndim == 0: - * shape = view.len / itemsize - * stride = itemsize # <<<<<<<<<<<<<< - * else: - * shape = view.shape[dim] - */ - __pyx_v_stride = __pyx_v_itemsize; - - /* "View.MemoryView":916 - * cdef char *resultp - * - * if view.ndim == 0: # <<<<<<<<<<<<<< - * shape = view.len / itemsize - * stride = itemsize - */ - goto __pyx_L3; - } - - /* "View.MemoryView":920 - * stride = itemsize - * else: - * shape = view.shape[dim] # <<<<<<<<<<<<<< - * stride = view.strides[dim] - * if view.suboffsets != NULL: - */ - /*else*/ { - __pyx_v_shape = (__pyx_v_view->shape[__pyx_v_dim]); - - /* "View.MemoryView":921 - * else: - * shape = view.shape[dim] - * stride = view.strides[dim] # <<<<<<<<<<<<<< - * if view.suboffsets != NULL: - * suboffset = view.suboffsets[dim] - */ - __pyx_v_stride = (__pyx_v_view->strides[__pyx_v_dim]); - - /* "View.MemoryView":922 - * shape = view.shape[dim] - * stride = view.strides[dim] - * if view.suboffsets != NULL: # <<<<<<<<<<<<<< - * suboffset = view.suboffsets[dim] - * - */ - __pyx_t_2 = ((__pyx_v_view->suboffsets != NULL) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":923 - * stride = view.strides[dim] - * if view.suboffsets != NULL: - * suboffset = view.suboffsets[dim] # <<<<<<<<<<<<<< - * - * if index < 0: - */ - __pyx_v_suboffset = (__pyx_v_view->suboffsets[__pyx_v_dim]); - - /* "View.MemoryView":922 - * shape = view.shape[dim] - * stride = view.strides[dim] - * if view.suboffsets != NULL: # <<<<<<<<<<<<<< - * suboffset = view.suboffsets[dim] - * - */ - } - } - __pyx_L3:; - - /* "View.MemoryView":925 - * suboffset = view.suboffsets[dim] - * - * if index < 0: # <<<<<<<<<<<<<< - * index += view.shape[dim] - * if index < 0: - */ - __pyx_t_2 = ((__pyx_v_index < 0) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":926 - * - * if index < 0: - * index += view.shape[dim] # <<<<<<<<<<<<<< - * if index < 0: - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) - */ - __pyx_v_index = (__pyx_v_index + (__pyx_v_view->shape[__pyx_v_dim])); - - /* "View.MemoryView":927 - * if index < 0: - * index += view.shape[dim] - * if index < 0: # <<<<<<<<<<<<<< - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) - * - */ - __pyx_t_2 = ((__pyx_v_index < 0) != 0); - if (unlikely(__pyx_t_2)) { - - /* "View.MemoryView":928 - * index += view.shape[dim] - * if index < 0: - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< - * - * if index >= shape: - */ - __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 928, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 928, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 928, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 928, __pyx_L1_error) - - /* "View.MemoryView":927 - * if index < 0: - * index += view.shape[dim] - * if index < 0: # <<<<<<<<<<<<<< - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) - * - */ - } - - /* "View.MemoryView":925 - * suboffset = view.suboffsets[dim] - * - * if index < 0: # <<<<<<<<<<<<<< - * index += view.shape[dim] - * if index < 0: - */ - } - - /* "View.MemoryView":930 - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) - * - * if index >= shape: # <<<<<<<<<<<<<< - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) - * - */ - __pyx_t_2 = ((__pyx_v_index >= __pyx_v_shape) != 0); - if (unlikely(__pyx_t_2)) { - - /* "View.MemoryView":931 - * - * if index >= shape: - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< - * - * resultp = bufp + index * stride - */ - __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 931, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 931, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 931, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 931, __pyx_L1_error) - - /* "View.MemoryView":930 - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) - * - * if index >= shape: # <<<<<<<<<<<<<< - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) - * - */ - } - - /* "View.MemoryView":933 - * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) - * - * resultp = bufp + index * stride # <<<<<<<<<<<<<< - * if suboffset >= 0: - * resultp = ( resultp)[0] + suboffset - */ - __pyx_v_resultp = (__pyx_v_bufp + (__pyx_v_index * __pyx_v_stride)); - - /* "View.MemoryView":934 - * - * resultp = bufp + index * stride - * if suboffset >= 0: # <<<<<<<<<<<<<< - * resultp = ( resultp)[0] + suboffset - * - */ - __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":935 - * resultp = bufp + index * stride - * if suboffset >= 0: - * resultp = ( resultp)[0] + suboffset # <<<<<<<<<<<<<< - * - * return resultp - */ - __pyx_v_resultp = ((((char **)__pyx_v_resultp)[0]) + __pyx_v_suboffset); - - /* "View.MemoryView":934 - * - * resultp = bufp + index * stride - * if suboffset >= 0: # <<<<<<<<<<<<<< - * resultp = ( resultp)[0] + suboffset - * - */ - } - - /* "View.MemoryView":937 - * resultp = ( resultp)[0] + suboffset - * - * return resultp # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = __pyx_v_resultp; - goto __pyx_L0; - - /* "View.MemoryView":910 - * - * @cname('__pyx_pybuffer_index') - * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< - * Py_ssize_t dim) except NULL: - * cdef Py_ssize_t shape, stride, suboffset = -1 - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("View.MemoryView.pybuffer_index", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":943 - * - * @cname('__pyx_memslice_transpose') - * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< - * cdef int ndim = memslice.memview.view.ndim - * - */ - -static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { - int __pyx_v_ndim; - Py_ssize_t *__pyx_v_shape; - Py_ssize_t *__pyx_v_strides; - int __pyx_v_i; - int __pyx_v_j; - int __pyx_r; - int __pyx_t_1; - Py_ssize_t *__pyx_t_2; - long __pyx_t_3; - long __pyx_t_4; - Py_ssize_t __pyx_t_5; - Py_ssize_t __pyx_t_6; - int __pyx_t_7; - int __pyx_t_8; - int __pyx_t_9; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - - /* "View.MemoryView":944 - * @cname('__pyx_memslice_transpose') - * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: - * cdef int ndim = memslice.memview.view.ndim # <<<<<<<<<<<<<< - * - * cdef Py_ssize_t *shape = memslice.shape - */ - __pyx_t_1 = __pyx_v_memslice->memview->view.ndim; - __pyx_v_ndim = __pyx_t_1; - - /* "View.MemoryView":946 - * cdef int ndim = memslice.memview.view.ndim - * - * cdef Py_ssize_t *shape = memslice.shape # <<<<<<<<<<<<<< - * cdef Py_ssize_t *strides = memslice.strides - * - */ - __pyx_t_2 = __pyx_v_memslice->shape; - __pyx_v_shape = __pyx_t_2; - - /* "View.MemoryView":947 - * - * cdef Py_ssize_t *shape = memslice.shape - * cdef Py_ssize_t *strides = memslice.strides # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_2 = __pyx_v_memslice->strides; - __pyx_v_strides = __pyx_t_2; - - /* "View.MemoryView":951 - * - * cdef int i, j - * for i in range(ndim / 2): # <<<<<<<<<<<<<< - * j = ndim - 1 - i - * strides[i], strides[j] = strides[j], strides[i] - */ - __pyx_t_3 = __Pyx_div_long(__pyx_v_ndim, 2); - __pyx_t_4 = __pyx_t_3; - for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { - __pyx_v_i = __pyx_t_1; - - /* "View.MemoryView":952 - * cdef int i, j - * for i in range(ndim / 2): - * j = ndim - 1 - i # <<<<<<<<<<<<<< - * strides[i], strides[j] = strides[j], strides[i] - * shape[i], shape[j] = shape[j], shape[i] - */ - __pyx_v_j = ((__pyx_v_ndim - 1) - __pyx_v_i); - - /* "View.MemoryView":953 - * for i in range(ndim / 2): - * j = ndim - 1 - i - * strides[i], strides[j] = strides[j], strides[i] # <<<<<<<<<<<<<< - * shape[i], shape[j] = shape[j], shape[i] - * - */ - __pyx_t_5 = (__pyx_v_strides[__pyx_v_j]); - __pyx_t_6 = (__pyx_v_strides[__pyx_v_i]); - (__pyx_v_strides[__pyx_v_i]) = __pyx_t_5; - (__pyx_v_strides[__pyx_v_j]) = __pyx_t_6; - - /* "View.MemoryView":954 - * j = ndim - 1 - i - * strides[i], strides[j] = strides[j], strides[i] - * shape[i], shape[j] = shape[j], shape[i] # <<<<<<<<<<<<<< - * - * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: - */ - __pyx_t_6 = (__pyx_v_shape[__pyx_v_j]); - __pyx_t_5 = (__pyx_v_shape[__pyx_v_i]); - (__pyx_v_shape[__pyx_v_i]) = __pyx_t_6; - (__pyx_v_shape[__pyx_v_j]) = __pyx_t_5; - - /* "View.MemoryView":956 - * shape[i], shape[j] = shape[j], shape[i] - * - * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< - * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") - * - */ - __pyx_t_8 = (((__pyx_v_memslice->suboffsets[__pyx_v_i]) >= 0) != 0); - if (!__pyx_t_8) { - } else { - __pyx_t_7 = __pyx_t_8; - goto __pyx_L6_bool_binop_done; - } - __pyx_t_8 = (((__pyx_v_memslice->suboffsets[__pyx_v_j]) >= 0) != 0); - __pyx_t_7 = __pyx_t_8; - __pyx_L6_bool_binop_done:; - if (__pyx_t_7) { - - /* "View.MemoryView":957 - * - * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: - * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") # <<<<<<<<<<<<<< - * - * return 1 - */ - __pyx_t_9 = __pyx_memoryview_err(__pyx_builtin_ValueError, ((char *)"Cannot transpose memoryview with indirect dimensions")); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 957, __pyx_L1_error) - - /* "View.MemoryView":956 - * shape[i], shape[j] = shape[j], shape[i] - * - * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< - * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") - * - */ - } - } - - /* "View.MemoryView":959 - * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") - * - * return 1 # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = 1; - goto __pyx_L0; - - /* "View.MemoryView":943 - * - * @cname('__pyx_memslice_transpose') - * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< - * cdef int ndim = memslice.memview.view.ndim - * - */ - - /* function exit code */ - __pyx_L1_error:; - { - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_AddTraceback("View.MemoryView.transpose_memslice", __pyx_clineno, __pyx_lineno, __pyx_filename); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif - } - __pyx_r = 0; - __pyx_L0:; - return __pyx_r; -} - -/* "View.MemoryView":976 - * cdef int (*to_dtype_func)(char *, object) except 0 - * - * def __dealloc__(self): # <<<<<<<<<<<<<< - * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) - * - */ - -/* Python wrapper */ -static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self); /*proto*/ -static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); - __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__", 0); - - /* "View.MemoryView":977 - * - * def __dealloc__(self): - * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) # <<<<<<<<<<<<<< - * - * cdef convert_item_to_object(self, char *itemp): - */ - __PYX_XDEC_MEMVIEW((&__pyx_v_self->from_slice), 1); - - /* "View.MemoryView":976 - * cdef int (*to_dtype_func)(char *, object) except 0 - * - * def __dealloc__(self): # <<<<<<<<<<<<<< - * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) - * - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "View.MemoryView":979 - * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) - * - * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< - * if self.to_object_func != NULL: - * return self.to_object_func(itemp) - */ - -static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("convert_item_to_object", 0); - - /* "View.MemoryView":980 - * - * cdef convert_item_to_object(self, char *itemp): - * if self.to_object_func != NULL: # <<<<<<<<<<<<<< - * return self.to_object_func(itemp) - * else: - */ - __pyx_t_1 = ((__pyx_v_self->to_object_func != NULL) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":981 - * cdef convert_item_to_object(self, char *itemp): - * if self.to_object_func != NULL: - * return self.to_object_func(itemp) # <<<<<<<<<<<<<< - * else: - * return memoryview.convert_item_to_object(self, itemp) - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_v_self->to_object_func(__pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 981, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "View.MemoryView":980 - * - * cdef convert_item_to_object(self, char *itemp): - * if self.to_object_func != NULL: # <<<<<<<<<<<<<< - * return self.to_object_func(itemp) - * else: - */ - } - - /* "View.MemoryView":983 - * return self.to_object_func(itemp) - * else: - * return memoryview.convert_item_to_object(self, itemp) # <<<<<<<<<<<<<< - * - * cdef assign_item_from_object(self, char *itemp, object value): - */ - /*else*/ { - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_memoryview_convert_item_to_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 983, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - } - - /* "View.MemoryView":979 - * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) - * - * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< - * if self.to_object_func != NULL: - * return self.to_object_func(itemp) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("View.MemoryView._memoryviewslice.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":985 - * return memoryview.convert_item_to_object(self, itemp) - * - * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< - * if self.to_dtype_func != NULL: - * self.to_dtype_func(itemp, value) - */ - -static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("assign_item_from_object", 0); - - /* "View.MemoryView":986 - * - * cdef assign_item_from_object(self, char *itemp, object value): - * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< - * self.to_dtype_func(itemp, value) - * else: - */ - __pyx_t_1 = ((__pyx_v_self->to_dtype_func != NULL) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":987 - * cdef assign_item_from_object(self, char *itemp, object value): - * if self.to_dtype_func != NULL: - * self.to_dtype_func(itemp, value) # <<<<<<<<<<<<<< - * else: - * memoryview.assign_item_from_object(self, itemp, value) - */ - __pyx_t_2 = __pyx_v_self->to_dtype_func(__pyx_v_itemp, __pyx_v_value); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(2, 987, __pyx_L1_error) - - /* "View.MemoryView":986 - * - * cdef assign_item_from_object(self, char *itemp, object value): - * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< - * self.to_dtype_func(itemp, value) - * else: - */ - goto __pyx_L3; - } - - /* "View.MemoryView":989 - * self.to_dtype_func(itemp, value) - * else: - * memoryview.assign_item_from_object(self, itemp, value) # <<<<<<<<<<<<<< - * - * @property - */ - /*else*/ { - __pyx_t_3 = __pyx_memoryview_assign_item_from_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 989, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } - __pyx_L3:; - - /* "View.MemoryView":985 - * return memoryview.convert_item_to_object(self, itemp) - * - * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< - * if self.to_dtype_func != NULL: - * self.to_dtype_func(itemp, value) - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView._memoryviewslice.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":992 - * - * @property - * def base(self): # <<<<<<<<<<<<<< - * return self.from_object - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - - /* "View.MemoryView":993 - * @property - * def base(self): - * return self.from_object # <<<<<<<<<<<<<< - * - * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->from_object); - __pyx_r = __pyx_v_self->from_object; - goto __pyx_L0; - - /* "View.MemoryView":992 - * - * @property - * def base(self): # <<<<<<<<<<<<<< - * return self.from_object - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - */ - -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_memoryviewslice___reduce_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 2, __pyx_L1_error) - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - -/* Python wrapper */ -static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf___pyx_memoryviewslice_2__setstate_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 4, __pyx_L1_error) - - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":999 - * - * @cname('__pyx_memoryview_fromslice') - * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< - * int ndim, - * object (*to_object_func)(char *), - */ - -static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewslice, int __pyx_v_ndim, PyObject *(*__pyx_v_to_object_func)(char *), int (*__pyx_v_to_dtype_func)(char *, PyObject *), int __pyx_v_dtype_is_object) { - struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; - Py_ssize_t __pyx_v_suboffset; - PyObject *__pyx_v_length = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - __Pyx_TypeInfo *__pyx_t_4; - Py_buffer __pyx_t_5; - Py_ssize_t *__pyx_t_6; - Py_ssize_t *__pyx_t_7; - Py_ssize_t *__pyx_t_8; - Py_ssize_t __pyx_t_9; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("memoryview_fromslice", 0); - - /* "View.MemoryView":1007 - * cdef _memoryviewslice result - * - * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< - * return None - * - */ - __pyx_t_1 = ((((PyObject *)__pyx_v_memviewslice.memview) == Py_None) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":1008 - * - * if memviewslice.memview == Py_None: - * return None # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(__pyx_r); - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - - /* "View.MemoryView":1007 - * cdef _memoryviewslice result - * - * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< - * return None - * - */ - } - - /* "View.MemoryView":1013 - * - * - * result = _memoryviewslice(None, 0, dtype_is_object) # <<<<<<<<<<<<<< - * - * result.from_slice = memviewslice - */ - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1013, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1013, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - PyTuple_SET_ITEM(__pyx_t_3, 0, Py_None); - __Pyx_INCREF(__pyx_int_0); - __Pyx_GIVEREF(__pyx_int_0); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_0); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); - __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryviewslice_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1013, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); - __pyx_t_2 = 0; - - /* "View.MemoryView":1015 - * result = _memoryviewslice(None, 0, dtype_is_object) - * - * result.from_slice = memviewslice # <<<<<<<<<<<<<< - * __PYX_INC_MEMVIEW(&memviewslice, 1) - * - */ - __pyx_v_result->from_slice = __pyx_v_memviewslice; - - /* "View.MemoryView":1016 - * - * result.from_slice = memviewslice - * __PYX_INC_MEMVIEW(&memviewslice, 1) # <<<<<<<<<<<<<< - * - * result.from_object = ( memviewslice.memview).base - */ - __PYX_INC_MEMVIEW((&__pyx_v_memviewslice), 1); - - /* "View.MemoryView":1018 - * __PYX_INC_MEMVIEW(&memviewslice, 1) - * - * result.from_object = ( memviewslice.memview).base # <<<<<<<<<<<<<< - * result.typeinfo = memviewslice.memview.typeinfo - * - */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_memviewslice.memview), __pyx_n_s_base); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1018, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_GIVEREF(__pyx_t_2); - __Pyx_GOTREF(__pyx_v_result->from_object); - __Pyx_DECREF(__pyx_v_result->from_object); - __pyx_v_result->from_object = __pyx_t_2; - __pyx_t_2 = 0; - - /* "View.MemoryView":1019 - * - * result.from_object = ( memviewslice.memview).base - * result.typeinfo = memviewslice.memview.typeinfo # <<<<<<<<<<<<<< - * - * result.view = memviewslice.memview.view - */ - __pyx_t_4 = __pyx_v_memviewslice.memview->typeinfo; - __pyx_v_result->__pyx_base.typeinfo = __pyx_t_4; - - /* "View.MemoryView":1021 - * result.typeinfo = memviewslice.memview.typeinfo - * - * result.view = memviewslice.memview.view # <<<<<<<<<<<<<< - * result.view.buf = memviewslice.data - * result.view.ndim = ndim - */ - __pyx_t_5 = __pyx_v_memviewslice.memview->view; - __pyx_v_result->__pyx_base.view = __pyx_t_5; - - /* "View.MemoryView":1022 - * - * result.view = memviewslice.memview.view - * result.view.buf = memviewslice.data # <<<<<<<<<<<<<< - * result.view.ndim = ndim - * (<__pyx_buffer *> &result.view).obj = Py_None - */ - __pyx_v_result->__pyx_base.view.buf = ((void *)__pyx_v_memviewslice.data); - - /* "View.MemoryView":1023 - * result.view = memviewslice.memview.view - * result.view.buf = memviewslice.data - * result.view.ndim = ndim # <<<<<<<<<<<<<< - * (<__pyx_buffer *> &result.view).obj = Py_None - * Py_INCREF(Py_None) - */ - __pyx_v_result->__pyx_base.view.ndim = __pyx_v_ndim; - - /* "View.MemoryView":1024 - * result.view.buf = memviewslice.data - * result.view.ndim = ndim - * (<__pyx_buffer *> &result.view).obj = Py_None # <<<<<<<<<<<<<< - * Py_INCREF(Py_None) - * - */ - ((Py_buffer *)(&__pyx_v_result->__pyx_base.view))->obj = Py_None; - - /* "View.MemoryView":1025 - * result.view.ndim = ndim - * (<__pyx_buffer *> &result.view).obj = Py_None - * Py_INCREF(Py_None) # <<<<<<<<<<<<<< - * - * if (memviewslice.memview).flags & PyBUF_WRITABLE: - */ - Py_INCREF(Py_None); - - /* "View.MemoryView":1027 - * Py_INCREF(Py_None) - * - * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< - * result.flags = PyBUF_RECORDS - * else: - */ - __pyx_t_1 = ((((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->flags & PyBUF_WRITABLE) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":1028 - * - * if (memviewslice.memview).flags & PyBUF_WRITABLE: - * result.flags = PyBUF_RECORDS # <<<<<<<<<<<<<< - * else: - * result.flags = PyBUF_RECORDS_RO - */ - __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS; - - /* "View.MemoryView":1027 - * Py_INCREF(Py_None) - * - * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< - * result.flags = PyBUF_RECORDS - * else: - */ - goto __pyx_L4; - } - - /* "View.MemoryView":1030 - * result.flags = PyBUF_RECORDS - * else: - * result.flags = PyBUF_RECORDS_RO # <<<<<<<<<<<<<< - * - * result.view.shape = result.from_slice.shape - */ - /*else*/ { - __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS_RO; - } - __pyx_L4:; - - /* "View.MemoryView":1032 - * result.flags = PyBUF_RECORDS_RO - * - * result.view.shape = result.from_slice.shape # <<<<<<<<<<<<<< - * result.view.strides = result.from_slice.strides - * - */ - __pyx_v_result->__pyx_base.view.shape = ((Py_ssize_t *)__pyx_v_result->from_slice.shape); - - /* "View.MemoryView":1033 - * - * result.view.shape = result.from_slice.shape - * result.view.strides = result.from_slice.strides # <<<<<<<<<<<<<< - * - * - */ - __pyx_v_result->__pyx_base.view.strides = ((Py_ssize_t *)__pyx_v_result->from_slice.strides); - - /* "View.MemoryView":1036 - * - * - * result.view.suboffsets = NULL # <<<<<<<<<<<<<< - * for suboffset in result.from_slice.suboffsets[:ndim]: - * if suboffset >= 0: - */ - __pyx_v_result->__pyx_base.view.suboffsets = NULL; - - /* "View.MemoryView":1037 - * - * result.view.suboffsets = NULL - * for suboffset in result.from_slice.suboffsets[:ndim]: # <<<<<<<<<<<<<< - * if suboffset >= 0: - * result.view.suboffsets = result.from_slice.suboffsets - */ - __pyx_t_7 = (__pyx_v_result->from_slice.suboffsets + __pyx_v_ndim); - for (__pyx_t_8 = __pyx_v_result->from_slice.suboffsets; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { - __pyx_t_6 = __pyx_t_8; - __pyx_v_suboffset = (__pyx_t_6[0]); - - /* "View.MemoryView":1038 - * result.view.suboffsets = NULL - * for suboffset in result.from_slice.suboffsets[:ndim]: - * if suboffset >= 0: # <<<<<<<<<<<<<< - * result.view.suboffsets = result.from_slice.suboffsets - * break - */ - __pyx_t_1 = ((__pyx_v_suboffset >= 0) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":1039 - * for suboffset in result.from_slice.suboffsets[:ndim]: - * if suboffset >= 0: - * result.view.suboffsets = result.from_slice.suboffsets # <<<<<<<<<<<<<< - * break - * - */ - __pyx_v_result->__pyx_base.view.suboffsets = ((Py_ssize_t *)__pyx_v_result->from_slice.suboffsets); - - /* "View.MemoryView":1040 - * if suboffset >= 0: - * result.view.suboffsets = result.from_slice.suboffsets - * break # <<<<<<<<<<<<<< - * - * result.view.len = result.view.itemsize - */ - goto __pyx_L6_break; - - /* "View.MemoryView":1038 - * result.view.suboffsets = NULL - * for suboffset in result.from_slice.suboffsets[:ndim]: - * if suboffset >= 0: # <<<<<<<<<<<<<< - * result.view.suboffsets = result.from_slice.suboffsets - * break - */ - } - } - __pyx_L6_break:; - - /* "View.MemoryView":1042 - * break - * - * result.view.len = result.view.itemsize # <<<<<<<<<<<<<< - * for length in result.view.shape[:ndim]: - * result.view.len *= length - */ - __pyx_t_9 = __pyx_v_result->__pyx_base.view.itemsize; - __pyx_v_result->__pyx_base.view.len = __pyx_t_9; - - /* "View.MemoryView":1043 - * - * result.view.len = result.view.itemsize - * for length in result.view.shape[:ndim]: # <<<<<<<<<<<<<< - * result.view.len *= length - * - */ - __pyx_t_7 = (__pyx_v_result->__pyx_base.view.shape + __pyx_v_ndim); - for (__pyx_t_8 = __pyx_v_result->__pyx_base.view.shape; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { - __pyx_t_6 = __pyx_t_8; - __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_6[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1043, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_2); - __pyx_t_2 = 0; - - /* "View.MemoryView":1044 - * result.view.len = result.view.itemsize - * for length in result.view.shape[:ndim]: - * result.view.len *= length # <<<<<<<<<<<<<< - * - * result.to_object_func = to_object_func - */ - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_result->__pyx_base.view.len); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1044, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_v_length); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1044, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 1044, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_result->__pyx_base.view.len = __pyx_t_9; - } - - /* "View.MemoryView":1046 - * result.view.len *= length - * - * result.to_object_func = to_object_func # <<<<<<<<<<<<<< - * result.to_dtype_func = to_dtype_func - * - */ - __pyx_v_result->to_object_func = __pyx_v_to_object_func; - - /* "View.MemoryView":1047 - * - * result.to_object_func = to_object_func - * result.to_dtype_func = to_dtype_func # <<<<<<<<<<<<<< - * - * return result - */ - __pyx_v_result->to_dtype_func = __pyx_v_to_dtype_func; - - /* "View.MemoryView":1049 - * result.to_dtype_func = to_dtype_func - * - * return result # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_get_slice_from_memoryview') - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_result)); - __pyx_r = ((PyObject *)__pyx_v_result); - goto __pyx_L0; - - /* "View.MemoryView":999 - * - * @cname('__pyx_memoryview_fromslice') - * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< - * int ndim, - * object (*to_object_func)(char *), - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.memoryview_fromslice", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_result); - __Pyx_XDECREF(__pyx_v_length); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":1052 - * - * @cname('__pyx_memoryview_get_slice_from_memoryview') - * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< - * __Pyx_memviewslice *mslice) except NULL: - * cdef _memoryviewslice obj - */ - -static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_mslice) { - struct __pyx_memoryviewslice_obj *__pyx_v_obj = 0; - __Pyx_memviewslice *__pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("get_slice_from_memview", 0); - - /* "View.MemoryView":1055 - * __Pyx_memviewslice *mslice) except NULL: - * cdef _memoryviewslice obj - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * obj = memview - * return &obj.from_slice - */ - __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1056 - * cdef _memoryviewslice obj - * if isinstance(memview, _memoryviewslice): - * obj = memview # <<<<<<<<<<<<<< - * return &obj.from_slice - * else: - */ - if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(2, 1056, __pyx_L1_error) - __pyx_t_3 = ((PyObject *)__pyx_v_memview); - __Pyx_INCREF(__pyx_t_3); - __pyx_v_obj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); - __pyx_t_3 = 0; - - /* "View.MemoryView":1057 - * if isinstance(memview, _memoryviewslice): - * obj = memview - * return &obj.from_slice # <<<<<<<<<<<<<< - * else: - * slice_copy(memview, mslice) - */ - __pyx_r = (&__pyx_v_obj->from_slice); - goto __pyx_L0; - - /* "View.MemoryView":1055 - * __Pyx_memviewslice *mslice) except NULL: - * cdef _memoryviewslice obj - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * obj = memview - * return &obj.from_slice - */ - } - - /* "View.MemoryView":1059 - * return &obj.from_slice - * else: - * slice_copy(memview, mslice) # <<<<<<<<<<<<<< - * return mslice - * - */ - /*else*/ { - __pyx_memoryview_slice_copy(__pyx_v_memview, __pyx_v_mslice); - - /* "View.MemoryView":1060 - * else: - * slice_copy(memview, mslice) - * return mslice # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_slice_copy') - */ - __pyx_r = __pyx_v_mslice; - goto __pyx_L0; - } - - /* "View.MemoryView":1052 - * - * @cname('__pyx_memoryview_get_slice_from_memoryview') - * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< - * __Pyx_memviewslice *mslice) except NULL: - * cdef _memoryviewslice obj - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("View.MemoryView.get_slice_from_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_obj); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":1063 - * - * @cname('__pyx_memoryview_slice_copy') - * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< - * cdef int dim - * cdef (Py_ssize_t*) shape, strides, suboffsets - */ - -static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_dst) { - int __pyx_v_dim; - Py_ssize_t *__pyx_v_shape; - Py_ssize_t *__pyx_v_strides; - Py_ssize_t *__pyx_v_suboffsets; - __Pyx_RefNannyDeclarations - Py_ssize_t *__pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_t_4; - Py_ssize_t __pyx_t_5; - __Pyx_RefNannySetupContext("slice_copy", 0); - - /* "View.MemoryView":1067 - * cdef (Py_ssize_t*) shape, strides, suboffsets - * - * shape = memview.view.shape # <<<<<<<<<<<<<< - * strides = memview.view.strides - * suboffsets = memview.view.suboffsets - */ - __pyx_t_1 = __pyx_v_memview->view.shape; - __pyx_v_shape = __pyx_t_1; - - /* "View.MemoryView":1068 - * - * shape = memview.view.shape - * strides = memview.view.strides # <<<<<<<<<<<<<< - * suboffsets = memview.view.suboffsets - * - */ - __pyx_t_1 = __pyx_v_memview->view.strides; - __pyx_v_strides = __pyx_t_1; - - /* "View.MemoryView":1069 - * shape = memview.view.shape - * strides = memview.view.strides - * suboffsets = memview.view.suboffsets # <<<<<<<<<<<<<< - * - * dst.memview = <__pyx_memoryview *> memview - */ - __pyx_t_1 = __pyx_v_memview->view.suboffsets; - __pyx_v_suboffsets = __pyx_t_1; - - /* "View.MemoryView":1071 - * suboffsets = memview.view.suboffsets - * - * dst.memview = <__pyx_memoryview *> memview # <<<<<<<<<<<<<< - * dst.data = memview.view.buf - * - */ - __pyx_v_dst->memview = ((struct __pyx_memoryview_obj *)__pyx_v_memview); - - /* "View.MemoryView":1072 - * - * dst.memview = <__pyx_memoryview *> memview - * dst.data = memview.view.buf # <<<<<<<<<<<<<< - * - * for dim in range(memview.view.ndim): - */ - __pyx_v_dst->data = ((char *)__pyx_v_memview->view.buf); - - /* "View.MemoryView":1074 - * dst.data = memview.view.buf - * - * for dim in range(memview.view.ndim): # <<<<<<<<<<<<<< - * dst.shape[dim] = shape[dim] - * dst.strides[dim] = strides[dim] - */ - __pyx_t_2 = __pyx_v_memview->view.ndim; - __pyx_t_3 = __pyx_t_2; - for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { - __pyx_v_dim = __pyx_t_4; - - /* "View.MemoryView":1075 - * - * for dim in range(memview.view.ndim): - * dst.shape[dim] = shape[dim] # <<<<<<<<<<<<<< - * dst.strides[dim] = strides[dim] - * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 - */ - (__pyx_v_dst->shape[__pyx_v_dim]) = (__pyx_v_shape[__pyx_v_dim]); - - /* "View.MemoryView":1076 - * for dim in range(memview.view.ndim): - * dst.shape[dim] = shape[dim] - * dst.strides[dim] = strides[dim] # <<<<<<<<<<<<<< - * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 - * - */ - (__pyx_v_dst->strides[__pyx_v_dim]) = (__pyx_v_strides[__pyx_v_dim]); - - /* "View.MemoryView":1077 - * dst.shape[dim] = shape[dim] - * dst.strides[dim] = strides[dim] - * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_copy_object') - */ - if ((__pyx_v_suboffsets != 0)) { - __pyx_t_5 = (__pyx_v_suboffsets[__pyx_v_dim]); - } else { - __pyx_t_5 = -1L; - } - (__pyx_v_dst->suboffsets[__pyx_v_dim]) = __pyx_t_5; - } - - /* "View.MemoryView":1063 - * - * @cname('__pyx_memoryview_slice_copy') - * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< - * cdef int dim - * cdef (Py_ssize_t*) shape, strides, suboffsets - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "View.MemoryView":1080 - * - * @cname('__pyx_memoryview_copy_object') - * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< - * "Create a new memoryview object" - * cdef __Pyx_memviewslice memviewslice - */ - -static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx_v_memview) { - __Pyx_memviewslice __pyx_v_memviewslice; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("memoryview_copy", 0); - - /* "View.MemoryView":1083 - * "Create a new memoryview object" - * cdef __Pyx_memviewslice memviewslice - * slice_copy(memview, &memviewslice) # <<<<<<<<<<<<<< - * return memoryview_copy_from_slice(memview, &memviewslice) - * - */ - __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_memviewslice)); - - /* "View.MemoryView":1084 - * cdef __Pyx_memviewslice memviewslice - * slice_copy(memview, &memviewslice) - * return memoryview_copy_from_slice(memview, &memviewslice) # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_copy_object_from_slice') - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __pyx_memoryview_copy_object_from_slice(__pyx_v_memview, (&__pyx_v_memviewslice)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1084, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "View.MemoryView":1080 - * - * @cname('__pyx_memoryview_copy_object') - * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< - * "Create a new memoryview object" - * cdef __Pyx_memviewslice memviewslice - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("View.MemoryView.memoryview_copy", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":1087 - * - * @cname('__pyx_memoryview_copy_object_from_slice') - * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< - * """ - * Create a new memoryview object from a given memoryview object and slice. - */ - -static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_memviewslice) { - PyObject *(*__pyx_v_to_object_func)(char *); - int (*__pyx_v_to_dtype_func)(char *, PyObject *); - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *(*__pyx_t_3)(char *); - int (*__pyx_t_4)(char *, PyObject *); - PyObject *__pyx_t_5 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("memoryview_copy_from_slice", 0); - - /* "View.MemoryView":1094 - * cdef int (*to_dtype_func)(char *, object) except 0 - * - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * to_object_func = (<_memoryviewslice> memview).to_object_func - * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func - */ - __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1095 - * - * if isinstance(memview, _memoryviewslice): - * to_object_func = (<_memoryviewslice> memview).to_object_func # <<<<<<<<<<<<<< - * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func - * else: - */ - __pyx_t_3 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_object_func; - __pyx_v_to_object_func = __pyx_t_3; - - /* "View.MemoryView":1096 - * if isinstance(memview, _memoryviewslice): - * to_object_func = (<_memoryviewslice> memview).to_object_func - * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func # <<<<<<<<<<<<<< - * else: - * to_object_func = NULL - */ - __pyx_t_4 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_dtype_func; - __pyx_v_to_dtype_func = __pyx_t_4; - - /* "View.MemoryView":1094 - * cdef int (*to_dtype_func)(char *, object) except 0 - * - * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< - * to_object_func = (<_memoryviewslice> memview).to_object_func - * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func - */ - goto __pyx_L3; - } - - /* "View.MemoryView":1098 - * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func - * else: - * to_object_func = NULL # <<<<<<<<<<<<<< - * to_dtype_func = NULL - * - */ - /*else*/ { - __pyx_v_to_object_func = NULL; - - /* "View.MemoryView":1099 - * else: - * to_object_func = NULL - * to_dtype_func = NULL # <<<<<<<<<<<<<< - * - * return memoryview_fromslice(memviewslice[0], memview.view.ndim, - */ - __pyx_v_to_dtype_func = NULL; - } - __pyx_L3:; - - /* "View.MemoryView":1101 - * to_dtype_func = NULL - * - * return memoryview_fromslice(memviewslice[0], memview.view.ndim, # <<<<<<<<<<<<<< - * to_object_func, to_dtype_func, - * memview.dtype_is_object) - */ - __Pyx_XDECREF(__pyx_r); - - /* "View.MemoryView":1103 - * return memoryview_fromslice(memviewslice[0], memview.view.ndim, - * to_object_func, to_dtype_func, - * memview.dtype_is_object) # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_5 = __pyx_memoryview_fromslice((__pyx_v_memviewslice[0]), __pyx_v_memview->view.ndim, __pyx_v_to_object_func, __pyx_v_to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1101, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_r = __pyx_t_5; - __pyx_t_5 = 0; - goto __pyx_L0; - - /* "View.MemoryView":1087 - * - * @cname('__pyx_memoryview_copy_object_from_slice') - * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< - * """ - * Create a new memoryview object from a given memoryview object and slice. - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.memoryview_copy_from_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "View.MemoryView":1109 - * - * - * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< - * if arg < 0: - * return -arg - */ - -static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { - Py_ssize_t __pyx_r; - int __pyx_t_1; - - /* "View.MemoryView":1110 - * - * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: - * if arg < 0: # <<<<<<<<<<<<<< - * return -arg - * else: - */ - __pyx_t_1 = ((__pyx_v_arg < 0) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":1111 - * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: - * if arg < 0: - * return -arg # <<<<<<<<<<<<<< - * else: - * return arg - */ - __pyx_r = (-__pyx_v_arg); - goto __pyx_L0; - - /* "View.MemoryView":1110 - * - * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: - * if arg < 0: # <<<<<<<<<<<<<< - * return -arg - * else: - */ - } - - /* "View.MemoryView":1113 - * return -arg - * else: - * return arg # <<<<<<<<<<<<<< - * - * @cname('__pyx_get_best_slice_order') - */ - /*else*/ { - __pyx_r = __pyx_v_arg; - goto __pyx_L0; - } - - /* "View.MemoryView":1109 - * - * - * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< - * if arg < 0: - * return -arg - */ - - /* function exit code */ - __pyx_L0:; - return __pyx_r; -} - -/* "View.MemoryView":1116 - * - * @cname('__pyx_get_best_slice_order') - * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< - * """ - * Figure out the best memory access order for a given slice. - */ - -static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim) { - int __pyx_v_i; - Py_ssize_t __pyx_v_c_stride; - Py_ssize_t __pyx_v_f_stride; - char __pyx_r; - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_t_4; - - /* "View.MemoryView":1121 - * """ - * cdef int i - * cdef Py_ssize_t c_stride = 0 # <<<<<<<<<<<<<< - * cdef Py_ssize_t f_stride = 0 - * - */ - __pyx_v_c_stride = 0; - - /* "View.MemoryView":1122 - * cdef int i - * cdef Py_ssize_t c_stride = 0 - * cdef Py_ssize_t f_stride = 0 # <<<<<<<<<<<<<< - * - * for i in range(ndim - 1, -1, -1): - */ - __pyx_v_f_stride = 0; - - /* "View.MemoryView":1124 - * cdef Py_ssize_t f_stride = 0 - * - * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< - * if mslice.shape[i] > 1: - * c_stride = mslice.strides[i] - */ - for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { - __pyx_v_i = __pyx_t_1; - - /* "View.MemoryView":1125 - * - * for i in range(ndim - 1, -1, -1): - * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< - * c_stride = mslice.strides[i] - * break - */ - __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1126 - * for i in range(ndim - 1, -1, -1): - * if mslice.shape[i] > 1: - * c_stride = mslice.strides[i] # <<<<<<<<<<<<<< - * break - * - */ - __pyx_v_c_stride = (__pyx_v_mslice->strides[__pyx_v_i]); - - /* "View.MemoryView":1127 - * if mslice.shape[i] > 1: - * c_stride = mslice.strides[i] - * break # <<<<<<<<<<<<<< - * - * for i in range(ndim): - */ - goto __pyx_L4_break; - - /* "View.MemoryView":1125 - * - * for i in range(ndim - 1, -1, -1): - * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< - * c_stride = mslice.strides[i] - * break - */ - } - } - __pyx_L4_break:; - - /* "View.MemoryView":1129 - * break - * - * for i in range(ndim): # <<<<<<<<<<<<<< - * if mslice.shape[i] > 1: - * f_stride = mslice.strides[i] - */ - __pyx_t_1 = __pyx_v_ndim; - __pyx_t_3 = __pyx_t_1; - for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { - __pyx_v_i = __pyx_t_4; - - /* "View.MemoryView":1130 - * - * for i in range(ndim): - * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< - * f_stride = mslice.strides[i] - * break - */ - __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1131 - * for i in range(ndim): - * if mslice.shape[i] > 1: - * f_stride = mslice.strides[i] # <<<<<<<<<<<<<< - * break - * - */ - __pyx_v_f_stride = (__pyx_v_mslice->strides[__pyx_v_i]); - - /* "View.MemoryView":1132 - * if mslice.shape[i] > 1: - * f_stride = mslice.strides[i] - * break # <<<<<<<<<<<<<< - * - * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): - */ - goto __pyx_L7_break; - - /* "View.MemoryView":1130 - * - * for i in range(ndim): - * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< - * f_stride = mslice.strides[i] - * break - */ - } - } - __pyx_L7_break:; - - /* "View.MemoryView":1134 - * break - * - * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< - * return 'C' - * else: - */ - __pyx_t_2 = ((abs_py_ssize_t(__pyx_v_c_stride) <= abs_py_ssize_t(__pyx_v_f_stride)) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1135 - * - * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): - * return 'C' # <<<<<<<<<<<<<< - * else: - * return 'F' - */ - __pyx_r = 'C'; - goto __pyx_L0; - - /* "View.MemoryView":1134 - * break - * - * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< - * return 'C' - * else: - */ - } - - /* "View.MemoryView":1137 - * return 'C' - * else: - * return 'F' # <<<<<<<<<<<<<< - * - * @cython.cdivision(True) - */ - /*else*/ { - __pyx_r = 'F'; - goto __pyx_L0; - } - - /* "View.MemoryView":1116 - * - * @cname('__pyx_get_best_slice_order') - * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< - * """ - * Figure out the best memory access order for a given slice. - */ - - /* function exit code */ - __pyx_L0:; - return __pyx_r; -} - -/* "View.MemoryView":1140 - * - * @cython.cdivision(True) - * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< - * char *dst_data, Py_ssize_t *dst_strides, - * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, - */ - -static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v_src_strides, char *__pyx_v_dst_data, Py_ssize_t *__pyx_v_dst_strides, Py_ssize_t *__pyx_v_src_shape, Py_ssize_t *__pyx_v_dst_shape, int __pyx_v_ndim, size_t __pyx_v_itemsize) { - CYTHON_UNUSED Py_ssize_t __pyx_v_i; - CYTHON_UNUSED Py_ssize_t __pyx_v_src_extent; - Py_ssize_t __pyx_v_dst_extent; - Py_ssize_t __pyx_v_src_stride; - Py_ssize_t __pyx_v_dst_stride; - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - Py_ssize_t __pyx_t_4; - Py_ssize_t __pyx_t_5; - Py_ssize_t __pyx_t_6; - - /* "View.MemoryView":1147 - * - * cdef Py_ssize_t i - * cdef Py_ssize_t src_extent = src_shape[0] # <<<<<<<<<<<<<< - * cdef Py_ssize_t dst_extent = dst_shape[0] - * cdef Py_ssize_t src_stride = src_strides[0] - */ - __pyx_v_src_extent = (__pyx_v_src_shape[0]); - - /* "View.MemoryView":1148 - * cdef Py_ssize_t i - * cdef Py_ssize_t src_extent = src_shape[0] - * cdef Py_ssize_t dst_extent = dst_shape[0] # <<<<<<<<<<<<<< - * cdef Py_ssize_t src_stride = src_strides[0] - * cdef Py_ssize_t dst_stride = dst_strides[0] - */ - __pyx_v_dst_extent = (__pyx_v_dst_shape[0]); - - /* "View.MemoryView":1149 - * cdef Py_ssize_t src_extent = src_shape[0] - * cdef Py_ssize_t dst_extent = dst_shape[0] - * cdef Py_ssize_t src_stride = src_strides[0] # <<<<<<<<<<<<<< - * cdef Py_ssize_t dst_stride = dst_strides[0] - * - */ - __pyx_v_src_stride = (__pyx_v_src_strides[0]); - - /* "View.MemoryView":1150 - * cdef Py_ssize_t dst_extent = dst_shape[0] - * cdef Py_ssize_t src_stride = src_strides[0] - * cdef Py_ssize_t dst_stride = dst_strides[0] # <<<<<<<<<<<<<< - * - * if ndim == 1: - */ - __pyx_v_dst_stride = (__pyx_v_dst_strides[0]); - - /* "View.MemoryView":1152 - * cdef Py_ssize_t dst_stride = dst_strides[0] - * - * if ndim == 1: # <<<<<<<<<<<<<< - * if (src_stride > 0 and dst_stride > 0 and - * src_stride == itemsize == dst_stride): - */ - __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":1153 - * - * if ndim == 1: - * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< - * src_stride == itemsize == dst_stride): - * memcpy(dst_data, src_data, itemsize * dst_extent) - */ - __pyx_t_2 = ((__pyx_v_src_stride > 0) != 0); - if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L5_bool_binop_done; - } - __pyx_t_2 = ((__pyx_v_dst_stride > 0) != 0); - if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L5_bool_binop_done; - } - - /* "View.MemoryView":1154 - * if ndim == 1: - * if (src_stride > 0 and dst_stride > 0 and - * src_stride == itemsize == dst_stride): # <<<<<<<<<<<<<< - * memcpy(dst_data, src_data, itemsize * dst_extent) - * else: - */ - __pyx_t_2 = (((size_t)__pyx_v_src_stride) == __pyx_v_itemsize); - if (__pyx_t_2) { - __pyx_t_2 = (__pyx_v_itemsize == ((size_t)__pyx_v_dst_stride)); - } - __pyx_t_3 = (__pyx_t_2 != 0); - __pyx_t_1 = __pyx_t_3; - __pyx_L5_bool_binop_done:; - - /* "View.MemoryView":1153 - * - * if ndim == 1: - * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< - * src_stride == itemsize == dst_stride): - * memcpy(dst_data, src_data, itemsize * dst_extent) - */ - if (__pyx_t_1) { - - /* "View.MemoryView":1155 - * if (src_stride > 0 and dst_stride > 0 and - * src_stride == itemsize == dst_stride): - * memcpy(dst_data, src_data, itemsize * dst_extent) # <<<<<<<<<<<<<< - * else: - * for i in range(dst_extent): - */ - (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, (__pyx_v_itemsize * __pyx_v_dst_extent))); - - /* "View.MemoryView":1153 - * - * if ndim == 1: - * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< - * src_stride == itemsize == dst_stride): - * memcpy(dst_data, src_data, itemsize * dst_extent) - */ - goto __pyx_L4; - } - - /* "View.MemoryView":1157 - * memcpy(dst_data, src_data, itemsize * dst_extent) - * else: - * for i in range(dst_extent): # <<<<<<<<<<<<<< - * memcpy(dst_data, src_data, itemsize) - * src_data += src_stride - */ - /*else*/ { - __pyx_t_4 = __pyx_v_dst_extent; - __pyx_t_5 = __pyx_t_4; - for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_i = __pyx_t_6; - - /* "View.MemoryView":1158 - * else: - * for i in range(dst_extent): - * memcpy(dst_data, src_data, itemsize) # <<<<<<<<<<<<<< - * src_data += src_stride - * dst_data += dst_stride - */ - (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, __pyx_v_itemsize)); - - /* "View.MemoryView":1159 - * for i in range(dst_extent): - * memcpy(dst_data, src_data, itemsize) - * src_data += src_stride # <<<<<<<<<<<<<< - * dst_data += dst_stride - * else: - */ - __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); - - /* "View.MemoryView":1160 - * memcpy(dst_data, src_data, itemsize) - * src_data += src_stride - * dst_data += dst_stride # <<<<<<<<<<<<<< - * else: - * for i in range(dst_extent): - */ - __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); - } - } - __pyx_L4:; - - /* "View.MemoryView":1152 - * cdef Py_ssize_t dst_stride = dst_strides[0] - * - * if ndim == 1: # <<<<<<<<<<<<<< - * if (src_stride > 0 and dst_stride > 0 and - * src_stride == itemsize == dst_stride): - */ - goto __pyx_L3; - } - - /* "View.MemoryView":1162 - * dst_data += dst_stride - * else: - * for i in range(dst_extent): # <<<<<<<<<<<<<< - * _copy_strided_to_strided(src_data, src_strides + 1, - * dst_data, dst_strides + 1, - */ - /*else*/ { - __pyx_t_4 = __pyx_v_dst_extent; - __pyx_t_5 = __pyx_t_4; - for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_i = __pyx_t_6; - - /* "View.MemoryView":1163 - * else: - * for i in range(dst_extent): - * _copy_strided_to_strided(src_data, src_strides + 1, # <<<<<<<<<<<<<< - * dst_data, dst_strides + 1, - * src_shape + 1, dst_shape + 1, - */ - _copy_strided_to_strided(__pyx_v_src_data, (__pyx_v_src_strides + 1), __pyx_v_dst_data, (__pyx_v_dst_strides + 1), (__pyx_v_src_shape + 1), (__pyx_v_dst_shape + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize); - - /* "View.MemoryView":1167 - * src_shape + 1, dst_shape + 1, - * ndim - 1, itemsize) - * src_data += src_stride # <<<<<<<<<<<<<< - * dst_data += dst_stride - * - */ - __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); - - /* "View.MemoryView":1168 - * ndim - 1, itemsize) - * src_data += src_stride - * dst_data += dst_stride # <<<<<<<<<<<<<< - * - * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, - */ - __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); - } - } - __pyx_L3:; - - /* "View.MemoryView":1140 - * - * @cython.cdivision(True) - * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< - * char *dst_data, Py_ssize_t *dst_strides, - * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, - */ - - /* function exit code */ -} - -/* "View.MemoryView":1170 - * dst_data += dst_stride - * - * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< - * __Pyx_memviewslice *dst, - * int ndim, size_t itemsize) nogil: - */ - -static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize) { - - /* "View.MemoryView":1173 - * __Pyx_memviewslice *dst, - * int ndim, size_t itemsize) nogil: - * _copy_strided_to_strided(src.data, src.strides, dst.data, dst.strides, # <<<<<<<<<<<<<< - * src.shape, dst.shape, ndim, itemsize) - * - */ - _copy_strided_to_strided(__pyx_v_src->data, __pyx_v_src->strides, __pyx_v_dst->data, __pyx_v_dst->strides, __pyx_v_src->shape, __pyx_v_dst->shape, __pyx_v_ndim, __pyx_v_itemsize); - - /* "View.MemoryView":1170 - * dst_data += dst_stride - * - * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< - * __Pyx_memviewslice *dst, - * int ndim, size_t itemsize) nogil: - */ - - /* function exit code */ -} - -/* "View.MemoryView":1177 - * - * @cname('__pyx_memoryview_slice_get_size') - * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< - * "Return the size of the memory occupied by the slice in number of bytes" - * cdef Py_ssize_t shape, size = src.memview.view.itemsize - */ - -static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_src, int __pyx_v_ndim) { - Py_ssize_t __pyx_v_shape; - Py_ssize_t __pyx_v_size; - Py_ssize_t __pyx_r; - Py_ssize_t __pyx_t_1; - Py_ssize_t *__pyx_t_2; - Py_ssize_t *__pyx_t_3; - Py_ssize_t *__pyx_t_4; - - /* "View.MemoryView":1179 - * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: - * "Return the size of the memory occupied by the slice in number of bytes" - * cdef Py_ssize_t shape, size = src.memview.view.itemsize # <<<<<<<<<<<<<< - * - * for shape in src.shape[:ndim]: - */ - __pyx_t_1 = __pyx_v_src->memview->view.itemsize; - __pyx_v_size = __pyx_t_1; - - /* "View.MemoryView":1181 - * cdef Py_ssize_t shape, size = src.memview.view.itemsize - * - * for shape in src.shape[:ndim]: # <<<<<<<<<<<<<< - * size *= shape - * - */ - __pyx_t_3 = (__pyx_v_src->shape + __pyx_v_ndim); - for (__pyx_t_4 = __pyx_v_src->shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { - __pyx_t_2 = __pyx_t_4; - __pyx_v_shape = (__pyx_t_2[0]); - - /* "View.MemoryView":1182 - * - * for shape in src.shape[:ndim]: - * size *= shape # <<<<<<<<<<<<<< - * - * return size - */ - __pyx_v_size = (__pyx_v_size * __pyx_v_shape); - } - - /* "View.MemoryView":1184 - * size *= shape - * - * return size # <<<<<<<<<<<<<< - * - * @cname('__pyx_fill_contig_strides_array') - */ - __pyx_r = __pyx_v_size; - goto __pyx_L0; - - /* "View.MemoryView":1177 - * - * @cname('__pyx_memoryview_slice_get_size') - * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< - * "Return the size of the memory occupied by the slice in number of bytes" - * cdef Py_ssize_t shape, size = src.memview.view.itemsize - */ - - /* function exit code */ - __pyx_L0:; - return __pyx_r; -} - -/* "View.MemoryView":1187 - * - * @cname('__pyx_fill_contig_strides_array') - * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< - * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, - * int ndim, char order) nogil: - */ - -static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, Py_ssize_t __pyx_v_stride, int __pyx_v_ndim, char __pyx_v_order) { - int __pyx_v_idx; - Py_ssize_t __pyx_r; - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_t_4; - - /* "View.MemoryView":1196 - * cdef int idx - * - * if order == 'F': # <<<<<<<<<<<<<< - * for idx in range(ndim): - * strides[idx] = stride - */ - __pyx_t_1 = ((__pyx_v_order == 'F') != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":1197 - * - * if order == 'F': - * for idx in range(ndim): # <<<<<<<<<<<<<< - * strides[idx] = stride - * stride *= shape[idx] - */ - __pyx_t_2 = __pyx_v_ndim; - __pyx_t_3 = __pyx_t_2; - for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { - __pyx_v_idx = __pyx_t_4; - - /* "View.MemoryView":1198 - * if order == 'F': - * for idx in range(ndim): - * strides[idx] = stride # <<<<<<<<<<<<<< - * stride *= shape[idx] - * else: - */ - (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; - - /* "View.MemoryView":1199 - * for idx in range(ndim): - * strides[idx] = stride - * stride *= shape[idx] # <<<<<<<<<<<<<< - * else: - * for idx in range(ndim - 1, -1, -1): - */ - __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); - } - - /* "View.MemoryView":1196 - * cdef int idx - * - * if order == 'F': # <<<<<<<<<<<<<< - * for idx in range(ndim): - * strides[idx] = stride - */ - goto __pyx_L3; - } - - /* "View.MemoryView":1201 - * stride *= shape[idx] - * else: - * for idx in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< - * strides[idx] = stride - * stride *= shape[idx] - */ - /*else*/ { - for (__pyx_t_2 = (__pyx_v_ndim - 1); __pyx_t_2 > -1; __pyx_t_2-=1) { - __pyx_v_idx = __pyx_t_2; - - /* "View.MemoryView":1202 - * else: - * for idx in range(ndim - 1, -1, -1): - * strides[idx] = stride # <<<<<<<<<<<<<< - * stride *= shape[idx] - * - */ - (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; - - /* "View.MemoryView":1203 - * for idx in range(ndim - 1, -1, -1): - * strides[idx] = stride - * stride *= shape[idx] # <<<<<<<<<<<<<< - * - * return stride - */ - __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); - } - } - __pyx_L3:; - - /* "View.MemoryView":1205 - * stride *= shape[idx] - * - * return stride # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_copy_data_to_temp') - */ - __pyx_r = __pyx_v_stride; - goto __pyx_L0; - - /* "View.MemoryView":1187 - * - * @cname('__pyx_fill_contig_strides_array') - * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< - * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, - * int ndim, char order) nogil: - */ - - /* function exit code */ - __pyx_L0:; - return __pyx_r; -} - -/* "View.MemoryView":1208 - * - * @cname('__pyx_memoryview_copy_data_to_temp') - * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< - * __Pyx_memviewslice *tmpslice, - * char order, - */ - -static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_tmpslice, char __pyx_v_order, int __pyx_v_ndim) { - int __pyx_v_i; - void *__pyx_v_result; - size_t __pyx_v_itemsize; - size_t __pyx_v_size; - void *__pyx_r; - Py_ssize_t __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - struct __pyx_memoryview_obj *__pyx_t_4; - int __pyx_t_5; - int __pyx_t_6; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - - /* "View.MemoryView":1219 - * cdef void *result - * - * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< - * cdef size_t size = slice_get_size(src, ndim) - * - */ - __pyx_t_1 = __pyx_v_src->memview->view.itemsize; - __pyx_v_itemsize = __pyx_t_1; - - /* "View.MemoryView":1220 - * - * cdef size_t itemsize = src.memview.view.itemsize - * cdef size_t size = slice_get_size(src, ndim) # <<<<<<<<<<<<<< - * - * result = malloc(size) - */ - __pyx_v_size = __pyx_memoryview_slice_get_size(__pyx_v_src, __pyx_v_ndim); - - /* "View.MemoryView":1222 - * cdef size_t size = slice_get_size(src, ndim) - * - * result = malloc(size) # <<<<<<<<<<<<<< - * if not result: - * _err(MemoryError, NULL) - */ - __pyx_v_result = malloc(__pyx_v_size); - - /* "View.MemoryView":1223 - * - * result = malloc(size) - * if not result: # <<<<<<<<<<<<<< - * _err(MemoryError, NULL) - * - */ - __pyx_t_2 = ((!(__pyx_v_result != 0)) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1224 - * result = malloc(size) - * if not result: - * _err(MemoryError, NULL) # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_3 = __pyx_memoryview_err(__pyx_builtin_MemoryError, NULL); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 1224, __pyx_L1_error) - - /* "View.MemoryView":1223 - * - * result = malloc(size) - * if not result: # <<<<<<<<<<<<<< - * _err(MemoryError, NULL) - * - */ - } - - /* "View.MemoryView":1227 - * - * - * tmpslice.data = result # <<<<<<<<<<<<<< - * tmpslice.memview = src.memview - * for i in range(ndim): - */ - __pyx_v_tmpslice->data = ((char *)__pyx_v_result); - - /* "View.MemoryView":1228 - * - * tmpslice.data = result - * tmpslice.memview = src.memview # <<<<<<<<<<<<<< - * for i in range(ndim): - * tmpslice.shape[i] = src.shape[i] - */ - __pyx_t_4 = __pyx_v_src->memview; - __pyx_v_tmpslice->memview = __pyx_t_4; - - /* "View.MemoryView":1229 - * tmpslice.data = result - * tmpslice.memview = src.memview - * for i in range(ndim): # <<<<<<<<<<<<<< - * tmpslice.shape[i] = src.shape[i] - * tmpslice.suboffsets[i] = -1 - */ - __pyx_t_3 = __pyx_v_ndim; - __pyx_t_5 = __pyx_t_3; - for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_i = __pyx_t_6; - - /* "View.MemoryView":1230 - * tmpslice.memview = src.memview - * for i in range(ndim): - * tmpslice.shape[i] = src.shape[i] # <<<<<<<<<<<<<< - * tmpslice.suboffsets[i] = -1 - * - */ - (__pyx_v_tmpslice->shape[__pyx_v_i]) = (__pyx_v_src->shape[__pyx_v_i]); - - /* "View.MemoryView":1231 - * for i in range(ndim): - * tmpslice.shape[i] = src.shape[i] - * tmpslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< - * - * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, - */ - (__pyx_v_tmpslice->suboffsets[__pyx_v_i]) = -1L; - } - - /* "View.MemoryView":1233 - * tmpslice.suboffsets[i] = -1 - * - * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, # <<<<<<<<<<<<<< - * ndim, order) - * - */ - (void)(__pyx_fill_contig_strides_array((&(__pyx_v_tmpslice->shape[0])), (&(__pyx_v_tmpslice->strides[0])), __pyx_v_itemsize, __pyx_v_ndim, __pyx_v_order)); - - /* "View.MemoryView":1237 - * - * - * for i in range(ndim): # <<<<<<<<<<<<<< - * if tmpslice.shape[i] == 1: - * tmpslice.strides[i] = 0 - */ - __pyx_t_3 = __pyx_v_ndim; - __pyx_t_5 = __pyx_t_3; - for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_i = __pyx_t_6; - - /* "View.MemoryView":1238 - * - * for i in range(ndim): - * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< - * tmpslice.strides[i] = 0 - * - */ - __pyx_t_2 = (((__pyx_v_tmpslice->shape[__pyx_v_i]) == 1) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1239 - * for i in range(ndim): - * if tmpslice.shape[i] == 1: - * tmpslice.strides[i] = 0 # <<<<<<<<<<<<<< - * - * if slice_is_contig(src[0], order, ndim): - */ - (__pyx_v_tmpslice->strides[__pyx_v_i]) = 0; - - /* "View.MemoryView":1238 - * - * for i in range(ndim): - * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< - * tmpslice.strides[i] = 0 - * - */ - } - } - - /* "View.MemoryView":1241 - * tmpslice.strides[i] = 0 - * - * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< - * memcpy(result, src.data, size) - * else: - */ - __pyx_t_2 = (__pyx_memviewslice_is_contig((__pyx_v_src[0]), __pyx_v_order, __pyx_v_ndim) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1242 - * - * if slice_is_contig(src[0], order, ndim): - * memcpy(result, src.data, size) # <<<<<<<<<<<<<< - * else: - * copy_strided_to_strided(src, tmpslice, ndim, itemsize) - */ - (void)(memcpy(__pyx_v_result, __pyx_v_src->data, __pyx_v_size)); - - /* "View.MemoryView":1241 - * tmpslice.strides[i] = 0 - * - * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< - * memcpy(result, src.data, size) - * else: - */ - goto __pyx_L9; - } - - /* "View.MemoryView":1244 - * memcpy(result, src.data, size) - * else: - * copy_strided_to_strided(src, tmpslice, ndim, itemsize) # <<<<<<<<<<<<<< - * - * return result - */ - /*else*/ { - copy_strided_to_strided(__pyx_v_src, __pyx_v_tmpslice, __pyx_v_ndim, __pyx_v_itemsize); - } - __pyx_L9:; - - /* "View.MemoryView":1246 - * copy_strided_to_strided(src, tmpslice, ndim, itemsize) - * - * return result # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = __pyx_v_result; - goto __pyx_L0; - - /* "View.MemoryView":1208 - * - * @cname('__pyx_memoryview_copy_data_to_temp') - * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< - * __Pyx_memviewslice *tmpslice, - * char order, - */ - - /* function exit code */ - __pyx_L1_error:; - { - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_AddTraceback("View.MemoryView.copy_data_to_temp", __pyx_clineno, __pyx_lineno, __pyx_filename); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif - } - __pyx_r = NULL; - __pyx_L0:; - return __pyx_r; -} - -/* "View.MemoryView":1251 - * - * @cname('__pyx_memoryview_err_extents') - * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< - * Py_ssize_t extent2) except -1 with gil: - * raise ValueError("got differing extents in dimension %d (got %d and %d)" % - */ - -static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent1, Py_ssize_t __pyx_v_extent2) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_RefNannySetupContext("_err_extents", 0); - - /* "View.MemoryView":1254 - * Py_ssize_t extent2) except -1 with gil: - * raise ValueError("got differing extents in dimension %d (got %d and %d)" % - * (i, extent1, extent2)) # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_err_dim') - */ - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1254, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_extent1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1254, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_extent2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1254, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1254, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3); - __pyx_t_1 = 0; - __pyx_t_2 = 0; - __pyx_t_3 = 0; - - /* "View.MemoryView":1253 - * cdef int _err_extents(int i, Py_ssize_t extent1, - * Py_ssize_t extent2) except -1 with gil: - * raise ValueError("got differing extents in dimension %d (got %d and %d)" % # <<<<<<<<<<<<<< - * (i, extent1, extent2)) - * - */ - __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_got_differing_extents_in_dimensi, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1253, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1253, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(2, 1253, __pyx_L1_error) - - /* "View.MemoryView":1251 - * - * @cname('__pyx_memoryview_err_extents') - * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< - * Py_ssize_t extent2) except -1 with gil: - * raise ValueError("got differing extents in dimension %d (got %d and %d)" % - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("View.MemoryView._err_extents", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __Pyx_RefNannyFinishContext(); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif - return __pyx_r; -} - -/* "View.MemoryView":1257 - * - * @cname('__pyx_memoryview_err_dim') - * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< - * raise error(msg.decode('ascii') % dim) - * - */ - -static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, char *__pyx_v_msg, int __pyx_v_dim) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_RefNannySetupContext("_err_dim", 0); - __Pyx_INCREF(__pyx_v_error); - - /* "View.MemoryView":1258 - * @cname('__pyx_memoryview_err_dim') - * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: - * raise error(msg.decode('ascii') % dim) # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_err') - */ - __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1258, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1258, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyUnicode_Format(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1258, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_INCREF(__pyx_v_error); - __pyx_t_3 = __pyx_v_error; __pyx_t_2 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { - __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); - if (likely(__pyx_t_2)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); - __Pyx_INCREF(__pyx_t_2); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_3, function); - } - } - __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1258, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 1258, __pyx_L1_error) - - /* "View.MemoryView":1257 - * - * @cname('__pyx_memoryview_err_dim') - * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< - * raise error(msg.decode('ascii') % dim) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("View.MemoryView._err_dim", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __Pyx_XDECREF(__pyx_v_error); - __Pyx_RefNannyFinishContext(); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif - return __pyx_r; -} - -/* "View.MemoryView":1261 - * - * @cname('__pyx_memoryview_err') - * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< - * if msg != NULL: - * raise error(msg.decode('ascii')) - */ - -static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_msg) { - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_RefNannySetupContext("_err", 0); - __Pyx_INCREF(__pyx_v_error); - - /* "View.MemoryView":1262 - * @cname('__pyx_memoryview_err') - * cdef int _err(object error, char *msg) except -1 with gil: - * if msg != NULL: # <<<<<<<<<<<<<< - * raise error(msg.decode('ascii')) - * else: - */ - __pyx_t_1 = ((__pyx_v_msg != NULL) != 0); - if (unlikely(__pyx_t_1)) { - - /* "View.MemoryView":1263 - * cdef int _err(object error, char *msg) except -1 with gil: - * if msg != NULL: - * raise error(msg.decode('ascii')) # <<<<<<<<<<<<<< - * else: - * raise error - */ - __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1263, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_v_error); - __pyx_t_4 = __pyx_v_error; __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_4, function); - } - } - __pyx_t_2 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1263, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(2, 1263, __pyx_L1_error) - - /* "View.MemoryView":1262 - * @cname('__pyx_memoryview_err') - * cdef int _err(object error, char *msg) except -1 with gil: - * if msg != NULL: # <<<<<<<<<<<<<< - * raise error(msg.decode('ascii')) - * else: - */ - } - - /* "View.MemoryView":1265 - * raise error(msg.decode('ascii')) - * else: - * raise error # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_copy_contents') - */ - /*else*/ { - __Pyx_Raise(__pyx_v_error, 0, 0, 0); - __PYX_ERR(2, 1265, __pyx_L1_error) - } - - /* "View.MemoryView":1261 - * - * @cname('__pyx_memoryview_err') - * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< - * if msg != NULL: - * raise error(msg.decode('ascii')) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView._err", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __Pyx_XDECREF(__pyx_v_error); - __Pyx_RefNannyFinishContext(); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif - return __pyx_r; -} - -/* "View.MemoryView":1268 - * - * @cname('__pyx_memoryview_copy_contents') - * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< - * __Pyx_memviewslice dst, - * int src_ndim, int dst_ndim, - */ - -static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_memviewslice __pyx_v_dst, int __pyx_v_src_ndim, int __pyx_v_dst_ndim, int __pyx_v_dtype_is_object) { - void *__pyx_v_tmpdata; - size_t __pyx_v_itemsize; - int __pyx_v_i; - char __pyx_v_order; - int __pyx_v_broadcasting; - int __pyx_v_direct_copy; - __Pyx_memviewslice __pyx_v_tmp; - int __pyx_v_ndim; - int __pyx_r; - Py_ssize_t __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_t_4; - int __pyx_t_5; - int __pyx_t_6; - void *__pyx_t_7; - int __pyx_t_8; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - - /* "View.MemoryView":1276 - * Check for overlapping memory and verify the shapes. - * """ - * cdef void *tmpdata = NULL # <<<<<<<<<<<<<< - * cdef size_t itemsize = src.memview.view.itemsize - * cdef int i - */ - __pyx_v_tmpdata = NULL; - - /* "View.MemoryView":1277 - * """ - * cdef void *tmpdata = NULL - * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< - * cdef int i - * cdef char order = get_best_order(&src, src_ndim) - */ - __pyx_t_1 = __pyx_v_src.memview->view.itemsize; - __pyx_v_itemsize = __pyx_t_1; - - /* "View.MemoryView":1279 - * cdef size_t itemsize = src.memview.view.itemsize - * cdef int i - * cdef char order = get_best_order(&src, src_ndim) # <<<<<<<<<<<<<< - * cdef bint broadcasting = False - * cdef bint direct_copy = False - */ - __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_src), __pyx_v_src_ndim); - - /* "View.MemoryView":1280 - * cdef int i - * cdef char order = get_best_order(&src, src_ndim) - * cdef bint broadcasting = False # <<<<<<<<<<<<<< - * cdef bint direct_copy = False - * cdef __Pyx_memviewslice tmp - */ - __pyx_v_broadcasting = 0; - - /* "View.MemoryView":1281 - * cdef char order = get_best_order(&src, src_ndim) - * cdef bint broadcasting = False - * cdef bint direct_copy = False # <<<<<<<<<<<<<< - * cdef __Pyx_memviewslice tmp - * - */ - __pyx_v_direct_copy = 0; - - /* "View.MemoryView":1284 - * cdef __Pyx_memviewslice tmp - * - * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< - * broadcast_leading(&src, src_ndim, dst_ndim) - * elif dst_ndim < src_ndim: - */ - __pyx_t_2 = ((__pyx_v_src_ndim < __pyx_v_dst_ndim) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1285 - * - * if src_ndim < dst_ndim: - * broadcast_leading(&src, src_ndim, dst_ndim) # <<<<<<<<<<<<<< - * elif dst_ndim < src_ndim: - * broadcast_leading(&dst, dst_ndim, src_ndim) - */ - __pyx_memoryview_broadcast_leading((&__pyx_v_src), __pyx_v_src_ndim, __pyx_v_dst_ndim); - - /* "View.MemoryView":1284 - * cdef __Pyx_memviewslice tmp - * - * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< - * broadcast_leading(&src, src_ndim, dst_ndim) - * elif dst_ndim < src_ndim: - */ - goto __pyx_L3; - } - - /* "View.MemoryView":1286 - * if src_ndim < dst_ndim: - * broadcast_leading(&src, src_ndim, dst_ndim) - * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< - * broadcast_leading(&dst, dst_ndim, src_ndim) - * - */ - __pyx_t_2 = ((__pyx_v_dst_ndim < __pyx_v_src_ndim) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1287 - * broadcast_leading(&src, src_ndim, dst_ndim) - * elif dst_ndim < src_ndim: - * broadcast_leading(&dst, dst_ndim, src_ndim) # <<<<<<<<<<<<<< - * - * cdef int ndim = max(src_ndim, dst_ndim) - */ - __pyx_memoryview_broadcast_leading((&__pyx_v_dst), __pyx_v_dst_ndim, __pyx_v_src_ndim); - - /* "View.MemoryView":1286 - * if src_ndim < dst_ndim: - * broadcast_leading(&src, src_ndim, dst_ndim) - * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< - * broadcast_leading(&dst, dst_ndim, src_ndim) - * - */ - } - __pyx_L3:; - - /* "View.MemoryView":1289 - * broadcast_leading(&dst, dst_ndim, src_ndim) - * - * cdef int ndim = max(src_ndim, dst_ndim) # <<<<<<<<<<<<<< - * - * for i in range(ndim): - */ - __pyx_t_3 = __pyx_v_dst_ndim; - __pyx_t_4 = __pyx_v_src_ndim; - if (((__pyx_t_3 > __pyx_t_4) != 0)) { - __pyx_t_5 = __pyx_t_3; - } else { - __pyx_t_5 = __pyx_t_4; - } - __pyx_v_ndim = __pyx_t_5; - - /* "View.MemoryView":1291 - * cdef int ndim = max(src_ndim, dst_ndim) - * - * for i in range(ndim): # <<<<<<<<<<<<<< - * if src.shape[i] != dst.shape[i]: - * if src.shape[i] == 1: - */ - __pyx_t_5 = __pyx_v_ndim; - __pyx_t_3 = __pyx_t_5; - for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { - __pyx_v_i = __pyx_t_4; - - /* "View.MemoryView":1292 - * - * for i in range(ndim): - * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< - * if src.shape[i] == 1: - * broadcasting = True - */ - __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) != (__pyx_v_dst.shape[__pyx_v_i])) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1293 - * for i in range(ndim): - * if src.shape[i] != dst.shape[i]: - * if src.shape[i] == 1: # <<<<<<<<<<<<<< - * broadcasting = True - * src.strides[i] = 0 - */ - __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) == 1) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1294 - * if src.shape[i] != dst.shape[i]: - * if src.shape[i] == 1: - * broadcasting = True # <<<<<<<<<<<<<< - * src.strides[i] = 0 - * else: - */ - __pyx_v_broadcasting = 1; - - /* "View.MemoryView":1295 - * if src.shape[i] == 1: - * broadcasting = True - * src.strides[i] = 0 # <<<<<<<<<<<<<< - * else: - * _err_extents(i, dst.shape[i], src.shape[i]) - */ - (__pyx_v_src.strides[__pyx_v_i]) = 0; - - /* "View.MemoryView":1293 - * for i in range(ndim): - * if src.shape[i] != dst.shape[i]: - * if src.shape[i] == 1: # <<<<<<<<<<<<<< - * broadcasting = True - * src.strides[i] = 0 - */ - goto __pyx_L7; - } - - /* "View.MemoryView":1297 - * src.strides[i] = 0 - * else: - * _err_extents(i, dst.shape[i], src.shape[i]) # <<<<<<<<<<<<<< - * - * if src.suboffsets[i] >= 0: - */ - /*else*/ { - __pyx_t_6 = __pyx_memoryview_err_extents(__pyx_v_i, (__pyx_v_dst.shape[__pyx_v_i]), (__pyx_v_src.shape[__pyx_v_i])); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 1297, __pyx_L1_error) - } - __pyx_L7:; - - /* "View.MemoryView":1292 - * - * for i in range(ndim): - * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< - * if src.shape[i] == 1: - * broadcasting = True - */ - } - - /* "View.MemoryView":1299 - * _err_extents(i, dst.shape[i], src.shape[i]) - * - * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< - * _err_dim(ValueError, "Dimension %d is not direct", i) - * - */ - __pyx_t_2 = (((__pyx_v_src.suboffsets[__pyx_v_i]) >= 0) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1300 - * - * if src.suboffsets[i] >= 0: - * _err_dim(ValueError, "Dimension %d is not direct", i) # <<<<<<<<<<<<<< - * - * if slices_overlap(&src, &dst, ndim, itemsize): - */ - __pyx_t_6 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Dimension %d is not direct"), __pyx_v_i); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 1300, __pyx_L1_error) - - /* "View.MemoryView":1299 - * _err_extents(i, dst.shape[i], src.shape[i]) - * - * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< - * _err_dim(ValueError, "Dimension %d is not direct", i) - * - */ - } - } - - /* "View.MemoryView":1302 - * _err_dim(ValueError, "Dimension %d is not direct", i) - * - * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< - * - * if not slice_is_contig(src, order, ndim): - */ - __pyx_t_2 = (__pyx_slices_overlap((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1304 - * if slices_overlap(&src, &dst, ndim, itemsize): - * - * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< - * order = get_best_order(&dst, ndim) - * - */ - __pyx_t_2 = ((!(__pyx_memviewslice_is_contig(__pyx_v_src, __pyx_v_order, __pyx_v_ndim) != 0)) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1305 - * - * if not slice_is_contig(src, order, ndim): - * order = get_best_order(&dst, ndim) # <<<<<<<<<<<<<< - * - * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) - */ - __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim); - - /* "View.MemoryView":1304 - * if slices_overlap(&src, &dst, ndim, itemsize): - * - * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< - * order = get_best_order(&dst, ndim) - * - */ - } - - /* "View.MemoryView":1307 - * order = get_best_order(&dst, ndim) - * - * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) # <<<<<<<<<<<<<< - * src = tmp - * - */ - __pyx_t_7 = __pyx_memoryview_copy_data_to_temp((&__pyx_v_src), (&__pyx_v_tmp), __pyx_v_order, __pyx_v_ndim); if (unlikely(__pyx_t_7 == ((void *)NULL))) __PYX_ERR(2, 1307, __pyx_L1_error) - __pyx_v_tmpdata = __pyx_t_7; - - /* "View.MemoryView":1308 - * - * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) - * src = tmp # <<<<<<<<<<<<<< - * - * if not broadcasting: - */ - __pyx_v_src = __pyx_v_tmp; - - /* "View.MemoryView":1302 - * _err_dim(ValueError, "Dimension %d is not direct", i) - * - * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< - * - * if not slice_is_contig(src, order, ndim): - */ - } - - /* "View.MemoryView":1310 - * src = tmp - * - * if not broadcasting: # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_2 = ((!(__pyx_v_broadcasting != 0)) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1313 - * - * - * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< - * direct_copy = slice_is_contig(dst, 'C', ndim) - * elif slice_is_contig(src, 'F', ndim): - */ - __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'C', __pyx_v_ndim) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1314 - * - * if slice_is_contig(src, 'C', ndim): - * direct_copy = slice_is_contig(dst, 'C', ndim) # <<<<<<<<<<<<<< - * elif slice_is_contig(src, 'F', ndim): - * direct_copy = slice_is_contig(dst, 'F', ndim) - */ - __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'C', __pyx_v_ndim); - - /* "View.MemoryView":1313 - * - * - * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< - * direct_copy = slice_is_contig(dst, 'C', ndim) - * elif slice_is_contig(src, 'F', ndim): - */ - goto __pyx_L12; - } - - /* "View.MemoryView":1315 - * if slice_is_contig(src, 'C', ndim): - * direct_copy = slice_is_contig(dst, 'C', ndim) - * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< - * direct_copy = slice_is_contig(dst, 'F', ndim) - * - */ - __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'F', __pyx_v_ndim) != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1316 - * direct_copy = slice_is_contig(dst, 'C', ndim) - * elif slice_is_contig(src, 'F', ndim): - * direct_copy = slice_is_contig(dst, 'F', ndim) # <<<<<<<<<<<<<< - * - * if direct_copy: - */ - __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'F', __pyx_v_ndim); - - /* "View.MemoryView":1315 - * if slice_is_contig(src, 'C', ndim): - * direct_copy = slice_is_contig(dst, 'C', ndim) - * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< - * direct_copy = slice_is_contig(dst, 'F', ndim) - * - */ - } - __pyx_L12:; - - /* "View.MemoryView":1318 - * direct_copy = slice_is_contig(dst, 'F', ndim) - * - * if direct_copy: # <<<<<<<<<<<<<< - * - * refcount_copying(&dst, dtype_is_object, ndim, False) - */ - __pyx_t_2 = (__pyx_v_direct_copy != 0); - if (__pyx_t_2) { - - /* "View.MemoryView":1320 - * if direct_copy: - * - * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< - * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) - * refcount_copying(&dst, dtype_is_object, ndim, True) - */ - __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); - - /* "View.MemoryView":1321 - * - * refcount_copying(&dst, dtype_is_object, ndim, False) - * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) # <<<<<<<<<<<<<< - * refcount_copying(&dst, dtype_is_object, ndim, True) - * free(tmpdata) - */ - (void)(memcpy(__pyx_v_dst.data, __pyx_v_src.data, __pyx_memoryview_slice_get_size((&__pyx_v_src), __pyx_v_ndim))); - - /* "View.MemoryView":1322 - * refcount_copying(&dst, dtype_is_object, ndim, False) - * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) - * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< - * free(tmpdata) - * return 0 - */ - __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); - - /* "View.MemoryView":1323 - * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) - * refcount_copying(&dst, dtype_is_object, ndim, True) - * free(tmpdata) # <<<<<<<<<<<<<< - * return 0 - * - */ - free(__pyx_v_tmpdata); - - /* "View.MemoryView":1324 - * refcount_copying(&dst, dtype_is_object, ndim, True) - * free(tmpdata) - * return 0 # <<<<<<<<<<<<<< - * - * if order == 'F' == get_best_order(&dst, ndim): - */ - __pyx_r = 0; - goto __pyx_L0; - - /* "View.MemoryView":1318 - * direct_copy = slice_is_contig(dst, 'F', ndim) - * - * if direct_copy: # <<<<<<<<<<<<<< - * - * refcount_copying(&dst, dtype_is_object, ndim, False) - */ - } - - /* "View.MemoryView":1310 - * src = tmp - * - * if not broadcasting: # <<<<<<<<<<<<<< - * - * - */ - } - - /* "View.MemoryView":1326 - * return 0 - * - * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_2 = (__pyx_v_order == 'F'); - if (__pyx_t_2) { - __pyx_t_2 = ('F' == __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim)); - } - __pyx_t_8 = (__pyx_t_2 != 0); - if (__pyx_t_8) { - - /* "View.MemoryView":1329 - * - * - * transpose_memslice(&src) # <<<<<<<<<<<<<< - * transpose_memslice(&dst) - * - */ - __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_src)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(2, 1329, __pyx_L1_error) - - /* "View.MemoryView":1330 - * - * transpose_memslice(&src) - * transpose_memslice(&dst) # <<<<<<<<<<<<<< - * - * refcount_copying(&dst, dtype_is_object, ndim, False) - */ - __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_dst)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(2, 1330, __pyx_L1_error) - - /* "View.MemoryView":1326 - * return 0 - * - * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< - * - * - */ - } - - /* "View.MemoryView":1332 - * transpose_memslice(&dst) - * - * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< - * copy_strided_to_strided(&src, &dst, ndim, itemsize) - * refcount_copying(&dst, dtype_is_object, ndim, True) - */ - __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); - - /* "View.MemoryView":1333 - * - * refcount_copying(&dst, dtype_is_object, ndim, False) - * copy_strided_to_strided(&src, &dst, ndim, itemsize) # <<<<<<<<<<<<<< - * refcount_copying(&dst, dtype_is_object, ndim, True) - * - */ - copy_strided_to_strided((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); - - /* "View.MemoryView":1334 - * refcount_copying(&dst, dtype_is_object, ndim, False) - * copy_strided_to_strided(&src, &dst, ndim, itemsize) - * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< - * - * free(tmpdata) - */ - __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); - - /* "View.MemoryView":1336 - * refcount_copying(&dst, dtype_is_object, ndim, True) - * - * free(tmpdata) # <<<<<<<<<<<<<< - * return 0 - * - */ - free(__pyx_v_tmpdata); - - /* "View.MemoryView":1337 - * - * free(tmpdata) - * return 0 # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_broadcast_leading') - */ - __pyx_r = 0; - goto __pyx_L0; - - /* "View.MemoryView":1268 - * - * @cname('__pyx_memoryview_copy_contents') - * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< - * __Pyx_memviewslice dst, - * int src_ndim, int dst_ndim, - */ - - /* function exit code */ - __pyx_L1_error:; - { - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_AddTraceback("View.MemoryView.memoryview_copy_contents", __pyx_clineno, __pyx_lineno, __pyx_filename); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif - } - __pyx_r = -1; - __pyx_L0:; - return __pyx_r; -} - -/* "View.MemoryView":1340 - * - * @cname('__pyx_memoryview_broadcast_leading') - * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< - * int ndim, - * int ndim_other) nogil: - */ - -static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim, int __pyx_v_ndim_other) { - int __pyx_v_i; - int __pyx_v_offset; - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - - /* "View.MemoryView":1344 - * int ndim_other) nogil: - * cdef int i - * cdef int offset = ndim_other - ndim # <<<<<<<<<<<<<< - * - * for i in range(ndim - 1, -1, -1): - */ - __pyx_v_offset = (__pyx_v_ndim_other - __pyx_v_ndim); - - /* "View.MemoryView":1346 - * cdef int offset = ndim_other - ndim - * - * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< - * mslice.shape[i + offset] = mslice.shape[i] - * mslice.strides[i + offset] = mslice.strides[i] - */ - for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { - __pyx_v_i = __pyx_t_1; - - /* "View.MemoryView":1347 - * - * for i in range(ndim - 1, -1, -1): - * mslice.shape[i + offset] = mslice.shape[i] # <<<<<<<<<<<<<< - * mslice.strides[i + offset] = mslice.strides[i] - * mslice.suboffsets[i + offset] = mslice.suboffsets[i] - */ - (__pyx_v_mslice->shape[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->shape[__pyx_v_i]); - - /* "View.MemoryView":1348 - * for i in range(ndim - 1, -1, -1): - * mslice.shape[i + offset] = mslice.shape[i] - * mslice.strides[i + offset] = mslice.strides[i] # <<<<<<<<<<<<<< - * mslice.suboffsets[i + offset] = mslice.suboffsets[i] - * - */ - (__pyx_v_mslice->strides[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->strides[__pyx_v_i]); - - /* "View.MemoryView":1349 - * mslice.shape[i + offset] = mslice.shape[i] - * mslice.strides[i + offset] = mslice.strides[i] - * mslice.suboffsets[i + offset] = mslice.suboffsets[i] # <<<<<<<<<<<<<< - * - * for i in range(offset): - */ - (__pyx_v_mslice->suboffsets[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->suboffsets[__pyx_v_i]); - } - - /* "View.MemoryView":1351 - * mslice.suboffsets[i + offset] = mslice.suboffsets[i] - * - * for i in range(offset): # <<<<<<<<<<<<<< - * mslice.shape[i] = 1 - * mslice.strides[i] = mslice.strides[0] - */ - __pyx_t_1 = __pyx_v_offset; - __pyx_t_2 = __pyx_t_1; - for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { - __pyx_v_i = __pyx_t_3; - - /* "View.MemoryView":1352 - * - * for i in range(offset): - * mslice.shape[i] = 1 # <<<<<<<<<<<<<< - * mslice.strides[i] = mslice.strides[0] - * mslice.suboffsets[i] = -1 - */ - (__pyx_v_mslice->shape[__pyx_v_i]) = 1; - - /* "View.MemoryView":1353 - * for i in range(offset): - * mslice.shape[i] = 1 - * mslice.strides[i] = mslice.strides[0] # <<<<<<<<<<<<<< - * mslice.suboffsets[i] = -1 - * - */ - (__pyx_v_mslice->strides[__pyx_v_i]) = (__pyx_v_mslice->strides[0]); - - /* "View.MemoryView":1354 - * mslice.shape[i] = 1 - * mslice.strides[i] = mslice.strides[0] - * mslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< - * - * - */ - (__pyx_v_mslice->suboffsets[__pyx_v_i]) = -1L; - } - - /* "View.MemoryView":1340 - * - * @cname('__pyx_memoryview_broadcast_leading') - * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< - * int ndim, - * int ndim_other) nogil: - */ - - /* function exit code */ -} - -/* "View.MemoryView":1362 - * - * @cname('__pyx_memoryview_refcount_copying') - * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< - * int ndim, bint inc) nogil: - * - */ - -static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_dtype_is_object, int __pyx_v_ndim, int __pyx_v_inc) { - int __pyx_t_1; - - /* "View.MemoryView":1366 - * - * - * if dtype_is_object: # <<<<<<<<<<<<<< - * refcount_objects_in_slice_with_gil(dst.data, dst.shape, - * dst.strides, ndim, inc) - */ - __pyx_t_1 = (__pyx_v_dtype_is_object != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":1367 - * - * if dtype_is_object: - * refcount_objects_in_slice_with_gil(dst.data, dst.shape, # <<<<<<<<<<<<<< - * dst.strides, ndim, inc) - * - */ - __pyx_memoryview_refcount_objects_in_slice_with_gil(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_inc); - - /* "View.MemoryView":1366 - * - * - * if dtype_is_object: # <<<<<<<<<<<<<< - * refcount_objects_in_slice_with_gil(dst.data, dst.shape, - * dst.strides, ndim, inc) - */ - } - - /* "View.MemoryView":1362 - * - * @cname('__pyx_memoryview_refcount_copying') - * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< - * int ndim, bint inc) nogil: - * - */ - - /* function exit code */ -} - -/* "View.MemoryView":1371 - * - * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') - * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< - * Py_ssize_t *strides, int ndim, - * bint inc) with gil: - */ - -static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { - __Pyx_RefNannyDeclarations - #ifdef WITH_THREAD - PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); - #endif - __Pyx_RefNannySetupContext("refcount_objects_in_slice_with_gil", 0); - - /* "View.MemoryView":1374 - * Py_ssize_t *strides, int ndim, - * bint inc) with gil: - * refcount_objects_in_slice(data, shape, strides, ndim, inc) # <<<<<<<<<<<<<< - * - * @cname('__pyx_memoryview_refcount_objects_in_slice') - */ - __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, __pyx_v_shape, __pyx_v_strides, __pyx_v_ndim, __pyx_v_inc); - - /* "View.MemoryView":1371 - * - * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') - * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< - * Py_ssize_t *strides, int ndim, - * bint inc) with gil: - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - #ifdef WITH_THREAD - __Pyx_PyGILState_Release(__pyx_gilstate_save); - #endif -} - -/* "View.MemoryView":1377 - * - * @cname('__pyx_memoryview_refcount_objects_in_slice') - * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< - * Py_ssize_t *strides, int ndim, bint inc): - * cdef Py_ssize_t i - */ - -static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { - CYTHON_UNUSED Py_ssize_t __pyx_v_i; - __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - Py_ssize_t __pyx_t_2; - Py_ssize_t __pyx_t_3; - int __pyx_t_4; - __Pyx_RefNannySetupContext("refcount_objects_in_slice", 0); - - /* "View.MemoryView":1381 - * cdef Py_ssize_t i - * - * for i in range(shape[0]): # <<<<<<<<<<<<<< - * if ndim == 1: - * if inc: - */ - __pyx_t_1 = (__pyx_v_shape[0]); - __pyx_t_2 = __pyx_t_1; - for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { - __pyx_v_i = __pyx_t_3; - - /* "View.MemoryView":1382 - * - * for i in range(shape[0]): - * if ndim == 1: # <<<<<<<<<<<<<< - * if inc: - * Py_INCREF(( data)[0]) - */ - __pyx_t_4 = ((__pyx_v_ndim == 1) != 0); - if (__pyx_t_4) { - - /* "View.MemoryView":1383 - * for i in range(shape[0]): - * if ndim == 1: - * if inc: # <<<<<<<<<<<<<< - * Py_INCREF(( data)[0]) - * else: - */ - __pyx_t_4 = (__pyx_v_inc != 0); - if (__pyx_t_4) { - - /* "View.MemoryView":1384 - * if ndim == 1: - * if inc: - * Py_INCREF(( data)[0]) # <<<<<<<<<<<<<< - * else: - * Py_DECREF(( data)[0]) - */ - Py_INCREF((((PyObject **)__pyx_v_data)[0])); - - /* "View.MemoryView":1383 - * for i in range(shape[0]): - * if ndim == 1: - * if inc: # <<<<<<<<<<<<<< - * Py_INCREF(( data)[0]) - * else: - */ - goto __pyx_L6; - } - - /* "View.MemoryView":1386 - * Py_INCREF(( data)[0]) - * else: - * Py_DECREF(( data)[0]) # <<<<<<<<<<<<<< - * else: - * refcount_objects_in_slice(data, shape + 1, strides + 1, - */ - /*else*/ { - Py_DECREF((((PyObject **)__pyx_v_data)[0])); - } - __pyx_L6:; - - /* "View.MemoryView":1382 - * - * for i in range(shape[0]): - * if ndim == 1: # <<<<<<<<<<<<<< - * if inc: - * Py_INCREF(( data)[0]) - */ - goto __pyx_L5; - } - - /* "View.MemoryView":1388 - * Py_DECREF(( data)[0]) - * else: - * refcount_objects_in_slice(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< - * ndim - 1, inc) - * - */ - /*else*/ { - - /* "View.MemoryView":1389 - * else: - * refcount_objects_in_slice(data, shape + 1, strides + 1, - * ndim - 1, inc) # <<<<<<<<<<<<<< - * - * data += strides[0] - */ - __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_inc); - } - __pyx_L5:; - - /* "View.MemoryView":1391 - * ndim - 1, inc) - * - * data += strides[0] # <<<<<<<<<<<<<< - * - * - */ - __pyx_v_data = (__pyx_v_data + (__pyx_v_strides[0])); - } - - /* "View.MemoryView":1377 - * - * @cname('__pyx_memoryview_refcount_objects_in_slice') - * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< - * Py_ssize_t *strides, int ndim, bint inc): - * cdef Py_ssize_t i - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "View.MemoryView":1397 - * - * @cname('__pyx_memoryview_slice_assign_scalar') - * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< - * size_t itemsize, void *item, - * bint dtype_is_object) nogil: - */ - -static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item, int __pyx_v_dtype_is_object) { - - /* "View.MemoryView":1400 - * size_t itemsize, void *item, - * bint dtype_is_object) nogil: - * refcount_copying(dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< - * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, - * itemsize, item) - */ - __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 0); - - /* "View.MemoryView":1401 - * bint dtype_is_object) nogil: - * refcount_copying(dst, dtype_is_object, ndim, False) - * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, # <<<<<<<<<<<<<< - * itemsize, item) - * refcount_copying(dst, dtype_is_object, ndim, True) - */ - __pyx_memoryview__slice_assign_scalar(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_itemsize, __pyx_v_item); - - /* "View.MemoryView":1403 - * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, - * itemsize, item) - * refcount_copying(dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< - * - * - */ - __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 1); - - /* "View.MemoryView":1397 - * - * @cname('__pyx_memoryview_slice_assign_scalar') - * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< - * size_t itemsize, void *item, - * bint dtype_is_object) nogil: - */ - - /* function exit code */ -} - -/* "View.MemoryView":1407 - * - * @cname('__pyx_memoryview__slice_assign_scalar') - * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< - * Py_ssize_t *strides, int ndim, - * size_t itemsize, void *item) nogil: - */ - -static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item) { - CYTHON_UNUSED Py_ssize_t __pyx_v_i; - Py_ssize_t __pyx_v_stride; - Py_ssize_t __pyx_v_extent; - int __pyx_t_1; - Py_ssize_t __pyx_t_2; - Py_ssize_t __pyx_t_3; - Py_ssize_t __pyx_t_4; - - /* "View.MemoryView":1411 - * size_t itemsize, void *item) nogil: - * cdef Py_ssize_t i - * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< - * cdef Py_ssize_t extent = shape[0] - * - */ - __pyx_v_stride = (__pyx_v_strides[0]); - - /* "View.MemoryView":1412 - * cdef Py_ssize_t i - * cdef Py_ssize_t stride = strides[0] - * cdef Py_ssize_t extent = shape[0] # <<<<<<<<<<<<<< - * - * if ndim == 1: - */ - __pyx_v_extent = (__pyx_v_shape[0]); - - /* "View.MemoryView":1414 - * cdef Py_ssize_t extent = shape[0] - * - * if ndim == 1: # <<<<<<<<<<<<<< - * for i in range(extent): - * memcpy(data, item, itemsize) - */ - __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); - if (__pyx_t_1) { - - /* "View.MemoryView":1415 - * - * if ndim == 1: - * for i in range(extent): # <<<<<<<<<<<<<< - * memcpy(data, item, itemsize) - * data += stride - */ - __pyx_t_2 = __pyx_v_extent; - __pyx_t_3 = __pyx_t_2; - for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { - __pyx_v_i = __pyx_t_4; - - /* "View.MemoryView":1416 - * if ndim == 1: - * for i in range(extent): - * memcpy(data, item, itemsize) # <<<<<<<<<<<<<< - * data += stride - * else: - */ - (void)(memcpy(__pyx_v_data, __pyx_v_item, __pyx_v_itemsize)); - - /* "View.MemoryView":1417 - * for i in range(extent): - * memcpy(data, item, itemsize) - * data += stride # <<<<<<<<<<<<<< - * else: - * for i in range(extent): - */ - __pyx_v_data = (__pyx_v_data + __pyx_v_stride); - } - - /* "View.MemoryView":1414 - * cdef Py_ssize_t extent = shape[0] - * - * if ndim == 1: # <<<<<<<<<<<<<< - * for i in range(extent): - * memcpy(data, item, itemsize) - */ - goto __pyx_L3; - } - - /* "View.MemoryView":1419 - * data += stride - * else: - * for i in range(extent): # <<<<<<<<<<<<<< - * _slice_assign_scalar(data, shape + 1, strides + 1, - * ndim - 1, itemsize, item) - */ - /*else*/ { - __pyx_t_2 = __pyx_v_extent; - __pyx_t_3 = __pyx_t_2; - for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { - __pyx_v_i = __pyx_t_4; - - /* "View.MemoryView":1420 - * else: - * for i in range(extent): - * _slice_assign_scalar(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< - * ndim - 1, itemsize, item) - * data += stride - */ - __pyx_memoryview__slice_assign_scalar(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize, __pyx_v_item); - - /* "View.MemoryView":1422 - * _slice_assign_scalar(data, shape + 1, strides + 1, - * ndim - 1, itemsize, item) - * data += stride # <<<<<<<<<<<<<< - * - * - */ - __pyx_v_data = (__pyx_v_data + __pyx_v_stride); - } - } - __pyx_L3:; - - /* "View.MemoryView":1407 - * - * @cname('__pyx_memoryview__slice_assign_scalar') - * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< - * Py_ssize_t *strides, int ndim, - * size_t itemsize, void *item) nogil: - */ - - /* function exit code */ -} - -/* "(tree fragment)":1 - * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum = {"__pyx_unpickle_Enum", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v___pyx_type = 0; - long __pyx_v___pyx_checksum; - PyObject *__pyx_v___pyx_state = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__pyx_unpickle_Enum (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; - PyObject* values[3] = {0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 1); __PYX_ERR(2, 1, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 2); __PYX_ERR(2, 1, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_Enum") < 0)) __PYX_ERR(2, 1, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - } - __pyx_v___pyx_type = values[0]; - __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) - __pyx_v___pyx_state = values[2]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 1, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_v___pyx_PickleError = 0; - PyObject *__pyx_v___pyx_result = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - int __pyx_t_6; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__pyx_unpickle_Enum", 0); - - /* "(tree fragment)":4 - * cdef object __pyx_PickleError - * cdef object __pyx_result - * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) - */ - __pyx_t_1 = ((__pyx_v___pyx_checksum != 0xb068931) != 0); - if (__pyx_t_1) { - - /* "(tree fragment)":5 - * cdef object __pyx_result - * if __pyx_checksum != 0xb068931: - * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) - * __pyx_result = Enum.__new__(__pyx_type) - */ - __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_n_s_PickleError); - __Pyx_GIVEREF(__pyx_n_s_PickleError); - PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); - __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_t_2); - __pyx_v___pyx_PickleError = __pyx_t_2; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "(tree fragment)":6 - * if __pyx_checksum != 0xb068931: - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) # <<<<<<<<<<<<<< - * __pyx_result = Enum.__new__(__pyx_type) - * if __pyx_state is not None: - */ - __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0xb0, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_INCREF(__pyx_v___pyx_PickleError); - __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 6, __pyx_L1_error) - - /* "(tree fragment)":4 - * cdef object __pyx_PickleError - * cdef object __pyx_result - * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) - */ - } - - /* "(tree fragment)":7 - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) - * __pyx_result = Enum.__new__(__pyx_type) # <<<<<<<<<<<<<< - * if __pyx_state is not None: - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) - */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_MemviewEnum_type), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v___pyx_result = __pyx_t_3; - __pyx_t_3 = 0; - - /* "(tree fragment)":8 - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) - * __pyx_result = Enum.__new__(__pyx_type) - * if __pyx_state is not None: # <<<<<<<<<<<<<< - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) - * return __pyx_result - */ - __pyx_t_1 = (__pyx_v___pyx_state != Py_None); - __pyx_t_6 = (__pyx_t_1 != 0); - if (__pyx_t_6) { - - /* "(tree fragment)":9 - * __pyx_result = Enum.__new__(__pyx_type) - * if __pyx_state is not None: - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< - * return __pyx_result - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): - */ - if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(2, 9, __pyx_L1_error) - __pyx_t_3 = __pyx_unpickle_Enum__set_state(((struct __pyx_MemviewEnum_obj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "(tree fragment)":8 - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) - * __pyx_result = Enum.__new__(__pyx_type) - * if __pyx_state is not None: # <<<<<<<<<<<<<< - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) - * return __pyx_result - */ - } - - /* "(tree fragment)":10 - * if __pyx_state is not None: - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) - * return __pyx_result # <<<<<<<<<<<<<< - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): - * __pyx_result.name = __pyx_state[0] - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v___pyx_result); - __pyx_r = __pyx_v___pyx_result; - goto __pyx_L0; - - /* "(tree fragment)":1 - * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v___pyx_PickleError); - __Pyx_XDECREF(__pyx_v___pyx_result); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":11 - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) - * return __pyx_result - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< - * __pyx_result.name = __pyx_state[0] - * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): - */ - -static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - Py_ssize_t __pyx_t_3; - int __pyx_t_4; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__pyx_unpickle_Enum__set_state", 0); - - /* "(tree fragment)":12 - * return __pyx_result - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): - * __pyx_result.name = __pyx_state[0] # <<<<<<<<<<<<<< - * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): - * __pyx_result.__dict__.update(__pyx_state[1]) - */ - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(2, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->name); - __Pyx_DECREF(__pyx_v___pyx_result->name); - __pyx_v___pyx_result->name = __pyx_t_1; - __pyx_t_1 = 0; - - /* "(tree fragment)":13 - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): - * __pyx_result.name = __pyx_state[0] - * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< - * __pyx_result.__dict__.update(__pyx_state[1]) - */ - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); - __PYX_ERR(2, 13, __pyx_L1_error) - } - __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(2, 13, __pyx_L1_error) - __pyx_t_4 = ((__pyx_t_3 > 1) != 0); - if (__pyx_t_4) { - } else { - __pyx_t_2 = __pyx_t_4; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 13, __pyx_L1_error) - __pyx_t_5 = (__pyx_t_4 != 0); - __pyx_t_2 = __pyx_t_5; - __pyx_L4_bool_binop_done:; - if (__pyx_t_2) { - - /* "(tree fragment)":14 - * __pyx_result.name = __pyx_state[0] - * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): - * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< - */ - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(2, 14, __pyx_L1_error) - } - __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_8 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { - __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); - if (likely(__pyx_t_8)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); - __Pyx_INCREF(__pyx_t_8); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_7, function); - } - } - __pyx_t_1 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_8, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "(tree fragment)":13 - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): - * __pyx_result.name = __pyx_state[0] - * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< - * __pyx_result.__dict__.update(__pyx_state[1]) - */ - } - - /* "(tree fragment)":11 - * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) - * return __pyx_result - * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< - * __pyx_result.name = __pyx_state[0] - * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "BufferFormatFromTypeInfo":1463 - * - * @cname('__pyx_format_from_typeinfo') - * cdef bytes format_from_typeinfo(__Pyx_TypeInfo *type): # <<<<<<<<<<<<<< - * cdef __Pyx_StructField *field - * cdef __pyx_typeinfo_string fmt - */ - -static PyObject *__pyx_format_from_typeinfo(__Pyx_TypeInfo *__pyx_v_type) { - __Pyx_StructField *__pyx_v_field; - struct __pyx_typeinfo_string __pyx_v_fmt; - PyObject *__pyx_v_part = 0; - PyObject *__pyx_v_result = 0; - PyObject *__pyx_v_alignment = NULL; - PyObject *__pyx_v_parts = NULL; - PyObject *__pyx_v_extents = NULL; - int __pyx_v_i; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - __Pyx_StructField *__pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - int __pyx_t_7; - int __pyx_t_8; - int __pyx_t_9; - int __pyx_t_10; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("format_from_typeinfo", 0); - - /* "BufferFormatFromTypeInfo":1468 - * cdef bytes part, result - * - * if type.typegroup == 'S': # <<<<<<<<<<<<<< - * assert type.fields != NULL and type.fields.type != NULL - * - */ - __pyx_t_1 = ((__pyx_v_type->typegroup == 'S') != 0); - if (__pyx_t_1) { - - /* "BufferFormatFromTypeInfo":1469 - * - * if type.typegroup == 'S': - * assert type.fields != NULL and type.fields.type != NULL # <<<<<<<<<<<<<< - * - * if type.flags & __PYX_BUF_FLAGS_PACKED_STRUCT: - */ - #ifndef CYTHON_WITHOUT_ASSERTIONS - if (unlikely(!Py_OptimizeFlag)) { - __pyx_t_2 = ((__pyx_v_type->fields != NULL) != 0); - if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_2 = ((__pyx_v_type->fields->type != NULL) != 0); - __pyx_t_1 = __pyx_t_2; - __pyx_L4_bool_binop_done:; - if (unlikely(!__pyx_t_1)) { - PyErr_SetNone(PyExc_AssertionError); - __PYX_ERR(2, 1469, __pyx_L1_error) - } - } - #endif - - /* "BufferFormatFromTypeInfo":1471 - * assert type.fields != NULL and type.fields.type != NULL - * - * if type.flags & __PYX_BUF_FLAGS_PACKED_STRUCT: # <<<<<<<<<<<<<< - * alignment = b'^' - * else: - */ - __pyx_t_1 = ((__pyx_v_type->flags & __PYX_BUF_FLAGS_PACKED_STRUCT) != 0); - if (__pyx_t_1) { - - /* "BufferFormatFromTypeInfo":1472 - * - * if type.flags & __PYX_BUF_FLAGS_PACKED_STRUCT: - * alignment = b'^' # <<<<<<<<<<<<<< - * else: - * alignment = b'' - */ - __Pyx_INCREF(__pyx_kp_b__26); - __pyx_v_alignment = __pyx_kp_b__26; - - /* "BufferFormatFromTypeInfo":1471 - * assert type.fields != NULL and type.fields.type != NULL - * - * if type.flags & __PYX_BUF_FLAGS_PACKED_STRUCT: # <<<<<<<<<<<<<< - * alignment = b'^' - * else: - */ - goto __pyx_L6; - } - - /* "BufferFormatFromTypeInfo":1474 - * alignment = b'^' - * else: - * alignment = b'' # <<<<<<<<<<<<<< - * - * parts = [b"T{"] - */ - /*else*/ { - __Pyx_INCREF(__pyx_kp_b__27); - __pyx_v_alignment = __pyx_kp_b__27; - } - __pyx_L6:; - - /* "BufferFormatFromTypeInfo":1476 - * alignment = b'' - * - * parts = [b"T{"] # <<<<<<<<<<<<<< - * field = type.fields - * - */ - __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1476, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_kp_b_T); - __Pyx_GIVEREF(__pyx_kp_b_T); - PyList_SET_ITEM(__pyx_t_3, 0, __pyx_kp_b_T); - __pyx_v_parts = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "BufferFormatFromTypeInfo":1477 - * - * parts = [b"T{"] - * field = type.fields # <<<<<<<<<<<<<< - * - * while field.type: - */ - __pyx_t_4 = __pyx_v_type->fields; - __pyx_v_field = __pyx_t_4; - - /* "BufferFormatFromTypeInfo":1479 - * field = type.fields - * - * while field.type: # <<<<<<<<<<<<<< - * part = format_from_typeinfo(field.type) - * parts.append(part + b':' + field.name + b':') - */ - while (1) { - __pyx_t_1 = (__pyx_v_field->type != 0); - if (!__pyx_t_1) break; - - /* "BufferFormatFromTypeInfo":1480 - * - * while field.type: - * part = format_from_typeinfo(field.type) # <<<<<<<<<<<<<< - * parts.append(part + b':' + field.name + b':') - * field += 1 - */ - __pyx_t_3 = __pyx_format_from_typeinfo(__pyx_v_field->type); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1480, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_XDECREF_SET(__pyx_v_part, ((PyObject*)__pyx_t_3)); - __pyx_t_3 = 0; - - /* "BufferFormatFromTypeInfo":1481 - * while field.type: - * part = format_from_typeinfo(field.type) - * parts.append(part + b':' + field.name + b':') # <<<<<<<<<<<<<< - * field += 1 - * - */ - __pyx_t_3 = PyNumber_Add(__pyx_v_part, __pyx_kp_b__28); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1481, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_field->name); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1481, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = PyNumber_Add(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 1481, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyNumber_Add(__pyx_t_6, __pyx_kp_b__28); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1481, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_7 = __Pyx_PyList_Append(__pyx_v_parts, __pyx_t_5); if (unlikely(__pyx_t_7 == ((int)-1))) __PYX_ERR(2, 1481, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - - /* "BufferFormatFromTypeInfo":1482 - * part = format_from_typeinfo(field.type) - * parts.append(part + b':' + field.name + b':') - * field += 1 # <<<<<<<<<<<<<< - * - * result = alignment.join(parts) + b'}' - */ - __pyx_v_field = (__pyx_v_field + 1); - } - - /* "BufferFormatFromTypeInfo":1484 - * field += 1 - * - * result = alignment.join(parts) + b'}' # <<<<<<<<<<<<<< - * else: - * fmt = __Pyx_TypeInfoToFormat(type) - */ - __pyx_t_5 = __Pyx_PyBytes_Join(__pyx_v_alignment, __pyx_v_parts); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1484, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = PyNumber_Add(__pyx_t_5, __pyx_kp_b__29); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 1484, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (!(likely(PyBytes_CheckExact(__pyx_t_6))||((__pyx_t_6) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_6)->tp_name), 0))) __PYX_ERR(2, 1484, __pyx_L1_error) - __pyx_v_result = ((PyObject*)__pyx_t_6); - __pyx_t_6 = 0; - - /* "BufferFormatFromTypeInfo":1468 - * cdef bytes part, result - * - * if type.typegroup == 'S': # <<<<<<<<<<<<<< - * assert type.fields != NULL and type.fields.type != NULL - * - */ - goto __pyx_L3; - } - - /* "BufferFormatFromTypeInfo":1486 - * result = alignment.join(parts) + b'}' - * else: - * fmt = __Pyx_TypeInfoToFormat(type) # <<<<<<<<<<<<<< - * if type.arraysize[0]: - * extents = [unicode(type.arraysize[i]) for i in range(type.ndim)] - */ - /*else*/ { - __pyx_v_fmt = __Pyx_TypeInfoToFormat(__pyx_v_type); - - /* "BufferFormatFromTypeInfo":1487 - * else: - * fmt = __Pyx_TypeInfoToFormat(type) - * if type.arraysize[0]: # <<<<<<<<<<<<<< - * extents = [unicode(type.arraysize[i]) for i in range(type.ndim)] - * result = (u"(%s)" % u','.join(extents)).encode('ascii') + fmt.string - */ - __pyx_t_1 = ((__pyx_v_type->arraysize[0]) != 0); - if (__pyx_t_1) { - - /* "BufferFormatFromTypeInfo":1488 - * fmt = __Pyx_TypeInfoToFormat(type) - * if type.arraysize[0]: - * extents = [unicode(type.arraysize[i]) for i in range(type.ndim)] # <<<<<<<<<<<<<< - * result = (u"(%s)" % u','.join(extents)).encode('ascii') + fmt.string - * else: - */ - __pyx_t_6 = PyList_New(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 1488, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_8 = __pyx_v_type->ndim; - __pyx_t_9 = __pyx_t_8; - for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { - __pyx_v_i = __pyx_t_10; - __pyx_t_5 = __Pyx_PyInt_FromSize_t((__pyx_v_type->arraysize[__pyx_v_i])); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1488, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_3 = __Pyx_PyObject_Unicode(__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1488, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(__Pyx_ListComp_Append(__pyx_t_6, (PyObject*)__pyx_t_3))) __PYX_ERR(2, 1488, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } - __pyx_v_extents = ((PyObject*)__pyx_t_6); - __pyx_t_6 = 0; - - /* "BufferFormatFromTypeInfo":1489 - * if type.arraysize[0]: - * extents = [unicode(type.arraysize[i]) for i in range(type.ndim)] - * result = (u"(%s)" % u','.join(extents)).encode('ascii') + fmt.string # <<<<<<<<<<<<<< - * else: - * result = fmt.string - */ - __pyx_t_6 = PyUnicode_Join(__pyx_kp_u__30, __pyx_v_extents); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 1489, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_s, __pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1489, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = PyUnicode_AsASCIIString(((PyObject*)__pyx_t_3)); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 1489, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_FromString(__pyx_v_fmt.string); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1489, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = PyNumber_Add(__pyx_t_6, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1489, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (!(likely(PyBytes_CheckExact(__pyx_t_5))||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_5)->tp_name), 0))) __PYX_ERR(2, 1489, __pyx_L1_error) - __pyx_v_result = ((PyObject*)__pyx_t_5); - __pyx_t_5 = 0; - - /* "BufferFormatFromTypeInfo":1487 - * else: - * fmt = __Pyx_TypeInfoToFormat(type) - * if type.arraysize[0]: # <<<<<<<<<<<<<< - * extents = [unicode(type.arraysize[i]) for i in range(type.ndim)] - * result = (u"(%s)" % u','.join(extents)).encode('ascii') + fmt.string - */ - goto __pyx_L9; - } - - /* "BufferFormatFromTypeInfo":1491 - * result = (u"(%s)" % u','.join(extents)).encode('ascii') + fmt.string - * else: - * result = fmt.string # <<<<<<<<<<<<<< - * - * return result - */ - /*else*/ { - __pyx_t_5 = __Pyx_PyObject_FromString(__pyx_v_fmt.string); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1491, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_v_result = ((PyObject*)__pyx_t_5); - __pyx_t_5 = 0; - } - __pyx_L9:; - } - __pyx_L3:; - - /* "BufferFormatFromTypeInfo":1493 - * result = fmt.string - * - * return result # <<<<<<<<<<<<<< - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_result); - __pyx_r = __pyx_v_result; - goto __pyx_L0; - - /* "BufferFormatFromTypeInfo":1463 - * - * @cname('__pyx_format_from_typeinfo') - * cdef bytes format_from_typeinfo(__Pyx_TypeInfo *type): # <<<<<<<<<<<<<< - * cdef __Pyx_StructField *field - * cdef __pyx_typeinfo_string fmt - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("BufferFormatFromTypeInfo.format_from_typeinfo", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_part); - __Pyx_XDECREF(__pyx_v_result); - __Pyx_XDECREF(__pyx_v_alignment); - __Pyx_XDECREF(__pyx_v_parts); - __Pyx_XDECREF(__pyx_v_extents); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} -static struct __pyx_vtabstruct_array __pyx_vtable_array; - -static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k) { - struct __pyx_array_obj *p; - PyObject *o; - if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { - o = (*t->tp_alloc)(t, 0); - } else { - o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); - } - if (unlikely(!o)) return 0; - p = ((struct __pyx_array_obj *)o); - p->__pyx_vtab = __pyx_vtabptr_array; - p->mode = ((PyObject*)Py_None); Py_INCREF(Py_None); - p->_format = ((PyObject*)Py_None); Py_INCREF(Py_None); - if (unlikely(__pyx_array___cinit__(o, a, k) < 0)) goto bad; - return o; - bad: - Py_DECREF(o); o = 0; - return NULL; -} - -static void __pyx_tp_dealloc_array(PyObject *o) { - struct __pyx_array_obj *p = (struct __pyx_array_obj *)o; - #if CYTHON_USE_TP_FINALIZE - if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) { - if (PyObject_CallFinalizerFromDealloc(o)) return; - } - #endif - { - PyObject *etype, *eval, *etb; - PyErr_Fetch(&etype, &eval, &etb); - __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); - __pyx_array___dealloc__(o); - __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); - PyErr_Restore(etype, eval, etb); - } - Py_CLEAR(p->mode); - Py_CLEAR(p->_format); - (*Py_TYPE(o)->tp_free)(o); -} -static PyObject *__pyx_sq_item_array(PyObject *o, Py_ssize_t i) { - PyObject *r; - PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; - r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); - Py_DECREF(x); - return r; -} - -static int __pyx_mp_ass_subscript_array(PyObject *o, PyObject *i, PyObject *v) { - if (v) { - return __pyx_array___setitem__(o, i, v); - } - else { - PyErr_Format(PyExc_NotImplementedError, - "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name); - return -1; - } -} - -static PyObject *__pyx_tp_getattro_array(PyObject *o, PyObject *n) { - PyObject *v = __Pyx_PyObject_GenericGetAttr(o, n); - if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Clear(); - v = __pyx_array___getattr__(o, n); - } - return v; -} - -static PyObject *__pyx_getprop___pyx_array_memview(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(o); -} - -static PyMethodDef __pyx_methods_array[] = { - {"__getattr__", (PyCFunction)__pyx_array___getattr__, METH_O|METH_COEXIST, 0}, - {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_array_1__reduce_cython__, METH_NOARGS, 0}, - {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_array_3__setstate_cython__, METH_O, 0}, - {0, 0, 0, 0} -}; - -static struct PyGetSetDef __pyx_getsets_array[] = { - {(char *)"memview", __pyx_getprop___pyx_array_memview, 0, (char *)0, 0}, - {0, 0, 0, 0, 0} -}; - -static PySequenceMethods __pyx_tp_as_sequence_array = { - __pyx_array___len__, /*sq_length*/ - 0, /*sq_concat*/ - 0, /*sq_repeat*/ - __pyx_sq_item_array, /*sq_item*/ - 0, /*sq_slice*/ - 0, /*sq_ass_item*/ - 0, /*sq_ass_slice*/ - 0, /*sq_contains*/ - 0, /*sq_inplace_concat*/ - 0, /*sq_inplace_repeat*/ -}; - -static PyMappingMethods __pyx_tp_as_mapping_array = { - __pyx_array___len__, /*mp_length*/ - __pyx_array___getitem__, /*mp_subscript*/ - __pyx_mp_ass_subscript_array, /*mp_ass_subscript*/ -}; - -static PyBufferProcs __pyx_tp_as_buffer_array = { - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getreadbuffer*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getwritebuffer*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getsegcount*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getcharbuffer*/ - #endif - __pyx_array_getbuffer, /*bf_getbuffer*/ - 0, /*bf_releasebuffer*/ -}; - -static PyTypeObject __pyx_type___pyx_array = { - PyVarObject_HEAD_INIT(0, 0) - "easyCore.Utils.coord_cython.array", /*tp_name*/ - sizeof(struct __pyx_array_obj), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_array, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - &__pyx_tp_as_sequence_array, /*tp_as_sequence*/ - &__pyx_tp_as_mapping_array, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - __pyx_tp_getattro_array, /*tp_getattro*/ - 0, /*tp_setattro*/ - &__pyx_tp_as_buffer_array, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods_array, /*tp_methods*/ - 0, /*tp_members*/ - __pyx_getsets_array, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_array, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; - -static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { - struct __pyx_MemviewEnum_obj *p; - PyObject *o; - if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { - o = (*t->tp_alloc)(t, 0); - } else { - o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); - } - if (unlikely(!o)) return 0; - p = ((struct __pyx_MemviewEnum_obj *)o); - p->name = Py_None; Py_INCREF(Py_None); - return o; -} - -static void __pyx_tp_dealloc_Enum(PyObject *o) { - struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; - #if CYTHON_USE_TP_FINALIZE - if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { - if (PyObject_CallFinalizerFromDealloc(o)) return; - } - #endif - PyObject_GC_UnTrack(o); - Py_CLEAR(p->name); - (*Py_TYPE(o)->tp_free)(o); -} - -static int __pyx_tp_traverse_Enum(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; - if (p->name) { - e = (*v)(p->name, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_Enum(PyObject *o) { - PyObject* tmp; - struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; - tmp = ((PyObject*)p->name); - p->name = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - return 0; -} - -static PyMethodDef __pyx_methods_Enum[] = { - {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_MemviewEnum_1__reduce_cython__, METH_NOARGS, 0}, - {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_MemviewEnum_3__setstate_cython__, METH_O, 0}, - {0, 0, 0, 0} -}; - -static PyTypeObject __pyx_type___pyx_MemviewEnum = { - PyVarObject_HEAD_INIT(0, 0) - "easyCore.Utils.coord_cython.Enum", /*tp_name*/ - sizeof(struct __pyx_MemviewEnum_obj), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_Enum, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - __pyx_MemviewEnum___repr__, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - __pyx_tp_traverse_Enum, /*tp_traverse*/ - __pyx_tp_clear_Enum, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods_Enum, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - __pyx_MemviewEnum___init__, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_Enum, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; -static struct __pyx_vtabstruct_memoryview __pyx_vtable_memoryview; - -static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k) { - struct __pyx_memoryview_obj *p; - PyObject *o; - if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { - o = (*t->tp_alloc)(t, 0); - } else { - o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); - } - if (unlikely(!o)) return 0; - p = ((struct __pyx_memoryview_obj *)o); - p->__pyx_vtab = __pyx_vtabptr_memoryview; - p->obj = Py_None; Py_INCREF(Py_None); - p->_size = Py_None; Py_INCREF(Py_None); - p->_array_interface = Py_None; Py_INCREF(Py_None); - p->view.obj = NULL; - if (unlikely(__pyx_memoryview___cinit__(o, a, k) < 0)) goto bad; - return o; - bad: - Py_DECREF(o); o = 0; - return NULL; -} - -static void __pyx_tp_dealloc_memoryview(PyObject *o) { - struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; - #if CYTHON_USE_TP_FINALIZE - if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { - if (PyObject_CallFinalizerFromDealloc(o)) return; - } - #endif - PyObject_GC_UnTrack(o); - { - PyObject *etype, *eval, *etb; - PyErr_Fetch(&etype, &eval, &etb); - __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); - __pyx_memoryview___dealloc__(o); - __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); - PyErr_Restore(etype, eval, etb); - } - Py_CLEAR(p->obj); - Py_CLEAR(p->_size); - Py_CLEAR(p->_array_interface); - (*Py_TYPE(o)->tp_free)(o); -} - -static int __pyx_tp_traverse_memoryview(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; - if (p->obj) { - e = (*v)(p->obj, a); if (e) return e; - } - if (p->_size) { - e = (*v)(p->_size, a); if (e) return e; - } - if (p->_array_interface) { - e = (*v)(p->_array_interface, a); if (e) return e; - } - if (p->view.obj) { - e = (*v)(p->view.obj, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_memoryview(PyObject *o) { - PyObject* tmp; - struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; - tmp = ((PyObject*)p->obj); - p->obj = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->_size); - p->_size = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->_array_interface); - p->_array_interface = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - Py_CLEAR(p->view.obj); - return 0; -} -static PyObject *__pyx_sq_item_memoryview(PyObject *o, Py_ssize_t i) { - PyObject *r; - PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; - r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); - Py_DECREF(x); - return r; -} - -static int __pyx_mp_ass_subscript_memoryview(PyObject *o, PyObject *i, PyObject *v) { - if (v) { - return __pyx_memoryview___setitem__(o, i, v); - } - else { - PyErr_Format(PyExc_NotImplementedError, - "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name); - return -1; - } -} - -static PyObject *__pyx_getprop___pyx_memoryview_T(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(o); -} - -static PyObject *__pyx_getprop___pyx_memoryview_base(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(o); -} - -static PyObject *__pyx_getprop___pyx_memoryview_shape(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(o); -} - -static PyObject *__pyx_getprop___pyx_memoryview_strides(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(o); -} - -static PyObject *__pyx_getprop___pyx_memoryview_suboffsets(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(o); -} - -static PyObject *__pyx_getprop___pyx_memoryview_ndim(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(o); -} - -static PyObject *__pyx_getprop___pyx_memoryview_itemsize(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(o); -} - -static PyObject *__pyx_getprop___pyx_memoryview_nbytes(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(o); -} - -static PyObject *__pyx_getprop___pyx_memoryview_size(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(o); -} - -static PyMethodDef __pyx_methods_memoryview[] = { - {"is_c_contig", (PyCFunction)__pyx_memoryview_is_c_contig, METH_NOARGS, 0}, - {"is_f_contig", (PyCFunction)__pyx_memoryview_is_f_contig, METH_NOARGS, 0}, - {"copy", (PyCFunction)__pyx_memoryview_copy, METH_NOARGS, 0}, - {"copy_fortran", (PyCFunction)__pyx_memoryview_copy_fortran, METH_NOARGS, 0}, - {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_memoryview_1__reduce_cython__, METH_NOARGS, 0}, - {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_memoryview_3__setstate_cython__, METH_O, 0}, - {0, 0, 0, 0} -}; - -static struct PyGetSetDef __pyx_getsets_memoryview[] = { - {(char *)"T", __pyx_getprop___pyx_memoryview_T, 0, (char *)0, 0}, - {(char *)"base", __pyx_getprop___pyx_memoryview_base, 0, (char *)0, 0}, - {(char *)"shape", __pyx_getprop___pyx_memoryview_shape, 0, (char *)0, 0}, - {(char *)"strides", __pyx_getprop___pyx_memoryview_strides, 0, (char *)0, 0}, - {(char *)"suboffsets", __pyx_getprop___pyx_memoryview_suboffsets, 0, (char *)0, 0}, - {(char *)"ndim", __pyx_getprop___pyx_memoryview_ndim, 0, (char *)0, 0}, - {(char *)"itemsize", __pyx_getprop___pyx_memoryview_itemsize, 0, (char *)0, 0}, - {(char *)"nbytes", __pyx_getprop___pyx_memoryview_nbytes, 0, (char *)0, 0}, - {(char *)"size", __pyx_getprop___pyx_memoryview_size, 0, (char *)0, 0}, - {0, 0, 0, 0, 0} -}; - -static PySequenceMethods __pyx_tp_as_sequence_memoryview = { - __pyx_memoryview___len__, /*sq_length*/ - 0, /*sq_concat*/ - 0, /*sq_repeat*/ - __pyx_sq_item_memoryview, /*sq_item*/ - 0, /*sq_slice*/ - 0, /*sq_ass_item*/ - 0, /*sq_ass_slice*/ - 0, /*sq_contains*/ - 0, /*sq_inplace_concat*/ - 0, /*sq_inplace_repeat*/ -}; - -static PyMappingMethods __pyx_tp_as_mapping_memoryview = { - __pyx_memoryview___len__, /*mp_length*/ - __pyx_memoryview___getitem__, /*mp_subscript*/ - __pyx_mp_ass_subscript_memoryview, /*mp_ass_subscript*/ -}; - -static PyBufferProcs __pyx_tp_as_buffer_memoryview = { - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getreadbuffer*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getwritebuffer*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getsegcount*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getcharbuffer*/ - #endif - __pyx_memoryview_getbuffer, /*bf_getbuffer*/ - 0, /*bf_releasebuffer*/ -}; - -static PyTypeObject __pyx_type___pyx_memoryview = { - PyVarObject_HEAD_INIT(0, 0) - "easyCore.Utils.coord_cython.memoryview", /*tp_name*/ - sizeof(struct __pyx_memoryview_obj), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_memoryview, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - __pyx_memoryview___repr__, /*tp_repr*/ - 0, /*tp_as_number*/ - &__pyx_tp_as_sequence_memoryview, /*tp_as_sequence*/ - &__pyx_tp_as_mapping_memoryview, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - __pyx_memoryview___str__, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - &__pyx_tp_as_buffer_memoryview, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - __pyx_tp_traverse_memoryview, /*tp_traverse*/ - __pyx_tp_clear_memoryview, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods_memoryview, /*tp_methods*/ - 0, /*tp_members*/ - __pyx_getsets_memoryview, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_memoryview, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; -static struct __pyx_vtabstruct__memoryviewslice __pyx_vtable__memoryviewslice; - -static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k) { - struct __pyx_memoryviewslice_obj *p; - PyObject *o = __pyx_tp_new_memoryview(t, a, k); - if (unlikely(!o)) return 0; - p = ((struct __pyx_memoryviewslice_obj *)o); - p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_memoryview*)__pyx_vtabptr__memoryviewslice; - p->from_object = Py_None; Py_INCREF(Py_None); - p->from_slice.memview = NULL; - return o; -} - -static void __pyx_tp_dealloc__memoryviewslice(PyObject *o) { - struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; - #if CYTHON_USE_TP_FINALIZE - if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { - if (PyObject_CallFinalizerFromDealloc(o)) return; - } - #endif - PyObject_GC_UnTrack(o); - { - PyObject *etype, *eval, *etb; - PyErr_Fetch(&etype, &eval, &etb); - __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); - __pyx_memoryviewslice___dealloc__(o); - __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); - PyErr_Restore(etype, eval, etb); - } - Py_CLEAR(p->from_object); - PyObject_GC_Track(o); - __pyx_tp_dealloc_memoryview(o); -} - -static int __pyx_tp_traverse__memoryviewslice(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; - e = __pyx_tp_traverse_memoryview(o, v, a); if (e) return e; - if (p->from_object) { - e = (*v)(p->from_object, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear__memoryviewslice(PyObject *o) { - PyObject* tmp; - struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; - __pyx_tp_clear_memoryview(o); - tmp = ((PyObject*)p->from_object); - p->from_object = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - __PYX_XDEC_MEMVIEW(&p->from_slice, 1); - return 0; -} - -static PyObject *__pyx_getprop___pyx_memoryviewslice_base(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(o); -} - -static PyMethodDef __pyx_methods__memoryviewslice[] = { - {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_memoryviewslice_1__reduce_cython__, METH_NOARGS, 0}, - {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_memoryviewslice_3__setstate_cython__, METH_O, 0}, - {0, 0, 0, 0} -}; - -static struct PyGetSetDef __pyx_getsets__memoryviewslice[] = { - {(char *)"base", __pyx_getprop___pyx_memoryviewslice_base, 0, (char *)0, 0}, - {0, 0, 0, 0, 0} -}; - -static PyTypeObject __pyx_type___pyx_memoryviewslice = { - PyVarObject_HEAD_INIT(0, 0) - "easyCore.Utils.coord_cython._memoryviewslice", /*tp_name*/ - sizeof(struct __pyx_memoryviewslice_obj), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc__memoryviewslice, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - #if CYTHON_COMPILING_IN_PYPY - __pyx_memoryview___repr__, /*tp_repr*/ - #else - 0, /*tp_repr*/ - #endif - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - #if CYTHON_COMPILING_IN_PYPY - __pyx_memoryview___str__, /*tp_str*/ - #else - 0, /*tp_str*/ - #endif - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - "Internal class for passing memoryview slices to Python", /*tp_doc*/ - __pyx_tp_traverse__memoryviewslice, /*tp_traverse*/ - __pyx_tp_clear__memoryviewslice, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods__memoryviewslice, /*tp_methods*/ - 0, /*tp_members*/ - __pyx_getsets__memoryviewslice, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new__memoryviewslice, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; - -static PyMethodDef __pyx_methods[] = { - {0, 0, 0, 0} -}; - -#if PY_MAJOR_VERSION >= 3 -#if CYTHON_PEP489_MULTI_PHASE_INIT -static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ -static int __pyx_pymod_exec_coord_cython(PyObject* module); /*proto*/ -static PyModuleDef_Slot __pyx_moduledef_slots[] = { - {Py_mod_create, (void*)__pyx_pymod_create}, - {Py_mod_exec, (void*)__pyx_pymod_exec_coord_cython}, - {0, NULL} -}; -#endif - -static struct PyModuleDef __pyx_moduledef = { - PyModuleDef_HEAD_INIT, - "coord_cython", - __pyx_k_Utilities_for_manipulating_coor, /* m_doc */ - #if CYTHON_PEP489_MULTI_PHASE_INIT - 0, /* m_size */ - #else - -1, /* m_size */ - #endif - __pyx_methods /* m_methods */, - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_moduledef_slots, /* m_slots */ - #else - NULL, /* m_reload */ - #endif - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; -#endif -#ifndef CYTHON_SMALL_CODE -#if defined(__clang__) - #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) - #define CYTHON_SMALL_CODE __attribute__((cold)) -#else - #define CYTHON_SMALL_CODE -#endif -#endif - -static __Pyx_StringTabEntry __pyx_string_tab[] = { - {&__pyx_kp_s_1_0, __pyx_k_1_0, sizeof(__pyx_k_1_0), 0, 0, 1, 0}, - {&__pyx_n_s_ASCII, __pyx_k_ASCII, sizeof(__pyx_k_ASCII), 0, 0, 1, 1}, - {&__pyx_kp_s_Buffer_view_does_not_expose_stri, __pyx_k_Buffer_view_does_not_expose_stri, sizeof(__pyx_k_Buffer_view_does_not_expose_stri), 0, 0, 1, 0}, - {&__pyx_n_s_C, __pyx_k_C, sizeof(__pyx_k_C), 0, 0, 1, 1}, - {&__pyx_kp_s_Can_only_create_a_buffer_that_is, __pyx_k_Can_only_create_a_buffer_that_is, sizeof(__pyx_k_Can_only_create_a_buffer_that_is), 0, 0, 1, 0}, - {&__pyx_kp_s_Cannot_assign_to_read_only_memor, __pyx_k_Cannot_assign_to_read_only_memor, sizeof(__pyx_k_Cannot_assign_to_read_only_memor), 0, 0, 1, 0}, - {&__pyx_kp_s_Cannot_create_writable_memory_vi, __pyx_k_Cannot_create_writable_memory_vi, sizeof(__pyx_k_Cannot_create_writable_memory_vi), 0, 0, 1, 0}, - {&__pyx_kp_s_Cannot_index_with_type_s, __pyx_k_Cannot_index_with_type_s, sizeof(__pyx_k_Cannot_index_with_type_s), 0, 0, 1, 0}, - {&__pyx_kp_s_Copyright_2011_The_Materials_Pro, __pyx_k_Copyright_2011_The_Materials_Pro, sizeof(__pyx_k_Copyright_2011_The_Materials_Pro), 0, 0, 1, 0}, - {&__pyx_n_s_Ellipsis, __pyx_k_Ellipsis, sizeof(__pyx_k_Ellipsis), 0, 0, 1, 1}, - {&__pyx_kp_s_Empty_shape_tuple_for_cython_arr, __pyx_k_Empty_shape_tuple_for_cython_arr, sizeof(__pyx_k_Empty_shape_tuple_for_cython_arr), 0, 0, 1, 0}, - {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0}, - {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0}, - {&__pyx_n_s_I, __pyx_k_I, sizeof(__pyx_k_I), 0, 0, 1, 1}, - {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, - {&__pyx_kp_s_Incompatible_checksums_s_vs_0xb0, __pyx_k_Incompatible_checksums_s_vs_0xb0, sizeof(__pyx_k_Incompatible_checksums_s_vs_0xb0), 0, 0, 1, 0}, - {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1}, - {&__pyx_kp_s_Indirect_dimensions_not_supporte, __pyx_k_Indirect_dimensions_not_supporte, sizeof(__pyx_k_Indirect_dimensions_not_supporte), 0, 0, 1, 0}, - {&__pyx_kp_s_Invalid_mode_expected_c_or_fortr, __pyx_k_Invalid_mode_expected_c_or_fortr, sizeof(__pyx_k_Invalid_mode_expected_c_or_fortr), 0, 0, 1, 0}, - {&__pyx_kp_s_Invalid_shape_in_axis_d_d, __pyx_k_Invalid_shape_in_axis_d_d, sizeof(__pyx_k_Invalid_shape_in_axis_d_d), 0, 0, 1, 0}, - {&__pyx_n_s_J, __pyx_k_J, sizeof(__pyx_k_J), 0, 0, 1, 1}, - {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, - {&__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_k_MemoryView_of_r_at_0x_x, sizeof(__pyx_k_MemoryView_of_r_at_0x_x), 0, 0, 1, 0}, - {&__pyx_kp_s_MemoryView_of_r_object, __pyx_k_MemoryView_of_r_object, sizeof(__pyx_k_MemoryView_of_r_object), 0, 0, 1, 0}, - {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0}, - {&__pyx_kp_s_Nov_27_2011, __pyx_k_Nov_27_2011, sizeof(__pyx_k_Nov_27_2011), 0, 0, 1, 0}, - {&__pyx_n_b_O, __pyx_k_O, sizeof(__pyx_k_O), 0, 0, 0, 1}, - {&__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_k_Out_of_bounds_on_buffer_access_a, sizeof(__pyx_k_Out_of_bounds_on_buffer_access_a), 0, 0, 1, 0}, - {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, - {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, - {&__pyx_kp_s_Something_wrong_with_the_inputs, __pyx_k_Something_wrong_with_the_inputs, sizeof(__pyx_k_Something_wrong_with_the_inputs), 0, 0, 1, 0}, - {&__pyx_kp_b_T, __pyx_k_T, sizeof(__pyx_k_T), 0, 0, 0, 0}, - {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, - {&__pyx_kp_s_Unable_to_convert_item_to_object, __pyx_k_Unable_to_convert_item_to_object, sizeof(__pyx_k_Unable_to_convert_item_to_object), 0, 0, 1, 0}, - {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, - {&__pyx_n_s_View_MemoryView, __pyx_k_View_MemoryView, sizeof(__pyx_k_View_MemoryView), 0, 0, 1, 1}, - {&__pyx_kp_s_Will_Richards, __pyx_k_Will_Richards, sizeof(__pyx_k_Will_Richards), 0, 0, 1, 0}, - {&__pyx_kp_b__26, __pyx_k__26, sizeof(__pyx_k__26), 0, 0, 0, 0}, - {&__pyx_kp_b__27, __pyx_k__27, sizeof(__pyx_k__27), 0, 0, 0, 0}, - {&__pyx_kp_b__28, __pyx_k__28, sizeof(__pyx_k__28), 0, 0, 0, 0}, - {&__pyx_kp_b__29, __pyx_k__29, sizeof(__pyx_k__29), 0, 0, 0, 0}, - {&__pyx_kp_u__30, __pyx_k__30, sizeof(__pyx_k__30), 0, 1, 0, 0}, - {&__pyx_n_s_allocate_buffer, __pyx_k_allocate_buffer, sizeof(__pyx_k_allocate_buffer), 0, 0, 1, 1}, - {&__pyx_n_s_arange, __pyx_k_arange, sizeof(__pyx_k_arange), 0, 0, 1, 1}, - {&__pyx_n_s_array, __pyx_k_array, sizeof(__pyx_k_array), 0, 0, 1, 1}, - {&__pyx_n_s_atleast_2d, __pyx_k_atleast_2d, sizeof(__pyx_k_atleast_2d), 0, 0, 1, 1}, - {&__pyx_n_s_atol, __pyx_k_atol, sizeof(__pyx_k_atol), 0, 0, 1, 1}, - {&__pyx_n_s_author, __pyx_k_author, sizeof(__pyx_k_author), 0, 0, 1, 1}, - {&__pyx_n_s_base, __pyx_k_base, sizeof(__pyx_k_base), 0, 0, 1, 1}, - {&__pyx_n_s_best, __pyx_k_best, sizeof(__pyx_k_best), 0, 0, 1, 1}, - {&__pyx_n_s_bestK, __pyx_k_bestK, sizeof(__pyx_k_bestK), 0, 0, 1, 1}, - {&__pyx_n_s_bestk, __pyx_k_bestk, sizeof(__pyx_k_bestk), 0, 0, 1, 1}, - {&__pyx_n_s_brange, __pyx_k_brange, sizeof(__pyx_k_brange), 0, 0, 1, 1}, - {&__pyx_n_s_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 0, 1, 1}, - {&__pyx_n_u_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 1, 0, 1}, - {&__pyx_n_s_c_inds, __pyx_k_c_inds, sizeof(__pyx_k_c_inds), 0, 0, 1, 1}, - {&__pyx_n_s_cart_f1, __pyx_k_cart_f1, sizeof(__pyx_k_cart_f1), 0, 0, 1, 1}, - {&__pyx_n_s_cart_f2, __pyx_k_cart_f2, sizeof(__pyx_k_cart_f2), 0, 0, 1, 1}, - {&__pyx_n_s_cart_im, __pyx_k_cart_im, sizeof(__pyx_k_cart_im), 0, 0, 1, 1}, - {&__pyx_n_s_class, __pyx_k_class, sizeof(__pyx_k_class), 0, 0, 1, 1}, - {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, - {&__pyx_kp_s_contiguous_and_direct, __pyx_k_contiguous_and_direct, sizeof(__pyx_k_contiguous_and_direct), 0, 0, 1, 0}, - {&__pyx_kp_s_contiguous_and_indirect, __pyx_k_contiguous_and_indirect, sizeof(__pyx_k_contiguous_and_indirect), 0, 0, 1, 0}, - {&__pyx_n_s_coord_list_mapping_pbc, __pyx_k_coord_list_mapping_pbc, sizeof(__pyx_k_coord_list_mapping_pbc), 0, 0, 1, 1}, - {&__pyx_n_s_copy, __pyx_k_copy, sizeof(__pyx_k_copy), 0, 0, 1, 1}, - {&__pyx_n_s_copyright, __pyx_k_copyright, sizeof(__pyx_k_copyright), 0, 0, 1, 1}, - {&__pyx_n_s_crange, __pyx_k_crange, sizeof(__pyx_k_crange), 0, 0, 1, 1}, - {&__pyx_n_s_d, __pyx_k_d, sizeof(__pyx_k_d), 0, 0, 1, 1}, - {&__pyx_n_s_d2, __pyx_k_d2, sizeof(__pyx_k_d2), 0, 0, 1, 1}, - {&__pyx_n_s_da, __pyx_k_da, sizeof(__pyx_k_da), 0, 0, 1, 1}, - {&__pyx_n_s_date, __pyx_k_date, sizeof(__pyx_k_date), 0, 0, 1, 1}, - {&__pyx_n_s_db, __pyx_k_db, sizeof(__pyx_k_db), 0, 0, 1, 1}, - {&__pyx_n_s_dc, __pyx_k_dc, sizeof(__pyx_k_dc), 0, 0, 1, 1}, - {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, - {&__pyx_n_s_ds, __pyx_k_ds, sizeof(__pyx_k_ds), 0, 0, 1, 1}, - {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, - {&__pyx_n_s_dtype_is_object, __pyx_k_dtype_is_object, sizeof(__pyx_k_dtype_is_object), 0, 0, 1, 1}, - {&__pyx_n_s_easyCore_Utils_coord_cython, __pyx_k_easyCore_Utils_coord_cython, sizeof(__pyx_k_easyCore_Utils_coord_cython), 0, 0, 1, 1}, - {&__pyx_kp_s_easyCore_Utils_coord_cython_pyx, __pyx_k_easyCore_Utils_coord_cython_pyx, sizeof(__pyx_k_easyCore_Utils_coord_cython_pyx), 0, 0, 1, 0}, - {&__pyx_n_s_email, __pyx_k_email, sizeof(__pyx_k_email), 0, 0, 1, 1}, - {&__pyx_n_s_empty, __pyx_k_empty, sizeof(__pyx_k_empty), 0, 0, 1, 1}, - {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1}, - {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, - {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1}, - {&__pyx_n_s_fc1, __pyx_k_fc1, sizeof(__pyx_k_fc1), 0, 0, 1, 1}, - {&__pyx_n_s_fc2, __pyx_k_fc2, sizeof(__pyx_k_fc2), 0, 0, 1, 1}, - {&__pyx_n_s_fcoords1, __pyx_k_fcoords1, sizeof(__pyx_k_fcoords1), 0, 0, 1, 1}, - {&__pyx_n_s_fcoords2, __pyx_k_fcoords2, sizeof(__pyx_k_fcoords2), 0, 0, 1, 1}, - {&__pyx_n_s_fdist, __pyx_k_fdist, sizeof(__pyx_k_fdist), 0, 0, 1, 1}, - {&__pyx_n_s_flags, __pyx_k_flags, sizeof(__pyx_k_flags), 0, 0, 1, 1}, - {&__pyx_n_s_float, __pyx_k_float, sizeof(__pyx_k_float), 0, 0, 1, 1}, - {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, - {&__pyx_n_s_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 0, 1, 1}, - {&__pyx_n_u_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 1, 0, 1}, - {&__pyx_n_s_ftol, __pyx_k_ftol, sizeof(__pyx_k_ftol), 0, 0, 1, 1}, - {&__pyx_n_s_get_lll_frac_coords, __pyx_k_get_lll_frac_coords, sizeof(__pyx_k_get_lll_frac_coords), 0, 0, 1, 1}, - {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, - {&__pyx_kp_s_got_differing_extents_in_dimensi, __pyx_k_got_differing_extents_in_dimensi, sizeof(__pyx_k_got_differing_extents_in_dimensi), 0, 0, 1, 0}, - {&__pyx_n_s_has_ftol, __pyx_k_has_ftol, sizeof(__pyx_k_has_ftol), 0, 0, 1, 1}, - {&__pyx_n_s_has_mask, __pyx_k_has_mask, sizeof(__pyx_k_has_mask), 0, 0, 1, 1}, - {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, - {&__pyx_n_s_id, __pyx_k_id, sizeof(__pyx_k_id), 0, 0, 1, 1}, - {&__pyx_n_s_images, __pyx_k_images, sizeof(__pyx_k_images), 0, 0, 1, 1}, - {&__pyx_n_s_images_t, __pyx_k_images_t, sizeof(__pyx_k_images_t), 0, 0, 1, 1}, - {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, - {&__pyx_n_s_inc_d, __pyx_k_inc_d, sizeof(__pyx_k_inc_d), 0, 0, 1, 1}, - {&__pyx_n_s_inds, __pyx_k_inds, sizeof(__pyx_k_inds), 0, 0, 1, 1}, - {&__pyx_n_s_int, __pyx_k_int, sizeof(__pyx_k_int), 0, 0, 1, 1}, - {&__pyx_n_s_int_2, __pyx_k_int_2, sizeof(__pyx_k_int_2), 0, 0, 1, 1}, - {&__pyx_n_s_is_coord_subset_pbc, __pyx_k_is_coord_subset_pbc, sizeof(__pyx_k_is_coord_subset_pbc), 0, 0, 1, 1}, - {&__pyx_n_s_itemsize, __pyx_k_itemsize, sizeof(__pyx_k_itemsize), 0, 0, 1, 1}, - {&__pyx_kp_s_itemsize_0_for_cython_array, __pyx_k_itemsize_0_for_cython_array, sizeof(__pyx_k_itemsize_0_for_cython_array), 0, 0, 1, 0}, - {&__pyx_n_s_j, __pyx_k_j, sizeof(__pyx_k_j), 0, 0, 1, 1}, - {&__pyx_n_s_join, __pyx_k_join, sizeof(__pyx_k_join), 0, 0, 1, 1}, - {&__pyx_n_s_k, __pyx_k_k, sizeof(__pyx_k_k), 0, 0, 1, 1}, - {&__pyx_n_s_l, __pyx_k_l, sizeof(__pyx_k_l), 0, 0, 1, 1}, - {&__pyx_n_s_lat, __pyx_k_lat, sizeof(__pyx_k_lat), 0, 0, 1, 1}, - {&__pyx_n_s_lattice, __pyx_k_lattice, sizeof(__pyx_k_lattice), 0, 0, 1, 1}, - {&__pyx_n_s_lll_frac_tol, __pyx_k_lll_frac_tol, sizeof(__pyx_k_lll_frac_tol), 0, 0, 1, 1}, - {&__pyx_n_s_lll_matrix, __pyx_k_lll_matrix, sizeof(__pyx_k_lll_matrix), 0, 0, 1, 1}, - {&__pyx_n_s_m, __pyx_k_m, sizeof(__pyx_k_m), 0, 0, 1, 1}, - {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, - {&__pyx_n_s_maintainer, __pyx_k_maintainer, sizeof(__pyx_k_maintainer), 0, 0, 1, 1}, - {&__pyx_n_s_mask, __pyx_k_mask, sizeof(__pyx_k_mask), 0, 0, 1, 1}, - {&__pyx_n_s_memview, __pyx_k_memview, sizeof(__pyx_k_memview), 0, 0, 1, 1}, - {&__pyx_n_s_mode, __pyx_k_mode, sizeof(__pyx_k_mode), 0, 0, 1, 1}, - {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, - {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, - {&__pyx_n_s_ndim, __pyx_k_ndim, sizeof(__pyx_k_ndim), 0, 0, 1, 1}, - {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, - {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, - {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, - {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, - {&__pyx_kp_s_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 0, 1, 0}, - {&__pyx_kp_s_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 0, 1, 0}, - {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, - {&__pyx_n_s_ok, __pyx_k_ok, sizeof(__pyx_k_ok), 0, 0, 1, 1}, - {&__pyx_n_s_ok_inner, __pyx_k_ok_inner, sizeof(__pyx_k_ok_inner), 0, 0, 1, 1}, - {&__pyx_n_s_ok_outer, __pyx_k_ok_outer, sizeof(__pyx_k_ok_outer), 0, 0, 1, 1}, - {&__pyx_n_s_order, __pyx_k_order, sizeof(__pyx_k_order), 0, 0, 1, 1}, - {&__pyx_n_s_pack, __pyx_k_pack, sizeof(__pyx_k_pack), 0, 0, 1, 1}, - {&__pyx_n_s_pbc_shortest_vectors, __pyx_k_pbc_shortest_vectors, sizeof(__pyx_k_pbc_shortest_vectors), 0, 0, 1, 1}, - {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, - {&__pyx_n_s_pre_im, __pyx_k_pre_im, sizeof(__pyx_k_pre_im), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_getbuffer, __pyx_k_pyx_getbuffer, sizeof(__pyx_k_pyx_getbuffer), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_unpickle_Enum, __pyx_k_pyx_unpickle_Enum, sizeof(__pyx_k_pyx_unpickle_Enum), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, - {&__pyx_n_s_r, __pyx_k_r, sizeof(__pyx_k_r), 0, 0, 1, 1}, - {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, - {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, - {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, - {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, - {&__pyx_n_s_reshape, __pyx_k_reshape, sizeof(__pyx_k_reshape), 0, 0, 1, 1}, - {&__pyx_n_s_return_d2, __pyx_k_return_d2, sizeof(__pyx_k_return_d2), 0, 0, 1, 1}, - {&__pyx_kp_u_s, __pyx_k_s, sizeof(__pyx_k_s), 0, 1, 0, 0}, - {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, - {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, - {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1}, - {&__pyx_n_s_six_moves, __pyx_k_six_moves, sizeof(__pyx_k_six_moves), 0, 0, 1, 1}, - {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, - {&__pyx_n_s_start, __pyx_k_start, sizeof(__pyx_k_start), 0, 0, 1, 1}, - {&__pyx_n_s_step, __pyx_k_step, sizeof(__pyx_k_step), 0, 0, 1, 1}, - {&__pyx_n_s_stop, __pyx_k_stop, sizeof(__pyx_k_stop), 0, 0, 1, 1}, - {&__pyx_kp_s_strided_and_direct, __pyx_k_strided_and_direct, sizeof(__pyx_k_strided_and_direct), 0, 0, 1, 0}, - {&__pyx_kp_s_strided_and_direct_or_indirect, __pyx_k_strided_and_direct_or_indirect, sizeof(__pyx_k_strided_and_direct_or_indirect), 0, 0, 1, 0}, - {&__pyx_kp_s_strided_and_indirect, __pyx_k_strided_and_indirect, sizeof(__pyx_k_strided_and_indirect), 0, 0, 1, 0}, - {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, - {&__pyx_n_s_struct, __pyx_k_struct, sizeof(__pyx_k_struct), 0, 0, 1, 1}, - {&__pyx_n_s_subset, __pyx_k_subset, sizeof(__pyx_k_subset), 0, 0, 1, 1}, - {&__pyx_kp_s_subset_is_not_a_subset_of_supers, __pyx_k_subset_is_not_a_subset_of_supers, sizeof(__pyx_k_subset_is_not_a_subset_of_supers), 0, 0, 1, 0}, - {&__pyx_n_s_superset, __pyx_k_superset, sizeof(__pyx_k_superset), 0, 0, 1, 1}, - {&__pyx_n_s_t, __pyx_k_t, sizeof(__pyx_k_t), 0, 0, 1, 1}, - {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, - {&__pyx_kp_s_unable_to_allocate_array_data, __pyx_k_unable_to_allocate_array_data, sizeof(__pyx_k_unable_to_allocate_array_data), 0, 0, 1, 0}, - {&__pyx_kp_s_unable_to_allocate_shape_and_str, __pyx_k_unable_to_allocate_shape_and_str, sizeof(__pyx_k_unable_to_allocate_shape_and_str), 0, 0, 1, 0}, - {&__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_k_unknown_dtype_code_in_numpy_pxd, sizeof(__pyx_k_unknown_dtype_code_in_numpy_pxd), 0, 1, 0, 0}, - {&__pyx_n_s_unpack, __pyx_k_unpack, sizeof(__pyx_k_unpack), 0, 0, 1, 1}, - {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, - {&__pyx_n_s_vectors, __pyx_k_vectors, sizeof(__pyx_k_vectors), 0, 0, 1, 1}, - {&__pyx_n_s_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 0, 1, 1}, - {&__pyx_n_s_vs, __pyx_k_vs, sizeof(__pyx_k_vs), 0, 0, 1, 1}, - {&__pyx_n_s_within_frac, __pyx_k_within_frac, sizeof(__pyx_k_within_frac), 0, 0, 1, 1}, - {&__pyx_kp_s_wmdrichards_gmail_com, __pyx_k_wmdrichards_gmail_com, sizeof(__pyx_k_wmdrichards_gmail_com), 0, 0, 1, 0}, - {&__pyx_n_s_zeros, __pyx_k_zeros, sizeof(__pyx_k_zeros), 0, 0, 1, 1}, - {&__pyx_n_s_zip, __pyx_k_zip, sizeof(__pyx_k_zip), 0, 0, 1, 1}, - {0, 0, 0, 0, 0, 0, 0} -}; -static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 45, __pyx_L1_error) - __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 262, __pyx_L1_error) - __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(1, 777, __pyx_L1_error) - __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 959, __pyx_L1_error) - __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(2, 148, __pyx_L1_error) - __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(2, 151, __pyx_L1_error) - __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(2, 2, __pyx_L1_error) - __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) __PYX_ERR(2, 404, __pyx_L1_error) - __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(2, 613, __pyx_L1_error) - __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(2, 832, __pyx_L1_error) - return 0; - __pyx_L1_error:; - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - - /* "easyCore/Utils/coord_cython.pyx":262 - * if ok_inner: - * if c_inds[i] >= 0: - * raise ValueError("Something wrong with the inputs, likely duplicates " # <<<<<<<<<<<<<< - * "in superset") - * c_inds[i] = j - */ - __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_Something_wrong_with_the_inputs); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 262, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple_); - __Pyx_GIVEREF(__pyx_tuple_); - - /* "easyCore/Utils/coord_cython.pyx":271 - * - * if not ok_outer: - * raise ValueError("subset is not a subset of superset") # <<<<<<<<<<<<<< - * - * return inds - */ - __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_subset_is_not_a_subset_of_supers); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 271, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__2); - __Pyx_GIVEREF(__pyx_tuple__2); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":777 - * - * if (end - f) - (new_offset - offset[0]) < 15: - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< - * - * if ((child.byteorder == c'>' and little_endian) or - */ - __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(1, 777, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__3); - __Pyx_GIVEREF(__pyx_tuple__3); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":781 - * if ((child.byteorder == c'>' and little_endian) or - * (child.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< - * # One could encode it in the format string and have Cython - * # complain instead, BUT: < and > in format strings also imply - */ - __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 781, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__4); - __Pyx_GIVEREF(__pyx_tuple__4); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":801 - * t = child.type_num - * if end - f < 5: - * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< - * - * # Until ticket #99 is fixed, use integers to avoid warnings - */ - __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 801, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__5); - __Pyx_GIVEREF(__pyx_tuple__5); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":959 - * __pyx_import_array() - * except Exception: - * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< - * - * cdef inline int import_umath() except -1: - */ - __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 959, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__6); - __Pyx_GIVEREF(__pyx_tuple__6); - - /* "../../../anaconda3/envs/easyCore/lib/python3.8/site-packages/numpy/__init__.pxd":965 - * _import_umath() - * except Exception: - * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< - * - * cdef inline int import_ufunc() except -1: - */ - __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(1, 965, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__7); - __Pyx_GIVEREF(__pyx_tuple__7); - - /* "View.MemoryView":133 - * - * if not self.ndim: - * raise ValueError("Empty shape tuple for cython.array") # <<<<<<<<<<<<<< - * - * if itemsize <= 0: - */ - __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_s_Empty_shape_tuple_for_cython_arr); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(2, 133, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__8); - __Pyx_GIVEREF(__pyx_tuple__8); - - /* "View.MemoryView":136 - * - * if itemsize <= 0: - * raise ValueError("itemsize <= 0 for cython.array") # <<<<<<<<<<<<<< - * - * if not isinstance(format, bytes): - */ - __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_itemsize_0_for_cython_array); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(2, 136, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__9); - __Pyx_GIVEREF(__pyx_tuple__9); - - /* "View.MemoryView":148 - * - * if not self._shape: - * raise MemoryError("unable to allocate shape and strides.") # <<<<<<<<<<<<<< - * - * - */ - __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_shape_and_str); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(2, 148, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__10); - __Pyx_GIVEREF(__pyx_tuple__10); - - /* "View.MemoryView":176 - * self.data = malloc(self.len) - * if not self.data: - * raise MemoryError("unable to allocate array data.") # <<<<<<<<<<<<<< - * - * if self.dtype_is_object: - */ - __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_array_data); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(2, 176, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__11); - __Pyx_GIVEREF(__pyx_tuple__11); - - /* "View.MemoryView":192 - * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS - * if not (flags & bufmode): - * raise ValueError("Can only create a buffer that is contiguous in memory.") # <<<<<<<<<<<<<< - * info.buf = self.data - * info.len = self.len - */ - __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_Can_only_create_a_buffer_that_is); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(2, 192, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__12); - __Pyx_GIVEREF(__pyx_tuple__12); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__13); - __Pyx_GIVEREF(__pyx_tuple__13); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - */ - __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__14); - __Pyx_GIVEREF(__pyx_tuple__14); - - /* "View.MemoryView":418 - * def __setitem__(memoryview self, object index, object value): - * if self.view.readonly: - * raise TypeError("Cannot assign to read-only memoryview") # <<<<<<<<<<<<<< - * - * have_slices, index = _unellipsify(index, self.view.ndim) - */ - __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_Cannot_assign_to_read_only_memor); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(2, 418, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__15); - __Pyx_GIVEREF(__pyx_tuple__15); - - /* "View.MemoryView":495 - * result = struct.unpack(self.view.format, bytesitem) - * except struct.error: - * raise ValueError("Unable to convert item to object") # <<<<<<<<<<<<<< - * else: - * if len(self.view.format) == 1: - */ - __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_s_Unable_to_convert_item_to_object); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(2, 495, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__16); - __Pyx_GIVEREF(__pyx_tuple__16); - - /* "View.MemoryView":520 - * def __getbuffer__(self, Py_buffer *info, int flags): - * if flags & PyBUF_WRITABLE and self.view.readonly: - * raise ValueError("Cannot create writable memory view from read-only memoryview") # <<<<<<<<<<<<<< - * - * if flags & PyBUF_ND: - */ - __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_Cannot_create_writable_memory_vi); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(2, 520, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__17); - __Pyx_GIVEREF(__pyx_tuple__17); - - /* "View.MemoryView":570 - * if self.view.strides == NULL: - * - * raise ValueError("Buffer view does not expose strides") # <<<<<<<<<<<<<< - * - * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) - */ - __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_Buffer_view_does_not_expose_stri); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(2, 570, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__18); - __Pyx_GIVEREF(__pyx_tuple__18); - - /* "View.MemoryView":577 - * def suboffsets(self): - * if self.view.suboffsets == NULL: - * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< - * - * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) - */ - __pyx_tuple__19 = PyTuple_New(1); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(2, 577, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__19); - __Pyx_INCREF(__pyx_int_neg_1); - __Pyx_GIVEREF(__pyx_int_neg_1); - PyTuple_SET_ITEM(__pyx_tuple__19, 0, __pyx_int_neg_1); - __Pyx_GIVEREF(__pyx_tuple__19); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__20); - __Pyx_GIVEREF(__pyx_tuple__20); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - */ - __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__21); - __Pyx_GIVEREF(__pyx_tuple__21); - - /* "View.MemoryView":682 - * if item is Ellipsis: - * if not seen_ellipsis: - * result.extend([slice(None)] * (ndim - len(tup) + 1)) # <<<<<<<<<<<<<< - * seen_ellipsis = True - * else: - */ - __pyx_slice__22 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__22)) __PYX_ERR(2, 682, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__22); - __Pyx_GIVEREF(__pyx_slice__22); - - /* "View.MemoryView":703 - * for suboffset in suboffsets[:ndim]: - * if suboffset >= 0: - * raise ValueError("Indirect dimensions not supported") # <<<<<<<<<<<<<< - * - * - */ - __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_Indirect_dimensions_not_supporte); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(2, 703, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__23); - __Pyx_GIVEREF(__pyx_tuple__23); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__24); - __Pyx_GIVEREF(__pyx_tuple__24); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - */ - __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__25); - __Pyx_GIVEREF(__pyx_tuple__25); - - /* "easyCore/Utils/coord_cython.pyx":27 - * - * #create images, 2d array of all length 3 combinations of [-1,0,1] - * r = np.arange(-1, 2, dtype=np.float_) # <<<<<<<<<<<<<< - * arange = r[:, None] * np.array([1, 0, 0])[None, :] - * brange = r[:, None] * np.array([0, 1, 0])[None, :] - */ - __pyx_tuple__31 = PyTuple_Pack(2, __pyx_int_neg_1, __pyx_int_2); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(0, 27, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__31); - __Pyx_GIVEREF(__pyx_tuple__31); - - /* "easyCore/Utils/coord_cython.pyx":28 - * #create images, 2d array of all length 3 combinations of [-1,0,1] - * r = np.arange(-1, 2, dtype=np.float_) - * arange = r[:, None] * np.array([1, 0, 0])[None, :] # <<<<<<<<<<<<<< - * brange = r[:, None] * np.array([0, 1, 0])[None, :] - * crange = r[:, None] * np.array([0, 0, 1])[None, :] - */ - __pyx_tuple__32 = PyTuple_Pack(2, __pyx_slice__22, Py_None); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__32); - __Pyx_GIVEREF(__pyx_tuple__32); - __pyx_tuple__33 = PyTuple_Pack(2, Py_None, __pyx_slice__22); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__33); - __Pyx_GIVEREF(__pyx_tuple__33); - - /* "easyCore/Utils/coord_cython.pyx":31 - * brange = r[:, None] * np.array([0, 1, 0])[None, :] - * crange = r[:, None] * np.array([0, 0, 1])[None, :] - * images_t = arange[:, None, None] + brange[None, :, None] + \ # <<<<<<<<<<<<<< - * crange[None, None, :] - * images = images_t.reshape((27, 3)) - */ - __pyx_tuple__34 = PyTuple_Pack(3, __pyx_slice__22, Py_None, Py_None); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(0, 31, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__34); - __Pyx_GIVEREF(__pyx_tuple__34); - __pyx_tuple__35 = PyTuple_Pack(3, Py_None, __pyx_slice__22, Py_None); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(0, 31, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__35); - __Pyx_GIVEREF(__pyx_tuple__35); - - /* "easyCore/Utils/coord_cython.pyx":32 - * crange = r[:, None] * np.array([0, 0, 1])[None, :] - * images_t = arange[:, None, None] + brange[None, :, None] + \ - * crange[None, None, :] # <<<<<<<<<<<<<< - * images = images_t.reshape((27, 3)) - * - */ - __pyx_tuple__36 = PyTuple_Pack(3, Py_None, Py_None, __pyx_slice__22); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 32, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__36); - __Pyx_GIVEREF(__pyx_tuple__36); - - /* "easyCore/Utils/coord_cython.pyx":33 - * images_t = arange[:, None, None] + brange[None, :, None] + \ - * crange[None, None, :] - * images = images_t.reshape((27, 3)) # <<<<<<<<<<<<<< - * - * cdef np.float_t[:, ::1] images_view = images - */ - __pyx_tuple__37 = PyTuple_Pack(2, __pyx_int_27, __pyx_int_3); if (unlikely(!__pyx_tuple__37)) __PYX_ERR(0, 33, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__37); - __Pyx_GIVEREF(__pyx_tuple__37); - __pyx_tuple__38 = PyTuple_Pack(1, __pyx_tuple__37); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 33, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__38); - __Pyx_GIVEREF(__pyx_tuple__38); - - /* "easyCore/Utils/coord_cython.pyx":70 - * @cython.wraparound(False) - * @cython.initializedcheck(False) - * def pbc_shortest_vectors(lattice, fcoords1, fcoords2, mask=None, return_d2=False, lll_frac_tol=None): # <<<<<<<<<<<<<< - * """ - * Returns the shortest vectors between two lists of coordinates taking into - */ - __pyx_tuple__39 = PyTuple_Pack(37, __pyx_n_s_lattice, __pyx_n_s_fcoords1, __pyx_n_s_fcoords2, __pyx_n_s_mask, __pyx_n_s_return_d2, __pyx_n_s_lll_frac_tol, __pyx_n_s_lat, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_l, __pyx_n_s_I, __pyx_n_s_J, __pyx_n_s_bestK, __pyx_n_s_fc1, __pyx_n_s_fc2, __pyx_n_s_cart_f1, __pyx_n_s_cart_f2, __pyx_n_s_cart_im, __pyx_n_s_has_mask, __pyx_n_s_m, __pyx_n_s_has_ftol, __pyx_n_s_ftol, __pyx_n_s_vectors, __pyx_n_s_d2, __pyx_n_s_vs, __pyx_n_s_ds, __pyx_n_s_best, __pyx_n_s_d, __pyx_n_s_inc_d, __pyx_n_s_da, __pyx_n_s_db, __pyx_n_s_dc, __pyx_n_s_fdist, __pyx_n_s_within_frac, __pyx_n_s_pre_im, __pyx_n_s_bestk); if (unlikely(!__pyx_tuple__39)) __PYX_ERR(0, 70, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__39); - __Pyx_GIVEREF(__pyx_tuple__39); - __pyx_codeobj__40 = (PyObject*)__Pyx_PyCode_New(6, 0, 37, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__39, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_easyCore_Utils_coord_cython_pyx, __pyx_n_s_pbc_shortest_vectors, 70, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__40)) __PYX_ERR(0, 70, __pyx_L1_error) - - /* "easyCore/Utils/coord_cython.pyx":181 - * @cython.wraparound(False) - * @cython.initializedcheck(False) - * def is_coord_subset_pbc(subset, superset, atol, mask): # <<<<<<<<<<<<<< - * """ - * Tests if all fractional coords in subset are contained in superset. - */ - __pyx_tuple__41 = PyTuple_Pack(15, __pyx_n_s_subset, __pyx_n_s_superset, __pyx_n_s_atol, __pyx_n_s_mask, __pyx_n_s_fc1, __pyx_n_s_fc2, __pyx_n_s_t, __pyx_n_s_m, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_I, __pyx_n_s_J, __pyx_n_s_d, __pyx_n_s_ok); if (unlikely(!__pyx_tuple__41)) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__41); - __Pyx_GIVEREF(__pyx_tuple__41); - __pyx_codeobj__42 = (PyObject*)__Pyx_PyCode_New(4, 0, 15, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__41, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_easyCore_Utils_coord_cython_pyx, __pyx_n_s_is_coord_subset_pbc, 181, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__42)) __PYX_ERR(0, 181, __pyx_L1_error) - - /* "easyCore/Utils/coord_cython.pyx":226 - * @cython.wraparound(False) - * @cython.initializedcheck(False) - * def coord_list_mapping_pbc(subset, superset, atol=1e-8): # <<<<<<<<<<<<<< - * """ - * Gives the index mapping from a subset to a superset. - */ - __pyx_tuple__43 = PyTuple_Pack(16, __pyx_n_s_subset, __pyx_n_s_superset, __pyx_n_s_atol, __pyx_n_s_inds, __pyx_n_s_fc1, __pyx_n_s_fc2, __pyx_n_s_t, __pyx_n_s_c_inds, __pyx_n_s_d, __pyx_n_s_ok_inner, __pyx_n_s_ok_outer, __pyx_n_s_I, __pyx_n_s_J, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k); if (unlikely(!__pyx_tuple__43)) __PYX_ERR(0, 226, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__43); - __Pyx_GIVEREF(__pyx_tuple__43); - __pyx_codeobj__44 = (PyObject*)__Pyx_PyCode_New(3, 0, 16, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__43, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_easyCore_Utils_coord_cython_pyx, __pyx_n_s_coord_list_mapping_pbc, 226, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__44)) __PYX_ERR(0, 226, __pyx_L1_error) - - /* "View.MemoryView":286 - * return self.name - * - * cdef generic = Enum("") # <<<<<<<<<<<<<< - * cdef strided = Enum("") # default - * cdef indirect = Enum("") - */ - __pyx_tuple__45 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__45)) __PYX_ERR(2, 286, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__45); - __Pyx_GIVEREF(__pyx_tuple__45); - - /* "View.MemoryView":287 - * - * cdef generic = Enum("") - * cdef strided = Enum("") # default # <<<<<<<<<<<<<< - * cdef indirect = Enum("") - * - */ - __pyx_tuple__46 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__46)) __PYX_ERR(2, 287, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__46); - __Pyx_GIVEREF(__pyx_tuple__46); - - /* "View.MemoryView":288 - * cdef generic = Enum("") - * cdef strided = Enum("") # default - * cdef indirect = Enum("") # <<<<<<<<<<<<<< - * - * - */ - __pyx_tuple__47 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__47)) __PYX_ERR(2, 288, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__47); - __Pyx_GIVEREF(__pyx_tuple__47); - - /* "View.MemoryView":291 - * - * - * cdef contiguous = Enum("") # <<<<<<<<<<<<<< - * cdef indirect_contiguous = Enum("") - * - */ - __pyx_tuple__48 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__48)) __PYX_ERR(2, 291, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__48); - __Pyx_GIVEREF(__pyx_tuple__48); - - /* "View.MemoryView":292 - * - * cdef contiguous = Enum("") - * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< - * - * - */ - __pyx_tuple__49 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__49)) __PYX_ERR(2, 292, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__49); - __Pyx_GIVEREF(__pyx_tuple__49); - - /* "(tree fragment)":1 - * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - __pyx_tuple__50 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__50)) __PYX_ERR(2, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__50); - __Pyx_GIVEREF(__pyx_tuple__50); - __pyx_codeobj__51 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__50, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__51)) __PYX_ERR(2, 1, __pyx_L1_error) - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { - if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - __pyx_float_1eneg_8 = PyFloat_FromDouble(1e-8); if (unlikely(!__pyx_float_1eneg_8)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_27 = PyInt_FromLong(27); if (unlikely(!__pyx_int_27)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_184977713 = PyInt_FromLong(184977713L); if (unlikely(!__pyx_int_184977713)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) - return 0; - __pyx_L1_error:; - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ - -static int __Pyx_modinit_global_init_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); - /*--- Global init code ---*/ - generic = Py_None; Py_INCREF(Py_None); - strided = Py_None; Py_INCREF(Py_None); - indirect = Py_None; Py_INCREF(Py_None); - contiguous = Py_None; Py_INCREF(Py_None); - indirect_contiguous = Py_None; Py_INCREF(Py_None); - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_variable_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); - /*--- Variable export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); - /*--- Function export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_type_init_code(void) { - __Pyx_RefNannyDeclarations - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); - /*--- Type init code ---*/ - __pyx_vtabptr_array = &__pyx_vtable_array; - __pyx_vtable_array.get_memview = (PyObject *(*)(struct __pyx_array_obj *))__pyx_array_get_memview; - if (PyType_Ready(&__pyx_type___pyx_array) < 0) __PYX_ERR(2, 105, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type___pyx_array.tp_print = 0; - #endif - if (__Pyx_SetVtable(__pyx_type___pyx_array.tp_dict, __pyx_vtabptr_array) < 0) __PYX_ERR(2, 105, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_array) < 0) __PYX_ERR(2, 105, __pyx_L1_error) - __pyx_array_type = &__pyx_type___pyx_array; - if (PyType_Ready(&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(2, 279, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type___pyx_MemviewEnum.tp_print = 0; - #endif - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_MemviewEnum.tp_dictoffset && __pyx_type___pyx_MemviewEnum.tp_getattro == PyObject_GenericGetAttr)) { - __pyx_type___pyx_MemviewEnum.tp_getattro = __Pyx_PyObject_GenericGetAttr; - } - if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(2, 279, __pyx_L1_error) - __pyx_MemviewEnum_type = &__pyx_type___pyx_MemviewEnum; - __pyx_vtabptr_memoryview = &__pyx_vtable_memoryview; - __pyx_vtable_memoryview.get_item_pointer = (char *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_get_item_pointer; - __pyx_vtable_memoryview.is_slice = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_is_slice; - __pyx_vtable_memoryview.setitem_slice_assignment = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_slice_assignment; - __pyx_vtable_memoryview.setitem_slice_assign_scalar = (PyObject *(*)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_setitem_slice_assign_scalar; - __pyx_vtable_memoryview.setitem_indexed = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_indexed; - __pyx_vtable_memoryview.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryview_convert_item_to_object; - __pyx_vtable_memoryview.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryview_assign_item_from_object; - if (PyType_Ready(&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(2, 330, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type___pyx_memoryview.tp_print = 0; - #endif - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_memoryview.tp_dictoffset && __pyx_type___pyx_memoryview.tp_getattro == PyObject_GenericGetAttr)) { - __pyx_type___pyx_memoryview.tp_getattro = __Pyx_PyObject_GenericGetAttr; - } - if (__Pyx_SetVtable(__pyx_type___pyx_memoryview.tp_dict, __pyx_vtabptr_memoryview) < 0) __PYX_ERR(2, 330, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(2, 330, __pyx_L1_error) - __pyx_memoryview_type = &__pyx_type___pyx_memoryview; - __pyx_vtabptr__memoryviewslice = &__pyx_vtable__memoryviewslice; - __pyx_vtable__memoryviewslice.__pyx_base = *__pyx_vtabptr_memoryview; - __pyx_vtable__memoryviewslice.__pyx_base.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryviewslice_convert_item_to_object; - __pyx_vtable__memoryviewslice.__pyx_base.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryviewslice_assign_item_from_object; - __pyx_type___pyx_memoryviewslice.tp_base = __pyx_memoryview_type; - if (PyType_Ready(&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(2, 965, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type___pyx_memoryviewslice.tp_print = 0; - #endif - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_memoryviewslice.tp_dictoffset && __pyx_type___pyx_memoryviewslice.tp_getattro == PyObject_GenericGetAttr)) { - __pyx_type___pyx_memoryviewslice.tp_getattro = __Pyx_PyObject_GenericGetAttr; - } - if (__Pyx_SetVtable(__pyx_type___pyx_memoryviewslice.tp_dict, __pyx_vtabptr__memoryviewslice) < 0) __PYX_ERR(2, 965, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(2, 965, __pyx_L1_error) - __pyx_memoryviewslice_type = &__pyx_type___pyx_memoryviewslice; - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} - -static int __Pyx_modinit_type_import_code(void) { - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); - /*--- Type import code ---*/ - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", - #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 - sizeof(PyTypeObject), - #else - sizeof(PyHeapTypeObject), - #endif - __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 207, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_5numpy_dtype = __Pyx_ImportType(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __Pyx_ImportType_CheckSize_Ignore); - if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 207, __pyx_L1_error) - __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __Pyx_ImportType_CheckSize_Ignore); - if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 230, __pyx_L1_error) - __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __Pyx_ImportType_CheckSize_Ignore); - if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 234, __pyx_L1_error) - __pyx_ptype_5numpy_ndarray = __Pyx_ImportType(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __Pyx_ImportType_CheckSize_Ignore); - if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 246, __pyx_L1_error) - __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __Pyx_ImportType_CheckSize_Ignore); - if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 839, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_RefNannyFinishContext(); - return -1; -} - -static int __Pyx_modinit_variable_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); - /*--- Variable import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); - /*--- Function import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - - -#ifndef CYTHON_NO_PYINIT_EXPORT -#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC -#elif PY_MAJOR_VERSION < 3 -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" void -#else -#define __Pyx_PyMODINIT_FUNC void -#endif -#else -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * -#else -#define __Pyx_PyMODINIT_FUNC PyObject * -#endif -#endif - - -#if PY_MAJOR_VERSION < 3 -__Pyx_PyMODINIT_FUNC initcoord_cython(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC initcoord_cython(void) -#else -__Pyx_PyMODINIT_FUNC PyInit_coord_cython(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC PyInit_coord_cython(void) -#if CYTHON_PEP489_MULTI_PHASE_INIT -{ - return PyModuleDef_Init(&__pyx_moduledef); -} -static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { - #if PY_VERSION_HEX >= 0x030700A1 - static PY_INT64_T main_interpreter_id = -1; - PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); - if (main_interpreter_id == -1) { - main_interpreter_id = current_id; - return (unlikely(current_id == -1)) ? -1 : 0; - } else if (unlikely(main_interpreter_id != current_id)) - #else - static PyInterpreterState *main_interpreter = NULL; - PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; - if (!main_interpreter) { - main_interpreter = current_interpreter; - } else if (unlikely(main_interpreter != current_interpreter)) - #endif - { - PyErr_SetString( - PyExc_ImportError, - "Interpreter change detected - this module can only be loaded into one interpreter per process."); - return -1; - } - return 0; -} -static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { - PyObject *value = PyObject_GetAttrString(spec, from_name); - int result = 0; - if (likely(value)) { - if (allow_none || value != Py_None) { - result = PyDict_SetItemString(moddict, to_name, value); - } - Py_DECREF(value); - } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Clear(); - } else { - result = -1; - } - return result; -} -static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { - PyObject *module = NULL, *moddict, *modname; - if (__Pyx_check_single_interpreter()) - return NULL; - if (__pyx_m) - return __Pyx_NewRef(__pyx_m); - modname = PyObject_GetAttrString(spec, "name"); - if (unlikely(!modname)) goto bad; - module = PyModule_NewObject(modname); - Py_DECREF(modname); - if (unlikely(!module)) goto bad; - moddict = PyModule_GetDict(module); - if (unlikely(!moddict)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; - return module; -bad: - Py_XDECREF(module); - return NULL; -} - - -static CYTHON_SMALL_CODE int __pyx_pymod_exec_coord_cython(PyObject *__pyx_pyinit_module) -#endif -#endif -{ - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - __Pyx_memviewslice __pyx_t_5 = { 0, 0, { 0 }, { 0 }, { 0 } }; - static PyThread_type_lock __pyx_t_6[8]; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannyDeclarations - #if CYTHON_PEP489_MULTI_PHASE_INIT - if (__pyx_m) { - if (__pyx_m == __pyx_pyinit_module) return 0; - PyErr_SetString(PyExc_RuntimeError, "Module 'coord_cython' has already been imported. Re-initialisation is not supported."); - return -1; - } - #elif PY_MAJOR_VERSION >= 3 - if (__pyx_m) return __Pyx_NewRef(__pyx_m); - #endif - #if CYTHON_REFNANNY -__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); -if (!__Pyx_RefNanny) { - PyErr_Clear(); - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); - if (!__Pyx_RefNanny) - Py_FatalError("failed to import 'refnanny' module"); -} -#endif - __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_coord_cython(void)", 0); - if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pxy_PyFrame_Initialize_Offsets - __Pxy_PyFrame_Initialize_Offsets(); - #endif - __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pyx_CyFunction_USED - if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_FusedFunction_USED - if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Coroutine_USED - if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Generator_USED - if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_AsyncGen_USED - if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_StopAsyncIteration_USED - if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - /*--- Library function declarations ---*/ - /*--- Threads initialization code ---*/ - #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS - #ifdef WITH_THREAD /* Python build with threading support? */ - PyEval_InitThreads(); - #endif - #endif - /*--- Module creation code ---*/ - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_m = __pyx_pyinit_module; - Py_INCREF(__pyx_m); - #else - #if PY_MAJOR_VERSION < 3 - __pyx_m = Py_InitModule4("coord_cython", __pyx_methods, __pyx_k_Utilities_for_manipulating_coor, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); - #else - __pyx_m = PyModule_Create(&__pyx_moduledef); - #endif - if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_d); - __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_b); - __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_cython_runtime); - if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - /*--- Initialize various global constants etc. ---*/ - if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) - if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - if (__pyx_module_is_main_easyCore__Utils__coord_cython) { - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name_2, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - } - #if PY_MAJOR_VERSION >= 3 - { - PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) - if (!PyDict_GetItemString(modules, "easyCore.Utils.coord_cython")) { - if (unlikely(PyDict_SetItemString(modules, "easyCore.Utils.coord_cython", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) - } - } - #endif - /*--- Builtin init code ---*/ - if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Constants init code ---*/ - if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Global type/function init code ---*/ - (void)__Pyx_modinit_global_init_code(); - (void)__Pyx_modinit_variable_export_code(); - (void)__Pyx_modinit_function_export_code(); - if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) - if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) - (void)__Pyx_modinit_variable_import_code(); - (void)__Pyx_modinit_function_import_code(); - /*--- Execution code ---*/ - #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) - if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - - /* "easyCore/Utils/coord_cython.pyx":10 - * """ - * - * from six.moves import zip # <<<<<<<<<<<<<< - * - * __author__ = "Will Richards" - */ - __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 10, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_s_zip); - __Pyx_GIVEREF(__pyx_n_s_zip); - PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_zip); - __pyx_t_2 = __Pyx_Import(__pyx_n_s_six_moves, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 10, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_zip); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 10, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_zip, __pyx_t_1) < 0) __PYX_ERR(0, 10, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "easyCore/Utils/coord_cython.pyx":12 - * from six.moves import zip - * - * __author__ = "Will Richards" # <<<<<<<<<<<<<< - * __copyright__ = "Copyright 2011, The Materials Project" - * __version__ = "1.0" - */ - if (PyDict_SetItem(__pyx_d, __pyx_n_s_author, __pyx_kp_s_Will_Richards) < 0) __PYX_ERR(0, 12, __pyx_L1_error) - - /* "easyCore/Utils/coord_cython.pyx":13 - * - * __author__ = "Will Richards" - * __copyright__ = "Copyright 2011, The Materials Project" # <<<<<<<<<<<<<< - * __version__ = "1.0" - * __maintainer__ = "Will Richards" - */ - if (PyDict_SetItem(__pyx_d, __pyx_n_s_copyright, __pyx_kp_s_Copyright_2011_The_Materials_Pro) < 0) __PYX_ERR(0, 13, __pyx_L1_error) - - /* "easyCore/Utils/coord_cython.pyx":14 - * __author__ = "Will Richards" - * __copyright__ = "Copyright 2011, The Materials Project" - * __version__ = "1.0" # <<<<<<<<<<<<<< - * __maintainer__ = "Will Richards" - * __email__ = "wmdrichards@gmail.com" - */ - if (PyDict_SetItem(__pyx_d, __pyx_n_s_version, __pyx_kp_s_1_0) < 0) __PYX_ERR(0, 14, __pyx_L1_error) - - /* "easyCore/Utils/coord_cython.pyx":15 - * __copyright__ = "Copyright 2011, The Materials Project" - * __version__ = "1.0" - * __maintainer__ = "Will Richards" # <<<<<<<<<<<<<< - * __email__ = "wmdrichards@gmail.com" - * __date__ = "Nov 27, 2011" - */ - if (PyDict_SetItem(__pyx_d, __pyx_n_s_maintainer, __pyx_kp_s_Will_Richards) < 0) __PYX_ERR(0, 15, __pyx_L1_error) - - /* "easyCore/Utils/coord_cython.pyx":16 - * __version__ = "1.0" - * __maintainer__ = "Will Richards" - * __email__ = "wmdrichards@gmail.com" # <<<<<<<<<<<<<< - * __date__ = "Nov 27, 2011" - * - */ - if (PyDict_SetItem(__pyx_d, __pyx_n_s_email, __pyx_kp_s_wmdrichards_gmail_com) < 0) __PYX_ERR(0, 16, __pyx_L1_error) - - /* "easyCore/Utils/coord_cython.pyx":17 - * __maintainer__ = "Will Richards" - * __email__ = "wmdrichards@gmail.com" - * __date__ = "Nov 27, 2011" # <<<<<<<<<<<<<< - * - * import numpy as np - */ - if (PyDict_SetItem(__pyx_d, __pyx_n_s_date, __pyx_kp_s_Nov_27_2011) < 0) __PYX_ERR(0, 17, __pyx_L1_error) - - /* "easyCore/Utils/coord_cython.pyx":19 - * __date__ = "Nov 27, 2011" - * - * import numpy as np # <<<<<<<<<<<<<< - * - * from libc.stdlib cimport malloc, free - */ - __pyx_t_2 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_2) < 0) __PYX_ERR(0, 19, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "easyCore/Utils/coord_cython.pyx":27 - * - * #create images, 2d array of all length 3 combinations of [-1,0,1] - * r = np.arange(-1, 2, dtype=np.float_) # <<<<<<<<<<<<<< - * arange = r[:, None] * np.array([1, 0, 0])[None, :] - * brange = r[:, None] * np.array([0, 1, 0])[None, :] - */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 27, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_arange); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 27, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 27, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 27, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_float); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 27, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 27, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__31, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 27, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_r, __pyx_t_4) < 0) __PYX_ERR(0, 27, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - - /* "easyCore/Utils/coord_cython.pyx":28 - * #create images, 2d array of all length 3 combinations of [-1,0,1] - * r = np.arange(-1, 2, dtype=np.float_) - * arange = r[:, None] * np.array([1, 0, 0])[None, :] # <<<<<<<<<<<<<< - * brange = r[:, None] * np.array([0, 1, 0])[None, :] - * crange = r[:, None] * np.array([0, 0, 1])[None, :] - */ - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_r); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_4, __pyx_tuple__32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = PyList_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_INCREF(__pyx_int_1); - __Pyx_GIVEREF(__pyx_int_1); - PyList_SET_ITEM(__pyx_t_4, 0, __pyx_int_1); - __Pyx_INCREF(__pyx_int_0); - __Pyx_GIVEREF(__pyx_int_0); - PyList_SET_ITEM(__pyx_t_4, 1, __pyx_int_0); - __Pyx_INCREF(__pyx_int_0); - __Pyx_GIVEREF(__pyx_int_0); - PyList_SET_ITEM(__pyx_t_4, 2, __pyx_int_0); - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_GetItem(__pyx_t_3, __pyx_tuple__33); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = PyNumber_Multiply(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_arange, __pyx_t_3) < 0) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "easyCore/Utils/coord_cython.pyx":29 - * r = np.arange(-1, 2, dtype=np.float_) - * arange = r[:, None] * np.array([1, 0, 0])[None, :] - * brange = r[:, None] * np.array([0, 1, 0])[None, :] # <<<<<<<<<<<<<< - * crange = r[:, None] * np.array([0, 0, 1])[None, :] - * images_t = arange[:, None, None] + brange[None, :, None] + \ - */ - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_r); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 29, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyObject_GetItem(__pyx_t_3, __pyx_tuple__32); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 29, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 29, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 29, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = PyList_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 29, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_int_0); - __Pyx_GIVEREF(__pyx_int_0); - PyList_SET_ITEM(__pyx_t_3, 0, __pyx_int_0); - __Pyx_INCREF(__pyx_int_1); - __Pyx_GIVEREF(__pyx_int_1); - PyList_SET_ITEM(__pyx_t_3, 1, __pyx_int_1); - __Pyx_INCREF(__pyx_int_0); - __Pyx_GIVEREF(__pyx_int_0); - PyList_SET_ITEM(__pyx_t_3, 2, __pyx_int_0); - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 29, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_tuple__33); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 29, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyNumber_Multiply(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 29, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_brange, __pyx_t_1) < 0) __PYX_ERR(0, 29, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "easyCore/Utils/coord_cython.pyx":30 - * arange = r[:, None] * np.array([1, 0, 0])[None, :] - * brange = r[:, None] * np.array([0, 1, 0])[None, :] - * crange = r[:, None] * np.array([0, 0, 1])[None, :] # <<<<<<<<<<<<<< - * images_t = arange[:, None, None] + brange[None, :, None] + \ - * crange[None, None, :] - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_r); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_tuple__32); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyList_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_int_0); - __Pyx_GIVEREF(__pyx_int_0); - PyList_SET_ITEM(__pyx_t_1, 0, __pyx_int_0); - __Pyx_INCREF(__pyx_int_0); - __Pyx_GIVEREF(__pyx_int_0); - PyList_SET_ITEM(__pyx_t_1, 1, __pyx_int_0); - __Pyx_INCREF(__pyx_int_1); - __Pyx_GIVEREF(__pyx_int_1); - PyList_SET_ITEM(__pyx_t_1, 2, __pyx_int_1); - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_t_2, __pyx_tuple__33); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyNumber_Multiply(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_crange, __pyx_t_2) < 0) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "easyCore/Utils/coord_cython.pyx":31 - * brange = r[:, None] * np.array([0, 1, 0])[None, :] - * crange = r[:, None] * np.array([0, 0, 1])[None, :] - * images_t = arange[:, None, None] + brange[None, :, None] + \ # <<<<<<<<<<<<<< - * crange[None, None, :] - * images = images_t.reshape((27, 3)) - */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_arange); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 31, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_t_2, __pyx_tuple__34); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 31, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_brange); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 31, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_t_2, __pyx_tuple__35); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 31, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 31, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "easyCore/Utils/coord_cython.pyx":32 - * crange = r[:, None] * np.array([0, 0, 1])[None, :] - * images_t = arange[:, None, None] + brange[None, :, None] + \ - * crange[None, None, :] # <<<<<<<<<<<<<< - * images = images_t.reshape((27, 3)) - * - */ - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_crange); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 32, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_t_3, __pyx_tuple__36); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 32, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "easyCore/Utils/coord_cython.pyx":31 - * brange = r[:, None] * np.array([0, 1, 0])[None, :] - * crange = r[:, None] * np.array([0, 0, 1])[None, :] - * images_t = arange[:, None, None] + brange[None, :, None] + \ # <<<<<<<<<<<<<< - * crange[None, None, :] - * images = images_t.reshape((27, 3)) - */ - __pyx_t_3 = PyNumber_Add(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 31, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_images_t, __pyx_t_3) < 0) __PYX_ERR(0, 31, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "easyCore/Utils/coord_cython.pyx":33 - * images_t = arange[:, None, None] + brange[None, :, None] + \ - * crange[None, None, :] - * images = images_t.reshape((27, 3)) # <<<<<<<<<<<<<< - * - * cdef np.float_t[:, ::1] images_view = images - */ - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_images_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 33, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_reshape); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 33, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__38, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 33, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_images, __pyx_t_3) < 0) __PYX_ERR(0, 33, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "easyCore/Utils/coord_cython.pyx":35 - * images = images_t.reshape((27, 3)) - * - * cdef np.float_t[:, ::1] images_view = images # <<<<<<<<<<<<<< - * - * @cython.boundscheck(False) - */ - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_images); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 35, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float_t(__pyx_t_3, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 35, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_XDEC_MEMVIEW(&__pyx_v_8easyCore_5Utils_12coord_cython_images_view, 1); - __pyx_v_8easyCore_5Utils_12coord_cython_images_view = __pyx_t_5; - __pyx_t_5.memview = NULL; - __pyx_t_5.data = NULL; - - /* "easyCore/Utils/coord_cython.pyx":70 - * @cython.wraparound(False) - * @cython.initializedcheck(False) - * def pbc_shortest_vectors(lattice, fcoords1, fcoords2, mask=None, return_d2=False, lll_frac_tol=None): # <<<<<<<<<<<<<< - * """ - * Returns the shortest vectors between two lists of coordinates taking into - */ - __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_8easyCore_5Utils_12coord_cython_1pbc_shortest_vectors, NULL, __pyx_n_s_easyCore_Utils_coord_cython); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 70, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_pbc_shortest_vectors, __pyx_t_3) < 0) __PYX_ERR(0, 70, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "easyCore/Utils/coord_cython.pyx":181 - * @cython.wraparound(False) - * @cython.initializedcheck(False) - * def is_coord_subset_pbc(subset, superset, atol, mask): # <<<<<<<<<<<<<< - * """ - * Tests if all fractional coords in subset are contained in superset. - */ - __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_8easyCore_5Utils_12coord_cython_3is_coord_subset_pbc, NULL, __pyx_n_s_easyCore_Utils_coord_cython); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_coord_subset_pbc, __pyx_t_3) < 0) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "easyCore/Utils/coord_cython.pyx":226 - * @cython.wraparound(False) - * @cython.initializedcheck(False) - * def coord_list_mapping_pbc(subset, superset, atol=1e-8): # <<<<<<<<<<<<<< - * """ - * Gives the index mapping from a subset to a superset. - */ - __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_8easyCore_5Utils_12coord_cython_5coord_list_mapping_pbc, NULL, __pyx_n_s_easyCore_Utils_coord_cython); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 226, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_coord_list_mapping_pbc, __pyx_t_3) < 0) __PYX_ERR(0, 226, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "easyCore/Utils/coord_cython.pyx":1 - * # coding: utf-8 # <<<<<<<<<<<<<< - * - * #from __future__ import division, unicode_literals - */ - __pyx_t_3 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_3) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "View.MemoryView":209 - * info.obj = self - * - * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< - * - * def __dealloc__(array self): - */ - __pyx_t_3 = __pyx_capsule_create(((void *)(&__pyx_array_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 209, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (PyDict_SetItem((PyObject *)__pyx_array_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_3) < 0) __PYX_ERR(2, 209, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - PyType_Modified(__pyx_array_type); - - /* "View.MemoryView":286 - * return self.name - * - * cdef generic = Enum("") # <<<<<<<<<<<<<< - * cdef strided = Enum("") # default - * cdef indirect = Enum("") - */ - __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__45, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 286, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_XGOTREF(generic); - __Pyx_DECREF_SET(generic, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __pyx_t_3 = 0; - - /* "View.MemoryView":287 - * - * cdef generic = Enum("") - * cdef strided = Enum("") # default # <<<<<<<<<<<<<< - * cdef indirect = Enum("") - * - */ - __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__46, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 287, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_XGOTREF(strided); - __Pyx_DECREF_SET(strided, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __pyx_t_3 = 0; - - /* "View.MemoryView":288 - * cdef generic = Enum("") - * cdef strided = Enum("") # default - * cdef indirect = Enum("") # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__47, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 288, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_XGOTREF(indirect); - __Pyx_DECREF_SET(indirect, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __pyx_t_3 = 0; - - /* "View.MemoryView":291 - * - * - * cdef contiguous = Enum("") # <<<<<<<<<<<<<< - * cdef indirect_contiguous = Enum("") - * - */ - __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__48, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 291, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_XGOTREF(contiguous); - __Pyx_DECREF_SET(contiguous, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __pyx_t_3 = 0; - - /* "View.MemoryView":292 - * - * cdef contiguous = Enum("") - * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__49, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 292, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_XGOTREF(indirect_contiguous); - __Pyx_DECREF_SET(indirect_contiguous, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __pyx_t_3 = 0; - - /* "View.MemoryView":316 - * - * DEF THREAD_LOCKS_PREALLOCATED = 8 - * cdef int __pyx_memoryview_thread_locks_used = 0 # <<<<<<<<<<<<<< - * cdef PyThread_type_lock[THREAD_LOCKS_PREALLOCATED] __pyx_memoryview_thread_locks = [ - * PyThread_allocate_lock(), - */ - __pyx_memoryview_thread_locks_used = 0; - - /* "View.MemoryView":317 - * DEF THREAD_LOCKS_PREALLOCATED = 8 - * cdef int __pyx_memoryview_thread_locks_used = 0 - * cdef PyThread_type_lock[THREAD_LOCKS_PREALLOCATED] __pyx_memoryview_thread_locks = [ # <<<<<<<<<<<<<< - * PyThread_allocate_lock(), - * PyThread_allocate_lock(), - */ - __pyx_t_6[0] = PyThread_allocate_lock(); - __pyx_t_6[1] = PyThread_allocate_lock(); - __pyx_t_6[2] = PyThread_allocate_lock(); - __pyx_t_6[3] = PyThread_allocate_lock(); - __pyx_t_6[4] = PyThread_allocate_lock(); - __pyx_t_6[5] = PyThread_allocate_lock(); - __pyx_t_6[6] = PyThread_allocate_lock(); - __pyx_t_6[7] = PyThread_allocate_lock(); - memcpy(&(__pyx_memoryview_thread_locks[0]), __pyx_t_6, sizeof(__pyx_memoryview_thread_locks[0]) * (8)); - - /* "View.MemoryView":549 - * info.obj = self - * - * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_3 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 549, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (PyDict_SetItem((PyObject *)__pyx_memoryview_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_3) < 0) __PYX_ERR(2, 549, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - PyType_Modified(__pyx_memoryview_type); - - /* "View.MemoryView":995 - * return self.from_object - * - * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_3 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 995, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (PyDict_SetItem((PyObject *)__pyx_memoryviewslice_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_3) < 0) __PYX_ERR(2, 995, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - PyType_Modified(__pyx_memoryviewslice_type); - - /* "(tree fragment)":1 - * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum, NULL, __pyx_n_s_View_MemoryView); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_Enum, __pyx_t_3) < 0) __PYX_ERR(2, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "BufferFormatFromTypeInfo":1463 - * - * @cname('__pyx_format_from_typeinfo') - * cdef bytes format_from_typeinfo(__Pyx_TypeInfo *type): # <<<<<<<<<<<<<< - * cdef __Pyx_StructField *field - * cdef __pyx_typeinfo_string fmt - */ - - /*--- Wrapped vars code ---*/ - - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1); - if (__pyx_m) { - if (__pyx_d) { - __Pyx_AddTraceback("init easyCore.Utils.coord_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); - } - Py_CLEAR(__pyx_m); - } else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "init easyCore.Utils.coord_cython"); - } - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - #if CYTHON_PEP489_MULTI_PHASE_INIT - return (__pyx_m != NULL) ? 0 : -1; - #elif PY_MAJOR_VERSION >= 3 - return __pyx_m; - #else - return; - #endif -} - -/* --- Runtime support code --- */ -/* Refnanny */ -#if CYTHON_REFNANNY -static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { - PyObject *m = NULL, *p = NULL; - void *r = NULL; - m = PyImport_ImportModule(modname); - if (!m) goto end; - p = PyObject_GetAttrString(m, "RefNannyAPI"); - if (!p) goto end; - r = PyLong_AsVoidPtr(p); -end: - Py_XDECREF(p); - Py_XDECREF(m); - return (__Pyx_RefNannyAPIStruct *)r; -} -#endif - -/* PyObjectGetAttrStr */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro)) - return tp->tp_getattro(obj, attr_name); -#if PY_MAJOR_VERSION < 3 - if (likely(tp->tp_getattr)) - return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); -#endif - return PyObject_GetAttr(obj, attr_name); -} -#endif - -/* GetBuiltinName */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name) { - PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); - if (unlikely(!result)) { - PyErr_Format(PyExc_NameError, -#if PY_MAJOR_VERSION >= 3 - "name '%U' is not defined", name); -#else - "name '%.200s' is not defined", PyString_AS_STRING(name)); -#endif - } - return result; -} - -/* None */ -static CYTHON_INLINE __pyx_t_5numpy_float_t __Pyx_mod___pyx_t_5numpy_float_t(__pyx_t_5numpy_float_t a, __pyx_t_5numpy_float_t b) { - __pyx_t_5numpy_float_t r = fmod(a, b); - r += ((r != 0) & ((r < 0) ^ (b < 0))) * b; - return r; -} - -/* RaiseArgTupleInvalid */ -static void __Pyx_RaiseArgtupleInvalid( - const char* func_name, - int exact, - Py_ssize_t num_min, - Py_ssize_t num_max, - Py_ssize_t num_found) -{ - Py_ssize_t num_expected; - const char *more_or_less; - if (num_found < num_min) { - num_expected = num_min; - more_or_less = "at least"; - } else { - num_expected = num_max; - more_or_less = "at most"; - } - if (exact) { - more_or_less = "exactly"; - } - PyErr_Format(PyExc_TypeError, - "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", - func_name, more_or_less, num_expected, - (num_expected == 1) ? "" : "s", num_found); -} - -/* RaiseDoubleKeywords */ -static void __Pyx_RaiseDoubleKeywordsError( - const char* func_name, - PyObject* kw_name) -{ - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION >= 3 - "%s() got multiple values for keyword argument '%U'", func_name, kw_name); - #else - "%s() got multiple values for keyword argument '%s'", func_name, - PyString_AsString(kw_name)); - #endif -} - -/* ParseKeywords */ -static int __Pyx_ParseOptionalKeywords( - PyObject *kwds, - PyObject **argnames[], - PyObject *kwds2, - PyObject *values[], - Py_ssize_t num_pos_args, - const char* function_name) -{ - PyObject *key = 0, *value = 0; - Py_ssize_t pos = 0; - PyObject*** name; - PyObject*** first_kw_arg = argnames + num_pos_args; - while (PyDict_Next(kwds, &pos, &key, &value)) { - name = first_kw_arg; - while (*name && (**name != key)) name++; - if (*name) { - values[name-argnames] = value; - continue; - } - name = first_kw_arg; - #if PY_MAJOR_VERSION < 3 - if (likely(PyString_Check(key))) { - while (*name) { - if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) - && _PyString_Eq(**name, key)) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - if ((**argname == key) || ( - (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) - && _PyString_Eq(**argname, key))) { - goto arg_passed_twice; - } - argname++; - } - } - } else - #endif - if (likely(PyUnicode_Check(key))) { - while (*name) { - int cmp = (**name == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**name, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - int cmp = (**argname == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**argname, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) goto arg_passed_twice; - argname++; - } - } - } else - goto invalid_keyword_type; - if (kwds2) { - if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; - } else { - goto invalid_keyword; - } - } - return 0; -arg_passed_twice: - __Pyx_RaiseDoubleKeywordsError(function_name, key); - goto bad; -invalid_keyword_type: - PyErr_Format(PyExc_TypeError, - "%.200s() keywords must be strings", function_name); - goto bad; -invalid_keyword: - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION < 3 - "%.200s() got an unexpected keyword argument '%.200s'", - function_name, PyString_AsString(key)); - #else - "%s() got an unexpected keyword argument '%U'", - function_name, key); - #endif -bad: - return -1; -} - -/* PyDictVersioning */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { - PyObject **dictptr = NULL; - Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; - if (offset) { -#if CYTHON_COMPILING_IN_CPYTHON - dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); -#else - dictptr = _PyObject_GetDictPtr(obj); -#endif - } - return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; -} -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) - return 0; - return obj_dict_version == __Pyx_get_object_dict_version(obj); -} -#endif - -/* GetModuleGlobalName */ -#if CYTHON_USE_DICT_VERSIONS -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) -#else -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) -#endif -{ - PyObject *result; -#if !CYTHON_AVOID_BORROWED_REFS -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 - result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } else if (unlikely(PyErr_Occurred())) { - return NULL; - } -#else - result = PyDict_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } -#endif -#else - result = PyObject_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } - PyErr_Clear(); -#endif - return __Pyx_GetBuiltinName(name); -} - -/* PyFunctionFastCall */ -#if CYTHON_FAST_PYCALL -static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, - PyObject *globals) { - PyFrameObject *f; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject **fastlocals; - Py_ssize_t i; - PyObject *result; - assert(globals != NULL); - /* XXX Perhaps we should create a specialized - PyFrame_New() that doesn't take locals, but does - take builtins without sanity checking them. - */ - assert(tstate != NULL); - f = PyFrame_New(tstate, co, globals, NULL); - if (f == NULL) { - return NULL; - } - fastlocals = __Pyx_PyFrame_GetLocalsplus(f); - for (i = 0; i < na; i++) { - Py_INCREF(*args); - fastlocals[i] = *args++; - } - result = PyEval_EvalFrameEx(f,0); - ++tstate->recursion_depth; - Py_DECREF(f); - --tstate->recursion_depth; - return result; -} -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *closure; -#if PY_MAJOR_VERSION >= 3 - PyObject *kwdefs; -#endif - PyObject *kwtuple, **k; - PyObject **d; - Py_ssize_t nd; - Py_ssize_t nk; - PyObject *result; - assert(kwargs == NULL || PyDict_Check(kwargs)); - nk = kwargs ? PyDict_Size(kwargs) : 0; - if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { - return NULL; - } - if ( -#if PY_MAJOR_VERSION >= 3 - co->co_kwonlyargcount == 0 && -#endif - likely(kwargs == NULL || nk == 0) && - co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { - if (argdefs == NULL && co->co_argcount == nargs) { - result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); - goto done; - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == Py_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - args = &PyTuple_GET_ITEM(argdefs, 0); - result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); - goto done; - } - } - if (kwargs != NULL) { - Py_ssize_t pos, i; - kwtuple = PyTuple_New(2 * nk); - if (kwtuple == NULL) { - result = NULL; - goto done; - } - k = &PyTuple_GET_ITEM(kwtuple, 0); - pos = i = 0; - while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { - Py_INCREF(k[i]); - Py_INCREF(k[i+1]); - i += 2; - } - nk = i / 2; - } - else { - kwtuple = NULL; - k = NULL; - } - closure = PyFunction_GET_CLOSURE(func); -#if PY_MAJOR_VERSION >= 3 - kwdefs = PyFunction_GET_KW_DEFAULTS(func); -#endif - if (argdefs != NULL) { - d = &PyTuple_GET_ITEM(argdefs, 0); - nd = Py_SIZE(argdefs); - } - else { - d = NULL; - nd = 0; - } -#if PY_MAJOR_VERSION >= 3 - result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, kwdefs, closure); -#else - result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, closure); -#endif - Py_XDECREF(kwtuple); -done: - Py_LeaveRecursiveCall(); - return result; -} -#endif -#endif - -/* PyCFunctionFastCall */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { - PyCFunctionObject *func = (PyCFunctionObject*)func_obj; - PyCFunction meth = PyCFunction_GET_FUNCTION(func); - PyObject *self = PyCFunction_GET_SELF(func); - int flags = PyCFunction_GET_FLAGS(func); - assert(PyCFunction_Check(func)); - assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - /* _PyCFunction_FastCallDict() must not be called with an exception set, - because it may clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); - if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { - return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); - } else { - return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); - } -} -#endif - -/* PyObjectCall */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { - PyObject *result; - ternaryfunc call = func->ob_type->tp_call; - if (unlikely(!call)) - return PyObject_Call(func, arg, kw); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = (*call)(func, arg, kw); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* RaiseTooManyValuesToUnpack */ -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { - PyErr_Format(PyExc_ValueError, - "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); -} - -/* RaiseNeedMoreValuesToUnpack */ -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { - PyErr_Format(PyExc_ValueError, - "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", - index, (index == 1) ? "" : "s"); -} - -/* IterFinish */ -static CYTHON_INLINE int __Pyx_IterFinish(void) { -#if CYTHON_FAST_THREAD_STATE - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject* exc_type = tstate->curexc_type; - if (unlikely(exc_type)) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) { - PyObject *exc_value, *exc_tb; - exc_value = tstate->curexc_value; - exc_tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; - Py_DECREF(exc_type); - Py_XDECREF(exc_value); - Py_XDECREF(exc_tb); - return 0; - } else { - return -1; - } - } - return 0; -#else - if (unlikely(PyErr_Occurred())) { - if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { - PyErr_Clear(); - return 0; - } else { - return -1; - } - } - return 0; -#endif -} - -/* UnpackItemEndCheck */ -static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { - if (unlikely(retval)) { - Py_DECREF(retval); - __Pyx_RaiseTooManyValuesError(expected); - return -1; - } else { - return __Pyx_IterFinish(); - } - return 0; -} - -/* PyObjectCall2Args */ -static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { - PyObject *args, *result = NULL; - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(function)) { - PyObject *args[2] = {arg1, arg2}; - return __Pyx_PyFunction_FastCall(function, args, 2); - } - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(function)) { - PyObject *args[2] = {arg1, arg2}; - return __Pyx_PyCFunction_FastCall(function, args, 2); - } - #endif - args = PyTuple_New(2); - if (unlikely(!args)) goto done; - Py_INCREF(arg1); - PyTuple_SET_ITEM(args, 0, arg1); - Py_INCREF(arg2); - PyTuple_SET_ITEM(args, 1, arg2); - Py_INCREF(function); - result = __Pyx_PyObject_Call(function, args, NULL); - Py_DECREF(args); - Py_DECREF(function); -done: - return result; -} - -/* PyObjectCallMethO */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { - PyObject *self, *result; - PyCFunction cfunc; - cfunc = PyCFunction_GET_FUNCTION(func); - self = PyCFunction_GET_SELF(func); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = cfunc(self, arg); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectCallOneArg */ -#if CYTHON_COMPILING_IN_CPYTHON -static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_New(1); - if (unlikely(!args)) return NULL; - Py_INCREF(arg); - PyTuple_SET_ITEM(args, 0, arg); - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { -#if CYTHON_FAST_PYCALL - if (PyFunction_Check(func)) { - return __Pyx_PyFunction_FastCall(func, &arg, 1); - } -#endif - if (likely(PyCFunction_Check(func))) { - if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { - return __Pyx_PyObject_CallMethO(func, arg); -#if CYTHON_FAST_PYCCALL - } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) { - return __Pyx_PyCFunction_FastCall(func, &arg, 1); -#endif - } - } - return __Pyx__PyObject_CallOneArg(func, arg); -} -#else -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_Pack(1, arg); - if (unlikely(!args)) return NULL; - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -#endif - -/* MemviewSliceInit */ -static int -__Pyx_init_memviewslice(struct __pyx_memoryview_obj *memview, - int ndim, - __Pyx_memviewslice *memviewslice, - int memview_is_new_reference) -{ - __Pyx_RefNannyDeclarations - int i, retval=-1; - Py_buffer *buf = &memview->view; - __Pyx_RefNannySetupContext("init_memviewslice", 0); - if (unlikely(memviewslice->memview || memviewslice->data)) { - PyErr_SetString(PyExc_ValueError, - "memviewslice is already initialized!"); - goto fail; - } - if (buf->strides) { - for (i = 0; i < ndim; i++) { - memviewslice->strides[i] = buf->strides[i]; - } - } else { - Py_ssize_t stride = buf->itemsize; - for (i = ndim - 1; i >= 0; i--) { - memviewslice->strides[i] = stride; - stride *= buf->shape[i]; - } - } - for (i = 0; i < ndim; i++) { - memviewslice->shape[i] = buf->shape[i]; - if (buf->suboffsets) { - memviewslice->suboffsets[i] = buf->suboffsets[i]; - } else { - memviewslice->suboffsets[i] = -1; - } - } - memviewslice->memview = memview; - memviewslice->data = (char *)buf->buf; - if (__pyx_add_acquisition_count(memview) == 0 && !memview_is_new_reference) { - Py_INCREF(memview); - } - retval = 0; - goto no_fail; -fail: - memviewslice->memview = 0; - memviewslice->data = 0; - retval = -1; -no_fail: - __Pyx_RefNannyFinishContext(); - return retval; -} -#ifndef Py_NO_RETURN -#define Py_NO_RETURN -#endif -static void __pyx_fatalerror(const char *fmt, ...) Py_NO_RETURN { - va_list vargs; - char msg[200]; -#ifdef HAVE_STDARG_PROTOTYPES - va_start(vargs, fmt); -#else - va_start(vargs); -#endif - vsnprintf(msg, 200, fmt, vargs); - va_end(vargs); - Py_FatalError(msg); -} -static CYTHON_INLINE int -__pyx_add_acquisition_count_locked(__pyx_atomic_int *acquisition_count, - PyThread_type_lock lock) -{ - int result; - PyThread_acquire_lock(lock, 1); - result = (*acquisition_count)++; - PyThread_release_lock(lock); - return result; -} -static CYTHON_INLINE int -__pyx_sub_acquisition_count_locked(__pyx_atomic_int *acquisition_count, - PyThread_type_lock lock) -{ - int result; - PyThread_acquire_lock(lock, 1); - result = (*acquisition_count)--; - PyThread_release_lock(lock); - return result; -} -static CYTHON_INLINE void -__Pyx_INC_MEMVIEW(__Pyx_memviewslice *memslice, int have_gil, int lineno) -{ - int first_time; - struct __pyx_memoryview_obj *memview = memslice->memview; - if (unlikely(!memview || (PyObject *) memview == Py_None)) - return; - if (unlikely(__pyx_get_slice_count(memview) < 0)) - __pyx_fatalerror("Acquisition count is %d (line %d)", - __pyx_get_slice_count(memview), lineno); - first_time = __pyx_add_acquisition_count(memview) == 0; - if (unlikely(first_time)) { - if (have_gil) { - Py_INCREF((PyObject *) memview); - } else { - PyGILState_STATE _gilstate = PyGILState_Ensure(); - Py_INCREF((PyObject *) memview); - PyGILState_Release(_gilstate); - } - } -} -static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *memslice, - int have_gil, int lineno) { - int last_time; - struct __pyx_memoryview_obj *memview = memslice->memview; - if (unlikely(!memview || (PyObject *) memview == Py_None)) { - memslice->memview = NULL; - return; - } - if (unlikely(__pyx_get_slice_count(memview) <= 0)) - __pyx_fatalerror("Acquisition count is %d (line %d)", - __pyx_get_slice_count(memview), lineno); - last_time = __pyx_sub_acquisition_count(memview) == 1; - memslice->data = NULL; - if (unlikely(last_time)) { - if (have_gil) { - Py_CLEAR(memslice->memview); - } else { - PyGILState_STATE _gilstate = PyGILState_Ensure(); - Py_CLEAR(memslice->memview); - PyGILState_Release(_gilstate); - } - } else { - memslice->memview = NULL; - } -} - -/* PyIntBinop */ -#if !CYTHON_COMPILING_IN_PYPY -static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, int inplace, int zerodivision_check) { - (void)inplace; - (void)zerodivision_check; - #if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(op1))) { - const long b = intval; - long x; - long a = PyInt_AS_LONG(op1); - x = (long)((unsigned long)a - b); - if (likely((x^a) >= 0 || (x^~b) >= 0)) - return PyInt_FromLong(x); - return PyLong_Type.tp_as_number->nb_subtract(op1, op2); - } - #endif - #if CYTHON_USE_PYLONG_INTERNALS - if (likely(PyLong_CheckExact(op1))) { - const long b = intval; - long a, x; -#ifdef HAVE_LONG_LONG - const PY_LONG_LONG llb = intval; - PY_LONG_LONG lla, llx; -#endif - const digit* digits = ((PyLongObject*)op1)->ob_digit; - const Py_ssize_t size = Py_SIZE(op1); - if (likely(__Pyx_sst_abs(size) <= 1)) { - a = likely(size) ? digits[0] : 0; - if (size == -1) a = -a; - } else { - switch (size) { - case -2: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { - lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case 2: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { - lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case -3: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { - lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case 3: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { - lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case -4: - if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { - lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case 4: - if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { - lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - default: return PyLong_Type.tp_as_number->nb_subtract(op1, op2); - } - } - x = a - b; - return PyLong_FromLong(x); -#ifdef HAVE_LONG_LONG - long_long: - llx = lla - llb; - return PyLong_FromLongLong(llx); -#endif - - - } - #endif - if (PyFloat_CheckExact(op1)) { - const long b = intval; - double a = PyFloat_AS_DOUBLE(op1); - double result; - PyFPE_START_PROTECT("subtract", return NULL) - result = ((double)a) - (double)b; - PyFPE_END_PROTECT(result) - return PyFloat_FromDouble(result); - } - return (inplace ? PyNumber_InPlaceSubtract : PyNumber_Subtract)(op1, op2); -} -#endif - -/* PyErrFetchRestore */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - tmp_type = tstate->curexc_type; - tmp_value = tstate->curexc_value; - tmp_tb = tstate->curexc_traceback; - tstate->curexc_type = type; - tstate->curexc_value = value; - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - *type = tstate->curexc_type; - *value = tstate->curexc_value; - *tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -} -#endif - -/* RaiseException */ -#if PY_MAJOR_VERSION < 3 -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, - CYTHON_UNUSED PyObject *cause) { - __Pyx_PyThreadState_declare - Py_XINCREF(type); - if (!value || value == Py_None) - value = NULL; - else - Py_INCREF(value); - if (!tb || tb == Py_None) - tb = NULL; - else { - Py_INCREF(tb); - if (!PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto raise_error; - } - } - if (PyType_Check(type)) { -#if CYTHON_COMPILING_IN_PYPY - if (!value) { - Py_INCREF(Py_None); - value = Py_None; - } -#endif - PyErr_NormalizeException(&type, &value, &tb); - } else { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto raise_error; - } - value = type; - type = (PyObject*) Py_TYPE(type); - Py_INCREF(type); - if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto raise_error; - } - } - __Pyx_PyThreadState_assign - __Pyx_ErrRestore(type, value, tb); - return; -raise_error: - Py_XDECREF(value); - Py_XDECREF(type); - Py_XDECREF(tb); - return; -} -#else -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { - PyObject* owned_instance = NULL; - if (tb == Py_None) { - tb = 0; - } else if (tb && !PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto bad; - } - if (value == Py_None) - value = 0; - if (PyExceptionInstance_Check(type)) { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto bad; - } - value = type; - type = (PyObject*) Py_TYPE(value); - } else if (PyExceptionClass_Check(type)) { - PyObject *instance_class = NULL; - if (value && PyExceptionInstance_Check(value)) { - instance_class = (PyObject*) Py_TYPE(value); - if (instance_class != type) { - int is_subclass = PyObject_IsSubclass(instance_class, type); - if (!is_subclass) { - instance_class = NULL; - } else if (unlikely(is_subclass == -1)) { - goto bad; - } else { - type = instance_class; - } - } - } - if (!instance_class) { - PyObject *args; - if (!value) - args = PyTuple_New(0); - else if (PyTuple_Check(value)) { - Py_INCREF(value); - args = value; - } else - args = PyTuple_Pack(1, value); - if (!args) - goto bad; - owned_instance = PyObject_Call(type, args, NULL); - Py_DECREF(args); - if (!owned_instance) - goto bad; - value = owned_instance; - if (!PyExceptionInstance_Check(value)) { - PyErr_Format(PyExc_TypeError, - "calling %R should have returned an instance of " - "BaseException, not %R", - type, Py_TYPE(value)); - goto bad; - } - } - } else { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto bad; - } - if (cause) { - PyObject *fixed_cause; - if (cause == Py_None) { - fixed_cause = NULL; - } else if (PyExceptionClass_Check(cause)) { - fixed_cause = PyObject_CallObject(cause, NULL); - if (fixed_cause == NULL) - goto bad; - } else if (PyExceptionInstance_Check(cause)) { - fixed_cause = cause; - Py_INCREF(fixed_cause); - } else { - PyErr_SetString(PyExc_TypeError, - "exception causes must derive from " - "BaseException"); - goto bad; - } - PyException_SetCause(value, fixed_cause); - } - PyErr_SetObject(type, value); - if (tb) { -#if CYTHON_COMPILING_IN_PYPY - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); - Py_INCREF(tb); - PyErr_Restore(tmp_type, tmp_value, tb); - Py_XDECREF(tmp_tb); -#else - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject* tmp_tb = tstate->curexc_traceback; - if (tb != tmp_tb) { - Py_INCREF(tb); - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_tb); - } -#endif - } -bad: - Py_XDECREF(owned_instance); - return; -} -#endif - -/* DictGetItem */ -#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY -static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { - PyObject *value; - value = PyDict_GetItemWithError(d, key); - if (unlikely(!value)) { - if (!PyErr_Occurred()) { - if (unlikely(PyTuple_Check(key))) { - PyObject* args = PyTuple_Pack(1, key); - if (likely(args)) { - PyErr_SetObject(PyExc_KeyError, args); - Py_DECREF(args); - } - } else { - PyErr_SetObject(PyExc_KeyError, key); - } - } - return NULL; - } - Py_INCREF(value); - return value; -} -#endif - -/* RaiseNoneIterError */ -static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); -} - -/* ExtTypeTest */ -static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { - if (unlikely(!type)) { - PyErr_SetString(PyExc_SystemError, "Missing type object"); - return 0; - } - if (likely(__Pyx_TypeCheck(obj, type))) - return 1; - PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", - Py_TYPE(obj)->tp_name, type->tp_name); - return 0; -} - -/* GetTopmostException */ -#if CYTHON_USE_EXC_INFO_STACK -static _PyErr_StackItem * -__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) -{ - _PyErr_StackItem *exc_info = tstate->exc_info; - while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && - exc_info->previous_item != NULL) - { - exc_info = exc_info->previous_item; - } - return exc_info; -} -#endif - -/* SaveResetException */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); - *type = exc_info->exc_type; - *value = exc_info->exc_value; - *tb = exc_info->exc_traceback; - #else - *type = tstate->exc_type; - *value = tstate->exc_value; - *tb = tstate->exc_traceback; - #endif - Py_XINCREF(*type); - Py_XINCREF(*value); - Py_XINCREF(*tb); -} -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = type; - exc_info->exc_value = value; - exc_info->exc_traceback = tb; - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = type; - tstate->exc_value = value; - tstate->exc_traceback = tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} -#endif - -/* PyErrExceptionMatches */ -#if CYTHON_FAST_THREAD_STATE -static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; icurexc_type; - if (exc_type == err) return 1; - if (unlikely(!exc_type)) return 0; - if (unlikely(PyTuple_Check(err))) - return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); - return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); -} -#endif - -/* GetException */ -#if CYTHON_FAST_THREAD_STATE -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) -#endif -{ - PyObject *local_type, *local_value, *local_tb; -#if CYTHON_FAST_THREAD_STATE - PyObject *tmp_type, *tmp_value, *tmp_tb; - local_type = tstate->curexc_type; - local_value = tstate->curexc_value; - local_tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -#else - PyErr_Fetch(&local_type, &local_value, &local_tb); -#endif - PyErr_NormalizeException(&local_type, &local_value, &local_tb); -#if CYTHON_FAST_THREAD_STATE - if (unlikely(tstate->curexc_type)) -#else - if (unlikely(PyErr_Occurred())) -#endif - goto bad; - #if PY_MAJOR_VERSION >= 3 - if (local_tb) { - if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) - goto bad; - } - #endif - Py_XINCREF(local_tb); - Py_XINCREF(local_type); - Py_XINCREF(local_value); - *type = local_type; - *value = local_value; - *tb = local_tb; -#if CYTHON_FAST_THREAD_STATE - #if CYTHON_USE_EXC_INFO_STACK - { - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = local_type; - exc_info->exc_value = local_value; - exc_info->exc_traceback = local_tb; - } - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = local_type; - tstate->exc_value = local_value; - tstate->exc_traceback = local_tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -#else - PyErr_SetExcInfo(local_type, local_value, local_tb); -#endif - return 0; -bad: - *type = 0; - *value = 0; - *tb = 0; - Py_XDECREF(local_type); - Py_XDECREF(local_value); - Py_XDECREF(local_tb); - return -1; -} - -/* ArgTypeTest */ -static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) -{ - if (unlikely(!type)) { - PyErr_SetString(PyExc_SystemError, "Missing type object"); - return 0; - } - else if (exact) { - #if PY_MAJOR_VERSION == 2 - if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; - #endif - } - else { - if (likely(__Pyx_TypeCheck(obj, type))) return 1; - } - PyErr_Format(PyExc_TypeError, - "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", - name, type->tp_name, Py_TYPE(obj)->tp_name); - return 0; -} - -/* BytesEquals */ -static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { -#if CYTHON_COMPILING_IN_PYPY - return PyObject_RichCompareBool(s1, s2, equals); -#else - if (s1 == s2) { - return (equals == Py_EQ); - } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { - const char *ps1, *ps2; - Py_ssize_t length = PyBytes_GET_SIZE(s1); - if (length != PyBytes_GET_SIZE(s2)) - return (equals == Py_NE); - ps1 = PyBytes_AS_STRING(s1); - ps2 = PyBytes_AS_STRING(s2); - if (ps1[0] != ps2[0]) { - return (equals == Py_NE); - } else if (length == 1) { - return (equals == Py_EQ); - } else { - int result; -#if CYTHON_USE_UNICODE_INTERNALS - Py_hash_t hash1, hash2; - hash1 = ((PyBytesObject*)s1)->ob_shash; - hash2 = ((PyBytesObject*)s2)->ob_shash; - if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { - return (equals == Py_NE); - } -#endif - result = memcmp(ps1, ps2, (size_t)length); - return (equals == Py_EQ) ? (result == 0) : (result != 0); - } - } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { - return (equals == Py_NE); - } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { - return (equals == Py_NE); - } else { - int result; - PyObject* py_result = PyObject_RichCompare(s1, s2, equals); - if (!py_result) - return -1; - result = __Pyx_PyObject_IsTrue(py_result); - Py_DECREF(py_result); - return result; - } -#endif -} - -/* UnicodeEquals */ -static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { -#if CYTHON_COMPILING_IN_PYPY - return PyObject_RichCompareBool(s1, s2, equals); -#else -#if PY_MAJOR_VERSION < 3 - PyObject* owned_ref = NULL; -#endif - int s1_is_unicode, s2_is_unicode; - if (s1 == s2) { - goto return_eq; - } - s1_is_unicode = PyUnicode_CheckExact(s1); - s2_is_unicode = PyUnicode_CheckExact(s2); -#if PY_MAJOR_VERSION < 3 - if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { - owned_ref = PyUnicode_FromObject(s2); - if (unlikely(!owned_ref)) - return -1; - s2 = owned_ref; - s2_is_unicode = 1; - } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { - owned_ref = PyUnicode_FromObject(s1); - if (unlikely(!owned_ref)) - return -1; - s1 = owned_ref; - s1_is_unicode = 1; - } else if (((!s2_is_unicode) & (!s1_is_unicode))) { - return __Pyx_PyBytes_Equals(s1, s2, equals); - } -#endif - if (s1_is_unicode & s2_is_unicode) { - Py_ssize_t length; - int kind; - void *data1, *data2; - if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) - return -1; - length = __Pyx_PyUnicode_GET_LENGTH(s1); - if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { - goto return_ne; - } -#if CYTHON_USE_UNICODE_INTERNALS - { - Py_hash_t hash1, hash2; - #if CYTHON_PEP393_ENABLED - hash1 = ((PyASCIIObject*)s1)->hash; - hash2 = ((PyASCIIObject*)s2)->hash; - #else - hash1 = ((PyUnicodeObject*)s1)->hash; - hash2 = ((PyUnicodeObject*)s2)->hash; - #endif - if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { - goto return_ne; - } - } -#endif - kind = __Pyx_PyUnicode_KIND(s1); - if (kind != __Pyx_PyUnicode_KIND(s2)) { - goto return_ne; - } - data1 = __Pyx_PyUnicode_DATA(s1); - data2 = __Pyx_PyUnicode_DATA(s2); - if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { - goto return_ne; - } else if (length == 1) { - goto return_eq; - } else { - int result = memcmp(data1, data2, (size_t)(length * kind)); - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - return (equals == Py_EQ) ? (result == 0) : (result != 0); - } - } else if ((s1 == Py_None) & s2_is_unicode) { - goto return_ne; - } else if ((s2 == Py_None) & s1_is_unicode) { - goto return_ne; - } else { - int result; - PyObject* py_result = PyObject_RichCompare(s1, s2, equals); - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - if (!py_result) - return -1; - result = __Pyx_PyObject_IsTrue(py_result); - Py_DECREF(py_result); - return result; - } -return_eq: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - return (equals == Py_EQ); -return_ne: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - return (equals == Py_NE); -#endif -} - -/* None */ -static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { - Py_ssize_t q = a / b; - Py_ssize_t r = a - q*b; - q -= ((r != 0) & ((r ^ b) < 0)); - return q; -} - -/* GetAttr */ -static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { -#if CYTHON_USE_TYPE_SLOTS -#if PY_MAJOR_VERSION >= 3 - if (likely(PyUnicode_Check(n))) -#else - if (likely(PyString_Check(n))) -#endif - return __Pyx_PyObject_GetAttrStr(o, n); -#endif - return PyObject_GetAttr(o, n); -} - -/* GetItemInt */ -static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { - PyObject *r; - if (!j) return NULL; - r = PyObject_GetItem(o, j); - Py_DECREF(j); - return r; -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - Py_ssize_t wrapped_i = i; - if (wraparound & unlikely(i < 0)) { - wrapped_i += PyList_GET_SIZE(o); - } - if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { - PyObject *r = PyList_GET_ITEM(o, wrapped_i); - Py_INCREF(r); - return r; - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -#else - return PySequence_GetItem(o, i); -#endif -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - Py_ssize_t wrapped_i = i; - if (wraparound & unlikely(i < 0)) { - wrapped_i += PyTuple_GET_SIZE(o); - } - if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { - PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); - Py_INCREF(r); - return r; - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -#else - return PySequence_GetItem(o, i); -#endif -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS - if (is_list || PyList_CheckExact(o)) { - Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); - if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { - PyObject *r = PyList_GET_ITEM(o, n); - Py_INCREF(r); - return r; - } - } - else if (PyTuple_CheckExact(o)) { - Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); - if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { - PyObject *r = PyTuple_GET_ITEM(o, n); - Py_INCREF(r); - return r; - } - } else { - PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; - if (likely(m && m->sq_item)) { - if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { - Py_ssize_t l = m->sq_length(o); - if (likely(l >= 0)) { - i += l; - } else { - if (!PyErr_ExceptionMatches(PyExc_OverflowError)) - return NULL; - PyErr_Clear(); - } - } - return m->sq_item(o, i); - } - } -#else - if (is_list || PySequence_Check(o)) { - return PySequence_GetItem(o, i); - } -#endif - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -} - -/* ObjectGetItem */ -#if CYTHON_USE_TYPE_SLOTS -static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject* index) { - PyObject *runerr; - Py_ssize_t key_value; - PySequenceMethods *m = Py_TYPE(obj)->tp_as_sequence; - if (unlikely(!(m && m->sq_item))) { - PyErr_Format(PyExc_TypeError, "'%.200s' object is not subscriptable", Py_TYPE(obj)->tp_name); - return NULL; - } - key_value = __Pyx_PyIndex_AsSsize_t(index); - if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { - return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); - } - if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { - PyErr_Clear(); - PyErr_Format(PyExc_IndexError, "cannot fit '%.200s' into an index-sized integer", Py_TYPE(index)->tp_name); - } - return NULL; -} -static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) { - PyMappingMethods *m = Py_TYPE(obj)->tp_as_mapping; - if (likely(m && m->mp_subscript)) { - return m->mp_subscript(obj, key); - } - return __Pyx_PyObject_GetIndex(obj, key); -} -#endif - -/* decode_c_string */ -static CYTHON_INLINE PyObject* __Pyx_decode_c_string( - const char* cstring, Py_ssize_t start, Py_ssize_t stop, - const char* encoding, const char* errors, - PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { - Py_ssize_t length; - if (unlikely((start < 0) | (stop < 0))) { - size_t slen = strlen(cstring); - if (unlikely(slen > (size_t) PY_SSIZE_T_MAX)) { - PyErr_SetString(PyExc_OverflowError, - "c-string too long to convert to Python"); - return NULL; - } - length = (Py_ssize_t) slen; - if (start < 0) { - start += length; - if (start < 0) - start = 0; - } - if (stop < 0) - stop += length; - } - if (unlikely(stop <= start)) - return __Pyx_NewRef(__pyx_empty_unicode); - length = stop - start; - cstring += start; - if (decode_func) { - return decode_func(cstring, length, errors); - } else { - return PyUnicode_Decode(cstring, length, encoding, errors); - } -} - -/* GetAttr3 */ -static PyObject *__Pyx_GetAttr3Default(PyObject *d) { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) - return NULL; - __Pyx_PyErr_Clear(); - Py_INCREF(d); - return d; -} -static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { - PyObject *r = __Pyx_GetAttr(o, n); - return (likely(r)) ? r : __Pyx_GetAttr3Default(d); -} - -/* SwapException */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = *type; - exc_info->exc_value = *value; - exc_info->exc_traceback = *tb; - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = *type; - tstate->exc_value = *value; - tstate->exc_traceback = *tb; - #endif - *type = tmp_type; - *value = tmp_value; - *tb = tmp_tb; -} -#else -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); - PyErr_SetExcInfo(*type, *value, *tb); - *type = tmp_type; - *value = tmp_value; - *tb = tmp_tb; -} -#endif - -/* Import */ -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { - PyObject *empty_list = 0; - PyObject *module = 0; - PyObject *global_dict = 0; - PyObject *empty_dict = 0; - PyObject *list; - #if PY_MAJOR_VERSION < 3 - PyObject *py_import; - py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); - if (!py_import) - goto bad; - #endif - if (from_list) - list = from_list; - else { - empty_list = PyList_New(0); - if (!empty_list) - goto bad; - list = empty_list; - } - global_dict = PyModule_GetDict(__pyx_m); - if (!global_dict) - goto bad; - empty_dict = PyDict_New(); - if (!empty_dict) - goto bad; - { - #if PY_MAJOR_VERSION >= 3 - if (level == -1) { - if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { - module = PyImport_ImportModuleLevelObject( - name, global_dict, empty_dict, list, 1); - if (!module) { - if (!PyErr_ExceptionMatches(PyExc_ImportError)) - goto bad; - PyErr_Clear(); - } - } - level = 0; - } - #endif - if (!module) { - #if PY_MAJOR_VERSION < 3 - PyObject *py_level = PyInt_FromLong(level); - if (!py_level) - goto bad; - module = PyObject_CallFunctionObjArgs(py_import, - name, global_dict, empty_dict, list, py_level, (PyObject *)NULL); - Py_DECREF(py_level); - #else - module = PyImport_ImportModuleLevelObject( - name, global_dict, empty_dict, list, level); - #endif - } - } -bad: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(py_import); - #endif - Py_XDECREF(empty_list); - Py_XDECREF(empty_dict); - return module; -} - -/* FastTypeChecks */ -#if CYTHON_COMPILING_IN_CPYTHON -static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { - while (a) { - a = a->tp_base; - if (a == b) - return 1; - } - return b == &PyBaseObject_Type; -} -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { - PyObject *mro; - if (a == b) return 1; - mro = a->tp_mro; - if (likely(mro)) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(mro); - for (i = 0; i < n; i++) { - if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) - return 1; - } - return 0; - } - return __Pyx_InBases(a, b); -} -#if PY_MAJOR_VERSION == 2 -static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { - PyObject *exception, *value, *tb; - int res; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ErrFetch(&exception, &value, &tb); - res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - if (!res) { - res = PyObject_IsSubclass(err, exc_type2); - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - } - __Pyx_ErrRestore(exception, value, tb); - return res; -} -#else -static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { - int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; - if (!res) { - res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); - } - return res; -} -#endif -static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - assert(PyExceptionClass_Check(exc_type)); - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; i= 0 || (x^b) >= 0)) - return PyInt_FromLong(x); - return PyLong_Type.tp_as_number->nb_add(op1, op2); - } - #endif - #if CYTHON_USE_PYLONG_INTERNALS - if (likely(PyLong_CheckExact(op1))) { - const long b = intval; - long a, x; -#ifdef HAVE_LONG_LONG - const PY_LONG_LONG llb = intval; - PY_LONG_LONG lla, llx; -#endif - const digit* digits = ((PyLongObject*)op1)->ob_digit; - const Py_ssize_t size = Py_SIZE(op1); - if (likely(__Pyx_sst_abs(size) <= 1)) { - a = likely(size) ? digits[0] : 0; - if (size == -1) a = -a; - } else { - switch (size) { - case -2: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { - lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case 2: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { - lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case -3: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { - lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case 3: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { - lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case -4: - if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { - lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - case 4: - if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; -#ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { - lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; -#endif - } - CYTHON_FALLTHROUGH; - default: return PyLong_Type.tp_as_number->nb_add(op1, op2); - } - } - x = a + b; - return PyLong_FromLong(x); -#ifdef HAVE_LONG_LONG - long_long: - llx = lla + llb; - return PyLong_FromLongLong(llx); -#endif - - - } - #endif - if (PyFloat_CheckExact(op1)) { - const long b = intval; - double a = PyFloat_AS_DOUBLE(op1); - double result; - PyFPE_START_PROTECT("add", return NULL) - result = ((double)a) + (double)b; - PyFPE_END_PROTECT(result) - return PyFloat_FromDouble(result); - } - return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2); -} -#endif - -/* None */ -static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { - PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); -} - -/* None */ -static CYTHON_INLINE long __Pyx_div_long(long a, long b) { - long q = a / b; - long r = a - q*b; - q -= ((r != 0) & ((r ^ b) < 0)); - return q; -} - -/* ImportFrom */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { - PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); - if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Format(PyExc_ImportError, - #if PY_MAJOR_VERSION < 3 - "cannot import name %.230s", PyString_AS_STRING(name)); - #else - "cannot import name %S", name); - #endif - } - return value; -} - -/* HasAttr */ -static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { - PyObject *r; - if (unlikely(!__Pyx_PyBaseString_Check(n))) { - PyErr_SetString(PyExc_TypeError, - "hasattr(): attribute name must be string"); - return -1; - } - r = __Pyx_GetAttr(o, n); - if (unlikely(!r)) { - PyErr_Clear(); - return 0; - } else { - Py_DECREF(r); - return 1; - } -} - -/* StringJoin */ -#if !CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyBytes_Join(PyObject* sep, PyObject* values) { - return PyObject_CallMethodObjArgs(sep, __pyx_n_s_join, values, NULL); -} -#endif - -/* PyObject_GenericGetAttrNoDict */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { - PyErr_Format(PyExc_AttributeError, -#if PY_MAJOR_VERSION >= 3 - "'%.50s' object has no attribute '%U'", - tp->tp_name, attr_name); -#else - "'%.50s' object has no attribute '%.400s'", - tp->tp_name, PyString_AS_STRING(attr_name)); -#endif - return NULL; -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { - PyObject *descr; - PyTypeObject *tp = Py_TYPE(obj); - if (unlikely(!PyString_Check(attr_name))) { - return PyObject_GenericGetAttr(obj, attr_name); - } - assert(!tp->tp_dictoffset); - descr = _PyType_Lookup(tp, attr_name); - if (unlikely(!descr)) { - return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); - } - Py_INCREF(descr); - #if PY_MAJOR_VERSION < 3 - if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) - #endif - { - descrgetfunc f = Py_TYPE(descr)->tp_descr_get; - if (unlikely(f)) { - PyObject *res = f(descr, obj, (PyObject *)tp); - Py_DECREF(descr); - return res; - } - } - return descr; -} -#endif - -/* PyObject_GenericGetAttr */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { - if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { - return PyObject_GenericGetAttr(obj, attr_name); - } - return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); -} -#endif - -/* SetVTable */ -static int __Pyx_SetVtable(PyObject *dict, void *vtable) { -#if PY_VERSION_HEX >= 0x02070000 - PyObject *ob = PyCapsule_New(vtable, 0, 0); -#else - PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); -#endif - if (!ob) - goto bad; - if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0) - goto bad; - Py_DECREF(ob); - return 0; -bad: - Py_XDECREF(ob); - return -1; -} - -/* PyObjectGetAttrStrNoError */ -static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) - __Pyx_PyErr_Clear(); -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { - PyObject *result; -#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { - return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); - } -#endif - result = __Pyx_PyObject_GetAttrStr(obj, attr_name); - if (unlikely(!result)) { - __Pyx_PyObject_GetAttrStr_ClearAttributeError(); - } - return result; -} - -/* SetupReduce */ -static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { - int ret; - PyObject *name_attr; - name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name_2); - if (likely(name_attr)) { - ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); - } else { - ret = -1; - } - if (unlikely(ret < 0)) { - PyErr_Clear(); - ret = 0; - } - Py_XDECREF(name_attr); - return ret; -} -static int __Pyx_setup_reduce(PyObject* type_obj) { - int ret = 0; - PyObject *object_reduce = NULL; - PyObject *object_reduce_ex = NULL; - PyObject *reduce = NULL; - PyObject *reduce_ex = NULL; - PyObject *reduce_cython = NULL; - PyObject *setstate = NULL; - PyObject *setstate_cython = NULL; -#if CYTHON_USE_PYTYPE_LOOKUP - if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; -#else - if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; -#endif -#if CYTHON_USE_PYTYPE_LOOKUP - object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; -#else - object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; -#endif - reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; - if (reduce_ex == object_reduce_ex) { -#if CYTHON_USE_PYTYPE_LOOKUP - object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; -#else - object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; -#endif - reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; - if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { - reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); - if (likely(reduce_cython)) { - ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - } else if (reduce == object_reduce || PyErr_Occurred()) { - goto __PYX_BAD; - } - setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); - if (!setstate) PyErr_Clear(); - if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { - setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); - if (likely(setstate_cython)) { - ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - } else if (!setstate || PyErr_Occurred()) { - goto __PYX_BAD; - } - } - PyType_Modified((PyTypeObject*)type_obj); - } - } - goto __PYX_GOOD; -__PYX_BAD: - if (!PyErr_Occurred()) - PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); - ret = -1; -__PYX_GOOD: -#if !CYTHON_USE_PYTYPE_LOOKUP - Py_XDECREF(object_reduce); - Py_XDECREF(object_reduce_ex); -#endif - Py_XDECREF(reduce); - Py_XDECREF(reduce_ex); - Py_XDECREF(reduce_cython); - Py_XDECREF(setstate); - Py_XDECREF(setstate_cython); - return ret; -} - -/* TypeImport */ -#ifndef __PYX_HAVE_RT_ImportType -#define __PYX_HAVE_RT_ImportType -static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, - size_t size, enum __Pyx_ImportType_CheckSize check_size) -{ - PyObject *result = 0; - char warning[200]; - Py_ssize_t basicsize; -#ifdef Py_LIMITED_API - PyObject *py_basicsize; -#endif - result = PyObject_GetAttrString(module, class_name); - if (!result) - goto bad; - if (!PyType_Check(result)) { - PyErr_Format(PyExc_TypeError, - "%.200s.%.200s is not a type object", - module_name, class_name); - goto bad; - } -#ifndef Py_LIMITED_API - basicsize = ((PyTypeObject *)result)->tp_basicsize; -#else - py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); - if (!py_basicsize) - goto bad; - basicsize = PyLong_AsSsize_t(py_basicsize); - Py_DECREF(py_basicsize); - py_basicsize = 0; - if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) - goto bad; -#endif - if ((size_t)basicsize < size) { - PyErr_Format(PyExc_ValueError, - "%.200s.%.200s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - goto bad; - } - if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { - PyErr_Format(PyExc_ValueError, - "%.200s.%.200s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - goto bad; - } - else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { - PyOS_snprintf(warning, sizeof(warning), - "%s.%s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; - } - return (PyTypeObject *)result; -bad: - Py_XDECREF(result); - return NULL; -} -#endif - -/* CLineInTraceback */ -#ifndef CYTHON_CLINE_IN_TRACEBACK -static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { - PyObject *use_cline; - PyObject *ptype, *pvalue, *ptraceback; -#if CYTHON_COMPILING_IN_CPYTHON - PyObject **cython_runtime_dict; -#endif - if (unlikely(!__pyx_cython_runtime)) { - return c_line; - } - __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); -#if CYTHON_COMPILING_IN_CPYTHON - cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); - if (likely(cython_runtime_dict)) { - __PYX_PY_DICT_LOOKUP_IF_MODIFIED( - use_cline, *cython_runtime_dict, - __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) - } else -#endif - { - PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); - if (use_cline_obj) { - use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; - Py_DECREF(use_cline_obj); - } else { - PyErr_Clear(); - use_cline = NULL; - } - } - if (!use_cline) { - c_line = 0; - PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); - } - else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { - c_line = 0; - } - __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); - return c_line; -} -#endif - -/* CodeObjectCache */ -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { - int start = 0, mid = 0, end = count - 1; - if (end >= 0 && code_line > entries[end].code_line) { - return count; - } - while (start < end) { - mid = start + (end - start) / 2; - if (code_line < entries[mid].code_line) { - end = mid; - } else if (code_line > entries[mid].code_line) { - start = mid + 1; - } else { - return mid; - } - } - if (code_line <= entries[mid].code_line) { - return mid; - } else { - return mid + 1; - } -} -static PyCodeObject *__pyx_find_code_object(int code_line) { - PyCodeObject* code_object; - int pos; - if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { - return NULL; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { - return NULL; - } - code_object = __pyx_code_cache.entries[pos].code_object; - Py_INCREF(code_object); - return code_object; -} -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { - int pos, i; - __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; - if (unlikely(!code_line)) { - return; - } - if (unlikely(!entries)) { - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); - if (likely(entries)) { - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = 64; - __pyx_code_cache.count = 1; - entries[0].code_line = code_line; - entries[0].code_object = code_object; - Py_INCREF(code_object); - } - return; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { - PyCodeObject* tmp = entries[pos].code_object; - entries[pos].code_object = code_object; - Py_DECREF(tmp); - return; - } - if (__pyx_code_cache.count == __pyx_code_cache.max_count) { - int new_max = __pyx_code_cache.max_count + 64; - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( - __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); - if (unlikely(!entries)) { - return; - } - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = new_max; - } - for (i=__pyx_code_cache.count; i>pos; i--) { - entries[i] = entries[i-1]; - } - entries[pos].code_line = code_line; - entries[pos].code_object = code_object; - __pyx_code_cache.count++; - Py_INCREF(code_object); -} - -/* AddTraceback */ -#include "compile.h" -#include "frameobject.h" -#include "traceback.h" -static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( - const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyObject *py_srcfile = 0; - PyObject *py_funcname = 0; - #if PY_MAJOR_VERSION < 3 - py_srcfile = PyString_FromString(filename); - #else - py_srcfile = PyUnicode_FromString(filename); - #endif - if (!py_srcfile) goto bad; - if (c_line) { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #else - py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #endif - } - else { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromString(funcname); - #else - py_funcname = PyUnicode_FromString(funcname); - #endif - } - if (!py_funcname) goto bad; - py_code = __Pyx_PyCode_New( - 0, - 0, - 0, - 0, - 0, - __pyx_empty_bytes, /*PyObject *code,*/ - __pyx_empty_tuple, /*PyObject *consts,*/ - __pyx_empty_tuple, /*PyObject *names,*/ - __pyx_empty_tuple, /*PyObject *varnames,*/ - __pyx_empty_tuple, /*PyObject *freevars,*/ - __pyx_empty_tuple, /*PyObject *cellvars,*/ - py_srcfile, /*PyObject *filename,*/ - py_funcname, /*PyObject *name,*/ - py_line, - __pyx_empty_bytes /*PyObject *lnotab*/ - ); - Py_DECREF(py_srcfile); - Py_DECREF(py_funcname); - return py_code; -bad: - Py_XDECREF(py_srcfile); - Py_XDECREF(py_funcname); - return NULL; -} -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyFrameObject *py_frame = 0; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - if (c_line) { - c_line = __Pyx_CLineForTraceback(tstate, c_line); - } - py_code = __pyx_find_code_object(c_line ? -c_line : py_line); - if (!py_code) { - py_code = __Pyx_CreateCodeObjectForTraceback( - funcname, c_line, py_line, filename); - if (!py_code) goto bad; - __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); - } - py_frame = PyFrame_New( - tstate, /*PyThreadState *tstate,*/ - py_code, /*PyCodeObject *code,*/ - __pyx_d, /*PyObject *globals,*/ - 0 /*PyObject *locals*/ - ); - if (!py_frame) goto bad; - __Pyx_PyFrame_SetLineNumber(py_frame, py_line); - PyTraceBack_Here(py_frame); -bad: - Py_XDECREF(py_code); - Py_XDECREF(py_frame); -} - -#if PY_MAJOR_VERSION < 3 -static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { - if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); - if (__Pyx_TypeCheck(obj, __pyx_array_type)) return __pyx_array_getbuffer(obj, view, flags); - if (__Pyx_TypeCheck(obj, __pyx_memoryview_type)) return __pyx_memoryview_getbuffer(obj, view, flags); - PyErr_Format(PyExc_TypeError, "'%.200s' does not have the buffer interface", Py_TYPE(obj)->tp_name); - return -1; -} -static void __Pyx_ReleaseBuffer(Py_buffer *view) { - PyObject *obj = view->obj; - if (!obj) return; - if (PyObject_CheckBuffer(obj)) { - PyBuffer_Release(view); - return; - } - if ((0)) {} - view->obj = NULL; - Py_DECREF(obj); -} -#endif - - -/* MemviewSliceIsContig */ -static int -__pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim) -{ - int i, index, step, start; - Py_ssize_t itemsize = mvs.memview->view.itemsize; - if (order == 'F') { - step = 1; - start = 0; - } else { - step = -1; - start = ndim - 1; - } - for (i = 0; i < ndim; i++) { - index = start + step * i; - if (mvs.suboffsets[index] >= 0 || mvs.strides[index] != itemsize) - return 0; - itemsize *= mvs.shape[index]; - } - return 1; -} - -/* OverlappingSlices */ -static void -__pyx_get_array_memory_extents(__Pyx_memviewslice *slice, - void **out_start, void **out_end, - int ndim, size_t itemsize) -{ - char *start, *end; - int i; - start = end = slice->data; - for (i = 0; i < ndim; i++) { - Py_ssize_t stride = slice->strides[i]; - Py_ssize_t extent = slice->shape[i]; - if (extent == 0) { - *out_start = *out_end = start; - return; - } else { - if (stride > 0) - end += stride * (extent - 1); - else - start += stride * (extent - 1); - } - } - *out_start = start; - *out_end = end + itemsize; -} -static int -__pyx_slices_overlap(__Pyx_memviewslice *slice1, - __Pyx_memviewslice *slice2, - int ndim, size_t itemsize) -{ - void *start1, *end1, *start2, *end2; - __pyx_get_array_memory_extents(slice1, &start1, &end1, ndim, itemsize); - __pyx_get_array_memory_extents(slice2, &start2, &end2, ndim, itemsize); - return (start1 < end2) && (start2 < end1); -} - -/* Capsule */ -static CYTHON_INLINE PyObject * -__pyx_capsule_create(void *p, CYTHON_UNUSED const char *sig) -{ - PyObject *cobj; -#if PY_VERSION_HEX >= 0x02070000 - cobj = PyCapsule_New(p, sig, NULL); -#else - cobj = PyCObject_FromVoidPtr(p, NULL); -#endif - return cobj; -} - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { - const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(int) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(int) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(int) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(int), - little, !is_unsigned); - } -} - -/* CIntFromPyVerify */ -#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) -#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) -#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ - {\ - func_type value = func_value;\ - if (sizeof(target_type) < sizeof(func_type)) {\ - if (unlikely(value != (func_type) (target_type) value)) {\ - func_type zero = 0;\ - if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ - return (target_type) -1;\ - if (is_unsigned && unlikely(value < zero))\ - goto raise_neg_overflow;\ - else\ - goto raise_overflow;\ - }\ - }\ - return (target_type) value;\ - } - -/* Declarations */ -#if CYTHON_CCOMPLEX - #ifdef __cplusplus - static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { - return ::std::complex< float >(x, y); - } - #else - static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { - return x + y*(__pyx_t_float_complex)_Complex_I; - } - #endif -#else - static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { - __pyx_t_float_complex z; - z.real = x; - z.imag = y; - return z; - } -#endif - -/* Arithmetic */ -#if CYTHON_CCOMPLEX -#else - static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - return (a.real == b.real) && (a.imag == b.imag); - } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - __pyx_t_float_complex z; - z.real = a.real + b.real; - z.imag = a.imag + b.imag; - return z; - } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - __pyx_t_float_complex z; - z.real = a.real - b.real; - z.imag = a.imag - b.imag; - return z; - } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - __pyx_t_float_complex z; - z.real = a.real * b.real - a.imag * b.imag; - z.imag = a.real * b.imag + a.imag * b.real; - return z; - } - #if 1 - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - if (b.imag == 0) { - return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); - } else if (fabsf(b.real) >= fabsf(b.imag)) { - if (b.real == 0 && b.imag == 0) { - return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); - } else { - float r = b.imag / b.real; - float s = (float)(1.0) / (b.real + b.imag * r); - return __pyx_t_float_complex_from_parts( - (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); - } - } else { - float r = b.real / b.imag; - float s = (float)(1.0) / (b.imag + b.real * r); - return __pyx_t_float_complex_from_parts( - (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); - } - } - #else - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - if (b.imag == 0) { - return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); - } else { - float denom = b.real * b.real + b.imag * b.imag; - return __pyx_t_float_complex_from_parts( - (a.real * b.real + a.imag * b.imag) / denom, - (a.imag * b.real - a.real * b.imag) / denom); - } - } - #endif - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { - __pyx_t_float_complex z; - z.real = -a.real; - z.imag = -a.imag; - return z; - } - static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { - return (a.real == 0) && (a.imag == 0); - } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { - __pyx_t_float_complex z; - z.real = a.real; - z.imag = -a.imag; - return z; - } - #if 1 - static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { - #if !defined(HAVE_HYPOT) || defined(_MSC_VER) - return sqrtf(z.real*z.real + z.imag*z.imag); - #else - return hypotf(z.real, z.imag); - #endif - } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - __pyx_t_float_complex z; - float r, lnr, theta, z_r, z_theta; - if (b.imag == 0 && b.real == (int)b.real) { - if (b.real < 0) { - float denom = a.real * a.real + a.imag * a.imag; - a.real = a.real / denom; - a.imag = -a.imag / denom; - b.real = -b.real; - } - switch ((int)b.real) { - case 0: - z.real = 1; - z.imag = 0; - return z; - case 1: - return a; - case 2: - return __Pyx_c_prod_float(a, a); - case 3: - z = __Pyx_c_prod_float(a, a); - return __Pyx_c_prod_float(z, a); - case 4: - z = __Pyx_c_prod_float(a, a); - return __Pyx_c_prod_float(z, z); - } - } - if (a.imag == 0) { - if (a.real == 0) { - return a; - } else if (b.imag == 0) { - z.real = powf(a.real, b.real); - z.imag = 0; - return z; - } else if (a.real > 0) { - r = a.real; - theta = 0; - } else { - r = -a.real; - theta = atan2f(0.0, -1.0); - } - } else { - r = __Pyx_c_abs_float(a); - theta = atan2f(a.imag, a.real); - } - lnr = logf(r); - z_r = expf(lnr * b.real - theta * b.imag); - z_theta = theta * b.real + lnr * b.imag; - z.real = z_r * cosf(z_theta); - z.imag = z_r * sinf(z_theta); - return z; - } - #endif -#endif - -/* Declarations */ -#if CYTHON_CCOMPLEX - #ifdef __cplusplus - static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { - return ::std::complex< double >(x, y); - } - #else - static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { - return x + y*(__pyx_t_double_complex)_Complex_I; - } - #endif -#else - static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { - __pyx_t_double_complex z; - z.real = x; - z.imag = y; - return z; - } -#endif - -/* Arithmetic */ -#if CYTHON_CCOMPLEX -#else - static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - return (a.real == b.real) && (a.imag == b.imag); - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - z.real = a.real + b.real; - z.imag = a.imag + b.imag; - return z; - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - z.real = a.real - b.real; - z.imag = a.imag - b.imag; - return z; - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - z.real = a.real * b.real - a.imag * b.imag; - z.imag = a.real * b.imag + a.imag * b.real; - return z; - } - #if 1 - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - if (b.imag == 0) { - return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); - } else if (fabs(b.real) >= fabs(b.imag)) { - if (b.real == 0 && b.imag == 0) { - return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); - } else { - double r = b.imag / b.real; - double s = (double)(1.0) / (b.real + b.imag * r); - return __pyx_t_double_complex_from_parts( - (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); - } - } else { - double r = b.real / b.imag; - double s = (double)(1.0) / (b.imag + b.real * r); - return __pyx_t_double_complex_from_parts( - (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); - } - } - #else - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - if (b.imag == 0) { - return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); - } else { - double denom = b.real * b.real + b.imag * b.imag; - return __pyx_t_double_complex_from_parts( - (a.real * b.real + a.imag * b.imag) / denom, - (a.imag * b.real - a.real * b.imag) / denom); - } - } - #endif - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { - __pyx_t_double_complex z; - z.real = -a.real; - z.imag = -a.imag; - return z; - } - static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { - return (a.real == 0) && (a.imag == 0); - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { - __pyx_t_double_complex z; - z.real = a.real; - z.imag = -a.imag; - return z; - } - #if 1 - static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { - #if !defined(HAVE_HYPOT) || defined(_MSC_VER) - return sqrt(z.real*z.real + z.imag*z.imag); - #else - return hypot(z.real, z.imag); - #endif - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - double r, lnr, theta, z_r, z_theta; - if (b.imag == 0 && b.real == (int)b.real) { - if (b.real < 0) { - double denom = a.real * a.real + a.imag * a.imag; - a.real = a.real / denom; - a.imag = -a.imag / denom; - b.real = -b.real; - } - switch ((int)b.real) { - case 0: - z.real = 1; - z.imag = 0; - return z; - case 1: - return a; - case 2: - return __Pyx_c_prod_double(a, a); - case 3: - z = __Pyx_c_prod_double(a, a); - return __Pyx_c_prod_double(z, a); - case 4: - z = __Pyx_c_prod_double(a, a); - return __Pyx_c_prod_double(z, z); - } - } - if (a.imag == 0) { - if (a.real == 0) { - return a; - } else if (b.imag == 0) { - z.real = pow(a.real, b.real); - z.imag = 0; - return z; - } else if (a.real > 0) { - r = a.real; - theta = 0; - } else { - r = -a.real; - theta = atan2(0.0, -1.0); - } - } else { - r = __Pyx_c_abs_double(a); - theta = atan2(a.imag, a.real); - } - lnr = log(r); - z_r = exp(lnr * b.real - theta * b.imag); - z_theta = theta * b.real + lnr * b.imag; - z.real = z_r * cos(z_theta); - z.imag = z_r * sin(z_theta); - return z; - } - #endif -#endif - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) { - const enum NPY_TYPES neg_one = (enum NPY_TYPES) ((enum NPY_TYPES) 0 - (enum NPY_TYPES) 1), const_zero = (enum NPY_TYPES) 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(enum NPY_TYPES) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(enum NPY_TYPES) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(enum NPY_TYPES), - little, !is_unsigned); - } -} - -/* MemviewSliceCopyTemplate */ -static __Pyx_memviewslice -__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, - const char *mode, int ndim, - size_t sizeof_dtype, int contig_flag, - int dtype_is_object) -{ - __Pyx_RefNannyDeclarations - int i; - __Pyx_memviewslice new_mvs = { 0, 0, { 0 }, { 0 }, { 0 } }; - struct __pyx_memoryview_obj *from_memview = from_mvs->memview; - Py_buffer *buf = &from_memview->view; - PyObject *shape_tuple = NULL; - PyObject *temp_int = NULL; - struct __pyx_array_obj *array_obj = NULL; - struct __pyx_memoryview_obj *memview_obj = NULL; - __Pyx_RefNannySetupContext("__pyx_memoryview_copy_new_contig", 0); - for (i = 0; i < ndim; i++) { - if (unlikely(from_mvs->suboffsets[i] >= 0)) { - PyErr_Format(PyExc_ValueError, "Cannot copy memoryview slice with " - "indirect dimensions (axis %d)", i); - goto fail; - } - } - shape_tuple = PyTuple_New(ndim); - if (unlikely(!shape_tuple)) { - goto fail; - } - __Pyx_GOTREF(shape_tuple); - for(i = 0; i < ndim; i++) { - temp_int = PyInt_FromSsize_t(from_mvs->shape[i]); - if(unlikely(!temp_int)) { - goto fail; - } else { - PyTuple_SET_ITEM(shape_tuple, i, temp_int); - temp_int = NULL; - } - } - array_obj = __pyx_array_new(shape_tuple, sizeof_dtype, buf->format, (char *) mode, NULL); - if (unlikely(!array_obj)) { - goto fail; - } - __Pyx_GOTREF(array_obj); - memview_obj = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( - (PyObject *) array_obj, contig_flag, - dtype_is_object, - from_mvs->memview->typeinfo); - if (unlikely(!memview_obj)) - goto fail; - if (unlikely(__Pyx_init_memviewslice(memview_obj, ndim, &new_mvs, 1) < 0)) - goto fail; - if (unlikely(__pyx_memoryview_copy_contents(*from_mvs, new_mvs, ndim, ndim, - dtype_is_object) < 0)) - goto fail; - goto no_fail; -fail: - __Pyx_XDECREF(new_mvs.memview); - new_mvs.memview = NULL; - new_mvs.data = NULL; -no_fail: - __Pyx_XDECREF(shape_tuple); - __Pyx_XDECREF(temp_int); - __Pyx_XDECREF(array_obj); - __Pyx_RefNannyFinishContext(); - return new_mvs; -} - -/* TypeInfoToFormat */ -static struct __pyx_typeinfo_string __Pyx_TypeInfoToFormat(__Pyx_TypeInfo *type) { - struct __pyx_typeinfo_string result = { {0} }; - char *buf = (char *) result.string; - size_t size = type->size; - switch (type->typegroup) { - case 'H': - *buf = 'c'; - break; - case 'I': - case 'U': - if (size == 1) - *buf = (type->is_unsigned) ? 'B' : 'b'; - else if (size == 2) - *buf = (type->is_unsigned) ? 'H' : 'h'; - else if (size == 4) - *buf = (type->is_unsigned) ? 'I' : 'i'; - else if (size == 8) - *buf = (type->is_unsigned) ? 'Q' : 'q'; - break; - case 'P': - *buf = 'P'; - break; - case 'C': - { - __Pyx_TypeInfo complex_type = *type; - complex_type.typegroup = 'R'; - complex_type.size /= 2; - *buf++ = 'Z'; - *buf = __Pyx_TypeInfoToFormat(&complex_type).string[0]; - break; - } - case 'R': - if (size == 4) - *buf = 'f'; - else if (size == 8) - *buf = 'd'; - else - *buf = 'g'; - break; - } - return result; -} - -/* CIntFromPy */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { - const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(int) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (int) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { - return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { - return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { - return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (int) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(int) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) - case -2: - if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - } -#endif - if (sizeof(int) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - int val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (int) -1; - } - } else { - int val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (int) -1; - val = __Pyx_PyInt_As_int(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to int"); - return (int) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to int"); - return (int) -1; -} - -/* CIntFromPy */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { - const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(long) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (long) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { - return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { - return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { - return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (long) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(long) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) - case -2: - if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - } -#endif - if (sizeof(long) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - long val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (long) -1; - } - } else { - long val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (long) -1; - val = __Pyx_PyInt_As_long(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to long"); - return (long) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to long"); - return (long) -1; -} - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { - const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(long) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(long) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(long) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(long), - little, !is_unsigned); - } -} - -/* CIntFromPy */ -static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { - const char neg_one = (char) ((char) 0 - (char) 1), const_zero = (char) 0; - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(char) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(char, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (char) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (char) 0; - case 1: __PYX_VERIFY_RETURN_INT(char, digit, digits[0]) - case 2: - if (8 * sizeof(char) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) >= 2 * PyLong_SHIFT) { - return (char) (((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(char) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) >= 3 * PyLong_SHIFT) { - return (char) (((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(char) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) >= 4 * PyLong_SHIFT) { - return (char) (((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (char) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(char) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(char, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(char) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(char, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (char) 0; - case -1: __PYX_VERIFY_RETURN_INT(char, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(char, digit, +digits[0]) - case -2: - if (8 * sizeof(char) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { - return (char) (((char)-1)*(((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(char) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { - return (char) ((((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { - return (char) (((char)-1)*(((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(char) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { - return (char) ((((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { - return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(char) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { - return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - } -#endif - if (sizeof(char) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(char) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - char val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (char) -1; - } - } else { - char val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (char) -1; - val = __Pyx_PyInt_As_char(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to char"); - return (char) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to char"); - return (char) -1; -} - -/* IsLittleEndian */ -static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) -{ - union { - uint32_t u32; - uint8_t u8[4]; - } S; - S.u32 = 0x01020304; - return S.u8[0] == 4; -} - -/* BufferFormatCheck */ -static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, - __Pyx_BufFmt_StackElem* stack, - __Pyx_TypeInfo* type) { - stack[0].field = &ctx->root; - stack[0].parent_offset = 0; - ctx->root.type = type; - ctx->root.name = "buffer dtype"; - ctx->root.offset = 0; - ctx->head = stack; - ctx->head->field = &ctx->root; - ctx->fmt_offset = 0; - ctx->head->parent_offset = 0; - ctx->new_packmode = '@'; - ctx->enc_packmode = '@'; - ctx->new_count = 1; - ctx->enc_count = 0; - ctx->enc_type = 0; - ctx->is_complex = 0; - ctx->is_valid_array = 0; - ctx->struct_alignment = 0; - while (type->typegroup == 'S') { - ++ctx->head; - ctx->head->field = type->fields; - ctx->head->parent_offset = 0; - type = type->fields->type; - } -} -static int __Pyx_BufFmt_ParseNumber(const char** ts) { - int count; - const char* t = *ts; - if (*t < '0' || *t > '9') { - return -1; - } else { - count = *t++ - '0'; - while (*t >= '0' && *t <= '9') { - count *= 10; - count += *t++ - '0'; - } - } - *ts = t; - return count; -} -static int __Pyx_BufFmt_ExpectNumber(const char **ts) { - int number = __Pyx_BufFmt_ParseNumber(ts); - if (number == -1) - PyErr_Format(PyExc_ValueError,\ - "Does not understand character buffer dtype format string ('%c')", **ts); - return number; -} -static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { - PyErr_Format(PyExc_ValueError, - "Unexpected format string character: '%c'", ch); -} -static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { - switch (ch) { - case '?': return "'bool'"; - case 'c': return "'char'"; - case 'b': return "'signed char'"; - case 'B': return "'unsigned char'"; - case 'h': return "'short'"; - case 'H': return "'unsigned short'"; - case 'i': return "'int'"; - case 'I': return "'unsigned int'"; - case 'l': return "'long'"; - case 'L': return "'unsigned long'"; - case 'q': return "'long long'"; - case 'Q': return "'unsigned long long'"; - case 'f': return (is_complex ? "'complex float'" : "'float'"); - case 'd': return (is_complex ? "'complex double'" : "'double'"); - case 'g': return (is_complex ? "'complex long double'" : "'long double'"); - case 'T': return "a struct"; - case 'O': return "Python object"; - case 'P': return "a pointer"; - case 's': case 'p': return "a string"; - case 0: return "end"; - default: return "unparseable format string"; - } -} -static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { - switch (ch) { - case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; - case 'h': case 'H': return 2; - case 'i': case 'I': case 'l': case 'L': return 4; - case 'q': case 'Q': return 8; - case 'f': return (is_complex ? 8 : 4); - case 'd': return (is_complex ? 16 : 8); - case 'g': { - PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); - return 0; - } - case 'O': case 'P': return sizeof(void*); - default: - __Pyx_BufFmt_RaiseUnexpectedChar(ch); - return 0; - } -} -static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { - switch (ch) { - case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; - case 'h': case 'H': return sizeof(short); - case 'i': case 'I': return sizeof(int); - case 'l': case 'L': return sizeof(long); - #ifdef HAVE_LONG_LONG - case 'q': case 'Q': return sizeof(PY_LONG_LONG); - #endif - case 'f': return sizeof(float) * (is_complex ? 2 : 1); - case 'd': return sizeof(double) * (is_complex ? 2 : 1); - case 'g': return sizeof(long double) * (is_complex ? 2 : 1); - case 'O': case 'P': return sizeof(void*); - default: { - __Pyx_BufFmt_RaiseUnexpectedChar(ch); - return 0; - } - } -} -typedef struct { char c; short x; } __Pyx_st_short; -typedef struct { char c; int x; } __Pyx_st_int; -typedef struct { char c; long x; } __Pyx_st_long; -typedef struct { char c; float x; } __Pyx_st_float; -typedef struct { char c; double x; } __Pyx_st_double; -typedef struct { char c; long double x; } __Pyx_st_longdouble; -typedef struct { char c; void *x; } __Pyx_st_void_p; -#ifdef HAVE_LONG_LONG -typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; -#endif -static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) { - switch (ch) { - case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; - case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); - case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); - case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); -#ifdef HAVE_LONG_LONG - case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); -#endif - case 'f': return sizeof(__Pyx_st_float) - sizeof(float); - case 'd': return sizeof(__Pyx_st_double) - sizeof(double); - case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); - case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); - default: - __Pyx_BufFmt_RaiseUnexpectedChar(ch); - return 0; - } -} -/* These are for computing the padding at the end of the struct to align - on the first member of the struct. This will probably the same as above, - but we don't have any guarantees. - */ -typedef struct { short x; char c; } __Pyx_pad_short; -typedef struct { int x; char c; } __Pyx_pad_int; -typedef struct { long x; char c; } __Pyx_pad_long; -typedef struct { float x; char c; } __Pyx_pad_float; -typedef struct { double x; char c; } __Pyx_pad_double; -typedef struct { long double x; char c; } __Pyx_pad_longdouble; -typedef struct { void *x; char c; } __Pyx_pad_void_p; -#ifdef HAVE_LONG_LONG -typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; -#endif -static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) { - switch (ch) { - case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; - case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); - case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); - case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); -#ifdef HAVE_LONG_LONG - case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); -#endif - case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); - case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); - case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); - case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); - default: - __Pyx_BufFmt_RaiseUnexpectedChar(ch); - return 0; - } -} -static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { - switch (ch) { - case 'c': - return 'H'; - case 'b': case 'h': case 'i': - case 'l': case 'q': case 's': case 'p': - return 'I'; - case '?': case 'B': case 'H': case 'I': case 'L': case 'Q': - return 'U'; - case 'f': case 'd': case 'g': - return (is_complex ? 'C' : 'R'); - case 'O': - return 'O'; - case 'P': - return 'P'; - default: { - __Pyx_BufFmt_RaiseUnexpectedChar(ch); - return 0; - } - } -} -static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { - if (ctx->head == NULL || ctx->head->field == &ctx->root) { - const char* expected; - const char* quote; - if (ctx->head == NULL) { - expected = "end"; - quote = ""; - } else { - expected = ctx->head->field->type->name; - quote = "'"; - } - PyErr_Format(PyExc_ValueError, - "Buffer dtype mismatch, expected %s%s%s but got %s", - quote, expected, quote, - __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); - } else { - __Pyx_StructField* field = ctx->head->field; - __Pyx_StructField* parent = (ctx->head - 1)->field; - PyErr_Format(PyExc_ValueError, - "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", - field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), - parent->type->name, field->name); - } -} -static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { - char group; - size_t size, offset, arraysize = 1; - if (ctx->enc_type == 0) return 0; - if (ctx->head->field->type->arraysize[0]) { - int i, ndim = 0; - if (ctx->enc_type == 's' || ctx->enc_type == 'p') { - ctx->is_valid_array = ctx->head->field->type->ndim == 1; - ndim = 1; - if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { - PyErr_Format(PyExc_ValueError, - "Expected a dimension of size %zu, got %zu", - ctx->head->field->type->arraysize[0], ctx->enc_count); - return -1; - } - } - if (!ctx->is_valid_array) { - PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", - ctx->head->field->type->ndim, ndim); - return -1; - } - for (i = 0; i < ctx->head->field->type->ndim; i++) { - arraysize *= ctx->head->field->type->arraysize[i]; - } - ctx->is_valid_array = 0; - ctx->enc_count = 1; - } - group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); - do { - __Pyx_StructField* field = ctx->head->field; - __Pyx_TypeInfo* type = field->type; - if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { - size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); - } else { - size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); - } - if (ctx->enc_packmode == '@') { - size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); - size_t align_mod_offset; - if (align_at == 0) return -1; - align_mod_offset = ctx->fmt_offset % align_at; - if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; - if (ctx->struct_alignment == 0) - ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, - ctx->is_complex); - } - if (type->size != size || type->typegroup != group) { - if (type->typegroup == 'C' && type->fields != NULL) { - size_t parent_offset = ctx->head->parent_offset + field->offset; - ++ctx->head; - ctx->head->field = type->fields; - ctx->head->parent_offset = parent_offset; - continue; - } - if ((type->typegroup == 'H' || group == 'H') && type->size == size) { - } else { - __Pyx_BufFmt_RaiseExpected(ctx); - return -1; - } - } - offset = ctx->head->parent_offset + field->offset; - if (ctx->fmt_offset != offset) { - PyErr_Format(PyExc_ValueError, - "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", - (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); - return -1; - } - ctx->fmt_offset += size; - if (arraysize) - ctx->fmt_offset += (arraysize - 1) * size; - --ctx->enc_count; - while (1) { - if (field == &ctx->root) { - ctx->head = NULL; - if (ctx->enc_count != 0) { - __Pyx_BufFmt_RaiseExpected(ctx); - return -1; - } - break; - } - ctx->head->field = ++field; - if (field->type == NULL) { - --ctx->head; - field = ctx->head->field; - continue; - } else if (field->type->typegroup == 'S') { - size_t parent_offset = ctx->head->parent_offset + field->offset; - if (field->type->fields->type == NULL) continue; - field = field->type->fields; - ++ctx->head; - ctx->head->field = field; - ctx->head->parent_offset = parent_offset; - break; - } else { - break; - } - } - } while (ctx->enc_count); - ctx->enc_type = 0; - ctx->is_complex = 0; - return 0; -} -static PyObject * -__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) -{ - const char *ts = *tsp; - int i = 0, number, ndim; - ++ts; - if (ctx->new_count != 1) { - PyErr_SetString(PyExc_ValueError, - "Cannot handle repeated arrays in format string"); - return NULL; - } - if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; - ndim = ctx->head->field->type->ndim; - while (*ts && *ts != ')') { - switch (*ts) { - case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; - default: break; - } - number = __Pyx_BufFmt_ExpectNumber(&ts); - if (number == -1) return NULL; - if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) - return PyErr_Format(PyExc_ValueError, - "Expected a dimension of size %zu, got %d", - ctx->head->field->type->arraysize[i], number); - if (*ts != ',' && *ts != ')') - return PyErr_Format(PyExc_ValueError, - "Expected a comma in format string, got '%c'", *ts); - if (*ts == ',') ts++; - i++; - } - if (i != ndim) - return PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", - ctx->head->field->type->ndim, i); - if (!*ts) { - PyErr_SetString(PyExc_ValueError, - "Unexpected end of format string, expected ')'"); - return NULL; - } - ctx->is_valid_array = 1; - ctx->new_count = 1; - *tsp = ++ts; - return Py_None; -} -static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { - int got_Z = 0; - while (1) { - switch(*ts) { - case 0: - if (ctx->enc_type != 0 && ctx->head == NULL) { - __Pyx_BufFmt_RaiseExpected(ctx); - return NULL; - } - if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; - if (ctx->head != NULL) { - __Pyx_BufFmt_RaiseExpected(ctx); - return NULL; - } - return ts; - case ' ': - case '\r': - case '\n': - ++ts; - break; - case '<': - if (!__Pyx_Is_Little_Endian()) { - PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); - return NULL; - } - ctx->new_packmode = '='; - ++ts; - break; - case '>': - case '!': - if (__Pyx_Is_Little_Endian()) { - PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); - return NULL; - } - ctx->new_packmode = '='; - ++ts; - break; - case '=': - case '@': - case '^': - ctx->new_packmode = *ts++; - break; - case 'T': - { - const char* ts_after_sub; - size_t i, struct_count = ctx->new_count; - size_t struct_alignment = ctx->struct_alignment; - ctx->new_count = 1; - ++ts; - if (*ts != '{') { - PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); - return NULL; - } - if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; - ctx->enc_type = 0; - ctx->enc_count = 0; - ctx->struct_alignment = 0; - ++ts; - ts_after_sub = ts; - for (i = 0; i != struct_count; ++i) { - ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); - if (!ts_after_sub) return NULL; - } - ts = ts_after_sub; - if (struct_alignment) ctx->struct_alignment = struct_alignment; - } - break; - case '}': - { - size_t alignment = ctx->struct_alignment; - ++ts; - if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; - ctx->enc_type = 0; - if (alignment && ctx->fmt_offset % alignment) { - ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); - } - } - return ts; - case 'x': - if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; - ctx->fmt_offset += ctx->new_count; - ctx->new_count = 1; - ctx->enc_count = 0; - ctx->enc_type = 0; - ctx->enc_packmode = ctx->new_packmode; - ++ts; - break; - case 'Z': - got_Z = 1; - ++ts; - if (*ts != 'f' && *ts != 'd' && *ts != 'g') { - __Pyx_BufFmt_RaiseUnexpectedChar('Z'); - return NULL; - } - CYTHON_FALLTHROUGH; - case '?': case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': - case 'l': case 'L': case 'q': case 'Q': - case 'f': case 'd': case 'g': - case 'O': case 'p': - if ((ctx->enc_type == *ts) && (got_Z == ctx->is_complex) && - (ctx->enc_packmode == ctx->new_packmode) && (!ctx->is_valid_array)) { - ctx->enc_count += ctx->new_count; - ctx->new_count = 1; - got_Z = 0; - ++ts; - break; - } - CYTHON_FALLTHROUGH; - case 's': - if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; - ctx->enc_count = ctx->new_count; - ctx->enc_packmode = ctx->new_packmode; - ctx->enc_type = *ts; - ctx->is_complex = got_Z; - ++ts; - ctx->new_count = 1; - got_Z = 0; - break; - case ':': - ++ts; - while(*ts != ':') ++ts; - ++ts; - break; - case '(': - if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL; - break; - default: - { - int number = __Pyx_BufFmt_ExpectNumber(&ts); - if (number == -1) return NULL; - ctx->new_count = (size_t)number; - } - } - } -} - -/* TypeInfoCompare */ - static int -__pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b) -{ - int i; - if (!a || !b) - return 0; - if (a == b) - return 1; - if (a->size != b->size || a->typegroup != b->typegroup || - a->is_unsigned != b->is_unsigned || a->ndim != b->ndim) { - if (a->typegroup == 'H' || b->typegroup == 'H') { - return a->size == b->size; - } else { - return 0; - } - } - if (a->ndim) { - for (i = 0; i < a->ndim; i++) - if (a->arraysize[i] != b->arraysize[i]) - return 0; - } - if (a->typegroup == 'S') { - if (a->flags != b->flags) - return 0; - if (a->fields || b->fields) { - if (!(a->fields && b->fields)) - return 0; - for (i = 0; a->fields[i].type && b->fields[i].type; i++) { - __Pyx_StructField *field_a = a->fields + i; - __Pyx_StructField *field_b = b->fields + i; - if (field_a->offset != field_b->offset || - !__pyx_typeinfo_cmp(field_a->type, field_b->type)) - return 0; - } - return !a->fields[i].type && !b->fields[i].type; - } - } - return 1; -} - -/* MemviewSliceValidateAndInit */ - static int -__pyx_check_strides(Py_buffer *buf, int dim, int ndim, int spec) -{ - if (buf->shape[dim] <= 1) - return 1; - if (buf->strides) { - if (spec & __Pyx_MEMVIEW_CONTIG) { - if (spec & (__Pyx_MEMVIEW_PTR|__Pyx_MEMVIEW_FULL)) { - if (unlikely(buf->strides[dim] != sizeof(void *))) { - PyErr_Format(PyExc_ValueError, - "Buffer is not indirectly contiguous " - "in dimension %d.", dim); - goto fail; - } - } else if (unlikely(buf->strides[dim] != buf->itemsize)) { - PyErr_SetString(PyExc_ValueError, - "Buffer and memoryview are not contiguous " - "in the same dimension."); - goto fail; - } - } - if (spec & __Pyx_MEMVIEW_FOLLOW) { - Py_ssize_t stride = buf->strides[dim]; - if (stride < 0) - stride = -stride; - if (unlikely(stride < buf->itemsize)) { - PyErr_SetString(PyExc_ValueError, - "Buffer and memoryview are not contiguous " - "in the same dimension."); - goto fail; - } - } - } else { - if (unlikely(spec & __Pyx_MEMVIEW_CONTIG && dim != ndim - 1)) { - PyErr_Format(PyExc_ValueError, - "C-contiguous buffer is not contiguous in " - "dimension %d", dim); - goto fail; - } else if (unlikely(spec & (__Pyx_MEMVIEW_PTR))) { - PyErr_Format(PyExc_ValueError, - "C-contiguous buffer is not indirect in " - "dimension %d", dim); - goto fail; - } else if (unlikely(buf->suboffsets)) { - PyErr_SetString(PyExc_ValueError, - "Buffer exposes suboffsets but no strides"); - goto fail; - } - } - return 1; -fail: - return 0; -} -static int -__pyx_check_suboffsets(Py_buffer *buf, int dim, CYTHON_UNUSED int ndim, int spec) -{ - if (spec & __Pyx_MEMVIEW_DIRECT) { - if (unlikely(buf->suboffsets && buf->suboffsets[dim] >= 0)) { - PyErr_Format(PyExc_ValueError, - "Buffer not compatible with direct access " - "in dimension %d.", dim); - goto fail; - } - } - if (spec & __Pyx_MEMVIEW_PTR) { - if (unlikely(!buf->suboffsets || (buf->suboffsets[dim] < 0))) { - PyErr_Format(PyExc_ValueError, - "Buffer is not indirectly accessible " - "in dimension %d.", dim); - goto fail; - } - } - return 1; -fail: - return 0; -} -static int -__pyx_verify_contig(Py_buffer *buf, int ndim, int c_or_f_flag) -{ - int i; - if (c_or_f_flag & __Pyx_IS_F_CONTIG) { - Py_ssize_t stride = 1; - for (i = 0; i < ndim; i++) { - if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { - PyErr_SetString(PyExc_ValueError, - "Buffer not fortran contiguous."); - goto fail; - } - stride = stride * buf->shape[i]; - } - } else if (c_or_f_flag & __Pyx_IS_C_CONTIG) { - Py_ssize_t stride = 1; - for (i = ndim - 1; i >- 1; i--) { - if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { - PyErr_SetString(PyExc_ValueError, - "Buffer not C contiguous."); - goto fail; - } - stride = stride * buf->shape[i]; - } - } - return 1; -fail: - return 0; -} -static int __Pyx_ValidateAndInit_memviewslice( - int *axes_specs, - int c_or_f_flag, - int buf_flags, - int ndim, - __Pyx_TypeInfo *dtype, - __Pyx_BufFmt_StackElem stack[], - __Pyx_memviewslice *memviewslice, - PyObject *original_obj) -{ - struct __pyx_memoryview_obj *memview, *new_memview; - __Pyx_RefNannyDeclarations - Py_buffer *buf; - int i, spec = 0, retval = -1; - __Pyx_BufFmt_Context ctx; - int from_memoryview = __pyx_memoryview_check(original_obj); - __Pyx_RefNannySetupContext("ValidateAndInit_memviewslice", 0); - if (from_memoryview && __pyx_typeinfo_cmp(dtype, ((struct __pyx_memoryview_obj *) - original_obj)->typeinfo)) { - memview = (struct __pyx_memoryview_obj *) original_obj; - new_memview = NULL; - } else { - memview = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( - original_obj, buf_flags, 0, dtype); - new_memview = memview; - if (unlikely(!memview)) - goto fail; - } - buf = &memview->view; - if (unlikely(buf->ndim != ndim)) { - PyErr_Format(PyExc_ValueError, - "Buffer has wrong number of dimensions (expected %d, got %d)", - ndim, buf->ndim); - goto fail; - } - if (new_memview) { - __Pyx_BufFmt_Init(&ctx, stack, dtype); - if (unlikely(!__Pyx_BufFmt_CheckString(&ctx, buf->format))) goto fail; - } - if (unlikely((unsigned) buf->itemsize != dtype->size)) { - PyErr_Format(PyExc_ValueError, - "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "u byte%s) " - "does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "u byte%s)", - buf->itemsize, - (buf->itemsize > 1) ? "s" : "", - dtype->name, - dtype->size, - (dtype->size > 1) ? "s" : ""); - goto fail; - } - if (buf->len > 0) { - for (i = 0; i < ndim; i++) { - spec = axes_specs[i]; - if (unlikely(!__pyx_check_strides(buf, i, ndim, spec))) - goto fail; - if (unlikely(!__pyx_check_suboffsets(buf, i, ndim, spec))) - goto fail; - } - if (unlikely(buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag))) - goto fail; - } - if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, - new_memview != NULL) == -1)) { - goto fail; - } - retval = 0; - goto no_fail; -fail: - Py_XDECREF(new_memview); - retval = -1; -no_fail: - __Pyx_RefNannyFinishContext(); - return retval; -} - -/* ObjectToMemviewSlice */ - static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float_t(PyObject *obj, int writable_flag) { - __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_BufFmt_StackElem stack[1]; - int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_FOLLOW), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_CONTIG) }; - int retcode; - if (obj == Py_None) { - result.memview = (struct __pyx_memoryview_obj *) Py_None; - return result; - } - retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, __Pyx_IS_C_CONTIG, - (PyBUF_C_CONTIGUOUS | PyBUF_FORMAT) | writable_flag, 2, - &__Pyx_TypeInfo_nn___pyx_t_5numpy_float_t, stack, - &result, obj); - if (unlikely(retcode == -1)) - goto __pyx_fail; - return result; -__pyx_fail: - result.memview = NULL; - result.data = NULL; - return result; -} - -/* ObjectToMemviewSlice */ - static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int_t(PyObject *obj, int writable_flag) { - __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_BufFmt_StackElem stack[1]; - int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; - int retcode; - if (obj == Py_None) { - result.memview = (struct __pyx_memoryview_obj *) Py_None; - return result; - } - retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, - PyBUF_RECORDS_RO | writable_flag, 2, - &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, stack, - &result, obj); - if (unlikely(retcode == -1)) - goto __pyx_fail; - return result; -__pyx_fail: - result.memview = NULL; - result.data = NULL; - return result; -} - -/* ObjectToMemviewSlice */ - static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_float_t(PyObject *obj, int writable_flag) { - __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_BufFmt_StackElem stack[1]; - int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; - int retcode; - if (obj == Py_None) { - result.memview = (struct __pyx_memoryview_obj *) Py_None; - return result; - } - retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, - PyBUF_RECORDS_RO | writable_flag, 1, - &__Pyx_TypeInfo_nn___pyx_t_5numpy_float_t, stack, - &result, obj); - if (unlikely(retcode == -1)) - goto __pyx_fail; - return result; -__pyx_fail: - result.memview = NULL; - result.data = NULL; - return result; -} - -/* ObjectToMemviewSlice */ - static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float_t(PyObject *obj, int writable_flag) { - __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_BufFmt_StackElem stack[1]; - int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_FOLLOW), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_FOLLOW), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_CONTIG) }; - int retcode; - if (obj == Py_None) { - result.memview = (struct __pyx_memoryview_obj *) Py_None; - return result; - } - retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, __Pyx_IS_C_CONTIG, - (PyBUF_C_CONTIGUOUS | PyBUF_FORMAT) | writable_flag, 3, - &__Pyx_TypeInfo_nn___pyx_t_5numpy_float_t, stack, - &result, obj); - if (unlikely(retcode == -1)) - goto __pyx_fail; - return result; -__pyx_fail: - result.memview = NULL; - result.data = NULL; - return result; -} - -/* ObjectToMemviewSlice */ - static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float_t(PyObject *obj, int writable_flag) { - __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_BufFmt_StackElem stack[1]; - int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; - int retcode; - if (obj == Py_None) { - result.memview = (struct __pyx_memoryview_obj *) Py_None; - return result; - } - retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, - PyBUF_RECORDS_RO | writable_flag, 2, - &__Pyx_TypeInfo_nn___pyx_t_5numpy_float_t, stack, - &result, obj); - if (unlikely(retcode == -1)) - goto __pyx_fail; - return result; -__pyx_fail: - result.memview = NULL; - result.data = NULL; - return result; -} - -/* ObjectToMemviewSlice */ - static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_int_t(PyObject *obj, int writable_flag) { - __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_BufFmt_StackElem stack[1]; - int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; - int retcode; - if (obj == Py_None) { - result.memview = (struct __pyx_memoryview_obj *) Py_None; - return result; - } - retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, - PyBUF_RECORDS_RO | writable_flag, 1, - &__Pyx_TypeInfo_nn___pyx_t_5numpy_int_t, stack, - &result, obj); - if (unlikely(retcode == -1)) - goto __pyx_fail; - return result; -__pyx_fail: - result.memview = NULL; - result.data = NULL; - return result; -} - -/* CheckBinaryVersion */ - static int __Pyx_check_binary_version(void) { - char ctversion[4], rtversion[4]; - PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); - PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); - if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { - char message[200]; - PyOS_snprintf(message, sizeof(message), - "compiletime version %s of module '%.100s' " - "does not match runtime version %s", - ctversion, __Pyx_MODULE_NAME, rtversion); - return PyErr_WarnEx(NULL, message, 1); - } - return 0; -} - -/* InitStrings */ - static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { - while (t->p) { - #if PY_MAJOR_VERSION < 3 - if (t->is_unicode) { - *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); - } else if (t->intern) { - *t->p = PyString_InternFromString(t->s); - } else { - *t->p = PyString_FromStringAndSize(t->s, t->n - 1); - } - #else - if (t->is_unicode | t->is_str) { - if (t->intern) { - *t->p = PyUnicode_InternFromString(t->s); - } else if (t->encoding) { - *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); - } else { - *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); - } - } else { - *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); - } - #endif - if (!*t->p) - return -1; - if (PyObject_Hash(*t->p) == -1) - return -1; - ++t; - } - return 0; -} - -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { - return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); -} -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { - Py_ssize_t ignore; - return __Pyx_PyObject_AsStringAndSize(o, &ignore); -} -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -#if !CYTHON_PEP393_ENABLED -static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - char* defenc_c; - PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); - if (!defenc) return NULL; - defenc_c = PyBytes_AS_STRING(defenc); -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - { - char* end = defenc_c + PyBytes_GET_SIZE(defenc); - char* c; - for (c = defenc_c; c < end; c++) { - if ((unsigned char) (*c) >= 128) { - PyUnicode_AsASCIIString(o); - return NULL; - } - } - } -#endif - *length = PyBytes_GET_SIZE(defenc); - return defenc_c; -} -#else -static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - if (likely(PyUnicode_IS_ASCII(o))) { - *length = PyUnicode_GET_LENGTH(o); - return PyUnicode_AsUTF8(o); - } else { - PyUnicode_AsASCIIString(o); - return NULL; - } -#else - return PyUnicode_AsUTF8AndSize(o, length); -#endif -} -#endif -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT - if ( -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - __Pyx_sys_getdefaultencoding_not_ascii && -#endif - PyUnicode_Check(o)) { - return __Pyx_PyUnicode_AsStringAndSize(o, length); - } else -#endif -#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) - if (PyByteArray_Check(o)) { - *length = PyByteArray_GET_SIZE(o); - return PyByteArray_AS_STRING(o); - } else -#endif - { - char* result; - int r = PyBytes_AsStringAndSize(o, &result, length); - if (unlikely(r < 0)) { - return NULL; - } else { - return result; - } - } -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { - int is_true = x == Py_True; - if (is_true | (x == Py_False) | (x == Py_None)) return is_true; - else return PyObject_IsTrue(x); -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { - int retval; - if (unlikely(!x)) return -1; - retval = __Pyx_PyObject_IsTrue(x); - Py_DECREF(x); - return retval; -} -static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { -#if PY_MAJOR_VERSION >= 3 - if (PyLong_Check(result)) { - if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, - "__int__ returned non-int (type %.200s). " - "The ability to return an instance of a strict subclass of int " - "is deprecated, and may be removed in a future version of Python.", - Py_TYPE(result)->tp_name)) { - Py_DECREF(result); - return NULL; - } - return result; - } -#endif - PyErr_Format(PyExc_TypeError, - "__%.4s__ returned non-%.4s (type %.200s)", - type_name, type_name, Py_TYPE(result)->tp_name); - Py_DECREF(result); - return NULL; -} -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { -#if CYTHON_USE_TYPE_SLOTS - PyNumberMethods *m; -#endif - const char *name = NULL; - PyObject *res = NULL; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x) || PyLong_Check(x))) -#else - if (likely(PyLong_Check(x))) -#endif - return __Pyx_NewRef(x); -#if CYTHON_USE_TYPE_SLOTS - m = Py_TYPE(x)->tp_as_number; - #if PY_MAJOR_VERSION < 3 - if (m && m->nb_int) { - name = "int"; - res = m->nb_int(x); - } - else if (m && m->nb_long) { - name = "long"; - res = m->nb_long(x); - } - #else - if (likely(m && m->nb_int)) { - name = "int"; - res = m->nb_int(x); - } - #endif -#else - if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { - res = PyNumber_Int(x); - } -#endif - if (likely(res)) { -#if PY_MAJOR_VERSION < 3 - if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { -#else - if (unlikely(!PyLong_CheckExact(res))) { -#endif - return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); - } - } - else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, - "an integer is required"); - } - return res; -} -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { - Py_ssize_t ival; - PyObject *x; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(b))) { - if (sizeof(Py_ssize_t) >= sizeof(long)) - return PyInt_AS_LONG(b); - else - return PyInt_AsSsize_t(b); - } -#endif - if (likely(PyLong_CheckExact(b))) { - #if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)b)->ob_digit; - const Py_ssize_t size = Py_SIZE(b); - if (likely(__Pyx_sst_abs(size) <= 1)) { - ival = likely(size) ? digits[0] : 0; - if (size == -1) ival = -ival; - return ival; - } else { - switch (size) { - case 2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - } - } - #endif - return PyLong_AsSsize_t(b); - } - x = PyNumber_Index(b); - if (!x) return -1; - ival = PyInt_AsSsize_t(x); - Py_DECREF(x); - return ival; -} -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { - return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); -} -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { - return PyInt_FromSize_t(ival); -} - - -#endif /* Py_PYTHON_H */ diff --git a/tests/coord_cython.pyx b/tests/coord_cython.pyx deleted file mode 100644 index 1c8d2861..00000000 --- a/tests/coord_cython.pyx +++ /dev/null @@ -1,273 +0,0 @@ -# coding: utf-8 - -#from __future__ import division, unicode_literals - -""" -Utilities for manipulating coordinates or list of coordinates, under periodic -boundary conditions or otherwise. -""" - -from six.moves import zip - -__author__ = "Will Richards" -__copyright__ = "Copyright 2011, The Materials Project" -__version__ = "1.0" -__maintainer__ = "Will Richards" -__email__ = "wmdrichards@gmail.com" -__date__ = "Nov 27, 2011" - -import numpy as np - -from libc.stdlib cimport malloc, free -from libc.math cimport round, fabs, sqrt, acos, M_PI, cos, sin -cimport numpy as np -cimport cython - -#create images, 2d array of all length 3 combinations of [-1,0,1] -r = np.arange(-1, 2, dtype=np.float_) -arange = r[:, None] * np.array([1, 0, 0])[None, :] -brange = r[:, None] * np.array([0, 1, 0])[None, :] -crange = r[:, None] * np.array([0, 0, 1])[None, :] -images_t = arange[:, None, None] + brange[None, :, None] + \ - crange[None, None, :] -images = images_t.reshape((27, 3)) - -cdef np.float_t[:, ::1] images_view = images - -@cython.boundscheck(False) -@cython.wraparound(False) -cdef void dot_2d(np.float_t[:, ::1] a, np.float_t[:, ::1] b, np.float_t[:, ::1] o) nogil: - cdef int i, j, k, I, J, K - I = a.shape[0] - J = b.shape[1] - K = a.shape[1] - - for j in range(J): - for i in range(I): - o[i, j] = 0 - for k in range(K): - for i in range(I): - o[i, j] += a[i, k] * b[k, j] - -@cython.boundscheck(False) -@cython.wraparound(False) -cdef void dot_2d_mod(np.float_t[:, ::1] a, np.float_t[:, ::1] b, np.float_t[:, ::1] o) nogil: - cdef int i, j, k, I, J, K - I = a.shape[0] - J = b.shape[1] - K = a.shape[1] - - for j in range(J): - for i in range(I): - o[i, j] = 0 - for k in range(K): - for i in range(I): - o[i, j] += a[i, k] % 1 * b[k, j] - -@cython.boundscheck(False) -@cython.wraparound(False) -@cython.initializedcheck(False) -def pbc_shortest_vectors(lattice, fcoords1, fcoords2, mask=None, return_d2=False, lll_frac_tol=None): - """ - Returns the shortest vectors between two lists of coordinates taking into - account periodic boundary conditions and the lattice. - - Args: - lattice: lattice to use - fcoords1: First set of fractional coordinates. e.g., [0.5, 0.6, 0.7] - or [[1.1, 1.2, 4.3], [0.5, 0.6, 0.7]]. Must be np.float_ - fcoords2: Second set of fractional coordinates. - mask (int_ array): Mask of matches that are not allowed. - i.e. if mask[1,2] == True, then subset[1] cannot be matched - to superset[2] - lll_frac_tol (float_ array of length 3): Fractional tolerance (per LLL lattice vector) over which - the calculation of minimum vectors will be skipped. - Can speed up calculation considerably for large structures. - - Returns: - array of displacement vectors from fcoords1 to fcoords2 - first index is fcoords1 index, second is fcoords2 index - """ - - #ensure correct shape - fcoords1, fcoords2 = np.atleast_2d(fcoords1, fcoords2) - - - fcoords1 = lattice.get_lll_frac_coords(fcoords1) - fcoords2 = lattice.get_lll_frac_coords(fcoords2) - - cdef np.float_t[:, ::1] lat = np.array(lattice.lll_matrix, dtype=np.float_, copy=False, order='C') - - cdef int i, j, k, l, I, J, bestK - - I = len(fcoords1) - J = len(fcoords2) - - cdef np.float_t[:, ::1] fc1 = fcoords1 - cdef np.float_t[:, ::1] fc2 = fcoords2 - - cdef np.float_t[:, ::1] cart_f1 = malloc(3 * I * sizeof(np.float_t)) - cdef np.float_t[:, ::1] cart_f2 = malloc(3 * J * sizeof(np.float_t)) - cdef np.float_t[:, ::1] cart_im = malloc(81 * sizeof(np.float_t)) - - cdef bint has_mask = mask is not None - cdef np.int_t[:, :] m - if has_mask: - m = np.array(mask, dtype=np.int_, copy=False, order='C') - - cdef bint has_ftol = (lll_frac_tol is not None) - cdef np.float_t[:] ftol - if has_ftol: - ftol = np.array(lll_frac_tol, dtype=np.float_, order='C', copy=False) - - - dot_2d_mod(fc1, lat, cart_f1) - dot_2d_mod(fc2, lat, cart_f2) - dot_2d(images_view, lat, cart_im) - - vectors = np.empty((I, J, 3)) - d2 = np.empty((I, J)) - cdef np.float_t[:, :, ::1] vs = vectors - cdef np.float_t[:, ::1] ds = d2 - cdef np.float_t best, d, inc_d, da, db, dc, fdist - cdef bint within_frac = True - cdef np.float_t[:] pre_im = malloc(3 * sizeof(np.float_t)) - - for i in range(I): - for j in range(J): - within_frac = False - if (not has_mask) or (m[i, j] == 0): - within_frac = True - if has_ftol: - for l in range(3): - fdist = fc2[j, l] - fc1[i, l] - if fabs(fdist - round(fdist)) > ftol[l]: - within_frac = False - break - if within_frac: - for l in range(3): - pre_im[l] = cart_f2[j, l] - cart_f1[i, l] - best = 1e100 - for k in range(27): - # compilers have a hard time unrolling this - da = pre_im[0] + cart_im[k, 0] - db = pre_im[1] + cart_im[k, 1] - dc = pre_im[2] + cart_im[k, 2] - d = da * da + db * db + dc * dc - if d < best: - best = d - bestk = k - ds[i, j] = best - for l in range(3): - vs[i, j, l] = pre_im[l] + cart_im[bestk, l] - if not within_frac: - ds[i, j] = 1e20 - for l in range(3): - vs[i, j, l] = 1e20 - - free(&cart_f1[0,0]) - free(&cart_f2[0,0]) - free(&cart_im[0,0]) - free(&pre_im[0]) - - if return_d2: - return vectors, d2 - else: - return vectors - -@cython.boundscheck(False) -@cython.wraparound(False) -@cython.initializedcheck(False) -def is_coord_subset_pbc(subset, superset, atol, mask): - """ - Tests if all fractional coords in subset are contained in superset. - Allows specification of a mask determining pairs that are not - allowed to match to each other - - Args: - subset, superset: List of fractional coords - - Returns: - True if all of subset is in superset. - """ - - cdef np.float_t[:, :] fc1 = subset - cdef np.float_t[:, :] fc2 = superset - cdef np.float_t[:] t = atol - cdef np.int_t[:, :] m = np.array(mask, dtype=np.int_, copy=False, order='C') - - cdef int i, j, k, I, J - cdef np.float_t d - cdef bint ok - - I = fc1.shape[0] - J = fc2.shape[0] - - for i in range(I): - ok = False - for j in range(J): - if m[i, j]: - continue - ok = True - for k in range(3): - d = fc1[i, k] - fc2[j, k] - if fabs(d - round(d)) > t[k]: - ok = False - break - if ok: - break - if not ok: - break - return bool(ok) - -@cython.boundscheck(False) -@cython.wraparound(False) -@cython.initializedcheck(False) -def coord_list_mapping_pbc(subset, superset, atol=1e-8): - """ - Gives the index mapping from a subset to a superset. - Superset cannot contain duplicate matching rows - - Args: - subset, superset: List of frac_coords - - Returns: - list of indices such that superset[indices] = subset - """ - inds = np.zeros(len(subset), dtype=np.int) - 1 - subset = np.atleast_2d(subset) - superset = np.atleast_2d(superset) - - cdef np.float_t[:, :] fc1 = subset - cdef np.float_t[:, :] fc2 = superset - cdef np.float_t[:] t = atol - cdef np.int_t[:] c_inds = inds - cdef np.float_t d - cdef bint ok_inner, ok_outer - - I = fc1.shape[0] - J = fc2.shape[0] - - for i in range(I): - ok_outer = False - for j in range(J): - ok_inner = True - for k in range(3): - d = fc1[i, k] - fc2[j, k] - if fabs(d - round(d)) > t[k]: - ok_inner = False - break - if ok_inner: - if c_inds[i] >= 0: - raise ValueError("Something wrong with the inputs, likely duplicates " - "in superset") - c_inds[i] = j - ok_outer = True - # we don't break here so we can check for duplicates in superset - if not ok_outer: - break - - if not ok_outer: - raise ValueError("subset is not a subset of superset") - - return inds \ No newline at end of file diff --git a/tests/coords.py b/tests/coords.py deleted file mode 100644 index b6784dff..00000000 --- a/tests/coords.py +++ /dev/null @@ -1,504 +0,0 @@ -__author__ = "https://github.com/materialsproject/pymatgen/blob/d45fdc1d9930d7952a26de51aab0d5b92fd27236/pymatgen/util/coord.py" -__version__ = "0.1.0" - - -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project 0 - - -def is_coord_subset(subset, superset, atol=1e-8): - """ - Tests if all coords in subset are contained in superset. - Doesn't use periodic boundary conditions - - Args: - subset, superset: List of coords - - Returns: - True if all of subset is in superset. - """ - c1 = np.array(subset) - c2 = np.array(superset) - is_close = np.all(np.abs(c1[:, None, :] - c2[None, :, :]) < atol, axis=-1) - any_close = np.any(is_close, axis=-1) - return np.all(any_close) - - -def coord_list_mapping(subset, superset, atol=1e-8): - """ - Gives the index mapping from a subset to a superset. - Subset and superset cannot contain duplicate rows - - Args: - subset, superset: List of coords - - Returns: - list of indices such that superset[indices] = subset - """ - c1 = np.array(subset) - c2 = np.array(superset) - inds = np.where( - np.all(np.isclose(c1[:, None, :], c2[None, :, :], atol=atol), axis=2) - )[1] - result = c2[inds] - if not np.allclose(c1, result, atol=atol): - if not is_coord_subset(subset, superset): - raise ValueError("subset is not a subset of superset") - if not result.shape == c1.shape: - raise ValueError( - "Something wrong with the inputs, likely duplicates " "in superset" - ) - return inds - - -def coord_list_mapping_pbc(subset, superset, atol=1e-8): - """ - Gives the index mapping from a subset to a superset. - Superset cannot contain duplicate matching rows - - Args: - subset, superset: List of frac_coords - - Returns: - list of indices such that superset[indices] = subset - """ - # pylint: disable=I1101 - atol = np.array([1.0, 1.0, 1.0]) * atol - return cuc.coord_list_mapping_pbc(subset, superset, atol) - - -def get_linear_interpolated_value(x_values, y_values, x): - """ - Returns an interpolated value by linear interpolation between two values. - This method is written to avoid dependency on scipy, which causes issues on - threading servers. - - Args: - x_values: Sequence of x values. - y_values: Corresponding sequence of y values - x: Get value at particular x - - Returns: - Value at x. - """ - a = np.array(sorted(zip(x_values, y_values), key=lambda d: d[0])) - - ind = np.where(a[:, 0] >= x)[0] - - if len(ind) == 0 or ind[0] == 0: - raise ValueError("x is out of range of provided x_values") - - i = ind[0] - x1, x2 = a[i - 1][0], a[i][0] - y1, y2 = a[i - 1][1], a[i][1] - - return y1 + (y2 - y1) / (x2 - x1) * (x - x1) - - -def all_distances(coords1, coords2): - """ - Returns the distances between two lists of coordinates - - Args: - coords1: First set of cartesian coordinates. - coords2: Second set of cartesian coordinates. - - Returns: - 2d array of cartesian distances. E.g the distance between - coords1[i] and coords2[j] is distances[i,j] - """ - c1 = np.array(coords1) - c2 = np.array(coords2) - z = (c1[:, None, :] - c2[None, :, :]) ** 2 - return np.sum(z, axis=-1) ** 0.5 - - -def pbc_diff(fcoords1, fcoords2): - """ - Returns the 'fractional distance' between two coordinates taking into - account periodic boundary conditions. - - Args: - fcoords1: First set of fractional coordinates. e.g., [0.5, 0.6, - 0.7] or [[1.1, 1.2, 4.3], [0.5, 0.6, 0.7]]. It can be a single - coord or any array of coords. - fcoords2: Second set of fractional coordinates. - - Returns: - Fractional distance. Each coordinate must have the property that - abs(a) <= 0.5. Examples: - pbc_diff([0.1, 0.1, 0.1], [0.3, 0.5, 0.9]) = [-0.2, -0.4, 0.2] - pbc_diff([0.9, 0.1, 1.01], [0.3, 0.5, 0.9]) = [-0.4, -0.4, 0.11] - """ - fdist = np.subtract(fcoords1, fcoords2) - return fdist - np.round(fdist) - - -def pbc_shortest_vectors(lattice, fcoords1, fcoords2, mask=None, return_d2=False): - """ - Returns the shortest vectors between two lists of coordinates taking into - account periodic boundary conditions and the lattice. - - Args: - lattice: lattice to use - fcoords1: First set of fractional coordinates. e.g., [0.5, 0.6, 0.7] - or [[1.1, 1.2, 4.3], [0.5, 0.6, 0.7]]. It can be a single - coord or any array of coords. - fcoords2: Second set of fractional coordinates. - mask (boolean array): Mask of matches that are not allowed. - i.e. if mask[1,2] == True, then subset[1] cannot be matched - to superset[2] - return_d2 (boolean): whether to also return the squared distances - - Returns: - array of displacement vectors from fcoords1 to fcoords2 - first index is fcoords1 index, second is fcoords2 index - """ - # pylint: disable=I1101 - return cuc.pbc_shortest_vectors(lattice, fcoords1, fcoords2, mask, return_d2) - - -def find_in_coord_list_pbc(fcoord_list, fcoord, atol=1e-8): - """ - Get the indices of all points in a fractional coord list that are - equal to a fractional coord (with a tolerance), taking into account - periodic boundary conditions. - - Args: - fcoord_list: List of fractional coords - fcoord: A specific fractional coord to test. - atol: Absolute tolerance. Defaults to 1e-8. - - Returns: - Indices of matches, e.g., [0, 1, 2, 3]. Empty list if not found. - """ - if len(fcoord_list) == 0: - return [] - fcoords = np.tile(fcoord, (len(fcoord_list), 1)) - fdist = fcoord_list - fcoords - fdist -= np.round(fdist) - return np.where(np.all(np.abs(fdist) < atol, axis=1))[0] - - -def in_coord_list_pbc(fcoord_list, fcoord, atol=1e-8): - """ - Tests if a particular fractional coord is within a fractional coord_list. - - Args: - fcoord_list: List of fractional coords to test - fcoord: A specific fractional coord to test. - atol: Absolute tolerance. Defaults to 1e-8. - - Returns: - True if coord is in the coord list. - """ - return len(find_in_coord_list_pbc(fcoord_list, fcoord, atol=atol)) > 0 - - -def is_coord_subset_pbc(subset, superset, atol=1e-8, mask=None): - """ - Tests if all fractional coords in subset are contained in superset. - - Args: - subset, superset: List of fractional coords - atol (float or size 3 array): Tolerance for matching - mask (boolean array): Mask of matches that are not allowed. - i.e. if mask[1,2] == True, then subset[1] cannot be matched - to superset[2] - - Returns: - True if all of subset is in superset. - """ - # pylint: disable=I1101 - c1 = np.array(subset, dtype=np.float64) - c2 = np.array(superset, dtype=np.float64) - if mask is not None: - m = np.array(mask, dtype=np.int) - else: - m = np.zeros((len(subset), len(superset)), dtype=np.int) - atol = np.zeros(3, dtype=np.float64) + atol - return cuc.is_coord_subset_pbc(c1, c2, atol, m) - - -def lattice_points_in_supercell(supercell_matrix): - """ - Returns the list of points on the original lattice contained in the - supercell in fractional coordinates (with the supercell basis). - e.g. [[2,0,0],[0,1,0],[0,0,1]] returns [[0,0,0],[0.5,0,0]] - - Args: - supercell_matrix: 3x3 matrix describing the supercell - - Returns: - numpy array of the fractional coordinates - """ - diagonals = np.array( - [ - [0, 0, 0], - [0, 0, 1], - [0, 1, 0], - [0, 1, 1], - [1, 0, 0], - [1, 0, 1], - [1, 1, 0], - [1, 1, 1], - ] - ) - d_points = np.dot(diagonals, supercell_matrix) - - mins = np.min(d_points, axis=0) - maxes = np.max(d_points, axis=0) + 1 - - ar = np.arange(mins[0], maxes[0])[:, None] * np.array([1, 0, 0])[None, :] - br = np.arange(mins[1], maxes[1])[:, None] * np.array([0, 1, 0])[None, :] - cr = np.arange(mins[2], maxes[2])[:, None] * np.array([0, 0, 1])[None, :] - - all_points = ar[:, None, None] + br[None, :, None] + cr[None, None, :] - all_points = all_points.reshape((-1, 3)) - - frac_points = np.dot(all_points, np.linalg.inv(supercell_matrix)) - - tvects = frac_points[ - np.all(frac_points < 1 - 1e-10, axis=1) & np.all(frac_points >= -1e-10, axis=1) - ] - assert len(tvects) == round(abs(np.linalg.det(supercell_matrix))) - return tvects - - -def barycentric_coords(coords, simplex): - """ - Converts a list of coordinates to barycentric coordinates, given a - simplex with d+1 points. Only works for d >= 2. - - Args: - coords: list of n coords to transform, shape should be (n,d) - simplex: list of coordinates that form the simplex, shape should be - (d+1, d) - - Returns: - a LIST of barycentric coordinates (even if the original input was 1d) - """ - coords = np.atleast_2d(coords) - - t = np.transpose(simplex[:-1, :]) - np.transpose(simplex[-1, :])[:, None] - all_but_one = np.transpose(np.linalg.solve(t, np.transpose(coords - simplex[-1]))) - last_coord = 1 - np.sum(all_but_one, axis=-1)[:, None] - return np.append(all_but_one, last_coord, axis=-1) - - -def get_angle(v1, v2, units="degrees"): - """ - Calculates the angle between two vectors. - - Args: - v1: Vector 1 - v2: Vector 2 - units: "degrees" or "radians". Defaults to "degrees". - - Returns: - Angle between them in degrees. - """ - d = np.dot(v1, v2) / np.linalg.norm(v1) / np.linalg.norm(v2) - d = min(d, 1) - d = max(d, -1) - angle = math.acos(d) - if units == "degrees": - return math.degrees(angle) - if units == "radians": - return angle - raise ValueError("Invalid units {}".format(units)) - - -class Simplex: - """ - A generalized simplex object. See http://en.wikipedia.org/wiki/Simplex. - - .. attribute: space_dim - - Dimension of the space. Usually, this is 1 more than the simplex_dim. - - .. attribute: simplex_dim - - Dimension of the simplex coordinate space. - """ - - def __init__(self, coords): - """ - Initializes a Simplex from vertex coordinates. - - Args: - coords ([[float]]): Coords of the vertices of the simplex. E.g., - [[1, 2, 3], [2, 4, 5], [6, 7, 8], [8, 9, 10]. - """ - self._coords = np.array(coords) - self.space_dim, self.simplex_dim = self._coords.shape - self.origin = self._coords[-1] - if self.space_dim == self.simplex_dim + 1: - # precompute augmented matrix for calculating bary_coords - self._aug = np.concatenate([coords, np.ones((self.space_dim, 1))], axis=-1) - self._aug_inv = np.linalg.inv(self._aug) - - @property - def volume(self): - """ - Volume of the simplex. - """ - return abs(np.linalg.det(self._aug)) / math.factorial(self.simplex_dim) - - def bary_coords(self, point): - """ - Args: - point (): Point coordinates. - - Returns: - Barycentric coordinations. - """ - try: - return np.dot(np.concatenate([point, [1]]), self._aug_inv) - except AttributeError: - raise ValueError("Simplex is not full-dimensional") - - def point_from_bary_coords(self, bary_coords): - """ - Args: - bary_coords (): Barycentric coordinates - - Returns: - Point coordinates - """ - try: - return np.dot(bary_coords, self._aug[:, :-1]) - except AttributeError: - raise ValueError("Simplex is not full-dimensional") - - def in_simplex(self, point, tolerance=1e-8): - """ - Checks if a point is in the simplex using the standard barycentric - coordinate system algorithm. - - Taking an arbitrary vertex as an origin, we compute the basis for the - simplex from this origin by subtracting all other vertices from the - origin. We then project the point into this coordinate system and - determine the linear decomposition coefficients in this coordinate - system. If the coeffs satisfy that all coeffs >= 0, the composition - is in the facet. - - Args: - point ([float]): Point to test - tolerance (float): Tolerance to test if point is in simplex. - """ - return (self.bary_coords(point) >= -tolerance).all() - - def line_intersection(self, point1, point2, tolerance=1e-8): - """ - Computes the intersection points of a line with a simplex - Args: - point1, point2 ([float]): Points that determine the line - Returns: - points where the line intersects the simplex (0, 1, or 2) - """ - b1 = self.bary_coords(point1) - b2 = self.bary_coords(point2) - l = b1 - b2 - # don't use barycentric dimension where line is parallel to face - valid = np.abs(l) > 1e-10 - # array of all the barycentric coordinates on the line where - # one of the values is 0 - possible = b1 - (b1[valid] / l[valid])[:, None] * l - barys = [] - for p in possible: - # it's only an intersection if its in the simplex - if (p >= -tolerance).all(): - found = False - # don't return duplicate points - for b in barys: - if np.all(np.abs(b - p) < tolerance): - found = True - break - if not found: - barys.append(p) - assert len(barys) < 3 - return [self.point_from_bary_coords(b) for b in barys] - - def __eq__(self, other): - for p in itertools.permutations(self._coords): - if np.allclose(p, other.coords): - return True - return False - - def __hash__(self): - return len(self._coords) - - def __repr__(self): - output = [ - "{}-simplex in {}D space".format(self.simplex_dim, self.space_dim), - "Vertices:", - ] - for coord in self._coords: - output.append("\t({})".format(", ".join(map(str, coord)))) - return "\n".join(output) - - def __str__(self): - return self.__repr__() - - @property - def coords(self): - """ - Returns a copy of the vertex coordinates in the simplex. - """ - return self._coords.copy() diff --git a/tests/integration_tests/fitting/test_fitter.py b/tests/integration/fitting/test_fitter.py similarity index 100% rename from tests/integration_tests/fitting/test_fitter.py rename to tests/integration/fitting/test_fitter.py diff --git a/tests/integration_tests/fitting/test_multi_fitter.py b/tests/integration/fitting/test_multi_fitter.py similarity index 100% rename from tests/integration_tests/fitting/test_multi_fitter.py rename to tests/integration/fitting/test_multi_fitter.py diff --git a/tests/integration_tests/fitting/__init__.py b/tests/integration_tests/fitting/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/package_test.py b/tests/package_test.py deleted file mode 100644 index 1e54c8ce..00000000 --- a/tests/package_test.py +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2025 Easyscience contributors (https://github.com/EasyScience) -import easyscience as pkg - - -def test_has_version(): - assert hasattr(pkg, '__version__') # noqa S101 diff --git a/tests/unit_tests/base_classes/test_collection_base.py b/tests/unit/base_classes/test_collection_base.py similarity index 100% rename from tests/unit_tests/base_classes/test_collection_base.py rename to tests/unit/base_classes/test_collection_base.py diff --git a/tests/unit_tests/base_classes/test_easy_list.py b/tests/unit/base_classes/test_easy_list.py similarity index 100% rename from tests/unit_tests/base_classes/test_easy_list.py rename to tests/unit/base_classes/test_easy_list.py diff --git a/tests/unit_tests/base_classes/test_model_base.py b/tests/unit/base_classes/test_model_base.py similarity index 100% rename from tests/unit_tests/base_classes/test_model_base.py rename to tests/unit/base_classes/test_model_base.py diff --git a/tests/unit_tests/base_classes/test_new_base.py b/tests/unit/base_classes/test_new_base.py similarity index 100% rename from tests/unit_tests/base_classes/test_new_base.py rename to tests/unit/base_classes/test_new_base.py diff --git a/tests/unit_tests/base_classes/test_obj_base.py b/tests/unit/base_classes/test_obj_base.py similarity index 100% rename from tests/unit_tests/base_classes/test_obj_base.py rename to tests/unit/base_classes/test_obj_base.py diff --git a/tests/unit_tests/fitting/calculators/test_interface_factory.py b/tests/unit/fitting/calculators/test_interface_factory.py similarity index 100% rename from tests/unit_tests/fitting/calculators/test_interface_factory.py rename to tests/unit/fitting/calculators/test_interface_factory.py diff --git a/tests/unit_tests/fitting/minimizers/test_factory.py b/tests/unit/fitting/minimizers/test_factory.py similarity index 100% rename from tests/unit_tests/fitting/minimizers/test_factory.py rename to tests/unit/fitting/minimizers/test_factory.py diff --git a/tests/unit_tests/fitting/minimizers/test_minimizer_base.py b/tests/unit/fitting/minimizers/test_minimizer_base.py similarity index 100% rename from tests/unit_tests/fitting/minimizers/test_minimizer_base.py rename to tests/unit/fitting/minimizers/test_minimizer_base.py diff --git a/tests/unit_tests/fitting/minimizers/test_minimizer_bumps.py b/tests/unit/fitting/minimizers/test_minimizer_bumps.py similarity index 100% rename from tests/unit_tests/fitting/minimizers/test_minimizer_bumps.py rename to tests/unit/fitting/minimizers/test_minimizer_bumps.py diff --git a/tests/unit_tests/fitting/minimizers/test_minimizer_dfo.py b/tests/unit/fitting/minimizers/test_minimizer_dfo.py similarity index 100% rename from tests/unit_tests/fitting/minimizers/test_minimizer_dfo.py rename to tests/unit/fitting/minimizers/test_minimizer_dfo.py diff --git a/tests/unit_tests/fitting/minimizers/test_minimizer_lmfit.py b/tests/unit/fitting/minimizers/test_minimizer_lmfit.py similarity index 100% rename from tests/unit_tests/fitting/minimizers/test_minimizer_lmfit.py rename to tests/unit/fitting/minimizers/test_minimizer_lmfit.py diff --git a/tests/unit_tests/fitting/test_fitter.py b/tests/unit/fitting/test_fitter.py similarity index 100% rename from tests/unit_tests/fitting/test_fitter.py rename to tests/unit/fitting/test_fitter.py diff --git a/tests/unit_tests/global_object/test_entry_list_comprehensive.py b/tests/unit/global_object/test_entry_list_comprehensive.py similarity index 100% rename from tests/unit_tests/global_object/test_entry_list_comprehensive.py rename to tests/unit/global_object/test_entry_list_comprehensive.py diff --git a/tests/unit_tests/global_object/test_global_object.py b/tests/unit/global_object/test_global_object.py similarity index 100% rename from tests/unit_tests/global_object/test_global_object.py rename to tests/unit/global_object/test_global_object.py diff --git a/tests/unit_tests/global_object/test_integration_comprehensive.py b/tests/unit/global_object/test_integration_comprehensive.py similarity index 100% rename from tests/unit_tests/global_object/test_integration_comprehensive.py rename to tests/unit/global_object/test_integration_comprehensive.py diff --git a/tests/unit_tests/global_object/test_map.py b/tests/unit/global_object/test_map.py similarity index 100% rename from tests/unit_tests/global_object/test_map.py rename to tests/unit/global_object/test_map.py diff --git a/tests/unit_tests/global_object/test_undo_redo.py b/tests/unit/global_object/test_undo_redo.py similarity index 100% rename from tests/unit_tests/global_object/test_undo_redo.py rename to tests/unit/global_object/test_undo_redo.py diff --git a/tests/unit_tests/global_object/test_undo_redo_comprehensive.py b/tests/unit/global_object/test_undo_redo_comprehensive.py similarity index 100% rename from tests/unit_tests/global_object/test_undo_redo_comprehensive.py rename to tests/unit/global_object/test_undo_redo_comprehensive.py diff --git a/tests/unit_tests/io/test_serializer_base.py b/tests/unit/io/test_serializer_base.py similarity index 100% rename from tests/unit_tests/io/test_serializer_base.py rename to tests/unit/io/test_serializer_base.py diff --git a/tests/unit_tests/io/test_serializer_component.py b/tests/unit/io/test_serializer_component.py similarity index 100% rename from tests/unit_tests/io/test_serializer_component.py rename to tests/unit/io/test_serializer_component.py diff --git a/tests/unit_tests/io/test_serializer_dict.py b/tests/unit/io/test_serializer_dict.py similarity index 100% rename from tests/unit_tests/io/test_serializer_dict.py rename to tests/unit/io/test_serializer_dict.py diff --git a/tests/unit_tests/legacy/test_dict.py b/tests/unit/legacy/test_dict.py similarity index 100% rename from tests/unit_tests/legacy/test_dict.py rename to tests/unit/legacy/test_dict.py diff --git a/tests/unit_tests/legacy/test_json.py b/tests/unit/legacy/test_json.py similarity index 100% rename from tests/unit_tests/legacy/test_json.py rename to tests/unit/legacy/test_json.py diff --git a/tests/unit_tests/legacy/test_xml.py b/tests/unit/legacy/test_xml.py similarity index 100% rename from tests/unit_tests/legacy/test_xml.py rename to tests/unit/legacy/test_xml.py diff --git a/tests/unit_tests/models/test_polynomial.py b/tests/unit/models/test_polynomial.py similarity index 100% rename from tests/unit_tests/models/test_polynomial.py rename to tests/unit/models/test_polynomial.py diff --git a/tests/unit_tests/variable/test_descriptor_any_type.py b/tests/unit/variable/test_descriptor_any_type.py similarity index 100% rename from tests/unit_tests/variable/test_descriptor_any_type.py rename to tests/unit/variable/test_descriptor_any_type.py diff --git a/tests/unit_tests/variable/test_descriptor_array.py b/tests/unit/variable/test_descriptor_array.py similarity index 100% rename from tests/unit_tests/variable/test_descriptor_array.py rename to tests/unit/variable/test_descriptor_array.py diff --git a/tests/unit_tests/variable/test_descriptor_base.py b/tests/unit/variable/test_descriptor_base.py similarity index 100% rename from tests/unit_tests/variable/test_descriptor_base.py rename to tests/unit/variable/test_descriptor_base.py diff --git a/tests/unit_tests/variable/test_descriptor_bool.py b/tests/unit/variable/test_descriptor_bool.py similarity index 100% rename from tests/unit_tests/variable/test_descriptor_bool.py rename to tests/unit/variable/test_descriptor_bool.py diff --git a/tests/unit_tests/variable/test_descriptor_number.py b/tests/unit/variable/test_descriptor_number.py similarity index 100% rename from tests/unit_tests/variable/test_descriptor_number.py rename to tests/unit/variable/test_descriptor_number.py diff --git a/tests/unit_tests/variable/test_descriptor_str.py b/tests/unit/variable/test_descriptor_str.py similarity index 100% rename from tests/unit_tests/variable/test_descriptor_str.py rename to tests/unit/variable/test_descriptor_str.py diff --git a/tests/unit_tests/variable/test_parameter.py b/tests/unit/variable/test_parameter.py similarity index 100% rename from tests/unit_tests/variable/test_parameter.py rename to tests/unit/variable/test_parameter.py diff --git a/tests/unit_tests/variable/test_parameter_dependency_serialization.py b/tests/unit/variable/test_parameter_dependency_serialization.py similarity index 100% rename from tests/unit_tests/variable/test_parameter_dependency_serialization.py rename to tests/unit/variable/test_parameter_dependency_serialization.py diff --git a/tests/unit_tests/__init__.py b/tests/unit_tests/__init__.py deleted file mode 100644 index 462d95af..00000000 --- a/tests/unit_tests/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause -# © 2025 Contributors to the EasyScience project - diff --git a/tests/unit_tests/models/__init__.py b/tests/unit_tests/models/__init__.py deleted file mode 100644 index bb769856..00000000 --- a/tests/unit_tests/models/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause -# © 2025 Contributors to the EasyScience project - diff --git a/tests/unit_tests/variable/__init__.py b/tests/unit_tests/variable/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tools/test_scripts.py b/tools/test_scripts.py new file mode 100644 index 00000000..2d347579 --- /dev/null +++ b/tools/test_scripts.py @@ -0,0 +1,55 @@ +"""Test runner for tutorial scripts in the 'tutorials' directory. + +This test discovers and executes all Python scripts located under the +'tutorials' directory to ensure they run without errors. + +Important: each script must be executed in a fresh Python process. +Running many tutorials in-process (e.g. via runpy) leaks global state +between scripts (notably cached calculator dictionaries keyed only by +model/experiment names), which can cause false failures. +""" + +import os +import subprocess # noqa: S404 +import sys +from pathlib import Path + +import pytest + +_repo_root = Path(__file__).resolve().parents[1] +_src_root = _repo_root / 'src' + +# Discover tutorial scripts, excluding temporary checkpoint files +TUTORIALS = [ + p for p in Path('docs/docs/tutorials').rglob('*.py') if '.ipynb_checkpoints' not in p.parts +] + + +@pytest.mark.parametrize('script_path', TUTORIALS) +def test_script_runs(script_path: Path): + """Execute a tutorial script and fail if it raises an exception. + + Each script is run in the context of __main__ to mimic standalone + execution. + """ + env = os.environ.copy() + if _src_root.exists(): + existing = env.get('PYTHONPATH', '') + env['PYTHONPATH'] = ( + str(_src_root) if not existing else str(_src_root) + os.pathsep + existing + ) + + # This is a test harness executing repo-local tutorial scripts. + # We intentionally use subprocess isolation to prevent cross-test + # global state leaks (e.g. calculator caches) that can cause false + # failures when running tutorials in a shared interpreter. + result = subprocess.run( # noqa: S603 + [sys.executable, str(script_path)], + cwd=str(_repo_root), + env=env, + capture_output=True, + text=True, + ) + if result.returncode != 0: + details = (result.stdout or '') + (result.stderr or '') + pytest.fail(f'{script_path}\n{details.strip()}') diff --git a/tools/update_docs_assets.py b/tools/update_docs_assets.py new file mode 100644 index 00000000..26c7c41b --- /dev/null +++ b/tools/update_docs_assets.py @@ -0,0 +1,91 @@ +""" +Update documentation assets from the assets-branding repository. + +This script fetches branding assets (logos, icons, images) from the +easyscience/assets-branding GitHub repository and copies them to the +appropriate locations in the documentation directory. +""" + +import shutil +from pathlib import Path + +import pooch + +# Configuration: Define what to fetch and where to copy +GITHUB_REPO = 'easyscience/assets-branding' +GITHUB_BRANCH = 'master' +BASE_URL = f'https://raw.githubusercontent.com/{GITHUB_REPO}/refs/heads/{GITHUB_BRANCH}' +PROJECT_NAME = 'easyscience' + +# Mapping of source files to destination paths +# Format: "source_path_in_repo": "destination_path_in_project" +ASSETS_MAP = { + # Logos + f'{PROJECT_NAME}/logos/dark.svg': 'docs/docs/assets/images/logo_dark.svg', + f'{PROJECT_NAME}/logos/light.svg': 'docs/docs/assets/images/logo_light.svg', + # Favicon + f'{PROJECT_NAME}/icons/color.png': 'docs/docs/assets/images/favicon.png', + # Icon overrides + f'{PROJECT_NAME}/icons/bw.svg': f'docs/overrides/.icons/{PROJECT_NAME}.svg', + 'easyscience-org/icons/eso-icon_bw.svg': 'docs/overrides/.icons/easyscience.svg', +} + + +def fetch_and_copy_asset( + source_path: str, + dest_path: str, + cache_dir: Path, +) -> None: + """ + Fetch an asset from GitHub and copy it to the destination. + + Args: + source_path: Path to the file in the GitHub repository + dest_path: Destination path in the project + cache_dir: Directory to cache downloaded files + """ + url = f'{BASE_URL}/{source_path}' + + # Create a unique cache filename based on source path + cache_filename = source_path.replace('/', '_') + + # Download file using pooch + file_path = pooch.retrieve( + url=url, + known_hash=None, # Skip hash verification + path=cache_dir, + fname=cache_filename, + ) + + # Create destination directory if it doesn't exist + dest = Path(dest_path) + dest.parent.mkdir(parents=True, exist_ok=True) + + # Copy the file to destination + shutil.copy2(file_path, dest) + print(f'Copied {file_path} -> {dest_path}') + + +def main(): + """Main function to update all documentation assets.""" + print('📥 Updating documentation assets...') + print(f' Repository: {GITHUB_REPO}') + print(f' Branch: {GITHUB_BRANCH}\n') + + # Use a temporary cache directory + cache_dir = Path.home() / '.cache' / GITHUB_REPO + cache_dir.mkdir(parents=True, exist_ok=True) + + # Fetch and copy each asset + for source_path, dest_path in ASSETS_MAP.items(): + try: + fetch_and_copy_asset(source_path, dest_path, cache_dir) + print() + except Exception as e: + print(f'❌ Failed to fetch {source_path}: {e}') + + print('\n✅ Documentation assets updated successfully!') + + +if __name__ == '__main__': + main() diff --git a/tools/update_github_labels.py b/tools/update_github_labels.py new file mode 100644 index 00000000..8ec8c2d7 --- /dev/null +++ b/tools/update_github_labels.py @@ -0,0 +1,339 @@ +"""Set/update GitHub labels for current or specified easyscience +repository. + +Requires: + - gh CLI installed + - gh auth login completed + +Usage: + python update_github_labels.py + python update_github_labels.py --dry-run + python update_github_labels.py --repo easyscience/my-repo + python update_github_labels.py --repo easyscience/my-repo --dry-run +""" + +from __future__ import annotations + +import argparse +import json +import shlex +import subprocess +import sys +from dataclasses import dataclass + +EASYSCIENCE_ORG = 'easyscience' + + +# Data structures + + +@dataclass(frozen=True) +class Label: + """A GitHub label with name, color, and description.""" + + name: str + color: str + description: str = '' + + +@dataclass(frozen=True) +class LabelRename: + """Mapping from old label name to new label name.""" + + old: str + new: str + + +class Colors: + """Hex color codes for label groups.""" + + SCOPE = 'd73a4a' + MAINTAINER = '0e8a16' + PRIORITY = 'fbca04' + BOT = '5319e7' + + +LABEL_RENAMES = [ + # Default GitHub labels to rename (if they exist) + LabelRename('bug', '[scope] bug'), + LabelRename('documentation', '[scope] documentation'), + LabelRename('duplicate', '[maintainer] duplicate'), + LabelRename('enhancement', '[scope] enhancement'), + LabelRename('good first issue', '[maintainer] good first issue'), + LabelRename('help wanted', '[maintainer] help wanted'), + LabelRename('invalid', '[maintainer] invalid'), + LabelRename('question', '[maintainer] question'), + LabelRename('wontfix', '[maintainer] wontfix'), + # Custom label renames (if they exist) + LabelRename('[bot] pull request', '[bot] release'), +] + +LABELS = [ + # Scope labels + Label( + '[scope] bug', + Colors.SCOPE, + 'Bug report or fix (major.minor.PATCH)', + ), + Label( + '[scope] documentation', + Colors.SCOPE, + 'Documentation only changes (major.minor.patch.POST)', + ), + Label( + '[scope] enhancement', + Colors.SCOPE, + 'Adds/improves features (major.MINOR.patch)', + ), + Label( + '[scope] maintenance', + Colors.SCOPE, + 'Code/tooling cleanup, no feature or bugfix (major.minor.PATCH)', + ), + Label( + '[scope] significant', + Colors.SCOPE, + 'Breaking or major changes (MAJOR.minor.patch)', + ), + Label( + '[scope] ⚠️ label needed', + Colors.SCOPE, + 'Automatically added to issues and PRs without a [scope] label', + ), + # Maintainer labels + Label( + '[maintainer] duplicate', + Colors.MAINTAINER, + 'Already reported or submitted', + ), + Label( + '[maintainer] good first issue', + Colors.MAINTAINER, + 'Good entry-level issue for newcomers', + ), + Label( + '[maintainer] help wanted', + Colors.MAINTAINER, + 'Needs additional help to resolve or implement', + ), + Label( + '[maintainer] invalid', + Colors.MAINTAINER, + 'Invalid, incorrect or outdated', + ), + Label( + '[maintainer] question', + Colors.MAINTAINER, + 'Needs clarification, discussion, or more information', + ), + Label( + '[maintainer] wontfix', + Colors.MAINTAINER, + 'Will not be fixed or continued', + ), + # Priority labels + Label( + '[priority] lowest', + Colors.PRIORITY, + 'Very low urgency', + ), + Label( + '[priority] low', + Colors.PRIORITY, + 'Low importance', + ), + Label( + '[priority] medium', + Colors.PRIORITY, + 'Normal/default priority', + ), + Label( + '[priority] high', + Colors.PRIORITY, + 'Should be prioritized soon', + ), + Label( + '[priority] highest', + Colors.PRIORITY, + 'Urgent. Needs attention ASAP', + ), + Label( + '[priority] ⚠️ label needed', + Colors.PRIORITY, + 'Automatically added to issues without a [priority] label', + ), + # Bot label + Label( + '[bot] release', + Colors.BOT, + 'Automated release PR. Excluded from changelog/versioning', + ), + Label( + '[bot] backmerge', + Colors.BOT, + 'Automated backmerge master → develop failed due to conflicts', + ), +] + + +# Helpers + + +@dataclass(frozen=True) +class CmdResult: + """Result of a shell command execution.""" + + returncode: int + stdout: str + stderr: str + + +def run_cmd( + args: list[str], + *, + dry_run: bool, + check: bool = True, +) -> CmdResult: + """Run a command (or print it in dry-run mode).""" + cmd_str = ' '.join(shlex.quote(a) for a in args) + + if dry_run: + print(f' [dry-run] {cmd_str}') + return CmdResult(0, '', '') + + proc = subprocess.run( + args=args, + text=True, + capture_output=True, + ) + result = CmdResult( + proc.returncode, + proc.stdout.strip(), + proc.stderr.strip(), + ) + + if check and proc.returncode != 0: + raise RuntimeError(f'Command failed ({proc.returncode}): {cmd_str}\n{result.stderr}') + + return result + + +def get_current_repo() -> str: + """Get the current repository name in 'owner/repo' format.""" + result = subprocess.run( + args=[ + 'gh', + 'repo', + 'view', + '--json', + 'nameWithOwner', + ], + text=True, + capture_output=True, + check=True, + ) + data = json.loads(result.stdout) + name_with_owner = data.get('nameWithOwner', '') + + if '/' not in name_with_owner: + raise RuntimeError('Could not determine current repository name') + + return name_with_owner + + +def rename_label( + repo: str, + rename: LabelRename, + *, + dry_run: bool, +) -> None: + """Rename a label, silently skipping if it doesn't exist.""" + result = run_cmd( + args=[ + 'gh', + 'label', + 'edit', + rename.old, + '--name', + rename.new, + '--repo', + repo, + ], + dry_run=dry_run, + check=False, + ) + + if dry_run or result.returncode == 0: + print(f' Rename: {rename.old!r} → {rename.new!r}') + else: + print(f' Skip (not found): {rename.old!r}') + + +def upsert_label( + repo: str, + label: Label, + *, + dry_run: bool, +) -> None: + """Create or update a label.""" + run_cmd( + [ + 'gh', + 'label', + 'create', + label.name, + '--color', + label.color, + '--description', + label.description, + '--force', + '--repo', + repo, + ], + dry_run=dry_run, + ) + print(f' Upsert: {label.name!r}') + + +# Main + + +def main() -> int: + """Entry point: parse arguments and sync labels.""" + parser = argparse.ArgumentParser(description='Sync GitHub labels for easyscience repos') + parser.add_argument( + '--repo', + help='Target repository (owner/name)', + ) + parser.add_argument( + '--dry-run', + action='store_true', + help='Print actions without applying changes', + ) + args = parser.parse_args() + + repo = args.repo or get_current_repo() + org = repo.split('/')[0] + + if org.lower() != EASYSCIENCE_ORG: + print(f"Error: repository '{repo}' is not under '{EASYSCIENCE_ORG}'", file=sys.stderr) + return 2 + + print(f'Repository: {repo}') + if args.dry_run: + print('Mode: DRY-RUN (no changes will be made)\n') + + print('\nRenaming default labels...') + for rename in LABEL_RENAMES: + rename_label(repo, rename, dry_run=args.dry_run) + + print('\nUpserting labels...') + for label in LABELS: + upsert_label(repo, label, dry_run=args.dry_run) + + print('\nDone.') + return 0 + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/tools/update_spdx.py b/tools/update_spdx.py new file mode 100644 index 00000000..5ae444da --- /dev/null +++ b/tools/update_spdx.py @@ -0,0 +1,106 @@ +"""Update or insert SPDX headers in Python files. + +- Ensures SPDX-FileCopyrightText has the current year. +- Ensures SPDX-License-Identifier is set to BSD-3-Clause. +""" + +import fnmatch +import re +from pathlib import Path + +COPYRIGHT_TEXT = ( + '# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors ' +) +LICENSE_TEXT = '# SPDX-License-Identifier: BSD-3-Clause' + +# Patterns to exclude from SPDX header updates (vendored code) +EXCLUDE_PATTERNS = [ + '*/_vendored/jupyter_dark_detect/*', +] + + +def should_exclude(file_path: Path) -> bool: + """Check if a file should be excluded from SPDX header updates.""" + path_str = str(file_path) + return any(fnmatch.fnmatch(path_str, pattern) for pattern in EXCLUDE_PATTERNS) + + +def update_spdx_header(file_path: Path): + # Use Path.open to satisfy lint rule PTH123. + with file_path.open('r', encoding='utf-8') as f: + original_lines = f.readlines() + + # Regexes for SPDX lines + copy_re = re.compile(r'^#\s*SPDX-FileCopyrightText:.*$') + lic_re = re.compile(r'^#\s*SPDX-License-Identifier:.*$') + + # 1) Preserve any leading shebang / coding cookie lines + prefix = [] + body_start = 0 + if original_lines: + # Shebang line like "#!/usr/bin/env python3" + if original_lines[0].startswith('#!'): + prefix.append(original_lines[0]) + body_start = 1 + # PEP 263 coding cookie on first or second line + # e.g. "# -*- coding: utf-8 -*-" or "# coding: utf-8" + for _ in range(2): # at most one more line to inspect + if body_start < len(original_lines): + line = original_lines[body_start] + if re.match(r'^#.*coding[:=]\s*[-\w.]+', line): + prefix.append(line) + body_start += 1 + else: + break + + # 2) Work on the remaining body + body = original_lines[body_start:] + + # Remove any existing SPDX lines anywhere in the body + body = [ln for ln in body if not (copy_re.match(ln) or lic_re.match(ln))] + + # Strip leading blank lines in the body so header is tight + while body and not body[0].strip(): + body.pop(0) + + # 3) Build canonical SPDX block: two lines + exactly one blank + spdx_block = [ + COPYRIGHT_TEXT + '\n', + LICENSE_TEXT + '\n', + '\n', + ] + + # 4) New content: prefix + SPDX + body + new_lines = prefix + spdx_block + body + + # 5) Normalize: collapse any extra blank lines immediately after + # LICENSE to exactly one. This keeps the script idempotent. + # Find the index of LICENSE we just inserted (prefix may be 0, 1, + # or 2 lines) + lic_idx = len(prefix) + 1 # spdx_block[1] is the license line + # Ensure exactly one blank line after LICENSE + # Remove all blank lines after lic_idx, then insert a single blank. + j = lic_idx + 1 + # Remove any number of blank lines following + while j < len(new_lines) and not new_lines[j].strip(): + new_lines.pop(j) + # Insert exactly one blank line at this position + new_lines.insert(j, '\n') + + with file_path.open('w', encoding='utf-8') as f: + f.writelines(new_lines) + + +def main(): + """Recursively update or insert SPDX headers in all Python files + under the 'src' and 'tests' directories. + """ + for base_dir in ('src', 'tests'): + for py_file in Path(base_dir).rglob('*.py'): + if should_exclude(py_file): + continue + update_spdx_header(py_file) + + +if __name__ == '__main__': + main() From 30a6c019de65aba52fe5e078d69d74f88c8dd48c Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 10:58:23 +0100 Subject: [PATCH 02/35] Change spdx header. Clean up --- .codecov.yml | 10 +- .github/release-drafter.yml | 32 - .github/workflows/codeql-analysis.yml | 68 - .github/workflows/documentation-build.yml | 49 - .github/workflows/nightly-check.yml | 24 - .github/workflows/ossar-analysis.yml | 38 - .github/workflows/python-ci.yml | 94 - .github/workflows/python-package.yml | 46 - .github/workflows/python-publish.yml | 38 - .github/workflows/release_drafter.yml | 16 - .github/workflows/verify_issue_labels.yml | 33 - .github/workflows/verify_pr_labels.yml | 23 - CONTRIBUTING.md | 7 +- PARAMETER_DEPENDENCY_SERIALIZATION.md | 107 +- README.md | 27 +- docs/Makefile | 20 - docs/docs/assets/images/favicon.png | Bin 0 -> 77928 bytes docs/docs/assets/images/logo_dark.svg | 52 + docs/docs/assets/images/logo_light.svg | 52 + docs/docs/index.md | 27 +- docs/docs/installation-and-setup/index.md | 8 +- docs/docs/introduction/index.md | 15 +- docs/docs/user-guide/index.md | 8 +- docs/make.bat | 35 - docs/overrides/.icons/easyscience.svg | 20 + docs/src/_static/ec_logo_single.png | Bin 11743 -> 0 bytes docs/src/_static/ec_sidebar.png | Bin 373287 -> 0 bytes docs/src/_static/ec_sidebar_w.png | Bin 363740 -> 0 bytes docs/src/_static/favicon.ico | Bin 24846 -> 0 bytes docs/src/conf.py | 228 - docs/src/fitting/introduction.rst | 362 - docs/src/getting-started/installation.rst | 33 - docs/src/getting-started/overview.rst | 224 - docs/src/index.rst | 181 - docs/src/reference/base.rst | 323 - pixi.lock | 11535 ++++++++++++---- pixi.toml | 7 +- pyproject.toml | 19 +- resources/images/ec_logo.svg | 25 - resources/images/ec_logo_single.svg | 23 - resources/images/ec_logo_wfont.svg | 38 - resources/scripts/generate_html.py | 28 - src/easyscience/__version__.py | 1 - src/easyscience/base_classes/__init__.py | 3 + src/easyscience/base_classes/based_base.py | 100 +- .../base_classes/collection_base.py | 61 +- src/easyscience/base_classes/easy_list.py | 94 +- src/easyscience/base_classes/model_base.py | 40 +- src/easyscience/base_classes/new_base.py | 61 +- src/easyscience/base_classes/obj_base.py | 25 +- src/easyscience/fitting/__init__.py | 3 + .../fitting/available_minimizers.py | 21 +- .../fitting/calculators/__init__.py | 5 +- .../fitting/calculators/interface_factory.py | 50 +- src/easyscience/fitting/fitter.py | 116 +- .../fitting/minimizers/__init__.py | 5 +- src/easyscience/fitting/minimizers/factory.py | 7 +- .../fitting/minimizers/minimizer_base.py | 67 +- .../fitting/minimizers/minimizer_bumps.py | 62 +- .../fitting/minimizers/minimizer_dfo.py | 49 +- .../fitting/minimizers/minimizer_lmfit.py | 55 +- src/easyscience/fitting/minimizers/utils.py | 7 +- src/easyscience/fitting/multi_fitter.py | 49 +- src/easyscience/global_object/__init__.py | 3 + .../global_object/global_object.py | 25 +- .../global_object/hugger/__init__.py | 6 +- .../global_object/hugger/hugger.py | 14 +- .../global_object/hugger/property.py | 22 +- src/easyscience/global_object/logger.py | 13 +- src/easyscience/global_object/map.py | 48 +- src/easyscience/global_object/undo_redo.py | 74 +- src/easyscience/io/__init__.py | 5 +- src/easyscience/io/serializer_base.py | 107 +- src/easyscience/io/serializer_component.py | 46 +- src/easyscience/io/serializer_dict.py | 28 +- src/easyscience/job/__init__.py | 5 +- src/easyscience/job/analysis.py | 9 +- src/easyscience/job/experiment.py | 9 +- src/easyscience/job/job.py | 9 +- src/easyscience/job/theoreticalmodel.py | 9 +- src/easyscience/legacy/dict.py | 60 +- src/easyscience/legacy/json.py | 39 +- src/easyscience/legacy/legacy_core.py | 90 +- src/easyscience/legacy/xml.py | 43 +- src/easyscience/models/__init__.py | 5 +- src/easyscience/models/polynomial.py | 14 +- src/easyscience/utils/__init__.py | 5 +- src/easyscience/utils/classTools.py | 5 +- src/easyscience/utils/classUtils.py | 29 +- src/easyscience/utils/decorators.py | 36 +- src/easyscience/utils/string.py | 17 +- src/easyscience/variable/__init__.py | 3 + .../variable/descriptor_any_type.py | 23 +- src/easyscience/variable/descriptor_array.py | 349 +- src/easyscience/variable/descriptor_base.py | 56 +- src/easyscience/variable/descriptor_bool.py | 13 +- src/easyscience/variable/descriptor_number.py | 87 +- src/easyscience/variable/descriptor_str.py | 13 +- src/easyscience/variable/parameter.py | 363 +- .../variable/parameter_dependency_resolver.py | 47 +- tests/integration/fitting/test_fitter.py | 109 +- .../integration/fitting/test_multi_fitter.py | 126 +- .../unit/base_classes/test_collection_base.py | 362 +- tests/unit/base_classes/test_easy_list.py | 12 +- tests/unit/base_classes/test_model_base.py | 183 +- tests/unit/base_classes/test_new_base.py | 62 +- tests/unit/base_classes/test_obj_base.py | 323 +- .../calculators/test_interface_factory.py | 334 +- tests/unit/fitting/minimizers/test_factory.py | 68 +- .../fitting/minimizers/test_minimizer_base.py | 87 +- .../minimizers/test_minimizer_bumps.py | 77 +- .../fitting/minimizers/test_minimizer_dfo.py | 190 +- .../minimizers/test_minimizer_lmfit.py | 137 +- tests/unit/fitting/test_fitter.py | 48 +- .../test_entry_list_comprehensive.py | 160 +- .../unit/global_object/test_global_object.py | 109 +- .../test_integration_comprehensive.py | 307 +- tests/unit/global_object/test_map.py | 378 +- tests/unit/global_object/test_undo_redo.py | 165 +- .../test_undo_redo_comprehensive.py | 397 +- tests/unit/io/test_serializer_base.py | 487 +- tests/unit/io/test_serializer_component.py | 69 +- tests/unit/io/test_serializer_dict.py | 34 +- tests/unit/legacy/test_dict.py | 4 +- tests/unit/legacy/test_json.py | 2 + tests/unit/legacy/test_xml.py | 2 + tests/unit/models/test_polynomial.py | 21 +- .../unit/variable/test_descriptor_any_type.py | 55 +- tests/unit/variable/test_descriptor_array.py | 2044 +-- tests/unit/variable/test_descriptor_base.py | 173 +- tests/unit/variable/test_descriptor_bool.py | 38 +- tests/unit/variable/test_descriptor_number.py | 356 +- tests/unit/variable/test_descriptor_str.py | 48 +- tests/unit/variable/test_parameter.py | 990 +- ...test_parameter_dependency_serialization.py | 320 +- 135 files changed, 15009 insertions(+), 9753 deletions(-) delete mode 100644 .github/release-drafter.yml delete mode 100644 .github/workflows/codeql-analysis.yml delete mode 100644 .github/workflows/documentation-build.yml delete mode 100644 .github/workflows/nightly-check.yml delete mode 100644 .github/workflows/ossar-analysis.yml delete mode 100644 .github/workflows/python-ci.yml delete mode 100644 .github/workflows/python-package.yml delete mode 100644 .github/workflows/python-publish.yml delete mode 100644 .github/workflows/release_drafter.yml delete mode 100644 .github/workflows/verify_issue_labels.yml delete mode 100644 .github/workflows/verify_pr_labels.yml delete mode 100644 docs/Makefile create mode 100644 docs/docs/assets/images/favicon.png create mode 100644 docs/docs/assets/images/logo_dark.svg create mode 100644 docs/docs/assets/images/logo_light.svg delete mode 100644 docs/make.bat create mode 100644 docs/overrides/.icons/easyscience.svg delete mode 100644 docs/src/_static/ec_logo_single.png delete mode 100644 docs/src/_static/ec_sidebar.png delete mode 100644 docs/src/_static/ec_sidebar_w.png delete mode 100644 docs/src/_static/favicon.ico delete mode 100644 docs/src/conf.py delete mode 100644 docs/src/fitting/introduction.rst delete mode 100644 docs/src/getting-started/installation.rst delete mode 100644 docs/src/getting-started/overview.rst delete mode 100644 docs/src/index.rst delete mode 100644 docs/src/reference/base.rst delete mode 100644 resources/images/ec_logo.svg delete mode 100644 resources/images/ec_logo_single.svg delete mode 100644 resources/images/ec_logo_wfont.svg delete mode 100644 resources/scripts/generate_html.py delete mode 100644 src/easyscience/__version__.py diff --git a/.codecov.yml b/.codecov.yml index 5cf1eedd..e17376e8 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -1,8 +1,8 @@ github_checks: - annotations: true + annotations: true comment: - layout: "reach, diff, flags, files" + layout: 'reach, diff, flags, files' behavior: default - require_changes: false # if true: only post the comment if coverage changes - require_base: no # [yes :: must have a base report to post] - require_head: yes # [yes :: must have a head report to post] \ No newline at end of file + require_changes: false # if true: only post the comment if coverage changes + require_base: no # [yes :: must have a base report to post] + require_head: yes # [yes :: must have a head report to post] diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml deleted file mode 100644 index a95ea8fc..00000000 --- a/.github/release-drafter.yml +++ /dev/null @@ -1,32 +0,0 @@ -# https://github.com/marketplace/actions/release-drafter -name-template: v$NEXT_PATCH_VERSION 🌈 -tag-template: v$NEXT_PATCH_VERSION -categories: -- title: 🚀 Features - labels: - - feature - - enhancement -- title: 🐛 Bug Fixes - labels: - - fix - - bugfix - - bug -- title: 🧰 Maintenance - labels: - - chore - - documentation -change-template: '- $TITLE @$AUTHOR (#$NUMBER)' -version-resolver: - major: - labels: - - major - minor: - labels: - - minor - patch: - labels: - - patch - default: patch -template: | - ## Changes - $CHANGES diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index bcd75a1a..00000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,68 +0,0 @@ -# This pipeline - -name: "CodeQL" - -on: - push: - branches: [ master, develop ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ master ] - schedule: - - cron: '0 16 * * 5' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - # Override automatic language detection by changing the below list - # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] - language: ['python'] - # Learn more... - # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection - - steps: - - name: Checkout repository - uses: actions/checkout@v5 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 - - # If this run was triggered by a pull request event, then checkout - # the head of the pull request instead of the merge commit. - - run: git checkout HEAD^2 - if: ${{ github.event_name == 'pull_request' }} - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v3 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 \ No newline at end of file diff --git a/.github/workflows/documentation-build.yml b/.github/workflows/documentation-build.yml deleted file mode 100644 index 3dd05a0f..00000000 --- a/.github/workflows/documentation-build.yml +++ /dev/null @@ -1,49 +0,0 @@ -# This pipeline -# - builds developer documentation using pixi -# - pushes documentation to gh-pages branch of the same repository -# -# Deployment is handled by pages-build-deployment bot - -name: Build Documentation and Push to gh-pages Branch - -# Controls when the workflow will run -on: - # Triggers the workflow on tag creation - push: - tags: - - 'v*' - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -permissions: - contents: write - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "build" - build_documentation: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v5 - with: - fetch-depth: 0 # otherwise, you will failed to push refs to dest repo - - - name: Setup Pixi - uses: easyscience/actions/pixi@master - - - name: Build documentation - run: pixi run --environment dev docs-build - - # - name: Build and Commit - # uses: sphinx-notes/pages@master - # with: - # install_requirements: true - # documentation_path: docs/src - - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./docs/_build/html diff --git a/.github/workflows/nightly-check.yml b/.github/workflows/nightly-check.yml deleted file mode 100644 index f9c1143f..00000000 --- a/.github/workflows/nightly-check.yml +++ /dev/null @@ -1,24 +0,0 @@ -# Nightly Check - install dependencies and run tests after pixi update-lock -name: Nightly Check -on: - schedule: - - cron: '0 0 * * *' # Runs every day at midnight UTC - workflow_dispatch: - -jobs: - nightly-check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v5 - - - name: Setup Pixi - uses: easyscience/actions/pixi@master - - - name: Update lock file - run: pixi run update-lock - - - name: Build package - run: pixi run build - - - name: Run tox tests - run: pixi run tox diff --git a/.github/workflows/ossar-analysis.yml b/.github/workflows/ossar-analysis.yml deleted file mode 100644 index 1d4435f4..00000000 --- a/.github/workflows/ossar-analysis.yml +++ /dev/null @@ -1,38 +0,0 @@ -# This workflow integrates a collection of open source static analysis tools -# with GitHub code scanning. For documentation, or to provide feedback, visit -# https://github.com/github/ossar-action -name: OSSAR - -on: - pull_request: - -jobs: - OSSAR-Scan: - # OSSAR runs on windows-latest. - # ubuntu-latest and macos-latest support coming soon - runs-on: windows-latest - - steps: - # Checkout your code repository to scan - - name: Checkout repository - uses: actions/checkout@v5 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 - - # If this run was triggered by a pull request event, then checkout - # the head of the pull request instead of the merge commit. - - run: git checkout HEAD^2 - if: ${{ github.event_name == 'pull_request' }} - - # Run open source static analysis tools - - name: Run OSSAR - uses: github/ossar-action@v1 - id: ossar - - # Upload results to the Security tab - - name: Upload OSSAR results - uses: github/codeql-action/upload-sarif@v3 - with: - sarif_file: ${{ steps.ossar.outputs.sarifFile }} \ No newline at end of file diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml deleted file mode 100644 index 4a78c7a0..00000000 --- a/.github/workflows/python-ci.yml +++ /dev/null @@ -1,94 +0,0 @@ -# This workflow will for a variety of Python versions -# - install the code base with pixi -# - lint the code base -# - test the code base -# - upload the test coverage to codecov -# -# It will also -# - build the package -# - check the package -# -# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries - -name: CI using pixi - -on: [push, pull_request] - -jobs: - Code_Consistency: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v5 - - name: Setup Pixi - uses: easyscience/actions/pixi@master - - name: Run linting - run: pixi run lint - - - name: Suggestion to fix lint issues - if: ${{ failure() }} - run: | - echo "::notice::In project root run 'pixi run lint-fix' and commit changes to fix issues." - exit 1 - - - name: Run formatting - run: pixi run format-check - - - name: Suggestion to fix format issues - if: ${{ failure() }} - run: | - echo "::notice::In project root run 'pixi run format' and commit changes to fix issues." - exit 1 - - Code_Testing: - strategy: - max-parallel: 4 - matrix: - python-version: ['3.11', '3.12', '3.13'] - os: [ubuntu-latest, macos-latest, macos-15-intel, windows-latest] - - runs-on: ${{ matrix.os }} - if: "!contains(github.event.head_commit.message, '[ci skip]')" - - steps: - - uses: actions/checkout@v5 - - - name: Setup Pixi - uses: prefix-dev/setup-pixi@v0.9.0 - with: - run-install: false - cache: false - post-cleanup: false - - - name: Set Python version - run: pixi add python=${{ matrix.python-version }} - - - name: Install dependencies and run tests - run: pixi run -e dev test - - - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v5 - with: - name: unit-tests-job - flags: unittests - files: ./coverage-unit.xml - fail_ci_if_error: true - verbose: true - token: ${{ secrets.CODECOV_TOKEN }} - slug: EasyScience/corelib - - Package_Testing: - - runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, '[ci skip]')" - - steps: - - uses: actions/checkout@v5 - - - name: Setup Pixi - uses: easyscience/actions/pixi@master - - - name: Build package - run: pixi run build - - - name: Run tox tests - run: pixi run tox diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml deleted file mode 100644 index 61bc66ba..00000000 --- a/.github/workflows/python-package.yml +++ /dev/null @@ -1,46 +0,0 @@ -# This workflow will for a variety of Python versions -# - build a python package using pixi -# - run tests on the produced package -# - upload the package as an artifact -# -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions - -name: Create Python Package using pixi - - -on: - push: - branches: - - master - pull_request: - branches: - - master - -jobs: - build: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ['3.11', '3.12', '3.13'] - if: "!contains(github.event.head_commit.message, '[ci skip]')" - - steps: - - uses: actions/checkout@v5 - - - name: Setup Pixi - uses: easyscience/actions/pixi@master - - - name: Set Python version - run: pixi add python=${{ matrix.python-version }} - - - name: Build package - run: pixi run build - - - name: Run tests with tox - run: pixi run tox - - - uses: actions/upload-artifact@v4 - with: - name: EasyScience - Python ${{ matrix.python-version }} - path: ${{ github.workspace }}/dist/* - overwrite: true \ No newline at end of file diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml deleted file mode 100644 index 471d0703..00000000 --- a/.github/workflows/python-publish.yml +++ /dev/null @@ -1,38 +0,0 @@ -# This workflow will -# - build distribution package, pure python wheel using pixi -# - publish produced distribution package to PyPI -# -# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries - -name: Publish Python Package - -# Controls when the workflow will run -on: - # Triggers the workflow on tag creation - push: - tags: - - 'v*' - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -jobs: - deploy: - - runs-on: ubuntu-latest - permissions: - id-token: write - contents: read - steps: - - uses: actions/checkout@v5 - - - name: Setup Pixi - uses: easyscience/actions/pixi@master - - - name: Build package - run: pixi run build - - - name: Publish distribution 📦 to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - password: ${{ secrets.PYPI_TOKEN_ES }} diff --git a/.github/workflows/release_drafter.yml b/.github/workflows/release_drafter.yml deleted file mode 100644 index eb3f34c2..00000000 --- a/.github/workflows/release_drafter.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Release Drafter - -on: - push: - # branches to consider in the event; optional, defaults to all - branches: - - master - -jobs: - update_release_draft: - runs-on: ubuntu-latest - steps: - # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v6 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/verify_issue_labels.yml b/.github/workflows/verify_issue_labels.yml deleted file mode 100644 index 4315fe7e..00000000 --- a/.github/workflows/verify_issue_labels.yml +++ /dev/null @@ -1,33 +0,0 @@ -# This workflow will verify that all issues have at -# least one of the [scope] labels and one of the [priority] labels - -name: Verify issue labels -on: - issues: - types: [opened, labeled, unlabeled] - -jobs: - check_issue_labels: - runs-on: ubuntu-latest - permissions: - issues: write - steps: - - name: Require [scope] label - uses: trstringer/require-label-prefix@v1 - with: - secret: ${{ github.TOKEN }} - prefix: "[scope]" - labelSeparator: " " - addLabel: true - defaultLabel: "[scope] ⚠️ label needed" - - - name: Require [priority] label - if: always() - uses: trstringer/require-label-prefix@v1 - with: - secret: ${{ github.TOKEN }} - prefix: "[priority]" - labelSeparator: " " - addLabel: true - defaultLabel: "[priority] ⚠️ label needed" - diff --git a/.github/workflows/verify_pr_labels.yml b/.github/workflows/verify_pr_labels.yml deleted file mode 100644 index e7eb0f5c..00000000 --- a/.github/workflows/verify_pr_labels.yml +++ /dev/null @@ -1,23 +0,0 @@ -# This workflow will verify that all PRs have at -# least one of the [scope] labels before they can be merged. - -name: Verify PR labels -on: - pull_request_target: - types: [opened, labeled, unlabeled, synchronize] - -jobs: - check_pr_label: - runs-on: ubuntu-latest - permissions: - pull-requests: write - name: Verify that the PR has a valid label - steps: - - name: Verify PR label action - uses: jesusvasquez333/verify-pr-label-action@v1.4.0 - id: verify-pr-label - with: - github-token: ${{ github.TOKEN }} - valid-labels: '[scope] bug, [scope] enhancement, [scope] documentation, [scope] significant, [scope] maintenance' - pull-request-number: ${{ github.event.pull_request.number }} - disable-reviews: false diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index be518599..fa245c37 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,8 +42,8 @@ Please make sure you follow the EasyScience organization-wide If you are not planning to modify the code, you may want to: - 🐞 Report a bug — see [Reporting Issues](#11-reporting-issues) -- 🛡 Report a security issue — - see [Security Issues](#12-security-issues) +- 🛡 Report a security issue — see + [Security Issues](#12-security-issues) - 💬 Ask a question or start a discussion at [Project Discussions](https://github.com/easyscience/core/discussions) @@ -403,5 +403,4 @@ the next stable release. --- -Thank you for contributing to EasyScience and the EasyScience -ecosystem! +Thank you for contributing to EasyScience and the EasyScience ecosystem! diff --git a/PARAMETER_DEPENDENCY_SERIALIZATION.md b/PARAMETER_DEPENDENCY_SERIALIZATION.md index 82bf0383..66a6659b 100644 --- a/PARAMETER_DEPENDENCY_SERIALIZATION.md +++ b/PARAMETER_DEPENDENCY_SERIALIZATION.md @@ -1,19 +1,31 @@ # Parameter Dependency Serialization -This document explains how to serialize and deserialize `Parameter` objects that have dependencies. +This document explains how to serialize and deserialize `Parameter` +objects that have dependencies. ## Overview -Parameters with dependencies can now be serialized to dictionaries (and JSON) while preserving their dependency relationships. After deserialization, the dependencies are automatically reconstructed using the `serializer_id` attribute to match parameters, with `unique_name` attribute being used as a fallback. +Parameters with dependencies can now be serialized to dictionaries (and +JSON) while preserving their dependency relationships. After +deserialization, the dependencies are automatically reconstructed using +the `serializer_id` attribute to match parameters, with `unique_name` +attribute being used as a fallback. ## Key Features -- **Automatic dependency serialization**: Dependency expressions and maps are automatically saved during serialization -- **Reliable dependency resolution**: Dependencies are resolved using stable `serializer_id` attributes with `unique_name` as fallback after deserialization -- **Order-independent loading**: Parameters can be loaded in any order thanks to the reliable ID system -- **Bulk dependency resolution**: Utility functions help resolve all dependencies at once -- **JSON compatibility**: Full support for JSON serialization/deserialization -- **Backward compatibility**: Existing code using `unique_name` continues to work as fallback +- **Automatic dependency serialization**: Dependency expressions and + maps are automatically saved during serialization +- **Reliable dependency resolution**: Dependencies are resolved using + stable `serializer_id` attributes with `unique_name` as fallback after + deserialization +- **Order-independent loading**: Parameters can be loaded in any order + thanks to the reliable ID system +- **Bulk dependency resolution**: Utility functions help resolve all + dependencies at once +- **JSON compatibility**: Full support for JSON + serialization/deserialization +- **Backward compatibility**: Existing code using `unique_name` + continues to work as fallback ## Usage @@ -76,7 +88,7 @@ import json param_dict = parameter.as_dict() json_str = json.dumps(param_dict, default=str) -# Deserialize from JSON +# Deserialize from JSON loaded_dict = json.loads(json_str) new_param = Parameter.from_dict(loaded_dict) @@ -111,11 +123,14 @@ resolve_all_parameter_dependencies(new_params) ### Serialization -During serialization, the following additional fields are added to dependent parameters: +During serialization, the following additional fields are added to +dependent parameters: - `_dependency_string`: The original dependency expression -- `_dependency_map_serializer_ids`: A mapping of dependency keys to stable dependency IDs (preferred) -- `_dependency_map_unique_names`: A mapping of dependency keys to unique names (fallback) +- `_dependency_map_serializer_ids`: A mapping of dependency keys to + stable dependency IDs (preferred) +- `_dependency_map_unique_names`: A mapping of dependency keys to unique + names (fallback) - `__serializer_id`: The parameter's own unique dependency ID - `_independent`: Boolean flag indicating if the parameter is dependent @@ -124,21 +139,31 @@ During serialization, the following additional fields are added to dependent par During deserialization: 1. Parameters are created normally but marked as independent temporarily -2. Dependency information is stored in `_pending_dependency_string`, `_pending_dependency_map_serializer_ids`, and `_pending_dependency_map_unique_names` attributes -3. The parameter's own `__serializer_id` is restored from serialized data -4. After all parameters are loaded, `resolve_all_parameter_dependencies()` establishes the dependency relationships using dependency IDs first, then unique names as fallback +2. Dependency information is stored in `_pending_dependency_string`, + `_pending_dependency_map_serializer_ids`, and + `_pending_dependency_map_unique_names` attributes +3. The parameter's own `__serializer_id` is restored from serialized + data +4. After all parameters are loaded, + `resolve_all_parameter_dependencies()` establishes the dependency + relationships using dependency IDs first, then unique names as + fallback ### Dependency Resolution The dependency resolution process: 1. Scans for parameters with pending dependencies -2. First attempts to look up dependency objects by their stable `serializer_id` -3. Falls back to `unique_name` lookup in the global map if serializer_id is not available +2. First attempts to look up dependency objects by their stable + `serializer_id` +3. Falls back to `unique_name` lookup in the global map if serializer_id + is not available 4. Calls `make_dependent_on()` to establish the dependency relationship 5. Cleans up temporary attributes -This dual-strategy approach ensures reliable dependency resolution regardless of parameter loading order while maintaining backward compatibility. +This dual-strategy approach ensures reliable dependency resolution +regardless of parameter loading order while maintaining backward +compatibility. ## Error Handling @@ -152,15 +177,20 @@ The system provides detailed error messages for common issues: ### `resolve_all_parameter_dependencies(obj)` -Recursively finds all Parameter objects with pending dependencies and resolves them. +Recursively finds all Parameter objects with pending dependencies and +resolves them. **Parameters:** -- `obj`: Object to search for Parameters (can be Parameter, list, dict, or complex object) + +- `obj`: Object to search for Parameters (can be Parameter, list, dict, + or complex object) **Returns:** + - None (modifies parameters in place) **Raises:** + - `ValueError`: If dependency resolution fails ### `get_parameters_with_pending_dependencies(obj)` @@ -168,26 +198,37 @@ Recursively finds all Parameter objects with pending dependencies and resolves t Finds all Parameter objects that have pending dependencies. **Parameters:** + - `obj`: Object to search for Parameters **Returns:** + - `List[Parameter]`: List of parameters with pending dependencies ## Best Practices -1. **Always resolve dependencies after deserialization**: Use `resolve_all_parameter_dependencies()` after loading serialized parameters +1. **Always resolve dependencies after deserialization**: Use + `resolve_all_parameter_dependencies()` after loading serialized + parameters -2. **Handle the global map carefully**: The global map must contain all referenced parameters for dependency resolution to work +2. **Handle the global map carefully**: The global map must contain all + referenced parameters for dependency resolution to work -3. **Use unique names for cross-references**: When creating dependency expressions that reference other parameters, consider using unique names with quotes: `'Parameter_0'` +3. **Use unique names for cross-references**: When creating dependency + expressions that reference other parameters, consider using unique + names with quotes: `'Parameter_0'` -4. **Error handling**: Wrap dependency resolution in try-catch blocks for robust error handling +4. **Error handling**: Wrap dependency resolution in try-catch blocks + for robust error handling -5. **Bulk operations**: For complex object hierarchies, use the utility functions to handle all parameters at once +5. **Bulk operations**: For complex object hierarchies, use the utility + functions to handle all parameters at once -6. **Reliable ordering**: With the new dependency ID system, parameters can be loaded in any order without affecting dependency resolution +6. **Reliable ordering**: With the new dependency ID system, parameters + can be loaded in any order without affecting dependency resolution -7. **Access dependency ID**: Use `parameter.serializer_id` to access the stable ID for debugging or manual cross-referencing +7. **Access dependency ID**: Use `parameter.serializer_id` to access the + stable ID for debugging or manual cross-referencing ## Example: Complex Hierarchy @@ -201,16 +242,18 @@ def save_model(model): def load_model(filename): \"\"\"Load a model from JSON and resolve dependencies.\"\"\" global_object.map._clear() # Start fresh - + with open(filename) as f: model_dict = json.load(f) - + model = Model.from_dict(model_dict) - + # Resolve all parameter dependencies resolve_all_parameter_dependencies(model) - + return model ``` -This system ensures that complex parameter hierarchies with dependencies can be reliably serialized and reconstructed while maintaining their behavioral relationships. \ No newline at end of file +This system ensures that complex parameter hierarchies with dependencies +can be reliably serialized and reconstructed while maintaining their +behavioral relationships. diff --git a/README.md b/README.md index 893e8fa1..270f97a3 100644 --- a/README.md +++ b/README.md @@ -9,35 +9,38 @@

-**EasyScience** is the foundation of the framework, providing reusable building blocks for scientific libraries and applications aimed at making data analysis easier. +**EasyScience** is the foundation of the framework, providing reusable +building blocks for scientific libraries and applications aimed at +making data analysis easier. - **EasyScience** is developed as a Python library. - - ## Useful Links ### 📚 For Users - 📖 [Documentation](https://easyscience.github.io/core/latest) -- 🚀 [Getting Started](https://easyscience.github.io/core/latest/introduction) +- 🚀 + [Getting Started](https://easyscience.github.io/core/latest/introduction) - 🧪 [Tutorials](https://easyscience.github.io/core/latest/tutorials) -- 💬 [Get in Touch](https://easyscience.github.io/core/latest/introduction/#get-in-touch) -- 🧾 [Citation](https://easyscience.github.io/core/latest/introduction/#citation) +- 💬 + [Get in Touch](https://easyscience.github.io/core/latest/introduction/#get-in-touch) +- 🧾 + [Citation](https://easyscience.github.io/core/latest/introduction/#citation) ### 🤝 For Contributors -- 🤝 [Contributing Guide](https://github.com/easyscience/core/blob/master/CONTRIBUTING.md) -- 🛡 [Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md) +- 🤝 + [Contributing Guide](https://github.com/easyscience/core/blob/master/CONTRIBUTING.md) +- 🛡 + [Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md) - 🐞 [Issue Tracker](https://github.com/easyscience/core/issues) - 💡 [Discussions](https://github.com/easyscience/core/discussions) - 🧑‍💻 [Source Code](https://github.com/easyscience/core) ### ⚖️ Project Information -- ⚖️ [License](https://raw.githubusercontent.com/easyscience/core/refs/heads/master/LICENSE) - - +- ⚖️ + [License](https://raw.githubusercontent.com/easyscience/core/refs/heads/master/LICENSE) diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 1a27587e..00000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = EasyScience -SOURCEDIR = ./src -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/docs/assets/images/favicon.png b/docs/docs/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..6bdcabb24eab067fdf6cb22330ae361ab6cb36d8 GIT binary patch literal 77928 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/logo_dark.svg b/docs/docs/assets/images/logo_dark.svg new file mode 100644 index 00000000..22179ce3 --- /dev/null +++ b/docs/docs/assets/images/logo_dark.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Logo + + Main circle + + + Inner elements + + + + + + + + + + + + + + Text + + + + + \ No newline at end of file diff --git a/docs/docs/assets/images/logo_light.svg b/docs/docs/assets/images/logo_light.svg new file mode 100644 index 00000000..61b2e226 --- /dev/null +++ b/docs/docs/assets/images/logo_light.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Logo + + Main circle + + + Inner elements + + + + + + + + + + + + + + Text + + + + + \ No newline at end of file diff --git a/docs/docs/index.md b/docs/docs/index.md index 08bb8b2a..5a3e9727 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -4,17 +4,18 @@ Here is a brief overview of the main documentation sections: -- [:material-information-slab-circle: Introduction](introduction/index.md) – - Provides a description of EasyScience, including its purpose, licensing, - latest release details, and contact information. -- [:material-cog-box: Installation & Setup](installation-and-setup/index.md) – - Guides users through system requirements, environment configuration, and the - installation process. -- [:material-book-open-variant: User Guide](user-guide/index.md) – Covers core - concepts, key terminology, workflow steps, and essential parameters for - effective use of EasyScience. +- [:material-information-slab-circle: Introduction](introduction/index.md) + – Provides a description of EasyScience, including its purpose, + licensing, latest release details, and contact information. +- [:material-cog-box: Installation & Setup](installation-and-setup/index.md) + – Guides users through system requirements, environment configuration, + and the installation process. +- [:material-book-open-variant: User Guide](user-guide/index.md) – + Covers core concepts, key terminology, workflow steps, and essential + parameters for effective use of EasyScience. - [:material-school: Tutorials](tutorials/index.md) – Offers practical, - step-by-step examples demonstrating common workflows and data analysis tasks. -- [:material-code-braces-box: API Reference](api-reference/index.md) – An - auto-generated reference detailing the available functions and modules in - EasyScience. + step-by-step examples demonstrating common workflows and data analysis + tasks. +- [:material-code-braces-box: API Reference](api-reference/index.md) – + An auto-generated reference detailing the available functions and + modules in EasyScience. diff --git a/docs/docs/installation-and-setup/index.md b/docs/docs/installation-and-setup/index.md index 707540cd..64064d08 100644 --- a/docs/docs/installation-and-setup/index.md +++ b/docs/docs/installation-and-setup/index.md @@ -8,8 +8,8 @@ icon: material/cog-box **Python 3.11** through **3.13**. To install and set up EasyScience, we recommend using -[**Pixi**](https://pixi.prefix.dev), a modern package manager for Windows, -macOS, and Linux. +[**Pixi**](https://pixi.prefix.dev), a modern package manager for +Windows, macOS, and Linux. ??? note "Main benefits of using Pixi" @@ -94,8 +94,8 @@ This section describes the simplest way to set up EasyScience using ## Classical Installation This section describes how to install EasyScience using the traditional -method with **pip**. It is assumed that you are familiar with Python package -management and virtual environments. +method with **pip**. It is assumed that you are familiar with Python +package management and virtual environments. ### Environment Setup optional { #environment-setup data-toc-label="Environment Setup" } diff --git a/docs/docs/introduction/index.md b/docs/docs/introduction/index.md index e753c063..b95b6de3 100644 --- a/docs/docs/introduction/index.md +++ b/docs/docs/introduction/index.md @@ -6,13 +6,12 @@ icon: material/information-slab-circle ## Description -**EasyScience** is the foundation of the framework, providing reusable building blocks for scientific libraries and applications aimed at making data analysis easier. - +**EasyScience** is the foundation of the framework, providing reusable +building blocks for scientific libraries and applications aimed at +making data analysis easier. **EasyScience** is developed as a Python library. - - S?Cc!O}ny$ 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%0AI}sh&|Sgz@xP@)_Zyb8!VpJoi< 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 >zW;T=A_(5z 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]Rp{cU)K|)!sM_xdUl2Ju)6U6UV(8qC`!Q?34~C* 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⁣GwECEij0}k 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

>skHo$8pPhSR9Nm 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%0ApllQU5cEHUhXIr?Y1eIdXqu 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

7r?-DMGw3|K2~y?Z*# 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%0AI}sh&|Sgz@xP@)_Zyb8!VpJoi< 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 >zW;T=A_(5z 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]Rp{cU)K|)!sM_xdUl2Ju)6U6UV(8qC`!Q?34~C* zKcu0m+4dV9PdqTWg;N*##XlRMF>7T2l)aP$4OY`i(*v)rruaThhkV@!PDo0ig7v}K z-o9_Rz$CL5XDcjG^+T4}UH%IESn@b3v}SZ_WukF^R?=*f^rHAKvFD`lJWb(%$M}$*df|oLL zae&t)4563wyPuynCYwGaG! z3K5S5hjdkUhYYivN8@tg-RxPlK(aE*;=fUv51;Q&OAzqt#gOXnVZ> z?;1ur$H-Y8ceekQRKBQp?};Y>rL6!C(&dUC zUVZ)s&qJ;^HlG$Op=y$**;&aBoe#;olaaQIpu-Vx?Go@)=hmZL-cjIlz~0YDAMg@c zz3MT-(4`_|nP3P=+rAM#Dp-~N;H{`J(YWl=HS_LdSu3VYgM4IJeQrCLPMUUpX|7=j zj0(Qo*u`+d$`$51FEjvBgcotm!q2It$&Y|U3()}>xRhXJIN@-!9AXptAMiDfU{!ZH zD{lV$28+Ao)71G9-fQ7AJUq^Hh@8i11$Zsk^I7Ml)#3xuw%`MLx3Nnz_stB3xp zb?I&1*8B>?259WF_hR1`b!Yp+$2y|%HGuJDf$@njZkaEkTk7jzY=aE+q;X$hb_Rw* zGVL?|^>^fvJ(eJOJ~C2_ma2hi_V%!VC$`8q26f~SLZ_MS zLIh`B4Sp*R0bpGX+P;sQFcV;mmH1-v14tK+pzR9YG>CpLppv~myL63xwErqq;JE~37R#kT^RtI;;fG_k3Uw(8}ag*7`@J^SA<8>ER35;w?UPq-LrESX#Ykop4G>X6fwy zjsce8ekrQW0BahSiLjHm{=)MK91Iwp?VKfAdkHEI->y}~6Km}g*1uM!V-N|~X z)AhuoPu{ba<53Mx?@7abgQ^A=BwJ^%X%oAVubrnw^1vFRtf~=b$NiWzlbBRTWNj23 zy@Sj60l!X_1HzU$Z2^;p4PkYekC0-%+Z1HJoORjK$!G3W>x=%Ab)P~!H!iyJ9K3S@ zr)GKIppL1^&B1YU>`r3S%$L@G<3x zDhvGcRmREb<|O^Jc`>Z$P7dfEXDuwIXE32E%Op+LdRKXJ3|B0 z1VMOziX!M9j$(w9ROA{1sd)Ee-~?1g^?FR%6VKCO<6g1K`Rd?ITAHXwRr3?ds6n-33QYP<8SqI3JD3+Y z1}}W(SRxS*@@+~%gMwd@R}|22?G2SZi$TP! z6cHC19C-x*{{y?HpG-Zc`RgW3wdCUs5&}T3mbx~`jS)h6qDGAq8Bmn3?!Jb?AkFAQcsG#bS-IG# zFO@2F?B>Ex0GBT z_^UE#&c}I=y}xC$#|5E?tGX1jGSG65JwNwZ{=7(gM_{uK$4*-CcXuGtgUf*PFPwfS zeurtK@T-c!H?#0!fIkjD87U#|{1Z8UetFfQ)@eQJvow_toi?9PY%(@3@73ZEsUQl(IgbIUvo&0DmNtEY?wAnNl}$Qf+Gi#M3yi&vhD`Q zFOf)}r%d7(tXw;K5;+aL0~`YN@(lE&MuM%#Mp_B%4MQQR!ozCR_@KE&O?!_W&;LUI z_x!J3(bwlWj}f2DUxU}Q9It~`GQ=<=EC~5GXsN&+U6ZJJQ7H3jvR_J!qIrO&r^+GY z5WcSAv%XxUXHbJ(=F(AW0~trmdeTPh;1~@KpqvDEJ10hXTotH2jAX@4Vx#W^5(L4g zkX!|xj~g+^)p-|^WYmHr9R}#R`h8w*P*1Fy^62=> zHlIghDJX(S!~|_hX(!rmN65Ij4K?FB2^%sboPf!(`c6TLT2lkVK0pjASi6?TwQ9Nv z&*cq-A=dI%-xqvA@8uK!xsMRdmQcDdrzb=PEb*gfZ8;#1z}(g*i(Y`0;iZMrnuPVv zC%zASS3=t`G50u}msxt%`bEV>P$&ZE=0kPY;blf6b#H@XOcOTpoHRup90{5di?#9| zxZcMd4J=Z_WDh+3E1NNd;AI^unA58KJyPB2r?|Z6q!fr8F1*3-^uFp?bx=e6Z*)W+ z93nV+GVouRXF&JVOVjiTx;Yd|!^w5`4YLKQO6u5^_=R+FzaXnhh7;|Gs^F{}Dd2s}Y6_?`ECeTbz*d^1{h9%jYdKk888GDo;zbvk6blbpP zOUYAI3SC=C5u!z<7ZF-ytF->U=X>s>e)kX0d!2jE_k5SncRA;toBgn=_13xrx2zsq z+U&XQ>VN}(jI47d{YeXrA)>kZhTw&J;v@3Q4LHCT5UIlelBFSp2cpSWo`gNgdY>(x z<)rXn{h-m~qZ&>9&J|2AF`Buq1RPlTTF;D3gKNvq>+EYzGunIj*N9tw4>i_4d8wLO zd8_uF)8{gw(pja@thn1{RYf|JU^9d*#N-HnjBwbZrS^3zH^Dfl;mxC!WJ~pw_1!hr%`NI1QC@mKH6(Dm-Ie~2 zj7API8mX9DT~K;^txmAAQtl;-M|-kKU#!umaT+NTOyIv*v*8Bh7>zR78=S90oGPP} z0-5}~?2?ALnfnh7D4kZaE6LgY&UJfj+lV8x2dep0^v-FCa-aCmCdYLrUwwu1afa*s zoBTww@%7r*O0gDp2^M3+f{I!@d)2QDxUt1_T1pA-31rHy>Cq$_hEPNZDBIoE$LVt5 zw0?)mQ_qo+C3d8MqdPI*KhI!Z%5(q0TDco+1qP3|eT`ld*OB%8Qd4q|MGv!~>Lelmk_5lx71%wz4u^Z>y4?ydTlI=4pEmRJLtdGbMbj{FAY?=>2~_Gkt24#bm@x#&V6o% z)8sV2^aN$nu?c`-JRE3H7xBADV>Gbt}B0BM+gwcQP;-M3hf0HCHkaImyAcyUc zcr1isC8WosNCx3U=86@hiLL9dWqreMO-SFAP@{Ec1C%Y45jl>0)79_}g;^JWfkvgU0AY65U3Y>iSn^uNA71c`+iEg_LE6juK(#&$gy5W zG@}i4y$@^Mx*W0uum=pj&ICZ=TlyrBAd`u8TXq!<|C+0Vn}d$v^j~H}8fW)rt!Q-6 zeJF5_91Rn7JwK1G?4)`|Cqa2AL_Nx7ev^;?lWq6vSJK|D zl;nOcPZ z)zs`aRonZKR?<6Hu?lc;G<>n4$ZJ=nKLuirlfl!1ArOScQ|S9Fpu_##b*GPB^i*np zbk5{O>Af__G(OhcODpY@iCC6nuR)NR00IdMR=a3O zx|57~F(z;Hnn<~mar+5z;1OqEQc68Eg$Z_+dJY|F^x)9t^|d?{l_80`+czRHc3nZAjsLnh>JBq`S0!Ar z?_#~hSB$CpPD-F+Z@ae(*&lqMeK z#l&mOb;0{Jby0~DBH=(jI9@0A7U){TO=`FcU=>!NVLBD23Cj5V#`wh$k{Ha3xZ`xg zuRip}m*oauy?S`eHW2Fly5H;7y)>8CYrjX{Lx5+N2jdfa`ZLiSjlwG$z?ty1N{mq@ zi7yr}JbbjzgQOKC^c{3#UV-h3eR3zWiuy~IudmQvl>hLpGtCV|`>{Cb0aTbCj(3BP zw58ynX^ra)Iw!`ie(kpEf0GX-P1_l`qmON$ebfOm8&RPvV)rn*n zWxdfl>+N3t1+4Z{f>)U!AGmMr4*%6c2Jdj_U)XyTwze$#i{tkq=IxqBlW{@!`YgHo zB<+Oq`2t*cVw&v_Kz-Ty7@=q^%1&qZ^}$Q|NX{I71^_4w`Sf+l=~VLvNf$kfqc@yR za`?}8@xq?#l7okH>-wCZ)^0kr-~NX^9XAAGvdk)c*41d#QHNXgbB+)XsS^sP4nl=I z238s32o%6GiOC+1GiI)HJ(Zx8nwpxf9iF{!ORI12ky{U(XRSS75U_I6oN^`efxDhL zyJzcqL~1&cyO^?cUdXX9SNbA#c!ma67c9*E)+0DEA+ZAn%`OSB%&!pB=4MwBW+VCc_b#Tru>X zHXv~v%vn?k^@HVDY7vpiS(eaOG-+8>Q+xz`MFfX9je<{cb??I#ViWog9EAzq(~0y-onFLk zUGtQw{_ABn2l`_htYwSNTl#qK z*hr#M*_FV;noiva0etttH61o~YI)`R%Q*;rw3Xy;^qk$OlRi`@V|B~lzuyVx?Ekn# zzuwpv3`a~)8UUcpX5g9!H>LDseH)?^-!6A19<=rk7M8fD$8T1qoA~#lyrNAaZn;4X znaDz#i217I*=|fG`5tUF6aXSNh~TSEPs;L_+vLvKhj$r9^cV5-_gQFT`#Zu&!tVDA z7b{p19pW$cm#_X8#z(os6eNogo^6L0sGL@f!ho4?)UV3fyf4X@Bp$TM*n*R%Z|Ymi zI)Trj9C&I{JS7TYt4l}wxBUIWC0!bM*z_iIu-!=ieB%AcE2RbcE?qb*od^+^q2x2P z(iw--S}vBosT@1 z;k_B**LNKr+eK1BIRM$Z6&s;d1iq`A8SkFH>zTe5!X@pAn*i$+J)Pi-&H$vQ@b)(C z^VxCTn!tOgiNGgJgl4(aFI|P#VED9TkzZt2*DtGCJyPo(K9=qTa zOcmS3@HJvTQoVUydh)YJ+s=-a^#PyFiVFA=XIp%kI+FlZjr`9Gm(CZ1FTgaNwvw7)V)zd+m}6AI;80pPyi&m*-7?>o#{hU6N77h5__}}w zidRWZ!Q3yImW%mj+!5pbeR~k7U;Z~G9WoOKb7O}lFTMr&ke>8p$;(w1Wkv=1!CiD| zRO#SRWO_qzdfaeu?Qc{rbhDyha)PJoioP)L@iEzU7O#WN93rPP9hiPr8<;fx66&+ z+{IocL!mO3LY87B@@QvLA4?y}Al$vjcVp{%$&-a6s27lxJ&_7J8t!?mmCqGKZQ4ro zjT);r?c}#OcY%91RZI9!d6bcGCA2QwOK1HAft4(K$}aYK!(w_GB-TZkA~;ra#mmb1 z{OilHnP@afLh}qvL8L;N{D+lK+KbC>vQFT0LET7HjKX6$5_vuAqR(MAh4Me!h{gg= zUEQz^eo2^$O!i$=pmM33q#|-5{queZtYf`!6@gI`jnLTXGN6mVBW^={N_IFfRJ9cJ z%6ly6M(^b}s5wX960W19JT&9flhhKlep18D+%aTe28z6457JzA;^g~Bwm)0I^YzN3 zN*8*0iO6lTMhD-A*_O_9>e8&=Y&=|JB9@!A@%e~k0=q6ffvbD z@TGxo6B1{%;n%MClQ&oXVBN~i(4^U)c9RR;TuQ)17JGq>Kmdn3Bb4A5bxU1cH7`jvPTZYPzM!SOx!10-+hIQXyrD@eb8 z!#1>H%eB>6`rz{rd@E@?6=$!_#DI&aT5Q!TU$c2tw~=npk>oHuV2wPq%o`uHbTMDM z(r7eI2-gXOrD=AP;>S1Oapp!4eKifG`f&RFqgCD7*l3~{_07??>x++d!z=eDTT}$M zFuYxdbq=mQjTH-iB6j28IN}L}g=NY}f~{hK%C&C#{|K>+U4;#Lq<%PM4WdT09C= zuBZG%rodn95G`crR&?>qg6UnSYrBO~v4K({c(nVz!!fef!e5e^s#I;-sJ#s0D=qZT z%PnD9Z^|T%DRI<{%WVDe+njx`sgG7pf5*vB@tIyP72WGOC}gkp za^Xg&szC?7In7N^zK}1c*5lLlfkmUA8-ELYbk3oEHPF}pnX!4}MRJCa?CSIO-_TYy z;}P&(hi2gYZHG4qAC0(vOq-_(ORhdicNnk z&T6;pN}}&*s)5t#B(=I}kIg95o?cjIVm5cPRNGNFHzgs}ys0z0xC`#@ws2&9e=6F9 z)4<)*?~`z&7C(RE=Uaw1RVR`e-MRX{4n9OCN49h>&_AZCbKH_K)F2I#djY3V(b2g zdBlHv?zQH>167 zLab&w_H|W1q0f@6b~Ex~9VS5wIVi0-7IZ(%u8V{Vmk&7jJ!&l>dkq~y8yMs$b}aho zFWIXEuHTnm_LS`ffcFc~u&g;@N_~D;BobYuOgoNDV{Ud+)xtd}u!Mn>nE0+t5WS%@ zIZpYbI=ia^Esvl#s?!^vbia`wk+LAVn*uH8N1RM=%;|PxLvJ+qhX{L2zD8Hh?i!6+ zi4KCv@5c09)OoedN4WDH*wx^aLaD_|^(iw$x?0@yFNtF19a_L^*`H_j?P5vOlLH1E zJhH{?i#fF5+|3Db>_1(>n0<>=WnyTEsdKoiv~_18NHy!=R7I8DrurVI%1)v@a`>m~ zjXL|0xeeBo?3GTA@Uc7kcnQrvpWku?z&U8=?@jJaVaC3Gto{GqLc zjUkfCeel609oZ5XT~$1bbnvI#1+Q}}<>DutoAolhd`aWT;h#y>{^DH0 zM`PHNC;WX?l>I^l@1)f7ETyLU(^a+WBWhapUTq`-5_X-BtwBK>f}c^c8)Q~IQFLH=Kg8KI)(j_1O2wzWwl>Jy~$0g{7m{* z1TQc-XN`E3LSN`&w#x0o87?YWDW~N3Eb^XP;_f6QN%@sU!~$jFilv&}2h%ZLvqk5+ zvT-9Vb_h2TX>*Dc8)tQu#q_CEptlAS_U@tHL+Q7!x^RG zP-@mp)eT^vR)u$8t)x}y7V{6fsF}WDiOBAsoH;THV z@!hz)g3^oCQAVjhr8Kr3l(aIo#}6faNeyo%HN0I_H4?zYHaRZ z3oCOnV;qY01Ce^b&`|`8_kcA9t%U!G{Jp}RVQ*XmS3P~c6_@Q;`?02&o-ZqR+7VfmE%>P18|eG{r+ym$KYgpaGE?Gd4lII) zwa-RbR%l=Q9W7=i8INfmL@i<3#Md2VV+nQE$(3ZQJiJAUM;0%LO+|e_h*IT!YS`3Y zyo&vjj2;AN-dPWgY&Ue3NCJ&0*i3bF3H#9{G^BQ$i!;iVi4iIsy0OUf4HWV?MH<^= zQrE__<&9Tt^FfknHyD&V8P4}SRyA@i_@F(a&B?j%Z!K(0DODO?VRHCHd7h_##T-0x zlZV)laxH@sou?+iz1;lLhU@Uj#MorDCv>P=h{tarot%>2Q6ou}_gl3%C|^6{Os)PD zKQJ!V8ttfIEzXHsNx{B(U&TN71H1trM16M?Hj3KOJg!GlALpI^r{6PDdh$&G7rf~6 z4LG5WnI-w@f)D(k3yw#rO7B64heBd%sDqR4CEc^?sL1Sdo)$XfGVxJ?THmo)4 zN2)m zo)kFG^Gzb8yEUj6r~K)B{tUEjG$JI!t3hk#fBJ-^K9PBrFc|-e+fOB)`hQ9sfzTwK z4GzPjqgOJa((g8XS-XzI@TTOJpz#)oC!o)b_A2s4J+`O}0?8*($%}~Ob1_S9&_H6C z1CNiq(j;pD+-4Bz7eR#)5cW9zCvueiA9DDPm(5~&W9gLoz%6s&W_A*{!f3vOF@KULVCb^*q3~q_o%m5hpINfke;+{`y*`4a)Bnc0;*Cp7WbtoFRQPoaH##L zAk_^P7_ZQ>ghLEQq9JV-#H}#W?_li8V0Mh{9$Dl>wvb$L`6{!gY|y>_ zsC!dgr@>}fcxvV_4V=akXLBV%{y+_LP5#iT#d0qwBt3?4*lMha`3|J|^b3Uhhe%K$ zIwsR6Rhat5lAo#{_J68xj0rK9TwbWgp6pcAft#60S1MWZnQKi@afYQh#snDmILXjF zaaWb0CCJHz%1K0?6H&!+q(`Y3gt<_li0_U7FkUR43NrJAyWh?~!x|>R1b*Uq)g(vYv!Yk0Ykk9}p|= z1Xpxwo!2S5pa)(OFw-jDO!c8j8U-sWTL zj#iW3xPc0)sOZS6USv|!b7dH13>fwJ!cRUe`#(Mv9zaz~R>=>%PhxY{CZ&>tPsVlp z>kdcp2#t)-%b>sb59~GhV>PF){o?hG*JyWWR2V|wx8*oL0`FXwc=2 z)+)M1YqqLP1LVo1$kPnS!)>Al8L^r2;0-A23{pK7ZKUC&DkLl$pZ`?V^#4=U__=5) zD-z%KNIHfaqpsf=pbv=&y+Y)zG4}GTIOeJuONPxzM`JZ_&;R*4B zgxIVQf~J-57?$yTeL;$w08dFawGkhzT%v07|n3f0%o}G3ddtL!bB9rZTf= z#^{4U=FW36M5TWYS1PB^+LFM6b6SpZUqoIhoe=g|r$}2x3lPldL zlj*Hg0}@aJ(g+i#&oaLcAI$Q_U_+~aYkNuFz%v008hpYQT{|x45IW}RQG8o0Ha(uA zPV|2d^}IPW|2akk$Xs#0lR-L7h@(ag5yz?7UZd=To_Yz(|27nuQQvC-O|dXCwSKw#`2WP*$iuO82sk~PDd zrfwj5p~SnrKMJkl=31CG6A-X z6KWo(%O^r0{f>GqbFf#@Wyg9`P3%2m}re{4-GOCrtJa%8U%^@6G0WPU=5co(wGjI->@;&;^u_c9ZyL*$t=&_ zliC|TPmOyW5K$$}StL)||0jQ`hRKk>3~u%VC3rCqEZvR-tJbA=_@72)=01=b2?b2mbHoBG0iTC*%2bcF-so)c4A3sL7usL5b*_tFI$`GB^K&DuqRd zdd`tq(8tAdz3L2~CGM&NtZk)O3vV)Dnm1EwJ)^4lK=&J6)Z}cSD!srnvPzpA&b$)S zK+X{ZJmUvm?MAmCpxic*u;kklsJW2nnmGU}@okuVrVqfysUbi48~K0yt+7P!umrus zRx-haqXRyYh?iS>cuU~ns$xJlJ@YK7~7(j{TJX=Xm-U>x=vU2x?>0CvXYtP{K24FbgZi=@b~ot}uJ`9i56XkA(0 zHqxHaE9`*IAPkvDf_^y*i-~x{3>EL9zkF17fa{e~*ULZvDxvF2H$Tt{Ia>khvxLNM z?7eqd1%V4cSDY9Oquu)HdrdRDWk|5uhmsHz?q}3lxrB_|d<5$&Ouy%d4{1QwV~o_; z=eUg9V2$tq9m88h7a*vz|H!=ER(nvYlHCMWmmft~wQ0W$OROhIG{-I~@gN}%GxQ?S zwoSpc54QAxP1EsrJ{mHYW;G0b_E#I#wkqKB9xA&Kw{SnYe9RrC(PP872Wg$7q4XGI z2Qjg&9&tGAa|#8si@tqqf7X=(WBT%yg_VPnkQt|y80`BZYUl@eVe&I2ejQet?EOvwtgPu0(oO|Yoe`L6eZRC2v_hxgr@Ys8m-qC3I6u>PaP_%qo$t)a zh{i!w;0p>6@R~sX_;Ih$93~lUZ!qCwgPjJVu@1k!1L9=YVO+40#<3gh!6>VYNx#<* z^Zm-ezZwjmU58F=V-PCG2C5t+)?;TEd(0-cMf^|>f=s!8232`2b_jX{z}ZTHvkZ*p z`Vfqo7NuK#rhA&15W3_weXvY9t^<=KIx`8mxs=rwpd2+sIkuB=Z2tr0xJxFr5te%k zS8r;Yn-5dh$^FT_9o@OdZN{vu`M>z>tjk-Rqt0B$3XKe8Ay7SYVczy8A1L1Pg07r9g6x}L~Y9=dtF(K5kWWRk_EM`IIr;c8&x%0 zvljg9c?b5~ak5lU5wRuky)J2gJ!QZ!7!?wwb!GWtSQ==6osVs1jrDK!_L&5>HrNLb z(Q&yvCz6?8+}YQoPxf%j1LN4&CAWLV3@Dx4f6G1xdqj+59rrRXMhf)WRG(Ys z=WTy2dR^~*!_KB}MTU?4x3Ovc+C!?_`@L%qc{l5E=BdtCpWGVzeEu6EX0D0a!>$m4 zTu)RImj%}Q%yP)Ym4YtRg@v~j*g-RUUysZOxf>3AuBsF|gmr$6t@@U|Zlak2E>w98 z##;j$^m5jIt6WItRs0);+c~kDGR_D#Sa|Dzy0}Ckg4Ut$YrC~5_WYs~ByM6|X~jac z?Lvx??LYS$FaB)Ygt2<_{&+!l?D>4!JcDlk;l^0Ire^$hs9iJz@T+t;u|zivsHOT7 z!v2`b^^vE)kU(Cn-O_lNU6#E{kwiH z5Lk*Up$%rp@lLPHza5-#5*wf98;c3u-vh~O3nplv}Qn}QH+K849H$1r=qoXw#;?@u(X=oD7w$j_R57iZyWU_{{=u^ zsRl8dJWMONOuNwrb&st<5-;ERzY{C=Wj$c>3(@ zLZa|oF|~A|k#%WZ;!LO3Lej?!V(^g~$P9jZ=r5Es`RT>u^uCbLjBiZq^mYk7oie8p z1!o++@;%9Cp0)Fb+2TxiGa4}Nac19&OvQ>!C9~fCLg~HN<+TF@q+S$?FgyL{?24^p zo0D;N+vEA!ZOw#!CEFG1ZMJ`}T@r1qoR!-WbMx@^jLK0JwJhw`pE3Y4F+|=ZR^55wEK3u<2xodX_C%`RvIuOz^yiz{5;QS zr+j}P*$SP~9t<8MFH@6m1CIdwr`zC}=6zK4s@*^l_}HWt6GxLwCK2=$v8oJ2SxgtXF|=TZ?_7Gkr5J1j zdcH=tz_6RadPGAsN`0mRtCsEt7+^E7nw9s=T0GnN!&Z`l!Lc7z(N~GIr90*?g%WgR z)drGo=*0$Jz8QGyX5f>6zAenHknD_-k@Hw+R*VHWQQX9q>f603w4Ax{d*A~iK+ekA z)#pT2j67(i%Y$95)()mS4{Iv~efr#acGBoeW)ru5->yVfJViIit?aQ6X7jcK%ilwL zVp%ld`l}=7r zJjkI2H7fygD&Z{m`AgMCs*<)Hc)ku4&CYGg*kv8;QURxpvtGE6TsVVd8Ii~01tCwL zRqr9wWGm9E@ivKR?0GYRf#v7qWYT$I=D~{0$coHUU~6f-t$|--{Gw2krw(iXVn=uY z8d-he&$cxv>!`(7%eROF4Iv4VxcxM>Il9vBNYYSE`TgEZK=|$KOZsWvs)7AUW>}Z1 z2;OJ@d#(BrFv<{PLw#Ho&C9D;ury{kv23P;k4ao?pL=J-E0%0c1yn6Wl}(dJ4$h%I zO|%Vr*Q4N5EWS{;P<-9f9awx4l`s=y>b(1L{toB6P9mbez98viBha0WqR+%yL*89$@tLR3KK7R6K3(k=A&0R+iIQ3JU?zhVT z|6nq7=RPA1vvzIL&Dk#YUj@I`V3_uW>L5o=%@Jo=SH5)?At-HC?D;?oVrolC`^TBm zip+NvnGGQNzLgYacf%i+@?Fdp_aZESpe_b1trojlyv#Lqp678Va;78aYLd44&70)8 z+dq3K4g7o2>iG_Vc5gp_5t5xA!XZR!xc=A2TKT)ccj$#rG?gMTBp6+i3W1>qZj=_f zV&l62vlFfS*VE>iJKZ1(fb!L!$6IEJ?+DDIK=5f7JMMLwGLM6xB&;B~?t4Az#$UY$ zfsFHzr+YKr#hjrT2>bB-{7>45HT|uhdxr?lT6l-{hM*_wCqN9;ZtfniIpR{HrCn!_ z?AM?qq$c&Y z$q}GSy0Z(jpZq_wmm&Xle^c9N4AG1(C4}z6WkM~Vd&^n0T=K6k1)XYkmOU4&YM0~LGZyyY!W_&%(nkqdG>ILi`$Fm!F$kmXJLq(;ge73hp2_8Tjh74JFA7At~Ti1uAZ|V2Mu*Fe);g_ z^qJtiJcc3NzXIJ`dAcjl&Hprtbii27mZ=HoUD>lPYGUwzYEp_&V)-~qpbgL~AFCmHT3Kl=HBT^#vP*EA9gCoyp+`Wp}%fZT5d; z*C0q)=0!bymOTfFSi?sHdm(&s7I$p^w>1SubHiN~DHu#f9;8Im_LY45V-P*)<{W7J z(O8ep@L-cg*!-oF_M_px=EJI~e_kzLB2E?kwHYE%ZSFcoiUE_d-vxQ}%2ye|J(DV56`ir6sKYn`jdP2W;mU0w`<5`e8th z-vTwAcXxjA=R|#5BzI_>R1D2fGeawWV0UEPh2Ir0yI}&C@p59^Io{%`&S99@kZ3B=TLPOU461!D&y(6yM~CwH-%iS2+t zGZ_XH-Xv9g_8M*eVO)*{WLv#pREF~_ONQDD2wa7j{QFr>W=4P<4S)C-pHfi%dU_Yw zjv{Y6eSv?tnM&zAHbao4Ww0Qr`Z!GdBZ-lO)~JGgF($1fl(5u6F*QI) z{W$Z+U1xwznPht>_l#1#^^nt&<1M>r>rP((3PF}I`OW8zCIU3JVZyT%ifni+ zH50(wgKfrzx@e%~bD38Ucnb!JG)1+DrvtCe_gr?o(6&^q4-&%1D-wXwYC$QuR}qXdnrEgnBs9d5~K|5U~lm0bpNM ze+{)+V(~-v;2j&({KuSD(E3`rTm9XxK~(lLph&w1_n|25{ULkK3vjcU^u!d0K@~@Q zVsyzCPbf1rNdt}?%~ySsb7#$6WmEsL+uOGs%gw(-HVAn%;Uo_=pV$4i_cFPajpA9D z0xU$d%7FTrA_0g#n4>BEl}n<`kD&x*nKHg~=s|M2g--+hy|O_-EJ-lvZqQJ!)S7j1 z)*+3hJ9%mPfNml@K(xUiKYmAkaK!ml?;)1JxZ&X<08U%2OHT^6uY)O*r*+s2MEd?^ zt=4SqFtP?hP8G!m?U?>Ec??_uhW*wGTO(-nFSZtkL&lE>CNqUR9xH{CVE3!S{EmlU zGD3GEM;DqKh=vjEHdBH@0i^LjOt1WrKp(Qb(|PI9`v765F(hEb$%(Nf;hW`LWTX3_aakqT4~Ib&=;mbSm~KIZ6H zzXHF`^No;qiK~v>BgRcE({>no9`Z@A&W678iYfS;c3n}_rlF*h(_zJ3m|v3nIK<3e9%Iu$g2sc z8~APd^a7Udj8@*e@0|e9^MzzC0B$6*>4j;|WYQL%IiQYG>pXSDa_~eqXH2-!poUUs z?5LI?_eAG-N-W}EBzB5xEyOBNhU2~xEx{G0fpQTU0` z+udAY?xtYGy#K2&UPpYC&mL@^MV|m-BKHGqv|h^7D!B|AZb>S)TpOaSPpws_-F$Fr z>f{FYGLI4Kq0)O6G{ra-FoL%CqwU{~%UJ^b&!PR({gX^&EcTzTRq_c~!@eh#pGZ@} zcB%Xg8q-jb&Eb{S1$BIdxH~~9g4U1t1ZLcxky@vV3KV}>K-mI!a|wl z5kfw7Z9Y|XRPnW-^f^xMDw{0i|Fv<%6{X z(LO3u=H|bfGQtIy%D|Jx5n~hi^#)Sd2|F{O&Z~khQ&tIMGod;$LtG%pF9&3bBM(-I zjA`rimG`nAsbEfj8zvYE5J$@l&=W(da zY}JS0j<&{)ouUPa%RgP-Do0z>$6^@i9$7$G2h1Bmn70Ra2NjEvA!Nr7L^v{r$Xl11 zSb0WNU4tqpr%TklKNdVCzrZ7$P!BPJIx#TTh8ImL7GXe=^?e!UHSzYmqnhAbVD@nd zl(&jWd+r1;`7(eY)bsiX=p|q#Sf~%BMnavH@(9wNpQ*?dXs^!{M>%C%1E!P_;!|*Q zQL#k7eJey>N96~Q_6_blJ)0rCbb~P8ENwivdbEp1)bo+sj*;l&q$cW08{P2EaD4!5 zuk1Timo^ESA0>MD77<|N*QMeDuu}4fCB##FF_|53p2wH{K+bhSjvl4{U!c%a+^?c>;yHVyrDGYj1x8wI!h` z5mE(m-8PweiYIVhEgR3GJ-oDp(?5K{wk>F z%HasM3N#~Qdq5D629*KIH;t&VA1-Q2wA@>&$3oyo5_GT!e_m33Fyq@`5g-A53f)B% zfv)*%_Bd3Pru)q(8$E|DpJlOsfpZ*_<199T7vpga1l`+ku~yQD1Q=W9k3~z=C$viRhr&WtX_pM4ynBXViBXY9KO2jMWMx5v+|AKP?qOc@o_n|31gtIr zSG9)(U6Gmy=|f*?LCLEVdYPs621`u?OD%!)cn?8ey67X_11cN=ET2Z2^G`zqmIp(`*gEMK?d|K9 zg2oVJ7tKe@8@VHf0Ku>z1Og>|p9I`UDki5oJw0Hyzd$!6ON_&{xwOB~fjvQL_VDFy z(Z4cK%>oNi1`FXL(Hiv|;sV`H>wbI6x2FrvjOg}-lu`n#az+phco2Pb!~&;X!E7-U z`93Ps=%JWb$MvVcj;%vo@?S#t{jqyQu_BKnRaXEw90_QHp3;?a&JqfurGd`Va>hqN z_d@I*qYb+|tpt}cr-9mlBKY$5lt-#@?MH*cjZ?v+mYERl+(+)Xr`4JTFF)Q=cADJ4 zWXa|m2UWm?wN6F>z%`FlB3*U#lQ%1^NW8uv2vtXkkH6XB@f0VcDuB?k38a5otjqME zNuVa30H0to{-L!VLo`c$!1&UP$aEEPx~sPwsrnBVJ$hklOMbdcr}fox3-N1#Q6h}$ zGYfPfZ9z`}Db9x0TegiNw1a1)a3<9!{_?-hO`jAd0{QfYet1Jnn%%wZmj)Psb6n*O#~(=)PDB?ZhXsWkVk@t7#}KZrfh0f-w!&upp^ru<-MPBY-HaggLIL z`T^DcBz9Yk+uRw^3tqU*ak3QlDzwia?X8fR0dJBz7q0*?n~U@1k12z46)cUP0d2^B z4()ehd)oh-vx2kW14$_c^n{+E2>b>!&#+i1ZhHqgrNo4=(-4(&{6~`WcD@=#n!`)1 zY3RxMpz8nTDXyLf6D}nMsf1mmba1eWRFr*iwh)f;++5D9!bAvcqKL;Y!{@yZR#8pJ z#?B-4DG)PmKzn&dk2eCdbO^{?q5)YOOnTpki8Ml~0qmS#&t#+(JbP@TFecO5UJpUM zWCbDLif99ufCbmBW{4w9CZ9@jFCcxhg&^Jzp5)N0hF4BqN_Bm`edL~)z+b%OynFN( z%h$?_yI@XHpk<|3ua5iNK#$P2fY@KEgDeLVK~7jm>I5 zN@g>^Uc)qA(5-6~L44Zw_>g0j#6g1o%EHoIYaZ@xCb zE*WdJ^O#dqRUTv~4c;(ap?go@gmCAg_I@{D!c+dh_8EMp#f>=aaCz zBw$mdHZkwW8#Ns}zrYNvFr?&6c{mWR#2FZBe|Lfz&>Ju%kGz^8u(7u`@vzP$ zv|&p?)~46v1MxtMv~dWdqKg<|QDs zh;@dy0*2e!LRrFLAxJC^3sUQ=*90FZKaQS(b>tOK^c0AfpPV#x0p$F-g!j7C_KZiD zZ1eJ3x14m%gz?2VcEuR0jD=4-=e6Gb7ntuyn2)6m;rJqpLVJ6Y<3mVub~2B|BE9(q z(em)L*9!POnjmWyD$n}YZovoqCyynK8Araj!PSC^ElRTTTw@Q@BpzIevi+YRbyIIr zBY-Q5o__<}8fVoyIY%q!*pVKLw25e$GHTi9=$4NcGC&JJc5pe$w4jz~K{3$+SBPl- zfZnHJ4i$O5rla*e(E_X}am73rC4Er~tUwF4$Zo)u-^eQ&>ZXnNLa}>Geh(27^5^kJ z;~c%5f8GE&)j*C^g5)Hr?rARG|0~6J`jj*5-8`>b_eN3E=nD+VszFJUy+iPwwb(H~ z>HUWf5BzA~{3cQ+WchLLlmB%tY0i1-4jq|k0G703vK_wdq*M9x=V!j-4UzN&2I&8i zZXKkFtwmkhW3(B*^{CVH=g)7vr|o<3n5~42xA=U^3UZkk!b^PcRP-ky{$dGjJeY6X ztQPA$DM+cr2;Q~FW)k>tLyd7V9u4qu^$#=-W-HxF2-Ge)?tKLI*⁣GwECEij0}k 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 diff --git a/docs/src/_static/favicon.ico b/docs/src/_static/favicon.ico deleted file mode 100644 index 9281805b69c8291af04234f4cc85d9d1bd1f0b5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24846 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 diff --git a/docs/src/conf.py b/docs/src/conf.py deleted file mode 100644 index f8445631..00000000 --- a/docs/src/conf.py +++ /dev/null @@ -1,228 +0,0 @@ -#!/usr/bin/env python - -# SPDX-FileCopyrightText: 2021 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause -# © 2021 Contributors to the EasyScience project - -# -# Configuration file for the Sphinx documentation builder. -# -# This file does only contain a selection of the most common options. For a -# full list see the documentation: -# http://www.sphinx-doc.org/en/master/config - -# -- 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 -# import toml -from pathlib import Path -import easyscience -# sys.path.insert(0, os.path.abspath('.')) -main_root = Path(__file__).parents[2] -sys.path.append(str(main_root)) - -import datetime - -# project_info = toml.load(os.path.join(main_root, 'pyproject.toml')) - -# -- Project information ----------------------------------------------------- - -project = 'EasyScience' -copyright = f"{datetime.date.today().year}, EasyScience Contributors" -author = "EasyScience Contributors" -# copyright = f"2021, {project_info['tool']['poetry']['authors'][0]}" -# author = project_info['tool']['poetry']['authors'][0] - -# # The short X.Y version -# version = '' -# # The full version, including alpha/beta/rc tags -# release = project_info['tool']['poetry']['version'] -# The short X.Y version. -#version = project_info['project']['version'] -# The full version, including alpha/beta/rc tags. -#version = project_info['project']['version'] -version = easyscience.__version__ - - -intersphinx_mapping = { - 'python': ('https://docs.python.org/3', None), - 'numpy': ('https://numpy.org/doc/stable/', None) -} - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# 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.githubpages', - 'sphinx.ext.napoleon', - 'sphinx.ext.autodoc', - 'sphinx_autodoc_typehints', - 'sphinx.ext.viewcode', - 'sphinx.ext.mathjax', - 'sphinx.ext.intersphinx', - 'sphinx_gallery.gen_gallery', -] -autoclass_content = 'init' - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = 'en' - -# 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'] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' -highlight_language = 'python3' - -# -- 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_book_theme' -html_logo = os.path.join('_static', 'ec_sidebar_w.png') -html_favicon = os.path.join('_static', 'favicon.ico') -html_theme_options = {} -# html_theme_options = { -# 'logo': os.path.join('ec_logo_single.png'), -# 'github_user': project_info['tool']['github']['info']['organization'], -# 'github_repo': project_info['tool']['github']['info']['repo'], -# } - - - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# 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'] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - - -# -- Options for HTMLHelp output --------------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = 'easySciencedoc' - - -# -- Options for LaTeX output ------------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'EasyScience.tex', 'EasyScience Documentation', - 'Simon Ward', 'manual'), -] - - -# -- Options for manual page output ------------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'EasyScience', 'EasyScience Documentation', - [author], 1) -] - - -# -- Options for Texinfo output ---------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'EasyScience', 'EasyScience Documentation', - author, 'EasyScience', 'One line description of project.', - 'Miscellaneous'), -] - - -# -- Options for Epub output ------------------------------------------------- - -# Bibliographic Dublin Core info. -epub_title = project - -# The unique identifier of the text. This can be a ISBN number -# or the project homepage. -# -# epub_identifier = '' - -# A unique identification for the text. -# -# epub_uid = '' - -# A list of files that should not be packed into the epub file. -epub_exclude_files = ['search.html'] - - -sphinx_gallery_conf = { - 'examples_dirs': [os.path.join(main_root, 'Examples', 'base'), - os.path.join(main_root, 'Examples', 'fitting')], # path to your example scripts - 'gallery_dirs': ['base_examples', 'fitting_examples'], # path to where to save gallery generated output - 'backreferences_dir': 'gen_modules/backreferences', # directory where function/class granular galleries are stored - # Modules for which function/class level galleries are created. In - # this case sphinx_gallery and numpy in a tuple of strings. - 'doc_module': ('sphinx_gallery', 'numpy', 'EasyScience'), -} \ No newline at end of file diff --git a/docs/src/fitting/introduction.rst b/docs/src/fitting/introduction.rst deleted file mode 100644 index 0a694090..00000000 --- a/docs/src/fitting/introduction.rst +++ /dev/null @@ -1,362 +0,0 @@ -====================== -Fitting in EasyScience -====================== - -EasyScience provides a flexible and powerful fitting framework that supports multiple optimization backends. -This guide covers both basic usage for users wanting to fit their data, and advanced patterns for developers building scientific components. - -Overview --------- - -The EasyScience fitting system consists of: - -* **Parameters**: Scientific values with units, bounds, and fitting capabilities -* **Models**: Objects containing parameters, inheriting from ``ObjBase`` -* **Fitter**: The main fitting engine supporting multiple minimizers -* **Minimizers**: Backend optimization engines (LMFit, Bumps, DFO-LS) - -Quick Start ------------ - -Basic Parameter and Model Setup -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: python - - import numpy as np - from easyscience import ObjBase, Parameter, Fitter - - # Create a simple model with fittable parameters - class SineModel(ObjBase): - def __init__(self, amplitude_val=1.0, frequency_val=1.0, phase_val=0.0): - amplitude = Parameter("amplitude", amplitude_val, min=0, max=10) - frequency = Parameter("frequency", frequency_val, min=0.1, max=5) - phase = Parameter("phase", phase_val, min=-np.pi, max=np.pi) - super().__init__("sine_model", amplitude=amplitude, frequency=frequency, phase=phase) - - def __call__(self, x): - return self.amplitude.value * np.sin(2 * np.pi * self.frequency.value * x + self.phase.value) - -Basic Fitting Example -~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: python - - # Create test data - x_data = np.linspace(0, 2, 100) - true_model = SineModel(amplitude_val=2.5, frequency_val=1.5, phase_val=0.5) - y_data = true_model(x_data) + 0.1 * np.random.normal(size=len(x_data)) - - # Create model to fit with initial guesses - fit_model = SineModel(amplitude_val=1.0, frequency_val=1.0, phase_val=0.0) - - # Set which parameters to fit (unfix them) - fit_model.amplitude.fixed = False - fit_model.frequency.fixed = False - fit_model.phase.fixed = False - - # Create fitter and perform fit - fitter = Fitter(fit_model, fit_model) - result = fitter.fit(x=x_data, y=y_data) - - # Access results - print(f"Chi-squared: {result.chi2}") - print(f"Fitted amplitude: {fit_model.amplitude.value} ± {fit_model.amplitude.error}") - print(f"Fitted frequency: {fit_model.frequency.value} ± {fit_model.frequency.error}") - -Available Minimizers --------------------- - -EasyScience supports multiple optimization backends: - -.. code-block:: python - - from easyscience import AvailableMinimizers - - # View all available minimizers - fitter = Fitter(model, model) - print(fitter.available_minimizers) - # Output: ['LMFit', 'LMFit_leastsq', 'LMFit_powell', 'Bumps', 'Bumps_simplex', 'DFO', 'DFO_leastsq'] - -Switching Minimizers -~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: python - - # Use LMFit (default) - fitter.switch_minimizer(AvailableMinimizers.LMFit) - result1 = fitter.fit(x=x_data, y=y_data) - - # Switch to Bumps - fitter.switch_minimizer(AvailableMinimizers.Bumps) - result2 = fitter.fit(x=x_data, y=y_data) - - # Use DFO for derivative-free optimization - fitter.switch_minimizer(AvailableMinimizers.DFO) - result3 = fitter.fit(x=x_data, y=y_data) - -Parameter Management --------------------- - -Setting Bounds and Constraints -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: python - - # Parameter with bounds - param = Parameter(name="amplitude", value=1.0, min=0.0, max=10.0, unit="m") - - # Fix parameter (exclude from fitting) - param.fixed = True - - # Unfix parameter (include in fitting) - param.fixed = False - - # Change bounds dynamically - param.min = 0.5 - param.max = 8.0 - -Parameter Dependencies -~~~~~~~~~~~~~~~~~~~~~~~ - -Parameters can depend on other parameters through expressions: - -.. code-block:: python - - # Create independent parameters - length = Parameter("length", 10.0, unit="m", min=1, max=100) - width = Parameter("width", 5.0, unit="m", min=1, max=50) - - # Create dependent parameter - area = Parameter.from_dependency( - name="area", - dependency_expression="length * width", - dependency_map={"length": length, "width": width} - ) - - # When length or width changes, area updates automatically - length.value = 15.0 - print(area.value) # Will be 75.0 (15 * 5) - -Using make_dependent_on() Method -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can also make an existing parameter dependent on other parameters using the ``make_dependent_on()`` method. This is useful when you want to convert an independent parameter into a dependent one: - -.. code-block:: python - - # Create independent parameters - radius = Parameter("radius", 5.0, unit="m", min=1, max=20) - height = Parameter("height", 10.0, unit="m", min=1, max=50) - volume = Parameter("volume", 100.0, unit="m³") # Initially independent - pi = Parameter("pi", 3.14159, fixed=True) # Constant parameter - - # Make volume dependent on radius and height - volume.make_dependent_on( - dependency_expression="pi * radius**2 * height", - dependency_map={"radius": radius, "height": height, "pi": pi} - ) - - # Now volume automatically updates when radius or height changes - radius.value = 8.0 - print(f"New volume: {volume.value:.2f} m³") # Automatically calculated - - # The parameter becomes dependent and cannot be set directly - try: - volume.value = 200.0 # This will raise an AttributeError - except AttributeError: - print("Cannot set value of dependent parameter directly") - -**What to expect:** - -- The parameter becomes **dependent** and its ``independent`` property becomes ``False`` -- You **cannot directly set** the value, bounds, or variance of a dependent parameter -- The parameter's value is **automatically recalculated** whenever any of its dependencies change -- Dependent parameters **cannot be fitted** (they are automatically fixed) -- The original value, unit, variance, min, and max are **overwritten** by the dependency calculation -- You can **revert to independence** using the ``make_independent()`` method if needed - -Advanced Fitting Options ------------------------- - -Setting Tolerances and Limits -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: python - - fitter = Fitter(model, model) - - # Set convergence tolerance - fitter.tolerance = 1e-8 - - # Limit maximum function evaluations - fitter.max_evaluations = 1000 - - # Perform fit with custom settings - result = fitter.fit(x=x_data, y=y_data) - -Using Weights -~~~~~~~~~~~~~ - -.. code-block:: python - - # Define weights (inverse variance) - weights = 1.0 / errors**2 # where errors are your data uncertainties - - # Fit with weights - result = fitter.fit(x=x_data, y=y_data, weights=weights) - -Multidimensional Fitting -~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: python - - class AbsSin2D(ObjBase): - def __init__(self, offset_val=0.0, phase_val=0.0): - offset = Parameter("offset", offset_val) - phase = Parameter("phase", phase_val) - super().__init__("sin2D", offset=offset, phase=phase) - - def __call__(self, x): - X, Y = x[:, 0], x[:, 1] # x is 2D array - return np.abs(np.sin(self.phase.value * X + self.offset.value)) * \ - np.abs(np.sin(self.phase.value * Y + self.offset.value)) - - # Create 2D data - x_2d = np.column_stack([x_grid.ravel(), y_grid.ravel()]) - - # Fit 2D model - model_2d = AbsSin2D(offset_val=0.1, phase_val=1.0) - model_2d.offset.fixed = False - model_2d.phase.fixed = False - - fitter = Fitter(model_2d, model_2d) - result = fitter.fit(x=x_2d, y=z_data.ravel()) - -Accessing Fit Results ---------------------- - -The ``FitResults`` object contains comprehensive information about the fit: - -.. code-block:: python - - result = fitter.fit(x=x_data, y=y_data) - - # Fit statistics - print(f"Chi-squared: {result.chi2}") - print(f"Reduced chi-squared: {result.reduced_chi}") - print(f"Number of parameters: {result.n_pars}") - print(f"Success: {result.success}") - - # Parameter values and uncertainties - for param_name, value in result.p.items(): - error = result.errors.get(param_name, 0.0) - print(f"{param_name}: {value} ± {error}") - - # Calculated values and residuals - y_calculated = result.y_calc - residuals = result.residual - - # Plot results - import matplotlib.pyplot as plt - plt.figure(figsize=(10, 4)) - plt.subplot(121) - plt.plot(x_data, y_data, 'o', label='Data') - plt.plot(x_data, y_calculated, '-', label='Fit') - plt.legend() - plt.subplot(122) - plt.plot(x_data, residuals, 'o') - plt.axhline(0, color='k', linestyle='--') - plt.ylabel('Residuals') - -Developer Guidelines ---------------------- - -Creating Custom Models -~~~~~~~~~~~~~~~~~~~~~~ - -For developers building scientific components: - -.. code-block:: python - - from easyscience import ObjBase, Parameter - - class CustomModel(ObjBase): - def __init__(self, param1_val=1.0, param2_val=0.0): - # Always create Parameters with appropriate bounds and units - param1 = Parameter("param1", param1_val, min=-10, max=10, unit="m/s") - param2 = Parameter("param2", param2_val, min=0, max=1, fixed=True) - - # Call parent constructor with named parameters - super().__init__("custom_model", param1=param1, param2=param2) - - def __call__(self, x): - # Implement your model calculation - return self.param1.value * x + self.param2.value - - def get_fit_parameters(self): - # This is automatically implemented by ObjBase - # Returns only non-fixed parameters - return super().get_fit_parameters() - -Best Practices -~~~~~~~~~~~~~~ - -1. **Always set appropriate bounds** on parameters to constrain the search space -2. **Use meaningful units** for physical parameters -3. **Fix parameters** that shouldn't be optimized -4. **Test with different minimizers** for robustness -5. **Validate results** by checking chi-squared and residuals - -Error Handling -~~~~~~~~~~~~~~ - -.. code-block:: python - - from easyscience.fitting.minimizers import FitError - - try: - result = fitter.fit(x=x_data, y=y_data) - if not result.success: - print(f"Fit failed: {result.message}") - except FitError as e: - print(f"Fitting error: {e}") - except Exception as e: - print(f"Unexpected error: {e}") - -Testing Patterns -~~~~~~~~~~~~~~~~ - -When writing tests for fitting code: - -.. code-block:: python - - import pytest - from easyscience import global_object - - @pytest.fixture - def clear_global_map(): - """Clear global map before each test""" - global_object.map._clear() - yield - global_object.map._clear() - - def test_model_fitting(clear_global_map): - # Create model and test fitting - model = CustomModel() - model.param1.fixed = False - - # Generate test data - x_test = np.linspace(0, 10, 50) - y_test = 2.5 * x_test + 0.1 * np.random.normal(size=len(x_test)) - - # Fit and verify - fitter = Fitter(model, model) - result = fitter.fit(x=x_test, y=y_test) - - assert result.success - assert model.param1.value == pytest.approx(2.5, abs=0.1) - -This comprehensive guide covers the essential aspects of fitting in EasyScience, from basic usage to advanced developer patterns. -The examples are drawn from the actual test suite and demonstrate real-world usage patterns. - diff --git a/docs/src/getting-started/installation.rst b/docs/src/getting-started/installation.rst deleted file mode 100644 index 4d0cef44..00000000 --- a/docs/src/getting-started/installation.rst +++ /dev/null @@ -1,33 +0,0 @@ -************ -Installation -************ - -**EasyScience** requires Python 3.11 or above. - -Install via ``pip`` -------------------- - -The easiest way of obtaining EasyScience and using it in your project is via pip. You can install directly by using: - -.. code-block:: console - - $ pip install EasyScience - -Install as an EasyScience developer ------------------------------------ - -You can obtain the latest development source from our `Github repository -`_.: - -.. code-block:: console - - $ git clone https://github.com/easyscience/corelib - $ cd corelib - -And install via pip: - -.. code-block:: console - - $ pip install -e . - -.. installation-end-content \ No newline at end of file diff --git a/docs/src/getting-started/overview.rst b/docs/src/getting-started/overview.rst deleted file mode 100644 index d5516a1c..00000000 --- a/docs/src/getting-started/overview.rst +++ /dev/null @@ -1,224 +0,0 @@ -.. _overview: - -Overview -======== - -EasyScience is a foundational Python library that provides the building blocks for scientific data simulation, analysis, and fitting. -It implements a descriptor-based object system with global state management, making it easy to create scientific models with parameters -that have units, bounds, and dependencies. - -What is EasyScience? --------------------- - -EasyScience serves as the core foundation for the EasyScience family of projects, offering: - -* **Scientific Parameters**: Values with units, uncertainties, bounds, and fitting capabilities -* **Model Building**: Base classes for creating complex scientific models -* **Multi-backend Fitting**: Support for LMFit, Bumps, and DFO-LS optimization engines -* **Parameter Dependencies**: Express relationships between parameters through mathematical expressions -* **Serialization**: Save and load complete model states including parameter relationships -* **Undo/Redo System**: Track and revert changes to model parameters -* **Global State Management**: Unified tracking of all objects and their relationships - -Key Concepts ------------- - -Descriptor-Based Architecture -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -EasyScience uses a hierarchical descriptor system: - -.. code-block:: python - - from easyscience import Parameter, ObjBase - - # Scientific parameter with units and bounds - temperature = Parameter( - name="temperature", - value=300.0, - unit="K", - min=0, - max=1000, - description="Sample temperature" - ) - - # Model containing parameters - class ThermalModel(ObjBase): - def __init__(self, temp_val=300.0, coeff_val=1.0): - temperature = Parameter("temperature", temp_val, unit="K", min=0, max=1000) - coefficient = Parameter("coefficient", coeff_val, min=0, max=10) - super().__init__("thermal_model", temperature=temperature, coefficient=coefficient) - -The hierarchy flows from: - -* ``DescriptorBase`` → ``DescriptorNumber`` → ``Parameter`` (fittable scientific values) -* ``BasedBase`` → ``ObjBase`` (containers for parameters and scientific models) -* ``CollectionBase`` (mutable sequences of scientific objects) - -Units and Physical Quantities -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -EasyScience integrates with `scipp `_ for robust unit handling: - -.. code-block:: python - - # Parameters automatically handle units - length = Parameter("length", 100, unit="cm", min=0, max=1000) - - # Unit conversions are automatic - length.convert_unit("m") - print(length.value) # 1.0 - print(length.unit) # m - - # Arithmetic operations preserve units - area = length * length # Results in m^2 - -Parameter Dependencies -~~~~~~~~~~~~~~~~~~~~~~~ - -Parameters can depend on other parameters through mathematical expressions: - -.. code-block:: python - - # Independent parameters - radius = Parameter("radius", 5.0, unit="m", min=0, max=100) - height = Parameter("height", 10.0, unit="m", min=0, max=200) - - # Dependent parameter using mathematical expression - volume = Parameter.from_dependency( - name="volume", - dependency_expression="3.14159 * radius**2 * height", - dependency_map={"radius": radius, "height": height} - ) - - # Automatic updates - radius.value = 10.0 - print(volume.value) # Automatically recalculated - -Global State Management -~~~~~~~~~~~~~~~~~~~~~~~ - -All EasyScience objects register with a global map for dependency tracking: - -.. code-block:: python - - from easyscience import global_object - - # All objects are automatically tracked - param = Parameter("test", 1.0) - print(param.unique_name) # Automatically generated unique identifier - - # Access global registry - all_objects = global_object.map.vertices() - - # Clear for testing (important in unit tests) - global_object.map._clear() - -Fitting and Optimization -~~~~~~~~~~~~~~~~~~~~~~~~~ - -EasyScience provides a unified interface to multiple optimization backends: - -.. code-block:: python - - from easyscience import Fitter, AvailableMinimizers - - # Create fitter with model - fitter = Fitter(model, model) # model serves as both object and function - - # Switch between different optimizers - fitter.switch_minimizer(AvailableMinimizers.LMFit) # Levenberg-Marquardt - fitter.switch_minimizer(AvailableMinimizers.Bumps) # Bayesian inference - fitter.switch_minimizer(AvailableMinimizers.DFO) # Derivative-free - - # Perform fit - result = fitter.fit(x=x_data, y=y_data, weights=weights) - -Serialization and Persistence -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Complete model states can be saved and restored: - -.. code-block:: python - - # Save model to dictionary - model_dict = model.as_dict() - - # Save to JSON - import json - with open('model.json', 'w') as f: - json.dump(model_dict, f, indent=2, default=str) - - # Restore model - with open('model.json', 'r') as f: - loaded_dict = json.load(f) - - new_model = Model.from_dict(loaded_dict) - - # Resolve parameter dependencies after loading - from easyscience.variable.parameter_dependency_resolver import resolve_all_parameter_dependencies - resolve_all_parameter_dependencies(new_model) - -Use Cases ---------- - -EasyScience is designed for: - -Scientific Modeling -~~~~~~~~~~~~~~~~~~~~ - -* Creating physics-based models with parameters that have physical meaning -* Handling units consistently throughout calculations -* Managing complex parameter relationships and constraints - -Data Fitting and Analysis -~~~~~~~~~~~~~~~~~~~~~~~~~ - -* Fitting experimental data to theoretical models -* Comparing different optimization algorithms -* Uncertainty quantification and error propagation - -Software Development -~~~~~~~~~~~~~~~~~~~~ - -* Building domain-specific scientific applications -* Creating reusable model components -* Implementing complex scientific workflows - -Research and Education -~~~~~~~~~~~~~~~~~~~~~~ - -* Reproducible scientific computing -* Teaching scientific programming concepts -* Collaborative model development - -Architecture Benefits ---------------------- - -**Type Safety**: Strong typing with unit checking prevents common errors - -**Flexibility**: Multiple optimization backends allow algorithm comparison - -**Extensibility**: Descriptor pattern makes it easy to add new parameter types - -**Reproducibility**: Complete serialization enables exact state restoration - -**Performance**: Efficient observer pattern minimizes unnecessary recalculations - -**Testing**: Global state management with cleanup utilities supports robust testing - -Getting Started ---------------- - -The best way to learn EasyScience is through examples: - -1. **Basic Usage**: Start with simple parameters and models -2. **Fitting Tutorial**: Learn the fitting system with real data -3. **Advanced Features**: Explore parameter dependencies and serialization -4. **Development Guide**: Build your own scientific components - -See the :doc:`installation` guide to get started, then explore the :doc:`../fitting/introduction` for practical examples. - -EasyScience forms the foundation for more specialized packages in the EasyScience ecosystem, providing the core abstractions that make scientific computing more accessible and reliable. - - diff --git a/docs/src/index.rst b/docs/src/index.rst deleted file mode 100644 index 10f795a8..00000000 --- a/docs/src/index.rst +++ /dev/null @@ -1,181 +0,0 @@ -======================================= -Welcome to EasyScience's documentation! -======================================= - -**EasyScience** is a foundational Python library that provides the building blocks for scientific data simulation, analysis, and fitting. -It implements a descriptor-based object system with global state management, making it easier to create scientific models with parameters -that have units, bounds, and dependencies. - -.. code-block:: python - - from easyscience import Parameter, ObjBase, Fitter - - # Create a model with scientific parameters - class SineModel(ObjBase): - def __init__(self, amplitude=1.0, frequency=1.0, phase=0.0): - amp = Parameter("amplitude", amplitude, min=0, max=10, unit="V") - freq = Parameter("frequency", frequency, min=0.1, max=5, unit="Hz") - phase = Parameter("phase", phase, min=-3.14, max=3.14, unit="rad") - super().__init__("sine_model", amplitude=amp, frequency=freq, phase=phase) - - def __call__(self, x): - return self.amplitude.value * np.sin(2*np.pi*self.frequency.value*x + self.phase.value) - - # Fit to experimental data - model = SineModel() - model.amplitude.fixed = False # Allow fitting - fitter = Fitter(model, model) - result = fitter.fit(x=x_data, y=y_data) - -Key Features -============ - -**Scientific Parameters with Units** - Parameters automatically handle physical units, bounds, and uncertainties using `scipp `_ integration. - -**Parameter Dependencies** - Express mathematical relationships between parameters that update automatically when dependencies change. - -**Multi-Backend Fitting** - Unified interface to LMFit, Bumps, and DFO-LS optimization engines with easy algorithm comparison. - -**Complete Serialization** - Save and restore entire model states including parameter relationships and dependencies. - -**Global State Management** - Automatic tracking of all objects and their relationships with built-in undo/redo capabilities. - -**Developer-Friendly** - Clean APIs, comprehensive testing utilities, and extensive documentation for building scientific applications. - -Why EasyScience? -================ - -**Type Safety & Units** - Prevent common scientific computing errors with automatic unit checking and strong typing. - -**Reproducible Research** - Complete state serialization ensures exact reproducibility of scientific analyses. - -**Algorithm Flexibility** - Compare different optimization approaches without changing your model code. - -**Extensible Architecture** - Descriptor pattern makes it easy to create new parameter types and model components. - -Open Source & Cross-Platform -============================ - -EasyScience is free and open-source software with the source code openly shared on `GitHub repository `_. - -* **Cross-platform** - Written in Python and available for Windows, macOS, and Linux -* **Well-tested** - Comprehensive test suite ensuring reliability across platforms -* **Community-driven** - Open to contributions and feature requests -* **Production-ready** - Used in multiple scientific applications worldwide - - -Projects Built with EasyScience -=============================== - -EasyScience serves as the foundation for several scientific applications: - -**easyDiffraction** - .. image:: https://raw.githubusercontent.com/easyScience/easyDiffractionWww/master/assets/img/card.png - :target: https://easydiffraction.org - :width: 300px - - Scientific software for modeling and analysis of neutron diffraction data, providing an intuitive interface for crystallographic refinement. - -**easyReflectometry** - .. image:: https://raw.githubusercontent.com/easyScience/easyReflectometryWww/master/assets/img/card.png - :target: https://easyreflectometry.org - :width: 300px - - Scientific software for modeling and analysis of neutron reflectometry data, enabling detailed study of thin film structures. - -**Your Project Here** - EasyScience's flexible architecture makes it ideal for building domain-specific scientific applications. The comprehensive API and documentation help you get started quickly. - -Quick Start -=========== - -Ready to begin? Here's how to get started: - -1. **Install EasyScience**: ``pip install easyscience`` -2. **Read the Overview**: Understand the core concepts and architecture -3. **Try the Examples**: Work through practical fitting examples -4. **Explore the API**: Dive into the comprehensive reference documentation - -.. code-block:: bash - - pip install easyscience - -Then explore the tutorials and examples to learn the key concepts! - -Documentation Guide -=================== - -.. toctree:: - :caption: Getting Started - :maxdepth: 2 - :titlesonly: - - getting-started/overview - getting-started/installation - -New to EasyScience? Start with the :doc:`getting-started/overview` to understand the core concepts, then follow the :doc:`getting-started/installation` guide. - -.. toctree:: - :caption: User Guides - :maxdepth: 2 - :titlesonly: - - fitting/introduction - -Learn how to use EasyScience for scientific modeling and data fitting with comprehensive examples and best practices. - -.. toctree:: - :caption: API Reference - :maxdepth: 2 - :titlesonly: - - reference/base - -Complete API documentation for all classes, methods, and functions in EasyScience. - -.. toctree:: - :caption: Examples - :maxdepth: 2 - :titlesonly: - - base_examples/index - fitting_examples/index - -Practical examples and tutorials demonstrating real-world usage patterns. - -Need Help? -========== - -* **GitHub Issues**: Report bugs or request features on `GitHub Issues `_ -* **Discussions**: Ask questions in `GitHub Discussions `_ -* **API Reference**: Complete documentation of all classes and methods -* **Examples**: Practical tutorials and code samples - -Contributing -============ - -EasyScience is developed openly and welcomes contributions! Whether you're fixing bugs, adding features, improving documentation, or sharing usage examples, your contributions help make scientific computing more accessible. - -Visit our `GitHub repository `_ to: - -* Report issues or suggest features -* Submit pull requests -* Join discussions about development -* Help improve documentation - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` \ No newline at end of file diff --git a/docs/src/reference/base.rst b/docs/src/reference/base.rst deleted file mode 100644 index 1d91803c..00000000 --- a/docs/src/reference/base.rst +++ /dev/null @@ -1,323 +0,0 @@ -============== -API Reference -============== - -This reference provides detailed documentation for all EasyScience classes and functions. - -Core Variables and Descriptors -============================== - -Descriptor Base Classes ------------------------ - -.. autoclass:: easyscience.variable.DescriptorBase - :members: - :inherited-members: - :show-inheritance: - -.. autoclass:: easyscience.variable.DescriptorNumber - :members: - :inherited-members: - :show-inheritance: - -.. autoclass:: easyscience.variable.DescriptorArray - :members: - :inherited-members: - :show-inheritance: - -.. autoclass:: easyscience.variable.DescriptorStr - :members: - :inherited-members: - :show-inheritance: - -.. autoclass:: easyscience.variable.DescriptorBool - :members: - :inherited-members: - :show-inheritance: - -.. autoclass:: easyscience.variable.DescriptorAnyType - :members: - :inherited-members: - :show-inheritance: - -Parameters ----------- - -.. autoclass:: easyscience.variable.Parameter - :members: - :inherited-members: - :show-inheritance: - - The Parameter class extends DescriptorNumber with fitting capabilities, bounds, and dependency relationships. - - **Key Methods:** - - .. automethod:: from_dependency - :noindex: - .. automethod:: make_dependent_on - :noindex: - .. automethod:: make_independent - :noindex: - .. automethod:: resolve_pending_dependencies - :noindex: - -Base Classes for Models -======================= - -BasedBase ---------- - -.. autoclass:: easyscience.base_classes.BasedBase - :members: - :inherited-members: - :show-inheritance: - - Base class providing serialization, global object registration, and interface management. - -ObjBase -------- - -.. autoclass:: easyscience.base_classes.ObjBase - :members: - :inherited-members: - :show-inheritance: - - Container class for creating scientific models with parameters. All user-defined models should inherit from this class. - - **Key Methods:** - - .. automethod:: get_fit_parameters - :noindex: - .. automethod:: get_parameters - :noindex: - .. automethod:: _add_component - -Collections ------------ - -.. autoclass:: easyscience.base_classes.CollectionBase - :members: - :inherited-members: - :show-inheritance: - - Mutable sequence container for scientific objects with automatic parameter tracking. - -Fitting and Optimization -========================= - -Fitter -------- - -.. autoclass:: easyscience.fitting.Fitter - :members: - :show-inheritance: - - Main fitting engine supporting multiple optimization backends. - - **Key Methods:** - - .. autoproperty:: fit - :noindex: - .. automethod:: switch_minimizer - :noindex: - .. automethod:: make_model - .. automethod:: evaluate - -Available Minimizers --------------------- - -.. autoclass:: easyscience.fitting.AvailableMinimizers - :members: - :show-inheritance: - - Enumeration of available optimization backends. - -Fit Results ------------ - -.. autoclass:: easyscience.fitting.FitResults - :members: - :show-inheritance: - - Container for fitting results including parameters, statistics, and diagnostics. - -Minimizer Base Classes ----------------------- - -.. autoclass:: easyscience.fitting.minimizers.MinimizerBase - :members: - :show-inheritance: - - Abstract base class for all minimizer implementations. - -.. autoclass:: easyscience.fitting.minimizers.LMFit - :members: - :show-inheritance: - - LMFit-based minimizer implementation. - -.. autoclass:: easyscience.fitting.minimizers.Bumps - :members: - :show-inheritance: - - Bumps-based minimizer implementation. - -.. autoclass:: easyscience.fitting.minimizers.DFO - :members: - :show-inheritance: - - DFO-LS-based minimizer implementation. - -Global State Management -======================== - -Global Object -------------- - -.. autoclass:: easyscience.global_object.GlobalObject - :members: - :show-inheritance: - - Singleton managing global state, logging, and object tracking. - -Object Map ----------- - -.. autoclass:: easyscience.global_object.Map - :members: - :show-inheritance: - - Graph-based registry for tracking object relationships and dependencies. - -Undo/Redo System ----------------- - -.. autoclass:: easyscience.global_object.undo_redo.UndoStack - :members: - :show-inheritance: - - Stack-based undo/redo system for parameter changes. - -Serialization and I/O -===================== - -Serializer Components ---------------------- - -.. autoclass:: easyscience.io.SerializerComponent - :members: - :show-inheritance: - - Base class providing serialization capabilities. - -.. autoclass:: easyscience.io.SerializerDict - :members: - :show-inheritance: - - Dictionary-based serialization implementation. - -.. autoclass:: easyscience.io.SerializerBase - :members: - :show-inheritance: - - Base serialization functionality. - -Models and Examples -=================== - -Polynomial Model ----------------- - -.. autoclass:: easyscience.models.Polynomial - :members: - :show-inheritance: - - Built-in polynomial model for demonstration and testing. - -Job Management -============== - -Analysis and Experiments ------------------------- - -.. autoclass:: easyscience.job.AnalysisBase - :members: - :show-inheritance: - -.. autoclass:: easyscience.job.ExperimentBase - :members: - :show-inheritance: - -.. autoclass:: easyscience.job.JobBase - :members: - :show-inheritance: - -.. autoclass:: easyscience.job.TheoreticalModelBase - :members: - :show-inheritance: - -Utility Functions -================= - -Decorators ----------- - -.. autofunction:: easyscience.global_object.undo_redo.property_stack - - Decorator for properties that should be tracked in the undo/redo system. - -Class Tools ------------ - -.. autofunction:: easyscience.utils.classTools.addLoggedProp - - Utility for adding logged properties to classes. - -String Utilities ----------------- - -.. automodule:: easyscience.utils.string - :members: - -Parameter Dependencies ------------------------ - -.. autofunction:: easyscience.variable.parameter_dependency_resolver.resolve_all_parameter_dependencies - - Resolve all pending parameter dependencies after deserialization. - -.. autofunction:: easyscience.variable.parameter_dependency_resolver.get_parameters_with_pending_dependencies - - Find parameters that have unresolved dependencies. - -Constants and Enumerations -=========================== - -.. autodata:: easyscience.global_object - :annotation: GlobalObject - - Global singleton instance managing application state. - -Exception Classes -================= - -.. autoclass:: easyscience.fitting.minimizers.FitError - :show-inheritance: - - Exception raised when fitting operations fail. - -.. autoclass:: scipp.UnitError - :show-inheritance: - - Exception raised for unit-related errors (from scipp dependency). - -Usage Examples -============== - -For practical usage examples and tutorials, see: - -* :doc:`../getting-started/overview` - Introduction and key concepts -* :doc:`../fitting/introduction` - Comprehensive fitting guide -* :doc:`../getting-started/installation` - Installation instructions - -The API reference covers all public classes and methods. For implementation details and advanced usage patterns, refer to the source code and test suites in the repository. diff --git a/pixi.lock b/pixi.lock index 729c76c2..d1d1877c 100644 --- a/pixi.lock +++ b/pixi.lock @@ -11,442 +11,996 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py313h843e2db_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py313heb322e3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-hbf7d49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-bootstrap_ha15bf96_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-25.7.0-he4ff34a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py313h5008379_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/da/875925db2ed80dc7b919b2817da555848b608620be9662c5f835670d5d8d/asteval-1.0.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/8b/371ab3cec97ee3fe1126b3406b7abd60c8fec8975fd79a3c75cdea0c3d83/fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/3d/020a6b6248c3d4a37797db068256f0b3f15b01bc481327ba888c50309aa8/mkdocs_plugin_inline_svg-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/83/36557b04cfdc317ed8a525c4993b23e43a8fbcddaddd78619112ca07138c/msgspec-0.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/be/b257e12f9710819fde40adc972578bee6b72c5992da1bc8369bef2597756/nbmake-1.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/16/e777eadfa0c0305878c36fae1d5e6db474fbb15dae202b9ec378809dfb4d/nbstripout-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/f7/d00d9b4a0313a6be3a3e0818e6375e15da6d7076f4ae47d1324e7ca986a1/radon-6.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/77/34/1956aed61c4abb91926f9513330afac4654cc2a711ecb73085dc4e2e5c1d/scipp-25.11.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ee/e9c95cda829131f71a8dff5ce0406059fd16e591c074414e31ada19ba7c3/validate_pyproject-0.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bcrypt-5.0.0-py313hcc225dc_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py313hf57695f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cryptography-46.0.5-py313h6e3882f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gsl-2.8-hc707ee6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.0-h19cb2f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_18.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.21-hc6ced15_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.0-h86bffb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.3-py313h0f4d31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.0-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.7.0-hf6efa0e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pynacl-1.6.2-py313hf61a874_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.3-py313h7c6a591_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/da/875925db2ed80dc7b919b2817da555848b608620be9662c5f835670d5d8d/asteval-1.0.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d6/8a/de9cc0540f542963ba5e8f3a1f6ad48fa211badc3177783b9d5cadf79b5d/fonttools-4.60.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/3d/020a6b6248c3d4a37797db068256f0b3f15b01bc481327ba888c50309aa8/mkdocs_plugin_inline_svg-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8a/d1/b902d38b6e5ba3bdddbec469bba388d647f960aeed7b5b3623a8debe8a76/msgspec-0.20.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/be/b257e12f9710819fde40adc972578bee6b72c5992da1bc8369bef2597756/nbmake-1.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/16/e777eadfa0c0305878c36fae1d5e6db474fbb15dae202b9ec378809dfb4d/nbstripout-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/f7/d00d9b4a0313a6be3a3e0818e6375e15da6d7076f4ae47d1324e7ca986a1/radon-6.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/f2/18d5be10ac890ce7490451eb55d41bf9d96e481751362a30ed1a8bc176fa/scipp-25.11.0-cp313-cp313-macosx_11_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ee/e9c95cda829131f71a8dff5ce0406059fd16e591c074414e31ada19ba7c3/validate_pyproject-0.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bcrypt-5.0.0-py313h2c089d5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-46.0.5-py313he3f6fad_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.8-h8d0574d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.7.0-hbfc8e16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py313h6940bce_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h65a2061_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/da/875925db2ed80dc7b919b2817da555848b608620be9662c5f835670d5d8d/asteval-1.0.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7c/5b/cdd2c612277b7ac7ec8c0c9bc41812c43dc7b2d5f2b0897e15fdf5a1f915/fonttools-4.60.1-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/3d/020a6b6248c3d4a37797db068256f0b3f15b01bc481327ba888c50309aa8/mkdocs_plugin_inline_svg-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/57/b6/eff0305961a1d9447ec2b02f8c73c8946f22564d302a504185b730c9a761/msgspec-0.20.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/be/b257e12f9710819fde40adc972578bee6b72c5992da1bc8369bef2597756/nbmake-1.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/16/e777eadfa0c0305878c36fae1d5e6db474fbb15dae202b9ec378809dfb4d/nbstripout-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/f7/d00d9b4a0313a6be3a3e0818e6375e15da6d7076f4ae47d1324e7ca986a1/radon-6.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/64/7c/d8a343b0a622987335a1ac848084079c47c21e44fcc450f9c145b11a56f6/scipp-25.11.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ee/e9c95cda829131f71a8dff5ce0406059fd16e591c074414e31ada19ba7c3/validate_pyproject-0.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bcrypt-5.0.0-py313hfbe8231_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-46.0.5-py313hf5c5e30_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gsl-2.8-h5b8d9c4_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py313hd650c13_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.7.0-h80d1838_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pynacl-1.6.2-py313hed4ef92_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py313h40c08fc_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh07e9846_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/da/875925db2ed80dc7b919b2817da555848b608620be9662c5f835670d5d8d/asteval-1.0.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/75/4d/b022c1577807ce8b31ffe055306ec13a866f2337ecee96e75b24b9b753ea/fonttools-4.60.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/3d/020a6b6248c3d4a37797db068256f0b3f15b01bc481327ba888c50309aa8/mkdocs_plugin_inline_svg-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/f1/25/5e8080fe0117f799b1b68008dc29a65862077296b92550632de015128579/msgspec-0.20.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/be/b257e12f9710819fde40adc972578bee6b72c5992da1bc8369bef2597756/nbmake-1.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/16/e777eadfa0c0305878c36fae1d5e6db474fbb15dae202b9ec378809dfb4d/nbstripout-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/f7/d00d9b4a0313a6be3a3e0818e6375e15da6d7076f4ae47d1324e7ca986a1/radon-6.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/f6/f3/9d1bb423a2dc0bbebfc98191095dd410a1268397b9c692d76a3ea971c790/scipp-25.11.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ee/e9c95cda829131f71a8dff5ce0406059fd16e591c074414e31ada19ba7c3/validate_pyproject-0.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ - dev: + py-311-env: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -455,1053 +1009,2289 @@ environments: pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py313h843e2db_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py313heb322e3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-bootstrap_ha15bf96_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-hbf7d49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py313h5008379_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl + - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-25.7.0-he4ff34a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hd63d673_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/da/875925db2ed80dc7b919b2817da555848b608620be9662c5f835670d5d8d/asteval-1.0.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/f0/35240571e1b67ffb19dafb29ab34150b6f59f93f717b041082cdb1bfceb1/backrefs-6.2-py311-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/46/eb6eca305c77a4489affe1c5d8f4cae82f285d9addd8de4ec084a7184221/cachetools-6.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/76/b6/67d7c0e1f400b32c883e9342de4a8c2ae7c1a0b57c5de87622b7262e2309/coverage-7.12.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b0/d0/89247ec250369fc76db477720a26b2fce7ba079ff1380e4ab4529d2fe233/debugpy-1.8.17-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/e9/90b7d243364d3dce38c8c2a1b8c103d7a8d1383c2b24c735fae0eee038dd/doc8-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2d/8b/371ab3cec97ee3fe1126b3406b7abd60c8fec8975fd79a3c75cdea0c3d83/fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/61/1ca198af22f7dd22c17ab86e9024ed3c06299cfdb08170640e9996d501a0/fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/23/4ab1108e87851ccc69694b03b817d92e142966a6c4abd99e17db77f2c066/h5py-3.15.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/aa/62893d6a591d337aa59dcc4c6f6c842f1fe20cd72c8c5c1f980255243252/ipython-9.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/1e/5a4d5498eba382fee667ed797cf64ae5d1b13b04356df62f067f48bb0f61/jupyterlab-4.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/3d/020a6b6248c3d4a37797db068256f0b3f15b01bc481327ba888c50309aa8/mkdocs_plugin_inline_svg-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6b/96/5c095b940de3aa6b43a71ec76275ac3537b21bd45c7499b5a17a429110fa/msgspec-0.20.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/be/b257e12f9710819fde40adc972578bee6b72c5992da1bc8369bef2597756/nbmake-1.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/16/e777eadfa0c0305878c36fae1d5e6db474fbb15dae202b9ec378809dfb4d/nbstripout-0.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/42/0f/c76bf3dba22c73c38e9b1113b017cf163f7696f50e003404ec5ecdb1e8a6/nh3-0.3.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/ce/b1/5f49af514f76431ba4eea935b8ad3725cdeb397e9245ab919dbc1d1dc20f/psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0b/8b/6300fb80f858cda1c51ffa17075df5d846757081d11ab4aa35cef9e6258b/pytest-9.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/f7/d00d9b4a0313a6be3a3e0818e6375e15da6d7076f4ae47d1324e7ca986a1/radon-6.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/63/ac52b32b33ae62f2076ed5c4f6b00e065e3ccbb2063e9a2e813b2bfc95bf/restructuredtext_lint-2.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/42/555b4ee17508beafac135c8b450816ace5a96194ce97fefc49d58e5652ea/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/13/ac/9b9fe63716af8bdfddfacd0882bc1586f29985d3b988b3c62ddce2e202c3/ruff-0.14.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/77/34/1956aed61c4abb91926f9513330afac4654cc2a711ecb73085dc4e2e5c1d/scipp-25.11.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3c/96/565e32544b31d46707370ba9153c98e3d6e2ade120130f0c7c22dfc9d48a/scipp-26.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/9e/c41d68be04eef5b6202b468e0f90faf0c469f3a03353f2a218fd78279710/sphinx_book_theme-1.1.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/c7/52b48aec16b26c52aba854d03a3a31e0681150301dac1bea2243645a69e7/sphinx_gallery-0.19.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f4/40/8561ce06dc46fd17242c7724ab25b257a2ac1b35f4ebf551b40ce6105cfa/stevedore-5.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f9/41/fb15f06e33d7430ca89420283a8762a4e6b8025b800ea51796ab5e6d9559/tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/fc/cc/e09c0d663a004945f82beecd4f147053567910479314e8d01ba71e5d5dea/tox-4.32.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/9e/8d50f3b3fc4af8c73154f64d4a2293bfa2d517a19000e70ef2d614254084/tox_gh_actions-3.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ee/e9c95cda829131f71a8dff5ce0406059fd16e591c074414e31ada19ba7c3/validate_pyproject-0.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9a/64/c53487d9f4968045b8afa51aed7ca44f58b2589e772f32745f3744476c82/yarl-1.23.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bcrypt-5.0.0-py313hcc225dc_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py313hf57695f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cryptography-46.0.5-py313h6e3882f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.21-hc6ced15_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.0-h86bffb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gsl-2.8-hc707ee6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.0-h19cb2f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.3-py313h0f4d31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.0-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pynacl-1.6.2-py313hf61a874_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.3-py313h7c6a591_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl + - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.7.0-hf6efa0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.14-h74c2667_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/da/875925db2ed80dc7b919b2817da555848b608620be9662c5f835670d5d8d/asteval-1.0.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/f0/35240571e1b67ffb19dafb29ab34150b6f59f93f717b041082cdb1bfceb1/backrefs-6.2-py311-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/46/eb6eca305c77a4489affe1c5d8f4cae82f285d9addd8de4ec084a7184221/cachetools-6.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b8/14/771700b4048774e48d2c54ed0c674273702713c9ee7acdfede40c2666747/coverage-7.12.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b0/d0/89247ec250369fc76db477720a26b2fce7ba079ff1380e4ab4529d2fe233/debugpy-1.8.17-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/e9/90b7d243364d3dce38c8c2a1b8c103d7a8d1383c2b24c735fae0eee038dd/doc8-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d6/8a/de9cc0540f542963ba5e8f3a1f6ad48fa211badc3177783b9d5cadf79b5d/fonttools-4.60.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ac/49/4138d1acb6261499bedde1c07f8c2605d1d8f9d77a151e5507fd3ef084b6/fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/fd/8349b48b15b47768042cff06ad6e1c229f0a4bd89225bf6b6894fea27e6d/h5py-3.15.1-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/aa/62893d6a591d337aa59dcc4c6f6c842f1fe20cd72c8c5c1f980255243252/ipython-9.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/1e/5a4d5498eba382fee667ed797cf64ae5d1b13b04356df62f067f48bb0f61/jupyterlab-4.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/3d/020a6b6248c3d4a37797db068256f0b3f15b01bc481327ba888c50309aa8/mkdocs_plugin_inline_svg-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/03/59/fdcb3af72f750a8de2bcf39d62ada70b5eb17b06d7f63860e0a679cb656b/msgspec-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/be/b257e12f9710819fde40adc972578bee6b72c5992da1bc8369bef2597756/nbmake-1.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/16/e777eadfa0c0305878c36fae1d5e6db474fbb15dae202b9ec378809dfb4d/nbstripout-0.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/3e/f5a5cc2885c24be13e9b937441bd16a012ac34a657fe05e58927e8af8b7a/nh3-0.3.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/ef/94/46b9154a800253e7ecff5aaacdf8ebf43db99de4a2dfa18575b02548654e/psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0b/8b/6300fb80f858cda1c51ffa17075df5d846757081d11ab4aa35cef9e6258b/pytest-9.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - - pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/f7/d00d9b4a0313a6be3a3e0818e6375e15da6d7076f4ae47d1324e7ca986a1/radon-6.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/63/ac52b32b33ae62f2076ed5c4f6b00e065e3ccbb2063e9a2e813b2bfc95bf/restructuredtext_lint-2.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/d9/c5de60d9d371bbb186c3e9bf75f4fc5665e11117a25a06a6b2e0afb7380e/rpds_py-0.29.0-cp313-cp313-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/36/6a/ad66d0a3315d6327ed6b01f759d83df3c4d5f86c30462121024361137b6a/ruff-0.14.6-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/71/f2/18d5be10ac890ce7490451eb55d41bf9d96e481751362a30ed1a8bc176fa/scipp-25.11.0-cp313-cp313-macosx_11_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/25/23eea063a85cc565c9e67ca0ac36b9b979c9d76215d62096746cdd8770e2/scipp-26.2.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/9e/c41d68be04eef5b6202b468e0f90faf0c469f3a03353f2a218fd78279710/sphinx_book_theme-1.1.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/c7/52b48aec16b26c52aba854d03a3a31e0681150301dac1bea2243645a69e7/sphinx_gallery-0.19.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f4/40/8561ce06dc46fd17242c7724ab25b257a2ac1b35f4ebf551b40ce6105cfa/stevedore-5.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f2/b5/9b575a0ed3e50b00c40b08cbce82eb618229091d09f6d14bce80fc01cb0b/tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/fc/cc/e09c0d663a004945f82beecd4f147053567910479314e8d01ba71e5d5dea/tox-4.32.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/9e/8d50f3b3fc4af8c73154f64d4a2293bfa2d517a19000e70ef2d614254084/tox_gh_actions-3.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ee/e9c95cda829131f71a8dff5ce0406059fd16e591c074414e31ada19ba7c3/validate_pyproject-0.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/24/84/e237607faf4e099dbb8a4f511cfd5efcb5f75918baad200ff7380635631b/yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bcrypt-5.0.0-py313h2c089d5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-46.0.5-py313he3f6fad_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.8-h8d0574d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py313h6940bce_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h65a2061_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.7.0-hbfc8e16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.14-h18782d2_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/0e/c9/741f8ac91e14b1d2e7100690425a5b2b919a87a5075406582991fb7de920/aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/da/875925db2ed80dc7b919b2817da555848b608620be9662c5f835670d5d8d/asteval-1.0.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/f0/35240571e1b67ffb19dafb29ab34150b6f59f93f717b041082cdb1bfceb1/backrefs-6.2-py311-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/46/eb6eca305c77a4489affe1c5d8f4cae82f285d9addd8de4ec084a7184221/cachetools-6.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/17/a7/3aa4144d3bcb719bf67b22d2d51c2d577bf801498c13cb08f64173e80497/coverage-7.12.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/17/0cb7ca3de72e5f4ef2ec2fa0089beafbcaaaead1844e8b8a63d35173d77d/coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b0/d0/89247ec250369fc76db477720a26b2fce7ba079ff1380e4ab4529d2fe233/debugpy-1.8.17-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/e9/90b7d243364d3dce38c8c2a1b8c103d7a8d1383c2b24c735fae0eee038dd/doc8-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7c/5b/cdd2c612277b7ac7ec8c0c9bc41812c43dc7b2d5f2b0897e15fdf5a1f915/fonttools-4.60.1-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/b0/1c628e26a0b95858f54aba17e1599e7f6cd241727596cc2580b72cb0a9bf/h5py-3.15.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/aa/62893d6a591d337aa59dcc4c6f6c842f1fe20cd72c8c5c1f980255243252/ipython-9.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/1e/5a4d5498eba382fee667ed797cf64ae5d1b13b04356df62f067f48bb0f61/jupyterlab-4.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/3d/020a6b6248c3d4a37797db068256f0b3f15b01bc481327ba888c50309aa8/mkdocs_plugin_inline_svg-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/5a/15/3c225610da9f02505d37d69a77f4a2e7daae2a125f99d638df211ba84e59/msgspec-0.20.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/be/b257e12f9710819fde40adc972578bee6b72c5992da1bc8369bef2597756/nbmake-1.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/16/e777eadfa0c0305878c36fae1d5e6db474fbb15dae202b9ec378809dfb4d/nbstripout-0.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/3e/f5a5cc2885c24be13e9b937441bd16a012ac34a657fe05e58927e8af8b7a/nh3-0.3.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/68/3a/9f93cff5c025029a36d9a92fef47220ab4692ee7f2be0fba9f92813d0cb8/psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0b/8b/6300fb80f858cda1c51ffa17075df5d846757081d11ab4aa35cef9e6258b/pytest-9.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - - pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/f7/d00d9b4a0313a6be3a3e0818e6375e15da6d7076f4ae47d1324e7ca986a1/radon-6.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/63/ac52b32b33ae62f2076ed5c4f6b00e065e3ccbb2063e9a2e813b2bfc95bf/restructuredtext_lint-2.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b3/b3/0860cdd012291dc21272895ce107f1e98e335509ba986dd83d72658b82b9/rpds_py-0.29.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/a3/9d/dae6db96df28e0a15dea8e986ee393af70fc97fd57669808728080529c37/ruff-0.14.6-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/64/7c/d8a343b0a622987335a1ac848084079c47c21e44fcc450f9c145b11a56f6/scipp-25.11.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/46/25/23eea063a85cc565c9e67ca0ac36b9b979c9d76215d62096746cdd8770e2/scipp-26.2.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/9e/c41d68be04eef5b6202b468e0f90faf0c469f3a03353f2a218fd78279710/sphinx_book_theme-1.1.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/c7/52b48aec16b26c52aba854d03a3a31e0681150301dac1bea2243645a69e7/sphinx_gallery-0.19.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f4/40/8561ce06dc46fd17242c7724ab25b257a2ac1b35f4ebf551b40ce6105cfa/stevedore-5.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f6/48/6a7529df2c9cc12efd2e8f5dd219516184d703b34c06786809670df5b3bd/tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/fc/cc/e09c0d663a004945f82beecd4f147053567910479314e8d01ba71e5d5dea/tox-4.32.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/9e/8d50f3b3fc4af8c73154f64d4a2293bfa2d517a19000e70ef2d614254084/tox_gh_actions-3.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ee/e9c95cda829131f71a8dff5ce0406059fd16e591c074414e31ada19ba7c3/validate_pyproject-0.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b2/0d/71ceabc14c146ba8ee3804ca7b3d42b1664c8440439de5214d366fec7d3a/yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bcrypt-5.0.0-py313hfbe8231_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-46.0.5-py313hf5c5e30_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gsl-2.8-h5b8d9c4_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py313hd650c13_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pynacl-1.6.2-py313hed4ef92_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py313h40c08fc_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh07e9846_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.7.0-h80d1838_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.14-h0159041_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/dc/f2/27cdf04c9851712d6c1b99df6821a6623c3c9e55956d4b1e318c337b5a48/aiohttp-3.13.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/da/875925db2ed80dc7b919b2817da555848b608620be9662c5f835670d5d8d/asteval-1.0.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/f0/35240571e1b67ffb19dafb29ab34150b6f59f93f717b041082cdb1bfceb1/backrefs-6.2-py311-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/46/eb6eca305c77a4489affe1c5d8f4cae82f285d9addd8de4ec084a7184221/cachetools-6.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/91/77/dd4aff9af16ff776bf355a24d87eeb48fc6acde54c907cc1ea89b14a8804/coverage-7.12.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/11/18c79a1cee5ff539a94ec4aa290c1c069a5580fd5cfd2fb2e282f8e905da/debugpy-1.8.17-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/e9/90b7d243364d3dce38c8c2a1b8c103d7a8d1383c2b24c735fae0eee038dd/doc8-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/75/4d/b022c1577807ce8b31ffe055306ec13a866f2337ecee96e75b24b9b753ea/fonttools-4.60.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/23/95/499b4e56452ef8b6c95a271af0dde08dac4ddb70515a75f346d4f400579b/h5py-3.15.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/aa/62893d6a591d337aa59dcc4c6f6c842f1fe20cd72c8c5c1f980255243252/ipython-9.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/1e/5a4d5498eba382fee667ed797cf64ae5d1b13b04356df62f067f48bb0f61/jupyterlab-4.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/3d/020a6b6248c3d4a37797db068256f0b3f15b01bc481327ba888c50309aa8/mkdocs_plugin_inline_svg-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/89/5e/406b7d578926b68790e390d83a1165a9bfc2d95612a1a9c1c4d5c72ea815/msgspec-0.20.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/be/b257e12f9710819fde40adc972578bee6b72c5992da1bc8369bef2597756/nbmake-1.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/16/e777eadfa0c0305878c36fae1d5e6db474fbb15dae202b9ec378809dfb4d/nbstripout-0.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/64/9a/1a1c154f10a575d20dd634e5697805e589bbdb7673a0ad00e8da90044ba7/nh3-0.3.2-cp38-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/76/ae/e0265e0163cf127c24c3969d29f1c4c64551a1e375d95a13d32eab25d364/numpy-2.4.2-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/55/4c/c3ed1a622b6ae2fd3c945a366e64eb35247a31e4db16cf5095e269e8eb3c/psutil-7.1.3-cp37-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0b/8b/6300fb80f858cda1c51ffa17075df5d846757081d11ab4aa35cef9e6258b/pytest-9.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fc/19/b757fe28008236a4a713e813283721b8a40aa60cd7d3f83549f2e25a3155/pywinpty-3.0.2-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/79/c3/3e75075c7f71735f22b66fab0481f2c98e3a4d58cba55cb50ba29114bcf6/pywinpty-3.0.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/f7/d00d9b4a0313a6be3a3e0818e6375e15da6d7076f4ae47d1324e7ca986a1/radon-6.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/63/ac52b32b33ae62f2076ed5c4f6b00e065e3ccbb2063e9a2e813b2bfc95bf/restructuredtext_lint-2.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3c/6b/0229d3bed4ddaa409e6d90b0ae967ed4380e4bdd0dad6e59b92c17d42457/rpds_py-0.29.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/fb/02/82240553b77fd1341f80ebb3eaae43ba011c7a91b4224a9f317d8e6591af/ruff-0.14.6-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/f6/f3/9d1bb423a2dc0bbebfc98191095dd410a1268397b9c692d76a3ea971c790/scipp-25.11.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/26/d5/0b0ca89849806a23da4e56182a72f510bdcf911511b3a0098f8252896941/scipp-26.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/9e/c41d68be04eef5b6202b468e0f90faf0c469f3a03353f2a218fd78279710/sphinx_book_theme-1.1.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/c7/52b48aec16b26c52aba854d03a3a31e0681150301dac1bea2243645a69e7/sphinx_gallery-0.19.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f4/40/8561ce06dc46fd17242c7724ab25b257a2ac1b35f4ebf551b40ce6105cfa/stevedore-5.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/2a/f609b420c2f564a748a2d80ebfb2ee02a73ca80223af712fca591386cafb/tornado-6.5.2-cp39-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/fc/cc/e09c0d663a004945f82beecd4f147053567910479314e8d01ba71e5d5dea/tox-4.32.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/9e/8d50f3b3fc4af8c73154f64d4a2293bfa2d517a19000e70ef2d614254084/tox_gh_actions-3.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ee/e9c95cda829131f71a8dff5ce0406059fd16e591c074414e31ada19ba7c3/validate_pyproject-0.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/93/22/b85eca6fa2ad9491af48c973e4c8cf6b103a73dbb271fe3346949449fca0/yarl-1.23.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ -packages: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 - md5: d7c89558ba9fa0495403155b64376d81 - license: None - purls: [] - size: 2562 - timestamp: 1578324546067 -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - build_number: 16 - sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 - md5: 73aaf86a425cc6e73fcf236a5a46396d - depends: - - _libgcc_mutex 0.1 conda_forge - - libgomp >=7.5.0 - constrains: - - openmp_impl 9999 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 23621 - timestamp: 1650670423406 -- pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - name: accessible-pygments - version: 0.0.5 - sha256: 88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7 - requires_dist: - - pygments>=1.5 - - pillow ; extra == 'dev' - - pkginfo>=1.10 ; extra == 'dev' - - playwright ; extra == 'dev' - - pre-commit ; extra == 'dev' - - setuptools ; extra == 'dev' - - twine>=5.0 ; extra == 'dev' - - hypothesis ; extra == 'tests' - - pytest ; extra == 'tests' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - name: aiohappyeyeballs - version: 2.6.1 - sha256: f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl - name: aiohttp - version: 3.13.2 - sha256: a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a - requires_dist: - - aiohappyeyeballs>=2.5.0 - - aiosignal>=1.4.0 - - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' - - attrs>=17.3.0 - - frozenlist>=1.1.1 - - multidict>=4.5,<7.0 - - propcache>=0.2.0 - - yarl>=1.17.0,<2.0 - - aiodns>=3.3.0 ; extra == 'speedups' - - brotli ; platform_python_implementation == 'CPython' and extra == 'speedups' - - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'speedups' - - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl - name: aiohttp - version: 3.13.2 - sha256: 5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293 - requires_dist: - - aiohappyeyeballs>=2.5.0 - - aiosignal>=1.4.0 - - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' - - attrs>=17.3.0 - - frozenlist>=1.1.1 - - multidict>=4.5,<7.0 - - propcache>=0.2.0 - - yarl>=1.17.0,<2.0 - - aiodns>=3.3.0 ; extra == 'speedups' - - brotli ; platform_python_implementation == 'CPython' and extra == 'speedups' - - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'speedups' - - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl - name: aiohttp - version: 3.13.2 - sha256: 088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742 - requires_dist: - - aiohappyeyeballs>=2.5.0 - - aiosignal>=1.4.0 - - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' - - attrs>=17.3.0 - - frozenlist>=1.1.1 - - multidict>=4.5,<7.0 - - propcache>=0.2.0 - - yarl>=1.17.0,<2.0 - - aiodns>=3.3.0 ; extra == 'speedups' - - brotli ; platform_python_implementation == 'CPython' and extra == 'speedups' - - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'speedups' - - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: aiohttp - version: 3.13.2 - sha256: ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e - requires_dist: - - aiohappyeyeballs>=2.5.0 - - aiosignal>=1.4.0 - - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' - - attrs>=17.3.0 - - frozenlist>=1.1.1 - - multidict>=4.5,<7.0 - - propcache>=0.2.0 - - yarl>=1.17.0,<2.0 - - aiodns>=3.3.0 ; extra == 'speedups' - - brotli ; platform_python_implementation == 'CPython' and extra == 'speedups' - - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'speedups' - - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - name: aiosignal - version: 1.4.0 - sha256: 053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e - requires_dist: - - frozenlist>=1.1.0 - - typing-extensions>=4.2 ; python_full_version < '3.13' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - name: alabaster - version: 1.0.0 - sha256: fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b - requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 - md5: 2934f256a8acfe48f6ebb4fce6cde29c - depends: - - python >=3.9 - - typing-extensions >=4.0.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/annotated-types?source=hash-mapping - size: 18074 - timestamp: 1733247158254 -- pypi: https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl - name: anyio - version: 4.11.0 - sha256: 0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc - requires_dist: + py-313-env: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-hbf7d49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-25.7.0-he4ff34a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/3d/020a6b6248c3d4a37797db068256f0b3f15b01bc481327ba888c50309aa8/mkdocs_plugin_inline_svg-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/83/36557b04cfdc317ed8a525c4993b23e43a8fbcddaddd78619112ca07138c/msgspec-0.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/be/b257e12f9710819fde40adc972578bee6b72c5992da1bc8369bef2597756/nbmake-1.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/16/e777eadfa0c0305878c36fae1d5e6db474fbb15dae202b9ec378809dfb4d/nbstripout-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f2/85/ab6d04733a7d6ff32bfc8382bf1b07078228f5d6ebec5266b91bfc5c4ff7/pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/f7/d00d9b4a0313a6be3a3e0818e6375e15da6d7076f4ae47d1324e7ca986a1/radon-6.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e4/d9/e76ce201285d50d536573047ddba5840718443436e7733439ed42f65ebe4/scipp-26.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ee/e9c95cda829131f71a8dff5ce0406059fd16e591c074414e31ada19ba7c3/validate_pyproject-0.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl + - pypi: ./ + osx-64: + - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gsl-2.8-hc707ee6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.0-h19cb2f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.0-h0d3cbff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.7.0-hf6efa0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.12-h894a449_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda + - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/3d/020a6b6248c3d4a37797db068256f0b3f15b01bc481327ba888c50309aa8/mkdocs_plugin_inline_svg-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8a/d1/b902d38b6e5ba3bdddbec469bba388d647f960aeed7b5b3623a8debe8a76/msgspec-0.20.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/be/b257e12f9710819fde40adc972578bee6b72c5992da1bc8369bef2597756/nbmake-1.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/16/e777eadfa0c0305878c36fae1d5e6db474fbb15dae202b9ec378809dfb4d/nbstripout-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/f7/d00d9b4a0313a6be3a3e0818e6375e15da6d7076f4ae47d1324e7ca986a1/radon-6.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/25/23eea063a85cc565c9e67ca0ac36b9b979c9d76215d62096746cdd8770e2/scipp-26.2.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ee/e9c95cda829131f71a8dff5ce0406059fd16e591c074414e31ada19ba7c3/validate_pyproject-0.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl + - pypi: ./ + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.8-h8d0574d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.7.0-hbfc8e16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/3d/020a6b6248c3d4a37797db068256f0b3f15b01bc481327ba888c50309aa8/mkdocs_plugin_inline_svg-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/57/b6/eff0305961a1d9447ec2b02f8c73c8946f22564d302a504185b730c9a761/msgspec-0.20.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/be/b257e12f9710819fde40adc972578bee6b72c5992da1bc8369bef2597756/nbmake-1.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/16/e777eadfa0c0305878c36fae1d5e6db474fbb15dae202b9ec378809dfb4d/nbstripout-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/14/5990826f779f79148ae9d3a2c39593dc04d61d5d90541e71b5749f35af95/pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/f7/d00d9b4a0313a6be3a3e0818e6375e15da6d7076f4ae47d1324e7ca986a1/radon-6.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/46/25/23eea063a85cc565c9e67ca0ac36b9b979c9d76215d62096746cdd8770e2/scipp-26.2.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ee/e9c95cda829131f71a8dff5ce0406059fd16e591c074414e31ada19ba7c3/validate_pyproject-0.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl + - pypi: ./ + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gsl-2.8-h5b8d9c4_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.7.0-h80d1838_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.12-h09917c8_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/3d/020a6b6248c3d4a37797db068256f0b3f15b01bc481327ba888c50309aa8/mkdocs_plugin_inline_svg-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/f1/25/5e8080fe0117f799b1b68008dc29a65862077296b92550632de015128579/msgspec-0.20.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/be/b257e12f9710819fde40adc972578bee6b72c5992da1bc8369bef2597756/nbmake-1.5.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/16/e777eadfa0c0305878c36fae1d5e6db474fbb15dae202b9ec378809dfb4d/nbstripout-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d6/7d/216a1588b65a7aa5f4535570418a599d943c85afb1d95b0876fc00aa1468/pandas-3.0.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/f7/d00d9b4a0313a6be3a3e0818e6375e15da6d7076f4ae47d1324e7ca986a1/radon-6.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d1/d2/166bce0c7420a30af57b17df2211eb53b33b8126a17e4ba6cd32099b85e7/scipp-26.2.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ee/e9c95cda829131f71a8dff5ce0406059fd16e591c074414e31ada19ba7c3/validate_pyproject-0.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl + - pypi: ./ +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + build_number: 20 + sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 + md5: a9f577daf3de00bca7c3c76c0ecbd1de + depends: + - __glibc >=2.17,<3.0.a0 + - libgomp >=7.5.0 + constrains: + - openmp_impl <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 28948 + timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda + build_number: 7 + sha256: 30006902a9274de8abdad5a9f02ef7c8bb3d69a503486af0c1faee30b023e5b7 + md5: eaac87c21aff3ed21ad9656697bb8326 + depends: + - llvm-openmp >=9.0.1 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 8328 + timestamp: 1764092562779 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + build_number: 7 + sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd + md5: a44032f282e7d2acdeb1c240308052dd + depends: + - llvm-openmp >=9.0.1 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 8325 + timestamp: 1764092507920 +- pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl + name: aiohappyeyeballs + version: 2.6.1 + sha256: f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl + name: aiohttp + version: 3.13.2 + sha256: a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; extra == 'speedups' + - brotli ; platform_python_implementation == 'CPython' and extra == 'speedups' + - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl + name: aiohttp + version: 3.13.2 + sha256: 5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293 + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; extra == 'speedups' + - brotli ; platform_python_implementation == 'CPython' and extra == 'speedups' + - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl + name: aiohttp + version: 3.13.2 + sha256: 088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742 + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; extra == 'speedups' + - brotli ; platform_python_implementation == 'CPython' and extra == 'speedups' + - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: aiohttp + version: 3.13.2 + sha256: ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; extra == 'speedups' + - brotli ; platform_python_implementation == 'CPython' and extra == 'speedups' + - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/0e/c9/741f8ac91e14b1d2e7100690425a5b2b919a87a5075406582991fb7de920/aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl + name: aiohttp + version: 3.13.3 + sha256: 28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; extra == 'speedups' + - brotli>=1.2 ; platform_python_implementation == 'CPython' and extra == 'speedups' + - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl + name: aiohttp + version: 3.13.3 + sha256: 425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3 + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; extra == 'speedups' + - brotli>=1.2 ; platform_python_implementation == 'CPython' and extra == 'speedups' + - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl + name: aiohttp + version: 3.13.3 + sha256: 87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9 + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; extra == 'speedups' + - brotli>=1.2 ; platform_python_implementation == 'CPython' and extra == 'speedups' + - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl + name: aiohttp + version: 3.13.3 + sha256: 693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; extra == 'speedups' + - brotli>=1.2 ; platform_python_implementation == 'CPython' and extra == 'speedups' + - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: aiohttp + version: 3.13.3 + sha256: f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0 + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; extra == 'speedups' + - brotli>=1.2 ; platform_python_implementation == 'CPython' and extra == 'speedups' + - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl + name: aiohttp + version: 3.13.3 + sha256: 1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64 + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; extra == 'speedups' + - brotli>=1.2 ; platform_python_implementation == 'CPython' and extra == 'speedups' + - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: aiohttp + version: 3.13.3 + sha256: 9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1 + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; extra == 'speedups' + - brotli>=1.2 ; platform_python_implementation == 'CPython' and extra == 'speedups' + - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/dc/f2/27cdf04c9851712d6c1b99df6821a6623c3c9e55956d4b1e318c337b5a48/aiohttp-3.13.3-cp311-cp311-win_amd64.whl + name: aiohttp + version: 3.13.3 + sha256: 642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; extra == 'speedups' + - brotli>=1.2 ; platform_python_implementation == 'CPython' and extra == 'speedups' + - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl + name: aiosignal + version: 1.4.0 + sha256: 053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e + requires_dist: + - frozenlist>=1.1.0 + - typing-extensions>=4.2 ; python_full_version < '3.13' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + name: annotated-types + version: 0.7.0 + sha256: 1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 + requires_dist: + - typing-extensions>=4.0.0 ; python_full_version < '3.9' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl + name: anyio + version: 4.12.1 + sha256: d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c + requires_dist: - exceptiongroup>=1.0.2 ; python_full_version < '3.11' - idna>=2.8 - - sniffio>=1.1 - typing-extensions>=4.5 ; python_full_version < '3.13' - - trio>=0.31.0 ; extra == 'trio' + - trio>=0.32.0 ; python_full_version >= '3.10' and extra == 'trio' + - trio>=0.31.0 ; python_full_version < '3.10' and extra == 'trio' requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl name: appnope @@ -1581,6 +3371,19 @@ packages: - coverage ; extra == 'test' - asteval[dev,doc,test] ; extra == 'all' requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl + name: asteval + version: 1.0.8 + sha256: 6c64385c6ff859a474953c124987c7ee8354d781c76509b2c598741c4d1d28e9 + requires_dist: + - build ; extra == 'dev' + - twine ; extra == 'dev' + - sphinx ; extra == 'doc' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - coverage ; extra == 'test' + - asteval[dev,doc,test] ; extra == 'all' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl name: asttokens version: 3.0.1 @@ -1592,22 +3395,30 @@ packages: - pytest-cov ; extra == 'test' - pytest-xdist ; extra == 'test' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl name: async-lru - version: 2.0.5 - sha256: ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943 + version: 2.2.0 + sha256: e2c1cf731eba202b59c5feedaef14ffd9d02ad0037fcda64938699f2c380eafe requires_dist: - typing-extensions>=4.0.0 ; python_full_version < '3.11' - requires_python: '>=3.9' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl name: attrs version: 25.4.0 sha256: adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl + name: autopep8 + version: 2.3.2 + sha256: ce8ad498672c845a0c3de2629c15b635ec2b05ef8177a6e7c91c74f3e9b51128 + requires_dist: + - pycodestyle>=2.12.0 + - tomli ; python_full_version < '3.11' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl name: babel - version: 2.17.0 - sha256: 4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 + version: 2.18.0 + sha256: e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35 requires_dist: - pytz>=2015.7 ; python_full_version < '3.9' - tzdata ; sys_platform == 'win32' and extra == 'dev' @@ -1619,77 +3430,26 @@ packages: - pytz ; extra == 'dev' - setuptools ; extra == 'dev' requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py313h843e2db_1.conda - sha256: cdf7496797af275f8bb5edd270aa06303dde623c7dd3a5941b0ce085d8f4cdc5 - md5: b59ec3796cba93d0db5f71e361176f27 - depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.13.* *_cp313 - constrains: - - __glibc >=2.17 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/bcrypt?source=hash-mapping - size: 292710 - timestamp: 1762497710166 -- conda: https://conda.anaconda.org/conda-forge/osx-64/bcrypt-5.0.0-py313hcc225dc_1.conda - sha256: b92b8fcad1fd3a74e42777c7f03e6c4dc931aae93c9f981295928bc45484f7bf - md5: 4adea8a12c7fd3e512e9e47436f84c94 - depends: - - python - - __osx >=10.13 - - python_abi 3.13.* *_cp313 - constrains: - - __osx >=10.13 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/bcrypt?source=hash-mapping - size: 278409 - timestamp: 1762497780574 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bcrypt-5.0.0-py313h2c089d5_1.conda - sha256: c8e3b95ad2665dc16ac37888fb91dd481fa759bad1fbf799451d12d6bfaec600 - md5: 4b14cba28eaf98170c2ddd7e900efa07 - depends: - - python - - __osx >=11.0 - - python 3.13.* *_cp313 - - python_abi 3.13.* *_cp313 - constrains: - - __osx >=11.0 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/bcrypt?source=hash-mapping - size: 267465 - timestamp: 1762497730829 -- conda: https://conda.anaconda.org/conda-forge/win-64/bcrypt-5.0.0-py313hfbe8231_1.conda - sha256: 21baf1316a8160fd3b83e7128803735b107f47c58ba5d5305a372fd6c679d42b - md5: 2a664b5cc93fbc9d7ca595b206a299f0 - 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: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/bcrypt?source=hash-mapping - size: 170702 - timestamp: 1762497739995 -- pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/0f/f0/35240571e1b67ffb19dafb29ab34150b6f59f93f717b041082cdb1bfceb1/backrefs-6.2-py311-none-any.whl + name: backrefs + version: '6.2' + sha256: 08aa7fae530c6b2361d7bdcbda1a7c454e330cc9dbcd03f5c23205e430e5c3be + requires_dist: + - regex ; extra == 'extras' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + name: backrefs + version: '6.2' + sha256: 12df81596ab511f783b7d87c043ce26bc5b0288cf3bb03610fe76b8189282b2b + requires_dist: + - regex ; extra == 'extras' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl name: beautifulsoup4 - version: 4.14.2 - sha256: 5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515 + version: 4.14.3 + sha256: 0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb requires_dist: - - soupsieve>1.2 + - soupsieve>=1.6.1 - typing-extensions>=4.0.0 - cchardet ; extra == 'cchardet' - chardet ; extra == 'chardet' @@ -1730,6 +3490,21 @@ packages: - virtualenv>=20.17 ; python_full_version >= '3.10' and python_full_version < '3.14' and extra == 'virtualenv' - virtualenv>=20.31 ; python_full_version >= '3.14' and extra == 'virtualenv' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl + name: build + version: 1.4.0 + sha256: 6a07c1b8eb6f2b311b96fcbdbce5dab5fe637ffda0fd83c9cac622e927501596 + requires_dist: + - packaging>=24.0 + - pyproject-hooks + - colorama ; os_name == 'nt' + - importlib-metadata>=4.6 ; python_full_version < '3.10.2' + - tomli>=1.1.0 ; python_full_version < '3.11' + - uv>=0.1.18 ; extra == 'uv' + - virtualenv>=20.11 ; python_full_version < '3.10' and extra == 'virtualenv' + - virtualenv>=20.17 ; python_full_version >= '3.10' and python_full_version < '3.14' and extra == 'virtualenv' + - virtualenv>=20.31 ; python_full_version >= '3.14' and extra == 'virtualenv' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl name: bumps version: 1.0.3 @@ -1769,6 +3544,17 @@ packages: purls: [] size: 260341 timestamp: 1757437258798 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 + md5: d2ffd7602c02f2b316fd921d39876885 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 260182 + timestamp: 1771350215188 - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda sha256: 8f50b58efb29c710f3cecf2027a8d7325ba769ab10c746eff75cea3ac050b10c md5: 97c4b3bd8a90722104798175a1bdddbf @@ -1779,6 +3565,16 @@ packages: purls: [] size: 132607 timestamp: 1757437730085 +- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda + sha256: 9f242f13537ef1ce195f93f0cc162965d6cc79da578568d6d8e50f70dd025c42 + md5: 4173ac3b19ec0a4f400b4f782910368b + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 133427 + timestamp: 1771350680709 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 md5: 58fd217444c2a5701a44244faf518206 @@ -1789,6 +3585,16 @@ packages: purls: [] size: 125061 timestamp: 1757437486465 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df + md5: 620b85a3f45526a8bc4d23fd78fc22f0 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 124834 + timestamp: 1771350416561 - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda sha256: d882712855624641f48aa9dc3f5feea2ed6b4e6004585d3616386a18186fe692 md5: 1077e9333c41ff0be8edd1a5ec0ddace @@ -1801,6 +3607,49 @@ packages: purls: [] size: 55977 timestamp: 1757437738856 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + sha256: 76dfb71df5e8d1c4eded2dbb5ba15bb8fb2e2b0fe42d94145d5eed4c75c35902 + md5: 4cb8e6b48f67de0b018719cdf1136306 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 56115 + timestamp: 1771350256444 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + sha256: cc9accf72fa028d31c2a038460787751127317dcfa991f8d1f1babf216bb454e + md5: 920bb03579f15389b9e512095ad995b7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 207882 + timestamp: 1765214722852 +- conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda + sha256: 2f5bc0292d595399df0d168355b4e9820affc8036792d6984bd751fdda2bcaea + md5: fc9a153c57c9f070bebaa7eef30a8f17 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 186122 + timestamp: 1765215100384 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + sha256: 2995f2aed4e53725e5efbc28199b46bf311c3cab2648fc4f10c2227d6d5fa196 + md5: bcb3cba70cf1eec964a03b4ba7775f01 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 180327 + timestamp: 1765215064054 - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda sha256: 686a13bd2d4024fc99a22c1e0e68a7356af3ed3304a8d3ff6bb56249ad4e82f0 md5: f98fb7db808b94bc1ec5b0e62f9f1069 @@ -1819,83 +3668,99 @@ packages: purls: [] size: 152432 timestamp: 1762967197890 -- pypi: https://files.pythonhosted.org/packages/e6/46/eb6eca305c77a4489affe1c5d8f4cae82f285d9addd8de4ec084a7184221/cachetools-6.2.2-py3-none-any.whl - name: cachetools - version: 6.2.2 - sha256: 6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl - name: certifi - version: 2025.11.12 - sha256: 97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b - requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda - sha256: 2162a91819945c826c6ef5efe379e88b1df0fe9a387eeba23ddcf7ebeacd5bd6 - md5: d0616e7935acab407d1543b28c446f6f - depends: - - __glibc >=2.17,<3.0.a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - pycparser - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - license: MIT - license_family: MIT - purls: - - pkg:pypi/cffi?source=hash-mapping - size: 298357 - timestamp: 1761202966461 -- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py313hf57695f_1.conda - sha256: 16c8c80bebe1c3d671382a64beaa16996e632f5b75963379e2b084eb6bc02053 - md5: b10f64f2e725afc9bf2d9b30eff6d0ea +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + sha256: 37950019c59b99585cee5d30dbc2cc9696ed4e11f5742606a4db1621ed8f94d6 + md5: f001e6e220355b7f87403a4d0e5bf1ca depends: - - __osx >=10.13 - - libffi >=3.5.2,<3.6.0a0 - - pycparser - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - license: MIT - license_family: MIT - purls: - - pkg:pypi/cffi?source=hash-mapping - size: 290946 - timestamp: 1761203173891 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda - sha256: 1fa69651f5e81c25d48ac42064db825ed1a3e53039629db69f86b952f5ce603c - md5: 050374657d1c7a4f2ea443c0d0cbd9a0 + - __win + license: ISC + purls: [] + size: 147734 + timestamp: 1772006322223 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc + md5: 4492fd26db29495f0ba23f146cd5638d depends: - - __osx >=11.0 - - libffi >=3.5.2,<3.6.0a0 - - pycparser - - 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/cffi?source=hash-mapping - size: 291376 - timestamp: 1761203583358 -- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda - sha256: f867a11f42bb64a09b232e3decf10f8a8fe5194d7e3a216c6bac9f40483bd1c6 - md5: 55b44664f66a2caf584d72196aa98af9 - depends: - - pycparser - - 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/cffi?source=hash-mapping - size: 292681 - timestamp: 1761203203673 -- pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - name: chardet - version: 5.2.0 - sha256: e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970 + - __unix + license: ISC + purls: [] + size: 147413 + timestamp: 1772006283803 +- pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + name: certifi + version: 2026.2.25 + sha256: 027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl + name: cffi + version: 2.0.0 + sha256: b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe + requires_dist: + - pycparser ; implementation_name != 'PyPy' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl + name: cffi + version: 2.0.0 + sha256: 19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75 + requires_dist: + - pycparser ; implementation_name != 'PyPy' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl + name: cffi + version: 2.0.0 + sha256: 45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca + requires_dist: + - pycparser ; implementation_name != 'PyPy' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl + name: cffi + version: 2.0.0 + sha256: 00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb + requires_dist: + - pycparser ; implementation_name != 'PyPy' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl + name: cffi + version: 2.0.0 + sha256: 2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c + requires_dist: + - pycparser ; implementation_name != 'PyPy' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: cffi + version: 2.0.0 + sha256: c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 + requires_dist: + - pycparser ; implementation_name != 'PyPy' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl + name: cffi + version: 2.0.0 + sha256: 66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5 + requires_dist: + - pycparser ; implementation_name != 'PyPy' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: cffi + version: 2.0.0 + sha256: 8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26 + requires_dist: + - pycparser ; implementation_name != 'PyPy' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + name: cfgv + version: 3.5.0 + sha256: a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl + name: charset-normalizer + version: 3.4.4 + sha256: 5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: charset-normalizer + version: 3.4.4 + sha256: 840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381 requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl name: charset-normalizer @@ -1907,35 +3772,33 @@ packages: version: 3.4.4 sha256: b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14 requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl + name: charset-normalizer + version: 3.4.4 + sha256: 6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8 + requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: charset-normalizer version: 3.4.4 sha256: a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894 requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl + name: click + version: 8.3.1 + sha256: 981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6 + requires_dist: + - colorama ; sys_platform == 'win32' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl name: cloudpickle version: 3.1.2 sha256: 9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl - name: codecov - version: 2.1.13 - sha256: c2ca5e51bba9ebb43644c43d0690148a55086f7f5e6fd36170858fa4206744d5 - requires_dist: - - requests>=2.7.9 - - coverage - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' -- 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 +- pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + name: colorama + version: 0.4.6 + sha256: 4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*' - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl name: comm version: 0.2.3 @@ -1943,6 +3806,31 @@ packages: requires_dist: - pytest ; extra == 'test' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl + name: contourpy + version: 1.3.3 + sha256: 23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381 + requires_dist: + - numpy>=1.25 + - furo ; extra == 'docs' + - sphinx>=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - bokeh ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy==1.17.0 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - pytest-rerunfailures ; extra == 'test-no-images' + - pytest-xdist ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl name: contourpy version: 1.3.3 @@ -1993,6 +3881,31 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: contourpy + version: 1.3.3 + sha256: 51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db + requires_dist: + - numpy>=1.25 + - furo ; extra == 'docs' + - sphinx>=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - bokeh ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy==1.17.0 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - pytest-rerunfailures ; extra == 'test-no-images' + - pytest-xdist ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl name: contourpy version: 1.3.3 @@ -2018,6 +3931,31 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl + name: contourpy + version: 1.3.3 + sha256: 709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1 + requires_dist: + - numpy>=1.25 + - furo ; extra == 'docs' + - sphinx>=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - bokeh ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy==1.17.0 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - pytest-rerunfailures ; extra == 'test-no-images' + - pytest-xdist ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl name: contourpy version: 1.3.3 @@ -2043,132 +3981,107 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- conda: https://conda.anaconda.org/conda-forge/noarch/copier-9.12.0-pyhcf101f3_0.conda - sha256: b4be1fad1496decdb83fa80a8cd7508184f680c98b53ec454c382fa6f8d72d20 - md5: d93fcbc0d424e3a07688f1e2bfedc360 - depends: - - python >=3.10 - - colorama >=0.4.6 - - dunamai >=1.7.0 - - funcy >=1.17 - - jinja2 >=3.1.5 - - jinja2-ansible-filters >=1.3.1 - - packaging >=23.0 - - pathspec >=0.9.0 - - plumbum >=1.6.9 - - prompt-toolkit <3.0.52 - - pydantic >=2.4.2 - - pygments >=2.7.1 - - pyyaml >=5.3.1 - - questionary >=1.8.1 - - eval-type-backport >=0.1.3,<0.3.0 - - platformdirs >=4.3.6 - - typing_extensions >=4.0.0,<5.0.0 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/copier?source=hash-mapping - size: 55390 - timestamp: 1771686560974 -- pypi: https://files.pythonhosted.org/packages/17/a7/3aa4144d3bcb719bf67b22d2d51c2d577bf801498c13cb08f64173e80497/coverage-7.12.0-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl + name: contourpy + version: 1.3.3 + sha256: 3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42 + requires_dist: + - numpy>=1.25 + - furo ; extra == 'docs' + - sphinx>=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - bokeh ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy==1.17.0 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - pytest-rerunfailures ; extra == 'test-no-images' + - pytest-xdist ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl + name: copier + version: 9.12.0 + sha256: a1bc84dfd2a4b85dbe034999026c0e24ca02a6bc1574f45df07fd76d935c2ea9 + requires_dist: + - colorama>=0.4.6 + - dunamai>=1.7.0 + - funcy>=1.17 + - jinja2-ansible-filters>=1.3.1 + - jinja2>=3.1.5 + - packaging>=23.0 + - pathspec>=0.9.0 + - platformdirs>=4.3.6 + - plumbum>=1.6.9 + - pydantic>=2.4.2 + - pygments>=2.7.1 + - pyyaml>=5.3.1 + - questionary>=1.8.1 + - typing-extensions>=4.0.0,<5.0.0 ; python_full_version < '3.11' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl name: coverage - version: 7.12.0 - sha256: ccf3b2ede91decd2fb53ec73c1f949c3e034129d1e0b07798ff1d02ea0c8fa4a + version: 7.13.4 + sha256: 2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/76/b6/67d7c0e1f400b32c883e9342de4a8c2ae7c1a0b57c5de87622b7262e2309/coverage-7.12.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl name: coverage - version: 7.12.0 - sha256: bc13baf85cd8a4cfcf4a35c7bc9d795837ad809775f782f697bf630b7e200211 + version: 7.13.4 + sha256: 8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7 requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/91/77/dd4aff9af16ff776bf355a24d87eeb48fc6acde54c907cc1ea89b14a8804/coverage-7.12.0-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl name: coverage - version: 7.12.0 - sha256: ce61969812d6a98a981d147d9ac583a36ac7db7766f2e64a9d4d059c2fe29d07 + version: 7.13.4 + sha256: 3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/b8/14/771700b4048774e48d2c54ed0c674273702713c9ee7acdfede40c2666747/coverage-7.12.0-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl name: coverage - version: 7.12.0 - sha256: 47324fffca8d8eae7e185b5bb20c14645f23350f870c1649003618ea91a78941 + version: 7.13.4 + sha256: d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053 + requires_dist: + - tomli ; python_full_version <= '3.11' and extra == 'toml' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl + name: coverage + version: 7.13.4 + sha256: b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9 + requires_dist: + - tomli ; python_full_version <= '3.11' and extra == 'toml' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl + name: coverage + version: 7.13.4 + sha256: e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd + requires_dist: + - tomli ; python_full_version <= '3.11' and extra == 'toml' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + name: coverage + version: 7.13.4 + sha256: b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b + requires_dist: + - tomli ; python_full_version <= '3.11' and extra == 'toml' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/f1/17/0cb7ca3de72e5f4ef2ec2fa0089beafbcaaaead1844e8b8a63d35173d77d/coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl + name: coverage + version: 7.13.4 + sha256: 19bc3c88078789f8ef36acb014d7241961dbf883fd2533d18cb1e7a5b4e28b11 requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py313heb322e3_0.conda - sha256: 553f4ee18ad755d690ad63fa8e00d89598ecc4945ec046a8af808ddee5bb1ca0 - md5: 964f25e322b16cae073da8f5b7adf123 - depends: - - __glibc >=2.17,<3.0.a0 - - cffi >=1.14 - - libgcc >=14 - - openssl >=3.5.5,<4.0a0 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - constrains: - - __glibc >=2.17 - license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT - license_family: BSD - purls: - - pkg:pypi/cryptography?source=compressed-mapping - size: 1718868 - timestamp: 1770772833949 -- conda: https://conda.anaconda.org/conda-forge/osx-64/cryptography-46.0.5-py313h6e3882f_0.conda - sha256: 92a8512b8e4b00e8afd8e3e5a77b1bf384f30ecbccbd5163c9c596098b06d914 - md5: 071bcb7607cc391596db9b193a1f5014 - depends: - - __osx >=10.13 - - cffi >=1.14 - - openssl >=3.5.5,<4.0a0 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - constrains: - - __osx >=10.13 - license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT - license_family: BSD - purls: - - pkg:pypi/cryptography?source=hash-mapping - size: 1652433 - timestamp: 1770772806563 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-46.0.5-py313he3f6fad_0.conda - sha256: 5d27780eae308b9602eb80b62b8fada46680c3fc68bfb249c95ddd07f74e74d2 - md5: 2cca7fe0caca845c02b37d8b465a18fa - depends: - - __osx >=11.0 - - cffi >=1.14 - - openssl >=3.5.5,<4.0a0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - constrains: - - __osx >=11.0 - license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT - license_family: BSD - purls: - - pkg:pypi/cryptography?source=hash-mapping - size: 1600031 - timestamp: 1770773038178 -- conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-46.0.5-py313hf5c5e30_0.conda - sha256: f565890690a299107adae6314f7e2ba633d7c4e554e87524acc99eb5bad753f9 - md5: 198a8d301501a620273ef05250e7213c - depends: - - cffi >=1.14 - - openssl >=3.5.5,<4.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 - license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT - license_family: BSD - purls: - - pkg:pypi/cryptography?source=hash-mapping - size: 1490238 - timestamp: 1770772680643 - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl name: cycler version: 0.12.1 @@ -2182,15 +4095,20 @@ packages: - pytest-cov ; extra == 'tests' - pytest-xdist ; extra == 'tests' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/46/11/18c79a1cee5ff539a94ec4aa290c1c069a5580fd5cfd2fb2e282f8e905da/debugpy-1.8.17-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl + name: debugpy + version: 1.8.20 + sha256: eb506e45943cab2efb7c6eafdd65b842f3ae779f020c82221f55aca9de135ed7 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl name: debugpy - version: 1.8.17 - sha256: 6c5cd6f009ad4fca8e33e5238210dc1e5f42db07d4b6ab21ac7ffa904a196420 + version: 1.8.20 + sha256: 1f7650546e0eded1902d0f6af28f787fa1f1dbdbc97ddabaf1cd963a405930cb requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b0/d0/89247ec250369fc76db477720a26b2fce7ba079ff1380e4ab4529d2fe233/debugpy-1.8.17-py2.py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl name: debugpy - version: 1.8.17 - sha256: 60c7dca6571efe660ccb7a9508d73ca14b8796c4ed484c2002abba714226cfef + version: 1.8.20 + sha256: 5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7 requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl name: decorator @@ -2216,6 +4134,20 @@ packages: - sphinx-rtd-theme ; extra == 'dev' - trustregion>=1.1 ; extra == 'trustregion' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl + name: dfo-ls + version: 1.6.2 + sha256: 961d15e7194f3868e9e48da45010cb6d24d85491007fbee4e38a9f3ab8050cef + requires_dist: + - setuptools + - numpy + - scipy>=1.11 + - pandas + - pytest ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx-rtd-theme ; extra == 'dev' + - trustregion>=1.1 ; extra == 'trustregion' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl name: dill version: 0.4.0 @@ -2223,100 +4155,89 @@ packages: requires_dist: - objgraph>=1.7.2 ; extra == 'graph' - gprof2dot>=2022.7.29 ; extra == 'profile' - requires_python: '>=3.8' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl + name: dill + version: 0.4.1 + sha256: 1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d + requires_dist: + - objgraph>=1.7.2 ; extra == 'graph' + - gprof2dot>=2022.7.29 ; extra == 'profile' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl name: distlib version: 0.4.0 sha256: 9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16 -- pypi: https://files.pythonhosted.org/packages/a2/e9/90b7d243364d3dce38c8c2a1b8c103d7a8d1383c2b24c735fae0eee038dd/doc8-2.0.0-py3-none-any.whl - name: doc8 - version: 2.0.0 - sha256: 9862710027f793c25f9b1899150660e4bf1d4c9a6738742e71f32011e2e3f590 - requires_dist: - - docutils>=0.19,<=0.21.2 - - restructuredtext-lint>=0.7 - - stevedore - - tomli ; python_full_version < '3.11' - - pygments - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - name: docutils - version: 0.21.2 - sha256: dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 - requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/noarch/dunamai-1.26.0-pyhd8ed1ab_0.conda - sha256: 8fc5c4879d95e64779551c2b0b734ee1685431014578702c14301cdb886c320a - md5: 50ebe9b5cceffc32858c5233196229d2 - depends: - - importlib-metadata >=1.6.0 - - packaging >=20.9 - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/dunamai?source=hash-mapping - size: 30908 - timestamp: 1771368088811 +- pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl + name: docformatter + version: 1.7.7 + sha256: 7af49f8a46346a77858f6651f431b882c503c2f4442c8b4524b920c863277834 + requires_dist: + - charset-normalizer>=3.0.0,<4.0.0 + - tomli>=2.0.0,<3.0.0 ; python_full_version < '3.11' and extra == 'tomli' + - untokenize>=0.1.1,<0.2.0 + requires_python: '>=3.9,<4.0' +- pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl + name: dunamai + version: 1.26.0 + sha256: f584edf0fda0d308cce0961f807bc90a8fe3d9ff4d62f94e72eca7b43f0ed5f6 + requires_dist: + - importlib-metadata>=1.6.0 ; python_full_version < '3.8' + - packaging>=20.9 + requires_python: '>=3.5' - pypi: ./ name: easyscience - version: 2.1.0 - sha256: 3e1433dc7b46ccbb4a5d63a22de63b3113897cd66b602a368db0c08b09b3659c + version: 1.0.1+devdirty55 + sha256: e117561462f02ec76e0399569208776341c74680885a2e490922065589875515 requires_dist: - asteval - bumps - dfo-ls + - jupyterlab - lmfit - numpy + - pixi-kernel + - pooch - scipp - uncertainties - - build ; extra == 'build' - - hatchling<=1.21.0 ; extra == 'build' - - setuptools-git-versioning ; extra == 'build' - build ; extra == 'dev' - - codecov ; extra == 'dev' - - flake8 ; extra == 'dev' - - jupyterlab ; extra == 'dev' - - matplotlib ; extra == 'dev' + - copier ; extra == 'dev' + - docformatter ; extra == 'dev' + - interrogate ; extra == 'dev' + - jinja2 ; extra == 'dev' + - jupyterquiz ; extra == 'dev' + - jupytext ; extra == 'dev' + - mike ; extra == 'dev' + - mkdocs ; extra == 'dev' + - mkdocs-autorefs ; extra == 'dev' + - mkdocs-jupyter ; extra == 'dev' + - mkdocs-markdownextradata-plugin ; extra == 'dev' + - mkdocs-material ; extra == 'dev' + - mkdocs-plugin-inline-svg ; extra == 'dev' + - mkdocstrings-python ; extra == 'dev' + - nbmake ; extra == 'dev' + - nbqa ; extra == 'dev' + - nbstripout ; extra == 'dev' + - pre-commit ; extra == 'dev' - pytest ; extra == 'dev' - pytest-cov ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - pyyaml ; extra == 'dev' + - radon ; extra == 'dev' - ruff ; extra == 'dev' - - tox-gh-actions ; extra == 'dev' - - doc8 ; extra == 'docs' - - readme-renderer ; extra == 'docs' - - sphinx-autodoc-typehints ; extra == 'docs' - - sphinx-book-theme ; extra == 'docs' - - sphinx-gallery ; extra == 'docs' - - toml ; extra == 'docs' + - validate-pyproject[all] ; extra == 'dev' + - versioningit ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl - name: editables - version: '0.5' - sha256: 61e5ffa82629e0d8bfe09bc44a07db3c1ab8ed1ce78a6980732870f19b5e7d4c - requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/noarch/eval-type-backport-0.2.2-pyhd8ed1ab_0.conda - sha256: 05ffdcb83903c159bfbb78a07fbcce6fd6dda41df9c55ed75e0eb1db5528048f - md5: 879479fda1dddb002fdc4885cea33740 - depends: - - eval_type_backport >=0.2.2,<0.2.3.0a0 - - python >=3.9 - license: MIT - license_family: MIT - purls: [] - size: 6662 - timestamp: 1734857849281 -- conda: https://conda.anaconda.org/conda-forge/noarch/eval_type_backport-0.2.2-pyha770c72_0.conda - sha256: 2d721421a60676216e10837a240c75e2190e093920a4016a469fa9a62c95ab5f - md5: 8681d7f876da5e66a1c7fce424509383 - depends: - - python >=3.9 - constrains: - - eval-type-backport >=0.2.2,<0.2.3.0a0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/eval-type-backport?source=hash-mapping - size: 11520 - timestamp: 1734857840035 +- pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl + name: execnet + version: 2.1.2 + sha256: 67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec + requires_dist: + - hatch ; extra == 'testing' + - pre-commit ; extra == 'testing' + - pytest ; extra == 'testing' + - tox ; extra == 'testing' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl name: executing version: 2.2.1 @@ -2343,20 +4264,11 @@ packages: - pytest-benchmark ; extra == 'devel' - pytest-cache ; extra == 'devel' - validictory ; extra == 'devel' -- pypi: https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl name: filelock - version: 3.20.0 - sha256: 339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2 + version: 3.25.0 + sha256: 5ccf8069f7948f494968fc0713c10e5c182a9c9d9eef3a636307a20c2490f047 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl - name: flake8 - version: 7.3.0 - sha256: b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e - requires_dist: - - mccabe>=0.7.0,<0.8.0 - - pycodestyle>=2.14.0,<2.15.0 - - pyflakes>=3.4.0,<3.5.0 - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/2d/8b/371ab3cec97ee3fe1126b3406b7abd60c8fec8975fd79a3c75cdea0c3d83/fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl name: fonttools version: 4.60.1 @@ -2482,7 +4394,279 @@ packages: - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' - zopfli>=0.1.4 ; extra == 'all' - - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' + - lz4>=1.7.4.2 ; extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - skia-pathops>=0.5.0 ; extra == 'all' + - uharfbuzz>=0.23.0 ; extra == 'all' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl + name: fonttools + version: 4.61.1 + sha256: fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7 + requires_dist: + - lxml>=4.0 ; extra == 'lxml' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - zopfli>=0.1.4 ; extra == 'woff' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'unicode' + - lz4>=1.7.4.2 ; extra == 'graphite' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - pycairo ; extra == 'interpolatable' + - matplotlib ; extra == 'plot' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - skia-pathops>=0.5.0 ; extra == 'pathops' + - uharfbuzz>=0.45.0 ; extra == 'repacker' + - lxml>=4.0 ; extra == 'all' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - zopfli>=0.1.4 ; extra == 'all' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'all' + - lz4>=1.7.4.2 ; extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - skia-pathops>=0.5.0 ; extra == 'all' + - uharfbuzz>=0.45.0 ; extra == 'all' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl + name: fonttools + version: 4.61.1 + sha256: 21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b + requires_dist: + - lxml>=4.0 ; extra == 'lxml' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - zopfli>=0.1.4 ; extra == 'woff' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'unicode' + - lz4>=1.7.4.2 ; extra == 'graphite' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - pycairo ; extra == 'interpolatable' + - matplotlib ; extra == 'plot' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - skia-pathops>=0.5.0 ; extra == 'pathops' + - uharfbuzz>=0.45.0 ; extra == 'repacker' + - lxml>=4.0 ; extra == 'all' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - zopfli>=0.1.4 ; extra == 'all' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'all' + - lz4>=1.7.4.2 ; extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - skia-pathops>=0.5.0 ; extra == 'all' + - uharfbuzz>=0.45.0 ; extra == 'all' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl + name: fonttools + version: 4.61.1 + sha256: 8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c + requires_dist: + - lxml>=4.0 ; extra == 'lxml' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - zopfli>=0.1.4 ; extra == 'woff' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'unicode' + - lz4>=1.7.4.2 ; extra == 'graphite' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - pycairo ; extra == 'interpolatable' + - matplotlib ; extra == 'plot' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - skia-pathops>=0.5.0 ; extra == 'pathops' + - uharfbuzz>=0.45.0 ; extra == 'repacker' + - lxml>=4.0 ; extra == 'all' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - zopfli>=0.1.4 ; extra == 'all' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'all' + - lz4>=1.7.4.2 ; extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - skia-pathops>=0.5.0 ; extra == 'all' + - uharfbuzz>=0.45.0 ; extra == 'all' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl + name: fonttools + version: 4.61.1 + sha256: dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e + requires_dist: + - lxml>=4.0 ; extra == 'lxml' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - zopfli>=0.1.4 ; extra == 'woff' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'unicode' + - lz4>=1.7.4.2 ; extra == 'graphite' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - pycairo ; extra == 'interpolatable' + - matplotlib ; extra == 'plot' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - skia-pathops>=0.5.0 ; extra == 'pathops' + - uharfbuzz>=0.45.0 ; extra == 'repacker' + - lxml>=4.0 ; extra == 'all' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - zopfli>=0.1.4 ; extra == 'all' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'all' + - lz4>=1.7.4.2 ; extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - skia-pathops>=0.5.0 ; extra == 'all' + - uharfbuzz>=0.45.0 ; extra == 'all' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl + name: fonttools + version: 4.61.1 + sha256: c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09 + requires_dist: + - lxml>=4.0 ; extra == 'lxml' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - zopfli>=0.1.4 ; extra == 'woff' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'unicode' + - lz4>=1.7.4.2 ; extra == 'graphite' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - pycairo ; extra == 'interpolatable' + - matplotlib ; extra == 'plot' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - skia-pathops>=0.5.0 ; extra == 'pathops' + - uharfbuzz>=0.45.0 ; extra == 'repacker' + - lxml>=4.0 ; extra == 'all' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - zopfli>=0.1.4 ; extra == 'all' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'all' + - lz4>=1.7.4.2 ; extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - skia-pathops>=0.5.0 ; extra == 'all' + - uharfbuzz>=0.45.0 ; extra == 'all' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/79/61/1ca198af22f7dd22c17ab86e9024ed3c06299cfdb08170640e9996d501a0/fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: fonttools + version: 4.61.1 + sha256: 75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9 + requires_dist: + - lxml>=4.0 ; extra == 'lxml' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - zopfli>=0.1.4 ; extra == 'woff' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'unicode' + - lz4>=1.7.4.2 ; extra == 'graphite' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - pycairo ; extra == 'interpolatable' + - matplotlib ; extra == 'plot' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - skia-pathops>=0.5.0 ; extra == 'pathops' + - uharfbuzz>=0.45.0 ; extra == 'repacker' + - lxml>=4.0 ; extra == 'all' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - zopfli>=0.1.4 ; extra == 'all' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'all' + - lz4>=1.7.4.2 ; extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - skia-pathops>=0.5.0 ; extra == 'all' + - uharfbuzz>=0.45.0 ; extra == 'all' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl + name: fonttools + version: 4.61.1 + sha256: 64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5 + requires_dist: + - lxml>=4.0 ; extra == 'lxml' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - zopfli>=0.1.4 ; extra == 'woff' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'unicode' + - lz4>=1.7.4.2 ; extra == 'graphite' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - pycairo ; extra == 'interpolatable' + - matplotlib ; extra == 'plot' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - skia-pathops>=0.5.0 ; extra == 'pathops' + - uharfbuzz>=0.45.0 ; extra == 'repacker' + - lxml>=4.0 ; extra == 'all' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - zopfli>=0.1.4 ; extra == 'all' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'all' + - lz4>=1.7.4.2 ; extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - skia-pathops>=0.5.0 ; extra == 'all' + - uharfbuzz>=0.45.0 ; extra == 'all' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ac/49/4138d1acb6261499bedde1c07f8c2605d1d8f9d77a151e5507fd3ef084b6/fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl + name: fonttools + version: 4.61.1 + sha256: 5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37 + requires_dist: + - lxml>=4.0 ; extra == 'lxml' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - zopfli>=0.1.4 ; extra == 'woff' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'unicode' + - lz4>=1.7.4.2 ; extra == 'graphite' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - pycairo ; extra == 'interpolatable' + - matplotlib ; extra == 'plot' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - skia-pathops>=0.5.0 ; extra == 'pathops' + - uharfbuzz>=0.45.0 ; extra == 'repacker' + - lxml>=4.0 ; extra == 'all' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - zopfli>=0.1.4 ; extra == 'all' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'all' - lz4>=1.7.4.2 ; extra == 'all' - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' @@ -2491,8 +4675,8 @@ packages: - sympy ; extra == 'all' - xattr ; sys_platform == 'darwin' and extra == 'all' - skia-pathops>=0.5.0 ; extra == 'all' - - uharfbuzz>=0.23.0 ; extra == 'all' - requires_python: '>=3.9' + - uharfbuzz>=0.45.0 ; extra == 'all' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl name: fqdn version: 1.5.1 @@ -2500,16 +4684,31 @@ packages: requires_dist: - cached-property>=1.3.0 ; python_full_version < '3.8' requires_python: '>=2.7,!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,<4' +- pypi: https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl + name: frozenlist + version: 1.8.0 + sha256: ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl name: frozenlist version: 1.8.0 sha256: f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40 requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + name: frozenlist + version: 1.8.0 + sha256: 2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl name: frozenlist version: 1.8.0 sha256: 96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7 requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl + name: frozenlist + version: 1.8.0 + sha256: fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93 + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl name: frozenlist version: 1.8.0 @@ -2520,22 +4719,97 @@ packages: version: 1.8.0 sha256: 878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231 requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/noarch/funcy-2.0-pyhd8ed1ab_1.conda - sha256: 4a3e3e86b7b49aaa2a0faa57da2bcf39f7ee858499e8335132f83bfeed79191e - md5: 84f8955e99a8944fdee49da39edb0add +- pypi: https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl + name: frozenlist + version: 1.8.0 + sha256: 17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl + name: funcy + version: '2.0' + sha256: 53df23c8bb1651b12f095df764bfb057935d49537a56de211b098f4c79614bb0 +- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + name: ghp-import + version: 2.1.0 + sha256: 8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619 + requires_dist: + - python-dateutil>=2.8.1 + - twine ; extra == 'dev' + - markdown ; extra == 'dev' + - flake8 ; extra == 'dev' + - wheel ; extra == 'dev' +- pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl + name: griffelib + version: 2.0.0 + sha256: 01284878c966508b6d6f1dbff9b6fa607bc062d8261c5c7253cb285b06422a7f + requires_dist: + - pip>=24.0 ; extra == 'pypi' + - platformdirs>=4.2 ; extra == 'pypi' + - wheel>=0.42 ; extra == 'pypi' + requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-hbf7d49c_1.conda + sha256: f923af07c3a3db746d3be8efebdaa9c819a6007ee3cc12445cee059641611e05 + md5: 04e128d2adafe3c844cde58f103c481b depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/funcy?source=hash-mapping - size: 30249 - timestamp: 1734381235500 + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + license: GPL-3.0-or-later + license_family: GPL + purls: [] + size: 2486744 + timestamp: 1737621160295 +- conda: https://conda.anaconda.org/conda-forge/osx-64/gsl-2.8-hc707ee6_1.conda + sha256: 1d729f940f28dd5476b847123883abce119dff7af1abc236452d54ad4682b702 + md5: 382c8abc7d56f9236090a76fc6e51a97 + depends: + - __osx >=10.13 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + license: GPL-3.0-or-later + license_family: GPL + purls: [] + size: 2300171 + timestamp: 1737621445693 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.8-h8d0574d_1.conda + sha256: f11d8f2007f6591022afa958d8fe15afbe4211198d1603c0eb886bc21a9eb19e + md5: cc261442bead590d89ca9f96884a344f + depends: + - __osx >=11.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + license: GPL-3.0-or-later + license_family: GPL + purls: [] + size: 1862134 + timestamp: 1737621413640 +- conda: https://conda.anaconda.org/conda-forge/win-64/gsl-2.8-h5b8d9c4_1.conda + sha256: 87a3468e09cc1ee0268e8639debad6a5b440090ef8cb1d2ee5eed66c86085528 + md5: a47cf810b7c03955139a150b228b93ca + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: GPL-3.0-or-later + license_family: GPL + purls: [] + size: 1528970 + timestamp: 1737622367981 - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl name: h11 version: 0.16.0 sha256: 63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86 requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/23/95/499b4e56452ef8b6c95a271af0dde08dac4ddb70515a75f346d4f400579b/h5py-3.15.1-cp311-cp311-win_amd64.whl + name: h5py + version: 3.15.1 + sha256: 550e51131376889656feec4aff2170efc054a7fe79eb1da3bb92e1625d1ac878 + requires_dist: + - numpy>=1.21.2 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl name: h5py version: 3.15.1 @@ -2543,6 +4817,13 @@ packages: requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/41/fd/8349b48b15b47768042cff06ad6e1c229f0a4bd89225bf6b6894fea27e6d/h5py-3.15.1-cp311-cp311-macosx_10_9_x86_64.whl + name: h5py + version: 3.15.1 + sha256: 5aaa330bcbf2830150c50897ea5dcbed30b5b6d56897289846ac5b9e529ec243 + requires_dist: + - numpy>=1.21.2 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl name: h5py version: 3.15.1 @@ -2550,6 +4831,20 @@ packages: requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/8b/23/4ab1108e87851ccc69694b03b817d92e142966a6c4abd99e17db77f2c066/h5py-3.15.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: h5py + version: 3.15.1 + sha256: 5b849ba619a066196169763c33f9f0f02e381156d61c03e000bb0100f9950faf + requires_dist: + - numpy>=1.21.2 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/c1/b0/1c628e26a0b95858f54aba17e1599e7f6cd241727596cc2580b72cb0a9bf/h5py-3.15.1-cp311-cp311-macosx_11_0_arm64.whl + name: h5py + version: 3.15.1 + sha256: c970fb80001fffabb0109eaf95116c8e7c0d3ca2de854e0901e8a04c1f098509 + requires_dist: + - numpy>=1.21.2 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: h5py version: 3.15.1 @@ -2564,18 +4859,6 @@ packages: requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl - name: hatchling - version: 1.21.0 - sha256: b33ef0ecdee6dbfd28c21ca30df459ba1d566050d033f8b5a1d0e26e5606d26b - requires_dist: - - editables>=0.3 - - packaging>=21.3 - - pathspec>=0.10.1 - - pluggy>=1.0.0 - - tomli>=1.2.2 ; python_full_version < '3.11' - - trove-classifiers - requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl name: httpcore version: 1.0.9 @@ -2606,28 +4889,57 @@ packages: - socksio==1.* ; extra == 'socks' - zstandard>=0.18.0 ; extra == 'zstd' requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e - md5: 8b189310083baabfb622af68fd9d3ae3 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + sha256: 142a722072fa96cf16ff98eaaf641f54ab84744af81754c292cb81e0881c0329 + md5: 186a18e3ba246eccfc7cff00cd19a870 depends: - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 12728445 + timestamp: 1767969922681 +- conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda + sha256: f3066beae7fe3002f09c8a412cdf1819f49a2c9a485f720ec11664330cf9f1fe + md5: 30334add4de016489b731c6662511684 + depends: + - __osx >=10.13 license: MIT license_family: MIT purls: [] - size: 12129203 - timestamp: 1720853576813 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 - md5: 5eb22c1d7b3fc4abb50d92d621583137 + size: 12263724 + timestamp: 1767970604977 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_0.conda + sha256: 24bc62335106c30fecbcc1dba62c5eba06d18b90ea1061abd111af7b9c89c2d7 + md5: 114e6bfe7c5ad2525eb3597acdbf2300 depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] - size: 11857802 - timestamp: 1720853997952 + size: 12389400 + timestamp: 1772209104304 +- conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda + sha256: 5a41fb28971342e293769fc968b3414253a2f8d9e30ed7c31517a15b4887246a + md5: 0ee3bb487600d5e71ab7d28951b2016a + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 13222158 + timestamp: 1767970128854 +- pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl + name: identify + version: 2.6.17 + sha256: be5f8412d5ed4b20f2bd41a65f920990bdccaa6a4a18a08f1eefdcd0bdd885f0 + requires_dist: + - ukkonen ; extra == 'license' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl name: idna version: '3.11' @@ -2638,58 +4950,90 @@ packages: - pytest>=8.3.2 ; extra == 'all' - flake8>=7.1.1 ; extra == 'all' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl - name: imagesize - version: 1.4.1 - sha256: 0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' -- 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/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 - md5: c85c76dc67d75619a92f51dfbce06992 - depends: - - python >=3.9 - - zipp >=3.1.0 - constrains: - - importlib-resources >=6.5.2,<6.5.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/importlib-resources?source=hash-mapping - size: 33781 - timestamp: 1736252433366 +- pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl + name: importlib-metadata + version: 8.7.1 + sha256: 5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151 + requires_dist: + - zipp>=3.20 + - pytest>=6,!=8.1.* ; extra == 'test' + - packaging ; extra == 'test' + - pyfakefs ; extra == 'test' + - flufl-flake8 ; extra == 'test' + - pytest-perf>=0.9.2 ; extra == 'test' + - jaraco-test>=5.4 ; extra == 'test' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - ipython ; extra == 'perf' + - pytest-checkdocs>=2.4 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - pytest-cov ; extra == 'cover' + - pytest-enabler>=3.4 ; extra == 'enabler' + - pytest-mypy>=1.0.1 ; extra == 'type' + - mypy<1.19 ; platform_python_implementation == 'PyPy' and extra == 'type' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl + name: importlib-resources + version: 6.5.2 + sha256: 789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec + requires_dist: + - zipp>=3.1.0 ; python_full_version < '3.10' + - pytest>=6,!=8.1.* ; extra == 'test' + - zipp>=3.17 ; extra == 'test' + - jaraco-test>=5.4 ; extra == 'test' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pytest-checkdocs>=2.4 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - pytest-cov ; extra == 'cover' + - pytest-enabler>=2.2 ; extra == 'enabler' + - pytest-mypy ; extra == 'type' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl name: iniconfig version: 2.3.0 sha256: f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12 requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - sha256: 5a4e3a01f626c8de15ddada622d364e94ff28e8d6bdedf1665442ef03a4e0140 - md5: 3a804714ed59be1969ffca10f703ec2a - depends: - - python >=3.10 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/invoke?source=hash-mapping - size: 132825 - timestamp: 1760146119847 -- pypi: https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl + name: interrogate + version: 1.7.0 + sha256: b13ff4dd8403369670e2efe684066de9fcb868ad9d7f2b4095d8112142dc9d12 + requires_dist: + - attrs + - click>=7.1 + - colorama + - py + - tabulate + - tomli ; python_full_version < '3.11' + - cairosvg ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx-autobuild ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - pytest-mock ; extra == 'dev' + - coverage[toml] ; extra == 'dev' + - wheel ; extra == 'dev' + - pre-commit ; extra == 'dev' + - sphinx ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - cairosvg ; extra == 'png' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-mock ; extra == 'tests' + - coverage[toml] ; extra == 'tests' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl name: ipykernel - version: 7.1.0 - sha256: 763b5ec6c5b7776f6a8d7ce09b267693b4e5ce75cb50ae696aaefb3c85e1ea4c + version: 6.31.0 + sha256: abe5386f6ced727a70e0eb0cf1da801fa7c5fa6ff82147747d5a0406cd8c94af requires_dist: - appnope>=0.1.2 ; sys_platform == 'darwin' - comm>=0.1.1 @@ -2711,8 +5055,8 @@ packages: - intersphinx-registry ; extra == 'docs' - myst-parser ; extra == 'docs' - pydata-sphinx-theme ; extra == 'docs' + - sphinx ; extra == 'docs' - sphinx-autodoc-typehints ; extra == 'docs' - - sphinx<8.2.0 ; extra == 'docs' - sphinxcontrib-github-alt ; extra == 'docs' - sphinxcontrib-spelling ; extra == 'docs' - trio ; extra == 'docs' @@ -2725,11 +5069,11 @@ packages: - pytest-cov ; extra == 'test' - pytest-timeout ; extra == 'test' - pytest>=7.0,<9 ; extra == 'test' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/05/aa/62893d6a591d337aa59dcc4c6f6c842f1fe20cd72c8c5c1f980255243252/ipython-9.7.0-py3-none-any.whl + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl name: ipython - version: 9.7.0 - sha256: bce8ac85eb9521adc94e1845b4c03d88365fd6ac2f4908ec4ed1eb1b0a065f9f + version: 9.10.0 + sha256: c6ab68cc23bba8c7e18e9b932797014cc61ea7fd6f19de180ab9ba73e65ee58d requires_dist: - colorama>=0.4.4 ; sys_platform == 'win32' - decorator>=4.3.2 @@ -2769,7 +5113,8 @@ packages: - pandas>2.1 ; extra == 'test-extra' - trio>=0.1.0 ; extra == 'test-extra' - matplotlib>3.9 ; extra == 'matplotlib' - - ipython[doc,matplotlib,test,test-extra] ; extra == 'all' + - ipython[doc,matplotlib,terminal,test,test-extra] ; extra == 'all' + - argcomplete>=3.0 ; extra == 'all' requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl name: ipython-pygments-lexers @@ -2825,63 +5170,42 @@ packages: - docopt ; extra == 'testing' - pytest<9.0.0 ; extra == 'testing' requires_python: '>=3.6' -- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b - md5: 04558c96691bed63104678757beb4f8d - depends: - - markupsafe >=2.0 - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/jinja2?source=compressed-mapping - size: 120685 - timestamp: 1764517220861 -- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-ansible-filters-1.3.2-pyhd8ed1ab_1.conda - sha256: a36789229ca9ce5315265b9d425abce9acb4691f5864aea69e935020545a9acb - md5: 974c5b3e353f031cfcf2365c9d375926 - depends: +- pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + name: jinja2 + version: 3.1.6 + sha256: 85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl + name: jinja2-ansible-filters + version: 1.3.2 + sha256: e1082f5564917649c76fed239117820610516ec10f87735d0338688800a55b34 + requires_dist: - jinja2 - - python >=3.9 - pyyaml - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/jinja2-ansible-filters?source=hash-mapping - size: 20315 - timestamp: 1734906203051 -- pypi: https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' +- pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl name: json5 - version: 0.12.1 - sha256: d9c9b3bc34a5f54d43c35e11ef7cb87d8bdd098c6ace87117a7b7e83e705c1d5 - requires_dist: - - build==1.2.2.post1 ; extra == 'dev' - - coverage==7.5.4 ; python_full_version < '3.9' and extra == 'dev' - - coverage==7.8.0 ; python_full_version >= '3.9' and extra == 'dev' - - mypy==1.14.1 ; python_full_version < '3.9' and extra == 'dev' - - mypy==1.15.0 ; python_full_version >= '3.9' and extra == 'dev' - - pip==25.0.1 ; extra == 'dev' - - pylint==3.2.7 ; python_full_version < '3.9' and extra == 'dev' - - pylint==3.3.6 ; python_full_version >= '3.9' and extra == 'dev' - - ruff==0.11.2 ; extra == 'dev' - - twine==6.1.0 ; extra == 'dev' - - uv==0.6.11 ; extra == 'dev' + version: 0.13.0 + sha256: 9a08e1dd65f6a4d4c6fa82d216cf2477349ec2346a38fd70cc11d2557499fbcc requires_python: '>=3.8.0' - pypi: https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl name: jsonpointer version: 3.0.0 sha256: 13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl name: jsonschema - version: 4.25.1 - sha256: 3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63 + version: 4.26.0 + sha256: d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce requires_dist: - attrs>=22.2.0 - jsonschema-specifications>=2023.3.6 - referencing>=0.28.4 - - rpds-py>=0.7.1 + - rpds-py>=0.25.0 - fqdn ; extra == 'format' - idna ; extra == 'format' - isoduration ; extra == 'format' @@ -2899,7 +5223,7 @@ packages: - rfc3987-syntax>=1.1.0 ; extra == 'format-nongpl' - uri-template ; extra == 'format-nongpl' - webcolors>=24.6.0 ; extra == 'format-nongpl' - requires_python: '>=3.9' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl name: jsonschema-specifications version: 2025.9.1 @@ -2907,16 +5231,15 @@ packages: requires_dist: - referencing>=0.31.0 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl name: jupyter-client - version: 8.6.3 - sha256: e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f + version: 8.8.0 + sha256: f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a requires_dist: - - importlib-metadata>=4.8.3 ; python_full_version < '3.10' - - jupyter-core>=4.12,!=5.0.* + - jupyter-core>=5.1 - python-dateutil>=2.8.2 - - pyzmq>=23.0 - - tornado>=6.2 + - pyzmq>=25.0 + - tornado>=6.4.1 - traitlets>=5.3 - ipykernel ; extra == 'docs' - myst-parser ; extra == 'docs' @@ -2925,16 +5248,19 @@ packages: - sphinx>=4 ; extra == 'docs' - sphinxcontrib-github-alt ; extra == 'docs' - sphinxcontrib-spelling ; extra == 'docs' + - orjson ; extra == 'orjson' + - anyio ; extra == 'test' - coverage ; extra == 'test' - ipykernel>=6.14 ; extra == 'test' - - mypy ; extra == 'test' + - msgpack ; extra == 'test' + - mypy ; platform_python_implementation != 'PyPy' and extra == 'test' - paramiko ; sys_platform == 'win32' and extra == 'test' - pre-commit ; extra == 'test' + - pytest ; extra == 'test' - pytest-cov ; extra == 'test' - - pytest-jupyter[client]>=0.4.1 ; extra == 'test' + - pytest-jupyter[client]>=0.6.2 ; extra == 'test' - pytest-timeout ; extra == 'test' - - pytest<8.2.0 ; extra == 'test' - requires_python: '>=3.8' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl name: jupyter-core version: 5.9.1 @@ -3037,10 +5363,10 @@ packages: - pytest>=7.0,<9 ; extra == 'test' - requests ; extra == 'test' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl name: jupyter-server-terminals - version: 0.5.3 - sha256: 41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa + version: 0.5.4 + sha256: 55be353fc74a80bc7f3b20e6be50a55a61cd525626f578dcb66a5708e2007d14 requires_dist: - pywinpty>=2.0.3 ; os_name == 'nt' - terminado>=0.8.3 @@ -3061,10 +5387,10 @@ packages: - pytest-timeout ; extra == 'test' - pytest>=7.0 ; extra == 'test' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/6c/1e/5a4d5498eba382fee667ed797cf64ae5d1b13b04356df62f067f48bb0f61/jupyterlab-4.5.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl name: jupyterlab - version: 4.5.0 - sha256: 88e157c75c1afff64c7dc4b801ec471450b922a4eae4305211ddd40da8201c8a + version: 4.5.5 + sha256: a35694a40a8e7f2e82f387472af24e61b22adcce87b5a8ab97a5d9c486202a6d requires_dist: - async-lru>=1.0.0 - httpx>=0.25.0,<1 @@ -3165,16 +5491,118 @@ packages: - strict-rfc3339 ; extra == 'test' - werkzeug ; extra == 'test' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl + name: jupyterquiz + version: 2.9.6.2 + sha256: f60f358c809d06a38c423c804740c1113c8840e130227aef50694a9201474bef +- pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl + name: jupytext + version: 1.19.1 + sha256: d8975035155d034bdfde5c0c37891425314b7ea8d3a6c4b5d18c294348714cd9 + requires_dist: + - markdown-it-py>=1.0 + - mdit-py-plugins + - nbformat + - packaging + - pyyaml + - tomli ; python_full_version < '3.11' + - autopep8 ; extra == 'dev' + - black ; extra == 'dev' + - flake8 ; extra == 'dev' + - gitpython ; extra == 'dev' + - ipykernel ; extra == 'dev' + - isort ; extra == 'dev' + - jupyter-fs[fs]>=1.0 ; extra == 'dev' + - jupyter-server!=2.11 ; extra == 'dev' + - marimo>=0.17.6,<=0.19.4 ; extra == 'dev' + - nbconvert ; extra == 'dev' + - pre-commit ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-asyncio ; extra == 'dev' + - pytest-cov>=2.6.1 ; extra == 'dev' + - pytest-randomly ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx-gallery>=0.8 ; extra == 'dev' + - myst-parser ; extra == 'docs' + - sphinx ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-rtd-theme ; extra == 'docs' + - pytest ; extra == 'test' + - pytest-asyncio ; extra == 'test' + - pytest-randomly ; extra == 'test' + - pytest-xdist ; extra == 'test' + - black ; extra == 'test-cov' + - ipykernel ; extra == 'test-cov' + - jupyter-server!=2.11 ; extra == 'test-cov' + - nbconvert ; extra == 'test-cov' + - pytest ; extra == 'test-cov' + - pytest-asyncio ; extra == 'test-cov' + - pytest-cov>=2.6.1 ; extra == 'test-cov' + - pytest-randomly ; extra == 'test-cov' + - pytest-xdist ; extra == 'test-cov' + - autopep8 ; extra == 'test-external' + - black ; extra == 'test-external' + - flake8 ; extra == 'test-external' + - gitpython ; extra == 'test-external' + - ipykernel ; extra == 'test-external' + - isort ; extra == 'test-external' + - jupyter-fs[fs]>=1.0 ; extra == 'test-external' + - jupyter-server!=2.11 ; extra == 'test-external' + - marimo>=0.17.6,<=0.19.4 ; extra == 'test-external' + - nbconvert ; extra == 'test-external' + - pre-commit ; extra == 'test-external' + - pytest ; extra == 'test-external' + - pytest-asyncio ; extra == 'test-external' + - pytest-randomly ; extra == 'test-external' + - pytest-xdist ; extra == 'test-external' + - sphinx ; extra == 'test-external' + - sphinx-gallery>=0.8 ; extra == 'test-external' + - black ; extra == 'test-functional' + - pytest ; extra == 'test-functional' + - pytest-asyncio ; extra == 'test-functional' + - pytest-randomly ; extra == 'test-functional' + - pytest-xdist ; extra == 'test-functional' + - black ; extra == 'test-integration' + - ipykernel ; extra == 'test-integration' + - jupyter-server!=2.11 ; extra == 'test-integration' + - nbconvert ; extra == 'test-integration' + - pytest ; extra == 'test-integration' + - pytest-asyncio ; extra == 'test-integration' + - pytest-randomly ; extra == 'test-integration' + - pytest-xdist ; extra == 'test-integration' + - bash-kernel ; extra == 'test-ui' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl name: kiwisolver version: 1.4.9 sha256: 1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl + name: kiwisolver + version: 1.4.9 + sha256: 2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl + name: kiwisolver + version: 1.4.9 + sha256: be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: kiwisolver + version: 1.4.9 + sha256: dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl name: kiwisolver version: 1.4.9 sha256: dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl + name: kiwisolver + version: 1.4.9 + sha256: 39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl name: kiwisolver version: 1.4.9 @@ -3201,11 +5629,342 @@ packages: depends: - __glibc >=2.17,<3.0.a0 constrains: - - binutils_impl_linux-64 2.45 - license: GPL-3.0-only + - binutils_impl_linux-64 2.45 + license: GPL-3.0-only + purls: [] + size: 729222 + timestamp: 1763768158810 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda + sha256: 565941ac1f8b0d2f2e8f02827cbca648f4d18cd461afc31f15604cd291b5c5f3 + md5: 12bd9a3f089ee6c9266a37dab82afabd + depends: + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-64 2.45.1 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 725507 + timestamp: 1770267139900 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + sha256: a7a4481a4d217a3eadea0ec489826a69070fcc3153f00443aa491ed21527d239 + md5: 6f7b4302263347698fd24565fbf11310 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - libabseil-static =20260107.1=cxx17* + - abseil-cpp =20260107.1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1384817 + timestamp: 1770863194876 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda + sha256: 2b4ff36082ddfbacc47ac6e11d4dd9f3403cd109ce8d7f0fbee0cdd47cdef013 + md5: 317f40d7bd7bf6d54b56d4a5b5f5085d + depends: + - __osx >=10.13 + - libcxx >=19 + constrains: + - libabseil-static =20260107.1=cxx17* + - abseil-cpp =20260107.1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1217836 + timestamp: 1770863510112 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda + sha256: 756611fbb8d2957a5b4635d9772bd8432cb6ddac05580a6284cca6fdc9b07fca + md5: bb65152e0d7c7178c0f1ee25692c9fd1 + depends: + - __osx >=11.0 + - libcxx >=19 + constrains: + - abseil-cpp =20260107.1 + - libabseil-static =20260107.1=cxx17* + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1229639 + timestamp: 1770863511331 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda + build_number: 5 + sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c + md5: c160954f7418d7b6e87eaf05a8913fa9 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - mkl <2026 + - liblapack 3.11.0 5*_openblas + - libcblas 3.11.0 5*_openblas + - blas 2.305 openblas + - liblapacke 3.11.0 5*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18213 + timestamp: 1765818813880 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda + build_number: 5 + sha256: 4754de83feafa6c0b41385f8dab1b13f13476232e16f524564a340871a9fc3bc + md5: 36d2e68a156692cbae776b75d6ca6eae + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - liblapack 3.11.0 5*_openblas + - blas 2.305 openblas + - libcblas 3.11.0 5*_openblas + - mkl <2026 + - liblapacke 3.11.0 5*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18476 + timestamp: 1765819054657 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda + build_number: 5 + sha256: 620a6278f194dcabc7962277da6835b1e968e46ad0c8e757736255f5ddbfca8d + md5: bcc025e2bbaf8a92982d20863fe1fb69 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - libcblas 3.11.0 5*_openblas + - liblapack 3.11.0 5*_openblas + - liblapacke 3.11.0 5*_openblas + - blas 2.305 openblas + - mkl <2026 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18546 + timestamp: 1765819094137 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda + build_number: 5 + sha256: f0cb7b2697461a306341f7ff32d5b361bb84f3e94478464c1e27ee01fc8f276b + md5: f9decf88743af85c9c9e05556a4c47c0 + depends: + - mkl >=2025.3.0,<2026.0a0 + constrains: + - liblapack 3.11.0 5*_mkl + - libcblas 3.11.0 5*_mkl + - blas 2.305 mkl + - liblapacke 3.11.0 5*_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 67438 + timestamp: 1765819100043 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda + sha256: 318f36bd49ca8ad85e6478bd8506c88d82454cc008c1ac1c6bf00a3c42fa610e + md5: 72c8fd1af66bd67bf580645b426513ed + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 79965 + timestamp: 1764017188531 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda + sha256: 4c19b211b3095f541426d5a9abac63e96a5045e509b3d11d4f9482de53efe43b + md5: f157c098841474579569c85a60ece586 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 78854 + timestamp: 1764017554982 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda + sha256: a7cb9e660531cf6fbd4148cff608c85738d0b76f0975c5fc3e7d5e92840b7229 + md5: 006e7ddd8a110771134fcc4e1e3a6ffa + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 79443 + timestamp: 1764017945924 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda + sha256: 12fff21d38f98bc446d82baa890e01fd82e3b750378fedc720ff93522ffb752b + md5: 366b40a69f0ad6072561c1d09301c886 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.2.0 hb03c661_1 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 34632 + timestamp: 1764017199083 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda + sha256: 729158be90ae655a4e0427fe4079767734af1f9b69ff58cf94ca6e8d4b3eb4b7 + md5: 63186ac7a8a24b3528b4b14f21c03f54 + depends: + - __osx >=10.13 + - libbrotlicommon 1.2.0 h8616949_1 + license: MIT + license_family: MIT + purls: [] + size: 30835 + timestamp: 1764017584474 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda + sha256: 2eae444039826db0454b19b52a3390f63bfe24f6b3e63089778dd5a5bf48b6bf + md5: 079e88933963f3f149054eec2c487bc2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.2.0 hc919400_1 + license: MIT + license_family: MIT + purls: [] + size: 29452 + timestamp: 1764017979099 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda + sha256: a0c15c79997820bbd3fbc8ecf146f4fe0eca36cc60b62b63ac6cf78857f1dd0d + md5: 4ffbb341c8b616aa2494b6afb26a0c5f + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.2.0 hb03c661_1 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 298378 + timestamp: 1764017210931 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda + sha256: 8ece7b41b6548d6601ac2c2cd605cf2261268fc4443227cc284477ed23fbd401 + md5: 12a58fd3fc285ce20cf20edf21a0ff8f + depends: + - __osx >=10.13 + - libbrotlicommon 1.2.0 h8616949_1 + license: MIT + license_family: MIT + purls: [] + size: 310355 + timestamp: 1764017609985 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda + sha256: 01436c32bb41f9cb4bcf07dda647ce4e5deb8307abfc3abdc8da5317db8189d1 + md5: b2b7c8288ca1a2d71ff97a8e6a1e8883 + depends: + - __osx >=11.0 + - libbrotlicommon 1.2.0 hc919400_1 + license: MIT + license_family: MIT + purls: [] + size: 290754 + timestamp: 1764018009077 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda + build_number: 5 + sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8 + md5: 6636a2b6f1a87572df2970d3ebc87cc0 + depends: + - libblas 3.11.0 5_h4a7cf45_openblas + constrains: + - liblapacke 3.11.0 5*_openblas + - blas 2.305 openblas + - liblapack 3.11.0 5*_openblas + license: BSD-3-Clause + license_family: BSD purls: [] - size: 729222 - timestamp: 1763768158810 + size: 18194 + timestamp: 1765818837135 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda + build_number: 5 + sha256: 8077c29ea720bd152be6e6859a3765228cde51301fe62a3b3f505b377c2cb48c + md5: b31d771cbccff686e01a687708a7ca41 + depends: + - libblas 3.11.0 5_he492b99_openblas + constrains: + - liblapack 3.11.0 5*_openblas + - blas 2.305 openblas + - liblapacke 3.11.0 5*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18484 + timestamp: 1765819073006 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda + build_number: 5 + sha256: 38809c361bbd165ecf83f7f05fae9b791e1baa11e4447367f38ae1327f402fc0 + md5: efd8bd15ca56e9d01748a3beab8404eb + depends: + - libblas 3.11.0 5_h51639a9_openblas + constrains: + - liblapacke 3.11.0 5*_openblas + - liblapack 3.11.0 5*_openblas + - blas 2.305 openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18548 + timestamp: 1765819108956 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda + build_number: 5 + sha256: 49dc59d8e58360920314b8d276dd80da7866a1484a9abae4ee2760bc68f3e68d + md5: b3fa8e8b55310ba8ef0060103afb02b5 + depends: + - libblas 3.11.0 5_hf2e6a31_mkl + constrains: + - liblapack 3.11.0 5*_mkl + - liblapacke 3.11.0 5*_mkl + - blas 2.305 mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 68079 + timestamp: 1765819124349 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.0-h19cb2f5_1.conda + sha256: fa002b43752fe5860e588435525195324fe250287105ebd472ac138e97de45e6 + md5: 836389b6b9ae58f3fbcf7cafebd5c7f2 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 570141 + timestamp: 1772001147762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda + sha256: ce1049fa6fda9cf08ff1c50fb39573b5b0ea6958375d8ea7ccd8456ab81a0bcb + md5: e9c56daea841013e7774b5cd46f41564 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 568910 + timestamp: 1772001095642 +- 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-64/libev-4.33-h10d778d_2.conda + sha256: 0d238488564a7992942aa165ff994eca540f687753b4f0998b29b4e4d030ff43 + md5: 899db79329439820b7e8f8de41bca902 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 106663 + timestamp: 1702146352558 +- 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/libexpat-2.7.3-hecca717_0.conda sha256: 1e1b08f6211629cbc2efe7a5bca5953f8f6b3cae0eeb04ca4dacee1bd4e2db2f md5: 8b09ae86839581147ef2e5c5e229d164 @@ -3219,6 +5978,19 @@ packages: purls: [] size: 76643 timestamp: 1763549731408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 + md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.4.* + license: MIT + license_family: MIT + purls: [] + size: 76798 + timestamp: 1771259418166 - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda sha256: d11b3a6ce5b2e832f430fd112084533a01220597221bee16d6c7dc3947dffba6 md5: 222e0732a1d0780a622926265bee14ef @@ -3231,6 +6003,18 @@ packages: purls: [] size: 74058 timestamp: 1763549886493 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + sha256: 8d9d79b2de7d6f335692391f5281607221bf5d040e6724dad4c4d77cd603ce43 + md5: a684eb8a19b2aa68fde0267df172a1e3 + depends: + - __osx >=10.13 + constrains: + - expat 2.7.4.* + license: MIT + license_family: MIT + purls: [] + size: 74578 + timestamp: 1771260142624 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda sha256: fce22610ecc95e6d149e42a42fbc3cc9d9179bd4eb6232639a60f06e080eec98 md5: b79875dbb5b1db9a4a22a4520f918e1a @@ -3243,6 +6027,18 @@ packages: purls: [] size: 67800 timestamp: 1763549994166 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + sha256: 03887d8080d6a8fe02d75b80929271b39697ecca7628f0657d7afaea87761edf + md5: a92e310ae8dfc206ff449f362fc4217f + depends: + - __osx >=11.0 + constrains: + - expat 2.7.4.* + license: MIT + license_family: MIT + purls: [] + size: 68199 + timestamp: 1771260020767 - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda sha256: 844ab708594bdfbd7b35e1a67c379861bcd180d6efe57b654f482ae2f7f5c21e md5: 8c9e4f1a0e688eef2e95711178061a0f @@ -3257,6 +6053,31 @@ packages: purls: [] size: 70137 timestamp: 1763550049107 +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + sha256: b31f6fb629c4e17885aaf2082fb30384156d16b48b264e454de4a06a313b533d + md5: 1c1ced969021592407f16ada4573586d + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.7.4.* + license: MIT + license_family: MIT + purls: [] + size: 70323 + timestamp: 1771259521393 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 + md5: a360c33a5abe61c07959e449fa1453eb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 58592 + timestamp: 1769456073053 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 md5: 35f29eec58405aaf55e01cb470d8c26a @@ -3278,6 +6099,26 @@ packages: purls: [] size: 52573 timestamp: 1760295626449 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda + sha256: 951958d1792238006fdc6fce7f71f1b559534743b26cc1333497d46e5903a2d6 + md5: 66a0dc7464927d0853b590b6f53ba3ea + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 53583 + timestamp: 1769456300951 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 + md5: 43c04d9cb46ef176bb2a4c77e324d599 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 40979 + timestamp: 1769456747661 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda sha256: 9b8acdf42df61b7bfe8bdc545c016c29e61985e79748c64ad66df47dbc2e295f md5: 411ff7cd5d1472bba0f55c0faf04453b @@ -3288,6 +6129,18 @@ packages: purls: [] size: 40251 timestamp: 1760295839166 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + sha256: 59d01f2dfa8b77491b5888a5ab88ff4e1574c9359f7e229da254cdfe27ddc190 + md5: 720b39f5ec0610457b725eb3f396219a + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 45831 + timestamp: 1769456418774 - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda sha256: ddff25aaa4f0aa535413f5d831b04073789522890a4d8626366e43ecde1534a3 md5: ba4ad812d2afc22b9a34ce8327a0930f @@ -3314,6 +6167,56 @@ packages: purls: [] size: 822552 timestamp: 1759968052178 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 + md5: 0aa00f03f9e39fb9876085dee11a85d4 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.2.0=*_18 + - libgomp 15.2.0 he0feb66_18 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1041788 + timestamp: 1771378212382 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_18.conda + sha256: 83366f11615ab234aa1e0797393f9e07b78124b5a24c4a9f8af0113d02df818e + md5: 9a5cb96e43f5c2296690186e15b3296f + depends: + - _openmp_mutex + constrains: + - libgcc-ng ==15.2.0=*_18 + - libgomp 15.2.0 18 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 423025 + timestamp: 1771378225170 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda + sha256: 1d9c4f35586adb71bcd23e31b68b7f3e4c4ab89914c26bed5f2859290be5560e + md5: 92df6107310b1fff92c4cc84f0de247b + depends: + - _openmp_mutex + constrains: + - libgcc-ng ==15.2.0=*_18 + - libgomp 15.2.0 18 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 401974 + timestamp: 1771378877463 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 + md5: d5e96b1ed75ca01906b3d2469b4ce493 + depends: + - libgcc 15.2.0 he0feb66_18 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 27526 + timestamp: 1771378224552 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda sha256: 2045066dd8e6e58aaf5ae2b722fb6dfdbb57c862b5f34ac7bfb58c40ef39b6ad md5: 280ea6eee9e2ddefde25ff799c4f0363 @@ -3324,6 +6227,79 @@ packages: purls: [] size: 29313 timestamp: 1759968065504 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda + sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee + md5: 9063115da5bc35fdc3e1002e69b9ef6e + depends: + - libgfortran5 15.2.0 h68bc16d_18 + constrains: + - libgfortran-ng ==15.2.0=*_18 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 27523 + timestamp: 1771378269450 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_18.conda + sha256: fb06c2a2ef06716a0f2a6550f5d13cdd1d89365993068512b7ae3c34e6e665d9 + md5: 34a9f67498721abcfef00178bcf4b190 + depends: + - libgfortran5 15.2.0 hd16e46c_18 + constrains: + - libgfortran-ng ==15.2.0=*_18 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 139761 + timestamp: 1771378423828 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda + sha256: 63f89087c3f0c8621c5c89ecceec1e56e5e1c84f65fc9c5feca33a07c570a836 + md5: 26981599908ed2205366e8fc91b37fc6 + depends: + - libgfortran5 15.2.0 hdae7583_18 + constrains: + - libgfortran-ng ==15.2.0=*_18 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 138973 + timestamp: 1771379054939 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda + sha256: 539b57cf50ec85509a94ba9949b7e30717839e4d694bc94f30d41c9d34de2d12 + md5: 646855f357199a12f02a87382d429b75 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 2482475 + timestamp: 1771378241063 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_18.conda + sha256: ddaf9dcf008c031b10987991aa78643e03c24a534ad420925cbd5851b31faa11 + md5: ca52daf58cea766656266c8771d8be81 + depends: + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1062274 + timestamp: 1771378232014 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + sha256: 91033978ba25e6a60fb86843cf7e1f7dc8ad513f9689f991c9ddabfaf0361e7e + md5: c4a6f7989cffb0544bfd9207b6789971 + depends: + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 598634 + timestamp: 1771378886363 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda sha256: e9fb1c258c8e66ee278397b5822692527c5f5786d372fe7a869b900853f3f5ca md5: f7b4d76975aac7e5d9e6ad13845f92fe @@ -3334,6 +6310,42 @@ packages: purls: [] size: 447919 timestamp: 1759967942498 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 + md5: 239c5e9546c38a1e884d69effcf4c882 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 603262 + timestamp: 1771378117851 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + sha256: 8cdf11333a81085468d9aa536ebb155abd74adc293576f6013fc0c85a7a90da3 + md5: 3b576f6860f838f950c570f4433b086e + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxml2 + - libxml2-16 >=2.14.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2411241 + timestamp: 1765104337762 +- 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/liblzma-5.8.1-hb9d3cd8_2.conda sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 md5: 1a580f7796c7bf6393fddb8bbbde58dc @@ -3346,6 +6358,18 @@ packages: purls: [] size: 112894 timestamp: 1749230047870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb + md5: c7c83eecbb72d88b940c249af56c8b17 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - xz 5.8.2.* + license: 0BSD + purls: [] + size: 113207 + timestamp: 1768752626120 - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda sha256: 7e22fd1bdb8bf4c2be93de2d4e718db5c548aa082af47a7430eb23192de6bb36 md5: 8468beea04b9065b9807fc8b9cdc5894 @@ -3357,6 +6381,17 @@ packages: purls: [] size: 104826 timestamp: 1749230155443 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + sha256: 7ab3c98abd3b5d5ec72faa8d9f5d4b50dcee4970ed05339bc381861199dabb41 + md5: 688a0c3d57fa118b9c97bf7e471ab46c + depends: + - __osx >=10.13 + constrains: + - xz 5.8.2.* + license: 0BSD + purls: [] + size: 105482 + timestamp: 1768753411348 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 md5: d6df911d4564d77c4374b02552cb17d1 @@ -3368,6 +6403,17 @@ packages: purls: [] size: 92286 timestamp: 1749230283517 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + sha256: 7bfc7ffb2d6a9629357a70d4eadeadb6f88fa26ebc28f606b1c1e5e5ed99dc7e + md5: 009f0d956d7bfb00de86901d16e486c7 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.2.* + license: 0BSD + purls: [] + size: 92242 + timestamp: 1768752982486 - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc md5: c15148b2e18da456f5108ccb5e411446 @@ -3381,6 +6427,30 @@ packages: purls: [] size: 104935 timestamp: 1749230611612 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + sha256: f25bf293f550c8ed2e0c7145eb404324611cfccff37660869d97abf526eb957c + md5: ba0bfd4c3cf73f299ffe46ff0eaeb8e3 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - xz 5.8.2.* + license: 0BSD + purls: [] + size: 106169 + timestamp: 1768752763559 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 + md5: 2c21e66f50753a083cbe6b80f38268fa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 92400 + timestamp: 1769482286018 - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee md5: c7e925f37e3b40d893459e625f6a53f1 @@ -3402,6 +6472,16 @@ packages: purls: [] size: 77667 timestamp: 1748393757154 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda + sha256: 1096c740109386607938ab9f09a7e9bca06d86770a284777586d6c378b8fb3fd + md5: ec88ba8a245855935b871a7324373105 + depends: + - __osx >=10.13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 79899 + timestamp: 1769482558610 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda sha256: 0a1875fc1642324ebd6c4ac864604f3f18f57fbcf558a8264f6ced028a3c75b2 md5: 85ccccb47823dd9f7a99d2c7f530342f @@ -3410,92 +6490,180 @@ packages: 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 + size: 71829 + timestamp: 1748393749336 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 + md5: 57c4be259f5e0b99a5983799a228ae55 + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 73690 + timestamp: 1769482560514 +- 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/win-64/libmpdec-4.0.0-hfd05255_1.conda + sha256: 40dcd0b9522a6e0af72a9db0ced619176e7cfdb114855c7a64f278e73f8a7514 + md5: e4a9fc2bba3b022dad998c78856afe47 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 89411 + timestamp: 1769482314283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + sha256: a4a7dab8db4dc81c736e9a9b42bdfd97b087816e029e221380511960ac46c690 + md5: b499ce4b026493a13774bcf0f4c33849 + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.5,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 666600 + timestamp: 1756834976695 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda + sha256: c48d7e1cc927aef83ff9c48ae34dd1d7495c6ccc1edc4a3a6ba6aff1624be9ac + md5: e7630cef881b1174d40f3e69a883e55f + depends: + - __osx >=10.13 + - c-ares >=1.34.5,<2.0a0 + - libcxx >=19 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 605680 + timestamp: 1756835898134 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + sha256: a07cb53b5ffa2d5a18afc6fd5a526a5a53dd9523fbc022148bd2f9395697c46d + md5: a4b4dd73c67df470d091312ab87bf6ae + depends: + - __osx >=11.0 + - c-ares >=1.34.5,<2.0a0 + - libcxx >=19 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 575454 + timestamp: 1756835746393 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 + md5: d864d34357c3b65a4b731f78c0801dc4 depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: BSD-2-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + license_family: GPL purls: [] - size: 88657 - timestamp: 1723861474602 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_2.conda - sha256: 0c890710173a98befb5ecc0f84475f1351c39cba4b52ba2f76f47aaf3c08a819 - md5: ef0b79f6a6f4893d4faccbcedc606d3c + size: 33731 + timestamp: 1750274110928 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda + sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5 + md5: be43915efc66345cccb3c310b6ed0374 depends: - - libgcc >=14 - __glibc >=2.17,<3.0.a0 - license: ISC + - 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: 252693 - timestamp: 1772126122364 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.21-hc6ced15_2.conda - sha256: e358c1ff16324afc21581fe05c8adbbd499f162e369c38261987e39771bb2abe - md5: f138258c578eb0a1eebd97ffac5d375c + size: 5927939 + timestamp: 1763114673331 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda + sha256: ba642353f7f41ab2d2eb6410fbe522238f0f4483bcd07df30b3222b4454ee7cd + md5: 9241a65e6e9605e4581a2a8005d7f789 depends: - __osx >=10.13 - license: ISC + - 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: 266757 - timestamp: 1772126288780 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_2.conda - sha256: 214c2db705eaba7417f66c546b23b62c82aaa4c647725f15631b8ba78d974a4c - md5: 00ade92230bc329783057db16a2e4ab1 + size: 6268795 + timestamp: 1763117623665 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda + sha256: ebbbc089b70bcde87c4121a083c724330f02a690fb9d7c6cd18c30f1b12504fa + md5: a6f6d3a31bb29e48d37ce65de54e2df0 depends: - __osx >=11.0 - license: ISC - purls: [] - size: 223288 - timestamp: 1772126208738 -- conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_2.conda - sha256: 3103c223d91a4f19d37be1a653057c262bf083712cde2c60e8df7154b55b58b8 - md5: 882032e3e05a4f6216b9b32742291bd7 - depends: - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - ucrt >=10.0.20348.0 - license: ISC + - 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: 251746 - timestamp: 1772126133305 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda - sha256: 4c992dcd0e34b68f843e75406f7f303b1b97c248d18f3c7c330bdc0bc26ae0b3 - md5: 729a572a3ebb8c43933b30edcc628ceb + size: 4284132 + timestamp: 1768547079205 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + sha256: 04596fcee262a870e4b7c9807224680ff48d4d0cc0dac076a602503d3dc6d217 + md5: da5be73701eecd0e8454423fd6ffcf30 depends: - __glibc >=2.17,<3.0.a0 - - icu >=75.1,<76.0a0 + - icu >=78.2,<79.0a0 - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: blessing purls: [] - size: 945576 - timestamp: 1762299687230 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.0-h86bffb9_0.conda - sha256: ad151af8192c17591fad0b68c9ffb7849ad9f4be9da2020b38b8befd2c5f6f02 - md5: 1ee9b74571acd6dd87e6a0f783989426 + size: 942808 + timestamp: 1768147973361 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda + sha256: 710a7ea27744199023c92e66ad005de7f8db9cf83f10d5a943d786f0dac53b7c + md5: d910105ce2b14dfb2b32e92ec7653420 depends: - __osx >=10.13 - libzlib >=1.3.1,<2.0a0 license: blessing purls: [] - size: 986898 - timestamp: 1762300146976 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda - sha256: b43d198f147f46866e5336c4a6b91668beef698bfba69d1706158460eadb2c1b - md5: 5fb1945dbc6380e6fe7e939a62267772 + size: 987506 + timestamp: 1768148247615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda + sha256: 6e9b9f269732cbc4698c7984aa5b9682c168e2a8d1e0406e1ff10091ca046167 + md5: 4b0bf313c53c3e89692f020fb55d5f2c depends: - __osx >=11.0 - - icu >=75.1,<76.0a0 + - icu >=78.2,<79.0a0 - libzlib >=1.3.1,<2.0a0 license: blessing purls: [] - size: 909508 - timestamp: 1762300078624 + size: 909777 + timestamp: 1768148320535 - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda sha256: 2373bd7450693bd0f624966e1bee2f49b0bf0ffbc114275ed0a43cf35aec5b21 md5: d2c9300ebd2848862929b18c264d1b1e @@ -3507,6 +6675,17 @@ packages: purls: [] size: 1292710 timestamp: 1762299749044 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + sha256: 756478128e3e104bd7e7c3ce6c1b0efad7e08c7320c69fdc726e039323c63fbb + md5: 903979414b47d777d548e5f0165e6cd8 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + purls: [] + size: 1291616 + timestamp: 1768148278261 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda sha256: 1b981647d9775e1cdeb2fab0a4dd9cd75a6b0de2963f6c3953dbd712f78334b3 md5: 5b767048b1b3ee9a954b06f4084f93dc @@ -3520,16 +6699,19 @@ packages: purls: [] size: 3898269 timestamp: 1759968103436 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda - sha256: 024fd46ac3ea8032a5ec3ea7b91c4c235701a8bf0e6520fe5e6539992a6bd05f - md5: f627678cf829bd70bccf141a19c3ad3e +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda + sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e + md5: 1b08cd684f34175e4514474793d44bcb depends: - - libstdcxx 15.2.0 h8f9b012_7 + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 he0feb66_18 + constrains: + - libstdcxx-ng ==15.2.0=*_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 29343 - timestamp: 1759968157195 + size: 5852330 + timestamp: 1771378262446 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda sha256: e5ec6d2ad7eef538ddcb9ea62ad4346fde70a4736342c4ad87bd713641eb9808 md5: 80c07c68d2f6870250959dcc95b209d1 @@ -3541,6 +6723,104 @@ packages: purls: [] size: 37135 timestamp: 1758626800002 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee + md5: db409b7c1720428638e7c0d509d3e1b5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 40311 + timestamp: 1766271528534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + sha256: c180f4124a889ac343fc59d15558e93667d894a966ec6fdb61da1604481be26b + md5: 0f03292cc56bf91a077a134ea8747118 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 895108 + timestamp: 1753948278280 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda + sha256: d90dd0eee6f195a5bd14edab4c5b33be3635b674b0b6c010fb942b956aa2254c + md5: fbfc6cf607ae1e1e498734e256561dc3 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 422612 + timestamp: 1753948458902 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + sha256: 042c7488ad97a5629ec0a991a8b2a3345599401ecc75ad6a5af73b60e6db9689 + md5: c0d87c3c8e075daf1daf6c31b53e8083 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 421195 + timestamp: 1753948426421 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0 + md5: 8a86073cf3b343b87d03f41790d8b4e5 + depends: + - ucrt + constrains: + - pthreads-win32 <0.0a0 + - msys2-conda-epoch <0.0a0 + license: MIT AND BSD-3-Clause-Clear + purls: [] + size: 36621 + timestamp: 1759768399557 +- 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/win-64/libxml2-2.15.1-h779ef1b_1.conda + sha256: 8b47d5fb00a6ccc0f495d16787ab5f37a434d51965584d6000966252efecf56d + md5: 68dc154b8d415176c07b6995bd3a65d9 + depends: + - icu >=78.1,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 h3cfd58e_1 + - 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: 43387 + timestamp: 1766327259710 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + sha256: a857e941156b7f462063e34e086d212c6ccbc1521ebdf75b9ed66bd90add57dc + md5: 07d73826fde28e7dbaec52a3297d7d26 + depends: + - icu >=78.1,<79.0a0 + - libiconv >=1.18,<2.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 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + purls: [] + size: 518964 + timestamp: 1766327232819 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 md5: edb0dca6bc32e4f4789199455a1dbeb8 @@ -3592,6 +6872,47 @@ packages: purls: [] size: 55476 timestamp: 1727963768015 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.0-h0d3cbff_0.conda + sha256: b63df4e592b3362e7d13e3d1cf8e55ce932ff4f17611c8514b5d36368ec2094c + md5: 3921780bab286f2439ba483c22b90345 + depends: + - __osx >=11.0 + constrains: + - openmp 22.1.0|22.1.0.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 311938 + timestamp: 1772024731611 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda + sha256: 0daeedb3872ad0fdd6f0d7e7165c63488e8a315d7057907434145fba0c1e7b3d + md5: ff0820b5588b20be3b858552ecf8ffae + depends: + - __osx >=11.0 + constrains: + - openmp 22.1.0|22.1.0.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 285558 + timestamp: 1772028716784 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda + sha256: bb55a3736380759d338f87aac68df4fd7d845ae090b94400525f5d21a55eea31 + md5: e5505e0b7d6ef5c19d5c0c1884a2f494 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - openmp 22.1.0|22.1.0.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 347404 + timestamp: 1772025050288 - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl name: lmfit version: 1.3.4 @@ -3627,74 +6948,221 @@ packages: - pytest-cov ; extra == 'test' - lmfit[dev,doc,test] ; extra == 'all' requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda - sha256: a530a411bdaaf0b1e4de8869dfaca46cb07407bc7dc0702a9e231b0e5ce7ca85 - md5: c14389156310b8ed3520d84f854be1ee - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - 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: 25909 - timestamp: 1759055357045 -- conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.3-py313h0f4d31d_0.conda - sha256: 9c698da56e3bdae80be2a7bc0d19565971b36060155374d16fce14271c8b695c - md5: 884a82dc80ecd251e38d647808c424b3 - depends: - - __osx >=10.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: 25105 - timestamp: 1759055575973 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda - sha256: e06902a1bf370fdd4ada0a8c81c504868fdb7e9971b72c6bd395aa4e5a497bd2 - md5: 3df5979cc0b761dda0053ffdb0bca3ea - 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: 25778 - timestamp: 1759055530601 -- conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py313hd650c13_0.conda - sha256: 988d14095c1392e055fd75e24544da2db01ade73b0c2f99ddc8e2b8678ead4cc - md5: 47eaaa4405741beb171ea6edc6eaf874 - 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: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - size: 28959 - timestamp: 1759055685616 +- pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl + name: mando + version: 0.7.1 + sha256: 26ef1d70928b6057ee3ca12583d73c63e05c49de8972d620c278a7b206581a8a + requires_dist: + - six + - argparse ; python_full_version < '2.7' + - funcsigs ; python_full_version < '3.3' + - rst2ansi ; extra == 'restructuredtext' +- pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl + name: markdown + version: 3.10.2 + sha256: e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36 + requires_dist: + - coverage ; extra == 'testing' + - pyyaml ; extra == 'testing' + - mkdocs>=1.6 ; extra == 'docs' + - mkdocs-nature>=0.6 ; extra == 'docs' + - mdx-gh-links>=0.2 ; extra == 'docs' + - mkdocstrings[python]>=0.28.3 ; extra == 'docs' + - mkdocs-gen-files ; extra == 'docs' + - mkdocs-section-index ; extra == 'docs' + - mkdocs-literate-nav ; extra == 'docs' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + name: markdown-it-py + version: 4.0.0 + sha256: 87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147 + requires_dist: + - mdurl~=0.1 + - psutil ; extra == 'benchmarking' + - pytest ; extra == 'benchmarking' + - pytest-benchmark ; extra == 'benchmarking' + - commonmark~=0.9 ; extra == 'compare' + - markdown~=3.4 ; extra == 'compare' + - mistletoe~=1.0 ; extra == 'compare' + - mistune~=3.0 ; extra == 'compare' + - panflute~=2.3 ; extra == 'compare' + - markdown-it-pyrs ; extra == 'compare' + - linkify-it-py>=1,<3 ; extra == 'linkify' + - mdit-py-plugins>=0.5.0 ; extra == 'plugins' + - gprof2dot ; extra == 'profiling' + - mdit-py-plugins>=0.5.0 ; extra == 'rtd' + - myst-parser ; extra == 'rtd' + - pyyaml ; extra == 'rtd' + - sphinx ; extra == 'rtd' + - sphinx-copybutton ; extra == 'rtd' + - sphinx-design ; extra == 'rtd' + - sphinx-book-theme~=1.0 ; extra == 'rtd' + - jupyter-sphinx ; extra == 'rtd' + - ipykernel ; extra == 'rtd' + - coverage ; extra == 'testing' + - pytest ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - pytest-regressions ; extra == 'testing' + - requests ; extra == 'testing' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl + name: markupsafe + version: 3.0.3 + sha256: 9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl + name: markupsafe + version: 3.0.3 + sha256: 1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: markupsafe + version: 3.0.3 + sha256: 0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl + name: markupsafe + version: 3.0.3 + sha256: e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl + name: markupsafe + version: 3.0.3 + sha256: de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl + name: markupsafe + version: 3.0.3 + sha256: 116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: markupsafe + version: 3.0.3 + sha256: ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl + name: markupsafe + version: 3.0.3 + sha256: 4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl name: matplotlib - version: 3.10.7 - sha256: 1d9d3713a237970569156cfb4de7533b7c4eacdd61789726f444f96a0d28f57f + version: 3.10.7 + sha256: 1d9d3713a237970569156cfb4de7533b7c4eacdd61789726f444f96a0d28f57f + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=3 + - python-dateutil>=2.7 + - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' + - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' + - setuptools-scm>=7 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: matplotlib + version: 3.10.7 + sha256: b3c4ea4948d93c9c29dc01c0c23eef66f2101bf75158c291b88de6525c55c3d1 + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=3 + - python-dateutil>=2.7 + - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' + - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' + - setuptools-scm>=7 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl + name: matplotlib + version: 3.10.7 + sha256: 37a1fea41153dd6ee061d21ab69c9cf2cf543160b1b85d89cd3d2e2a7902ca4c + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=3 + - python-dateutil>=2.7 + - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' + - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' + - setuptools-scm>=7 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl + name: matplotlib + version: 3.10.7 + sha256: 744991e0cc863dd669c8dc9136ca4e6e0082be2070b9d793cbd64bec872a6815 + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=3 + - python-dateutil>=2.7 + - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' + - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' + - setuptools-scm>=7 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl + name: matplotlib + version: 3.10.8 + sha256: 3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6 + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=3 + - python-dateutil>=2.7 + - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' + - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' + - setuptools-scm>=7 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl + name: matplotlib + version: 3.10.8 + sha256: e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149 + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=3 + - python-dateutil>=2.7 + - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' + - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' + - setuptools-scm>=7 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + name: matplotlib + version: 3.10.8 + sha256: 18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -3710,10 +7178,10 @@ packages: - setuptools-scm>=7 ; extra == 'dev' - setuptools>=64 ; extra == 'dev' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: matplotlib - version: 3.10.7 - sha256: b3c4ea4948d93c9c29dc01c0c23eef66f2101bf75158c291b88de6525c55c3d1 + version: 3.10.8 + sha256: a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -3729,10 +7197,10 @@ packages: - setuptools-scm>=7 ; extra == 'dev' - setuptools>=64 ; extra == 'dev' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl name: matplotlib - version: 3.10.7 - sha256: 37a1fea41153dd6ee061d21ab69c9cf2cf543160b1b85d89cd3d2e2a7902ca4c + version: 3.10.8 + sha256: 56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -3748,10 +7216,48 @@ packages: - setuptools-scm>=7 ; extra == 'dev' - setuptools>=64 ; extra == 'dev' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: matplotlib - version: 3.10.7 - sha256: 744991e0cc863dd669c8dc9136ca4e6e0082be2070b9d793cbd64bec872a6815 + version: 3.10.8 + sha256: efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4 + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=3 + - python-dateutil>=2.7 + - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' + - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' + - setuptools-scm>=7 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + name: matplotlib + version: 3.10.8 + sha256: 6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160 + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=3 + - python-dateutil>=2.7 + - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' + - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' + - setuptools-scm>=7 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + name: matplotlib + version: 3.10.8 + sha256: a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -3779,18 +7285,208 @@ packages: - notebook ; extra == 'test' - pytest ; extra == 'test' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl - name: mccabe - version: 0.7.0 - sha256: 6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e +- pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + name: mdit-py-plugins + version: 0.5.0 + sha256: 07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f + requires_dist: + - markdown-it-py>=2.0.0,<5.0.0 + - pre-commit ; extra == 'code-style' + - myst-parser ; extra == 'rtd' + - sphinx-book-theme ; extra == 'rtd' + - coverage ; extra == 'testing' + - pytest ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - pytest-regressions ; extra == 'testing' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + name: mdurl + version: 0.1.2 + sha256: 84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + name: mergedeep + version: 1.3.4 + sha256: 70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307 requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl + name: mike + version: 2.1.3 + sha256: d90c64077e84f06272437b464735130d380703a76a5738b152932884c60c062a + requires_dist: + - importlib-metadata + - importlib-resources + - jinja2>=2.7 + - mkdocs>=1.0 + - pyparsing>=3.0 + - pyyaml>=5.1 + - pyyaml-env-tag + - verspec + - coverage ; extra == 'dev' + - flake8-quotes ; extra == 'dev' + - flake8>=3.0 ; extra == 'dev' + - shtab ; extra == 'dev' + - coverage ; extra == 'test' + - flake8-quotes ; extra == 'test' + - flake8>=3.0 ; extra == 'test' + - shtab ; extra == 'test' +- pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl name: mistune - version: 3.1.4 - sha256: 93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d + version: 3.2.0 + sha256: febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1 requires_dist: - typing-extensions ; python_full_version < '3.11' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + name: mkdocs + version: 1.6.1 + sha256: db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e + requires_dist: + - click>=7.0 + - colorama>=0.4 ; sys_platform == 'win32' + - ghp-import>=1.0 + - importlib-metadata>=4.4 ; python_full_version < '3.10' + - jinja2>=2.11.1 + - markdown>=3.3.6 + - markupsafe>=2.0.1 + - mergedeep>=1.3.4 + - mkdocs-get-deps>=0.2.0 + - packaging>=20.5 + - pathspec>=0.11.1 + - pyyaml-env-tag>=0.1 + - pyyaml>=5.1 + - watchdog>=2.0 + - babel>=2.9.0 ; extra == 'i18n' + - babel==2.9.0 ; extra == 'min-versions' + - click==7.0 ; extra == 'min-versions' + - colorama==0.4 ; sys_platform == 'win32' and extra == 'min-versions' + - ghp-import==1.0 ; extra == 'min-versions' + - importlib-metadata==4.4 ; python_full_version < '3.10' and extra == 'min-versions' + - jinja2==2.11.1 ; extra == 'min-versions' + - markdown==3.3.6 ; extra == 'min-versions' + - markupsafe==2.0.1 ; extra == 'min-versions' + - mergedeep==1.3.4 ; extra == 'min-versions' + - mkdocs-get-deps==0.2.0 ; extra == 'min-versions' + - packaging==20.5 ; extra == 'min-versions' + - pathspec==0.11.1 ; extra == 'min-versions' + - pyyaml-env-tag==0.1 ; extra == 'min-versions' + - pyyaml==5.1 ; extra == 'min-versions' + - watchdog==2.0 ; extra == 'min-versions' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl + name: mkdocs-autorefs + version: 1.4.4 + sha256: 834ef5408d827071ad1bc69e0f39704fa34c7fc05bc8e1c72b227dfdc5c76089 + requires_dist: + - markdown>=3.3 + - markupsafe>=2.0.1 + - mkdocs>=1.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + name: mkdocs-get-deps + version: 0.2.0 + sha256: 2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134 + requires_dist: + - importlib-metadata>=4.3 ; python_full_version < '3.10' + - mergedeep>=1.3.4 + - platformdirs>=2.2.0 + - pyyaml>=5.1 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl + name: mkdocs-jupyter + version: 0.25.1 + sha256: 3f679a857609885d322880e72533ef5255561bbfdb13cfee2a1e92ef4d4ad8d8 + requires_dist: + - ipykernel>6.0.0,<7.0.0 + - jupytext>1.13.8,<2 + - mkdocs-material>9.0.0 + - mkdocs>=1.4.0,<2 + - nbconvert>=7.2.9,<8 + - pygments>2.12.0 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl + name: mkdocs-markdownextradata-plugin + version: 0.2.6 + sha256: 34dd40870781784c75809596b2d8d879da783815b075336d541de1f150c94242 + requires_dist: + - mkdocs + - pyyaml + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl + name: mkdocs-material + version: 9.7.3 + sha256: 37ebf7b4788c992203faf2e71900be3c197c70a4be9b0d72aed537b08a91dd9d + requires_dist: + - babel>=2.10 + - backrefs>=5.7.post1 + - colorama>=0.4 + - jinja2>=3.1 + - markdown>=3.2 + - mkdocs-material-extensions>=1.3 + - mkdocs>=1.6 + - paginate>=0.5 + - pygments>=2.16 + - pymdown-extensions>=10.2 + - requests>=2.30 + - mkdocs-git-committers-plugin-2>=1.1 ; extra == 'git' + - mkdocs-git-revision-date-localized-plugin>=1.2.4 ; extra == 'git' + - cairosvg>=2.6 ; extra == 'imaging' + - pillow>=10.2 ; extra == 'imaging' + - mkdocs-minify-plugin>=0.7 ; extra == 'recommended' + - mkdocs-redirects>=1.2 ; extra == 'recommended' + - mkdocs-rss-plugin>=1.6 ; extra == 'recommended' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + name: mkdocs-material-extensions + version: 1.3.1 + sha256: adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/c6/3d/020a6b6248c3d4a37797db068256f0b3f15b01bc481327ba888c50309aa8/mkdocs_plugin_inline_svg-0.1.0-py3-none-any.whl + name: mkdocs-plugin-inline-svg + version: 0.1.0 + sha256: a5aab2d98a19b24019f8e650f54fc647c2f31e7d0e36fc5cf2d2161acc0ea49a + requires_dist: + - mkdocs + requires_python: '>=3.5' +- pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl + name: mkdocstrings + version: 1.0.3 + sha256: 0d66d18430c2201dc7fe85134277382baaa15e6b30979f3f3bdbabd6dbdb6046 + requires_dist: + - jinja2>=3.1 + - markdown>=3.6 + - markupsafe>=1.1 + - mkdocs>=1.6 + - mkdocs-autorefs>=1.4 + - pymdown-extensions>=6.3 + - mkdocstrings-crystal>=0.3.4 ; extra == 'crystal' + - mkdocstrings-python-legacy>=0.2.1 ; extra == 'python-legacy' + - mkdocstrings-python>=1.16.2 ; extra == 'python' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl + name: mkdocstrings-python + version: 2.0.3 + sha256: 0b83513478bdfd803ff05aa43e9b1fca9dd22bcd9471f09ca6257f009bc5ee12 + requires_dist: + - mkdocstrings>=0.30 + - mkdocs-autorefs>=1.4 + - griffelib>=2.0 + - typing-extensions>=4.0 ; python_full_version < '3.11' + requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda + sha256: b2b4c84b95210760e4d12319416c60ab66e03674ccdcbd14aeb59f82ebb1318d + md5: fd05d1e894497b012d05a804232254ed + depends: + - llvm-openmp >=21.1.8 + - tbb >=2022.3.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 100224829 + timestamp: 1767634557029 - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl name: mpld3 version: 0.5.12 @@ -3798,6 +7494,16 @@ packages: requires_dist: - jinja2 - matplotlib +- pypi: https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl + name: msgpack + version: 1.1.2 + sha256: d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl + name: msgpack + version: 1.1.2 + sha256: 2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: msgpack version: 1.1.2 @@ -3813,11 +7519,93 @@ packages: version: 1.1.2 sha256: a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9 requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl + name: msgpack + version: 1.1.2 + sha256: 283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0 + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl name: msgpack version: 1.1.2 sha256: 42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7 requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: msgpack + version: 1.1.2 + sha256: 454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/03/59/fdcb3af72f750a8de2bcf39d62ada70b5eb17b06d7f63860e0a679cb656b/msgspec-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl + name: msgspec + version: 0.20.0 + sha256: 09e0efbf1ac641fedb1d5496c59507c2f0dc62a052189ee62c763e0aae217520 + requires_dist: + - tomli ; python_full_version < '3.11' and extra == 'toml' + - tomli-w ; extra == 'toml' + - pyyaml ; extra == 'yaml' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/28/83/36557b04cfdc317ed8a525c4993b23e43a8fbcddaddd78619112ca07138c/msgspec-0.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: msgspec + version: 0.20.0 + sha256: 7fac7e9c92eddcd24c19d9e5f6249760941485dff97802461ae7c995a2450111 + requires_dist: + - tomli ; python_full_version < '3.11' and extra == 'toml' + - tomli-w ; extra == 'toml' + - pyyaml ; extra == 'yaml' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/57/b6/eff0305961a1d9447ec2b02f8c73c8946f22564d302a504185b730c9a761/msgspec-0.20.0-cp313-cp313-macosx_11_0_arm64.whl + name: msgspec + version: 0.20.0 + sha256: f6532369ece217fd37c5ebcfd7e981f2615628c21121b7b2df9d3adcf2fd69b8 + requires_dist: + - tomli ; python_full_version < '3.11' and extra == 'toml' + - tomli-w ; extra == 'toml' + - pyyaml ; extra == 'yaml' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/5a/15/3c225610da9f02505d37d69a77f4a2e7daae2a125f99d638df211ba84e59/msgspec-0.20.0-cp311-cp311-macosx_11_0_arm64.whl + name: msgspec + version: 0.20.0 + sha256: 23ee3787142e48f5ee746b2909ce1b76e2949fbe0f97f9f6e70879f06c218b54 + requires_dist: + - tomli ; python_full_version < '3.11' and extra == 'toml' + - tomli-w ; extra == 'toml' + - pyyaml ; extra == 'yaml' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/6b/96/5c095b940de3aa6b43a71ec76275ac3537b21bd45c7499b5a17a429110fa/msgspec-0.20.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: msgspec + version: 0.20.0 + sha256: bb4d873f24ae18cd1334f4e37a178ed46c9d186437733351267e0a269bdf7e53 + requires_dist: + - tomli ; python_full_version < '3.11' and extra == 'toml' + - tomli-w ; extra == 'toml' + - pyyaml ; extra == 'yaml' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/89/5e/406b7d578926b68790e390d83a1165a9bfc2d95612a1a9c1c4d5c72ea815/msgspec-0.20.0-cp311-cp311-win_amd64.whl + name: msgspec + version: 0.20.0 + sha256: d1dcc93a3ce3d3195985bfff18a48274d0b5ffbc96fa1c5b89da6f0d9af81b29 + requires_dist: + - tomli ; python_full_version < '3.11' and extra == 'toml' + - tomli-w ; extra == 'toml' + - pyyaml ; extra == 'yaml' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/8a/d1/b902d38b6e5ba3bdddbec469bba388d647f960aeed7b5b3623a8debe8a76/msgspec-0.20.0-cp313-cp313-macosx_10_13_x86_64.whl + name: msgspec + version: 0.20.0 + sha256: 9c1ff8db03be7598b50dd4b4a478d6fe93faae3bd54f4f17aa004d0e46c14c46 + requires_dist: + - tomli ; python_full_version < '3.11' and extra == 'toml' + - tomli-w ; extra == 'toml' + - pyyaml ; extra == 'yaml' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/f1/25/5e8080fe0117f799b1b68008dc29a65862077296b92550632de015128579/msgspec-0.20.0-cp313-cp313-win_amd64.whl + name: msgspec + version: 0.20.0 + sha256: 67d5e4dfad52832017018d30a462604c80561aa62a9d548fc2bd4e430b66a352 + requires_dist: + - tomli ; python_full_version < '3.11' and extra == 'toml' + - tomli-w ; extra == 'toml' + - pyyaml ; extra == 'yaml' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl name: multidict version: 6.7.0 @@ -3846,6 +7634,62 @@ packages: requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: multidict + version: 6.7.1 + sha256: 439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144 + requires_dist: + - typing-extensions>=4.1.0 ; python_full_version < '3.11' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl + name: multidict + version: 6.7.1 + sha256: 935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445 + requires_dist: + - typing-extensions>=4.1.0 ; python_full_version < '3.11' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl + name: multidict + version: 6.7.1 + sha256: 844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e + requires_dist: + - typing-extensions>=4.1.0 ; python_full_version < '3.11' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: multidict + version: 6.7.1 + sha256: 9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429 + requires_dist: + - typing-extensions>=4.1.0 ; python_full_version < '3.11' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl + name: multidict + version: 6.7.1 + sha256: 960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5 + requires_dist: + - typing-extensions>=4.1.0 ; python_full_version < '3.11' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl + name: multidict + version: 6.7.1 + sha256: 84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2 + requires_dist: + - typing-extensions>=4.1.0 ; python_full_version < '3.11' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl + name: multidict + version: 6.7.1 + sha256: bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b + requires_dist: + - typing-extensions>=4.1.0 ; python_full_version < '3.11' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl + name: multidict + version: 6.7.1 + sha256: f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855 + requires_dist: + - typing-extensions>=4.1.0 ; python_full_version < '3.11' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl name: narwhals version: 2.12.0 @@ -3866,14 +7710,36 @@ packages: - pyspark[connect]>=3.5.0 ; extra == 'pyspark-connect' - sqlframe>=3.22.0,!=3.39.3 ; extra == 'sqlframe' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl + name: narwhals + version: 2.17.0 + sha256: 2ac5307b7c2b275a7d66eeda906b8605e3d7a760951e188dcfff86e8ebe083dd + requires_dist: + - cudf-cu12>=24.10.0 ; extra == 'cudf' + - dask[dataframe]>=2024.8 ; extra == 'dask' + - duckdb>=1.1 ; extra == 'duckdb' + - ibis-framework>=6.0.0 ; extra == 'ibis' + - packaging ; extra == 'ibis' + - pyarrow-hotfix ; extra == 'ibis' + - rich ; extra == 'ibis' + - modin ; extra == 'modin' + - pandas>=1.1.3 ; extra == 'pandas' + - polars>=0.20.4 ; extra == 'polars' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - pyspark>=3.5.0 ; extra == 'pyspark' + - pyspark[connect]>=3.5.0 ; extra == 'pyspark-connect' + - duckdb>=1.1 ; extra == 'sql' + - sqlparse ; extra == 'sql' + - sqlframe>=3.22.0,!=3.39.3 ; extra == 'sqlframe' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl name: nbclient - version: 0.10.2 - sha256: 4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d + version: 0.10.4 + sha256: 9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440 requires_dist: - jupyter-client>=6.1.12 - jupyter-core>=4.12,!=5.0.* - - nbformat>=5.1 + - nbformat>=5.1.3 - traitlets>=5.4 - pre-commit ; extra == 'dev' - autodoc-traits ; extra == 'docs' @@ -3885,9 +7751,9 @@ packages: - moto ; extra == 'docs' - myst-parser ; extra == 'docs' - nbconvert>=7.1.0 ; extra == 'docs' - - pytest-asyncio ; extra == 'docs' + - pytest-asyncio>=1.3.0 ; extra == 'docs' - pytest-cov>=4.0 ; extra == 'docs' - - pytest>=7.0,<8 ; extra == 'docs' + - pytest>=9.0.1,<10 ; extra == 'docs' - sphinx-book-theme ; extra == 'docs' - sphinx>=1.7 ; extra == 'docs' - sphinxcontrib-spelling ; extra == 'docs' @@ -3898,16 +7764,16 @@ packages: - ipython ; extra == 'test' - ipywidgets ; extra == 'test' - nbconvert>=7.1.0 ; extra == 'test' - - pytest-asyncio ; extra == 'test' + - pytest-asyncio>=1.3.0 ; extra == 'test' - pytest-cov>=4.0 ; extra == 'test' - - pytest>=7.0,<8 ; extra == 'test' + - pytest>=9.0.1,<10 ; extra == 'test' - testpath ; extra == 'test' - xmltodict ; extra == 'test' - requires_python: '>=3.9.0' -- pypi: https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl + requires_python: '>=3.10.0' +- pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl name: nbconvert - version: 7.16.6 - sha256: 1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b + version: 7.17.0 + sha256: 4f99a63b337b9a23504347afdab24a11faa7d86b405e5c8f9881cd313336d518 requires_dist: - beautifulsoup4 - bleach[css]!=5.0.0 @@ -3925,6 +7791,7 @@ packages: - pygments>=2.4.1 - traitlets>=5.1 - flaky ; extra == 'all' + - intersphinx-registry ; extra == 'all' - ipykernel ; extra == 'all' - ipython ; extra == 'all' - ipywidgets>=7.5 ; extra == 'all' @@ -3934,15 +7801,16 @@ packages: - pydata-sphinx-theme ; extra == 'all' - pyqtwebengine>=5.15 ; extra == 'all' - pytest>=7 ; extra == 'all' - - sphinx==5.0.2 ; extra == 'all' + - sphinx>=5.0.2 ; extra == 'all' - sphinxcontrib-spelling ; extra == 'all' - tornado>=6.1 ; extra == 'all' + - intersphinx-registry ; extra == 'docs' - ipykernel ; extra == 'docs' - ipython ; extra == 'docs' - myst-parser ; extra == 'docs' - nbsphinx>=0.2.12 ; extra == 'docs' - pydata-sphinx-theme ; extra == 'docs' - - sphinx==5.0.2 ; extra == 'docs' + - sphinx>=5.0.2 ; extra == 'docs' - sphinxcontrib-spelling ; extra == 'docs' - pyqtwebengine>=5.15 ; extra == 'qtpdf' - pyqtwebengine>=5.15 ; extra == 'qtpng' @@ -3952,7 +7820,7 @@ packages: - ipywidgets>=7.5 ; extra == 'test' - pytest>=7 ; extra == 'test' - playwright ; extra == 'webpdf' - requires_python: '>=3.8' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl name: nbformat version: 5.10.4 @@ -3972,6 +7840,43 @@ packages: - pytest ; extra == 'test' - testpath ; extra == 'test' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/eb/be/b257e12f9710819fde40adc972578bee6b72c5992da1bc8369bef2597756/nbmake-1.5.5-py3-none-any.whl + name: nbmake + version: 1.5.5 + sha256: c6fbe6e48b60cacac14af40b38bf338a3b88f47f085c54ac5b8639ff0babaf4b + requires_dist: + - ipykernel>=5.4.0 + - nbclient>=0.6.6 + - nbformat>=5.0.4 + - pygments>=2.7.3 + - pytest>=6.1.0 + requires_python: '>=3.8.0' +- pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl + name: nbqa + version: 1.9.1 + sha256: 95552d2f6c2c038136252a805aa78d85018aef922586270c3a074332737282e5 + requires_dist: + - autopep8>=1.5 + - ipython>=7.8.0 + - tokenize-rt>=3.2.0 + - tomli + - black ; extra == 'toolchain' + - blacken-docs ; extra == 'toolchain' + - flake8 ; extra == 'toolchain' + - isort ; extra == 'toolchain' + - jupytext ; extra == 'toolchain' + - mypy ; extra == 'toolchain' + - pylint ; extra == 'toolchain' + - pyupgrade ; extra == 'toolchain' + - ruff ; extra == 'toolchain' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/20/16/e777eadfa0c0305878c36fae1d5e6db474fbb15dae202b9ec378809dfb4d/nbstripout-0.9.1-py3-none-any.whl + name: nbstripout + version: 0.9.1 + sha256: ca027ee45742ee77e4f8e9080254f9a707f1161ba11367b82fdf4a29892c759e + requires_dist: + - nbformat + requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 md5: 47e340acb35de30501a76c7c799c41d7 @@ -4005,21 +7910,92 @@ packages: version: 1.6.0 sha256: 87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c requires_python: '>=3.5' -- pypi: https://files.pythonhosted.org/packages/42/0f/c76bf3dba22c73c38e9b1113b017cf163f7696f50e003404ec5ecdb1e8a6/nh3-0.3.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: nh3 - version: 0.3.2 - sha256: 7bb18403f02b655a1bbe4e3a4696c2ae1d6ae8f5991f7cacb684b1ae27e6c9f7 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/64/9a/1a1c154f10a575d20dd634e5697805e589bbdb7673a0ad00e8da90044ba7/nh3-0.3.2-cp38-abi3-win_amd64.whl - name: nh3 - version: 0.3.2 - sha256: 562da3dca7a17f9077593214a9781a94b8d76de4f158f8c895e62f09573945fe - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b6/3e/f5a5cc2885c24be13e9b937441bd16a012ac34a657fe05e58927e8af8b7a/nh3-0.3.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl - name: nh3 - version: 0.3.2 - sha256: 7064ccf5ace75825bd7bf57859daaaf16ed28660c1c6b306b649a9eda4b54b1e - requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl + name: nodeenv + version: 1.10.0 + sha256: 5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*' +- conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-25.7.0-he4ff34a_0.conda + sha256: 4791285a34195615e22a94dc62cbd43181548b34eb34e6cb1dcf8f469476a32e + md5: ba562095149fde99c700365d90e6d632 + depends: + - __glibc >=2.28,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - libnghttp2 >=1.67.0,<2.0a0 + - c-ares >=1.34.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libuv >=1.51.0,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - icu >=78.2,<79.0a0 + - libzlib >=1.3.1,<2.0a0 + - libsqlite >=3.51.2,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 18875002 + timestamp: 1772300115686 +- conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.7.0-hf6efa0e_0.conda + sha256: a23a3b536f1ccd3c10a2cbdf8c638b601c51f6e9bbf1e6c708610cf5b1df3d0f + md5: 448185eb18358e4b5fe2a157cc7e415f + depends: + - libcxx >=19 + - __osx >=10.15 + - openssl >=3.5.5,<4.0a0 + - c-ares >=1.34.6,<2.0a0 + - libuv >=1.51.0,<2.0a0 + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - libnghttp2 >=1.67.0,<2.0a0 + - icu >=78.2,<79.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: MIT + license_family: MIT + purls: [] + size: 18342335 + timestamp: 1772299132495 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.7.0-hbfc8e16_0.conda + sha256: 6398a45d2bb943585540d98a9b1b3bed1fb48fabd327b56eba2ece00e3dd202f + md5: 22a4a51f30590f274bb3f831d911c09a + depends: + - __osx >=11.0 + - libcxx >=19 + - libsqlite >=3.51.2,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libuv >=1.51.0,<2.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - icu >=78.2,<79.0a0 + - c-ares >=1.34.6,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - libnghttp2 >=1.67.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 17351648 + timestamp: 1772299122966 +- conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.7.0-h80d1838_0.conda + sha256: 0ea0ddad32366396d1beda7ce93ddd3d9f705286c1a4f99f05ec0049183c1e97 + md5: 61b62d3be12c9edbe34f202d51891927 + license: MIT + license_family: MIT + purls: [] + size: 31254428 + timestamp: 1772299132945 - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl name: notebook-shim version: 0.2.4 @@ -4051,6 +8027,46 @@ packages: version: 2.3.5 sha256: 11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017 requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: numpy + version: 2.4.2 + sha256: d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl + name: numpy + version: 2.4.2 + sha256: bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: numpy + version: 2.4.2 + sha256: c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl + name: numpy + version: 2.4.2 + sha256: 7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl + name: numpy + version: 2.4.2 + sha256: 7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/76/ae/e0265e0163cf127c24c3969d29f1c4c64551a1e375d95a13d32eab25d364/numpy-2.4.2-cp311-cp311-win_amd64.whl + name: numpy + version: 2.4.2 + sha256: b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl + name: numpy + version: 2.4.2 + sha256: 25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl + name: numpy + version: 2.4.2 + sha256: e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825 + requires_python: '>=3.11' - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d md5: 9ee58d5c534af06558933af3c845a780 @@ -4063,6 +8079,18 @@ packages: purls: [] size: 3165399 timestamp: 1762839186699 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c + md5: f61eb8cd60ff9057122a3d338b99c00f + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3164551 + timestamp: 1769555830639 - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda sha256: 36fe9fb316be22fcfb46d5fa3e2e85eec5ef84f908b7745f68f768917235b2d5 md5: 3f50cdf9a97d0280655758b735781096 @@ -4074,6 +8102,17 @@ packages: purls: [] size: 2778996 timestamp: 1762840724922 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + sha256: e02e5639b0e4d6d4fcf0f3b082642844fb5a37316f5b0a1126c6271347462e90 + md5: 30bb8d08b99b9a7600d39efb3559fff0 + depends: + - __osx >=10.13 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2777136 + timestamp: 1769557662405 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda sha256: ebe93dafcc09e099782fe3907485d4e1671296bc14f8c383cb6f3dfebb773988 md5: b34dc4172653c13dcf453862f251af2b @@ -4085,6 +8124,17 @@ packages: purls: [] size: 3108371 timestamp: 1762839712322 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + sha256: 361f5c5e60052abc12bdd1b50d7a1a43e6a6653aab99a2263bf2288d709dcf67 + md5: f4f6ad63f98f64191c3e77c5f5f29d76 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3104268 + timestamp: 1769556384749 - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda sha256: 6d72d6f766293d4f2aa60c28c244c8efed6946c430814175f959ffe8cab899b3 md5: 84f8fb4afd1157f59098f618cd2437e4 @@ -4098,22 +8148,134 @@ packages: purls: [] size: 9440812 timestamp: 1762841722179 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 - md5: b76541e68fea4d511b1ac46a28dcd2c6 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + sha256: 53a5ad2e5553b8157a91bb8aa375f78c5958f77cb80e9d2ce59471ea8e5c0bd6 + md5: eb585509b815415bc964b2c7e11c7eb3 depends: - - python >=3.8 - - python + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/packaging?source=compressed-mapping - size: 72010 - timestamp: 1769093650580 + license_family: Apache + purls: [] + size: 9343023 + timestamp: 1769557547888 +- pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl + name: overrides + version: 7.7.0 + sha256: c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49 + requires_dist: + - typing ; python_full_version < '3.5' + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + name: packaging + version: '26.0' + sha256: b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl + name: paginate + version: 0.5.7 + sha256: b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591 + requires_dist: + - pytest ; extra == 'dev' + - tox ; extra == 'dev' + - black ; extra == 'lint' - pypi: https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl name: pandas version: 2.3.3 - sha256: 318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac + sha256: 318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac + requires_dist: + - numpy>=1.22.4 ; python_full_version < '3.11' + - numpy>=1.23.2 ; python_full_version == '3.11.*' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - python-dateutil>=2.8.2 + - pytz>=2020.1 + - tzdata>=2022.7 + - hypothesis>=6.46.1 ; extra == 'test' + - pytest>=7.3.2 ; extra == 'test' + - pytest-xdist>=2.2.0 ; extra == 'test' + - pyarrow>=10.0.1 ; extra == 'pyarrow' + - bottleneck>=1.3.6 ; extra == 'performance' + - numba>=0.56.4 ; extra == 'performance' + - numexpr>=2.8.4 ; extra == 'performance' + - scipy>=1.10.0 ; extra == 'computation' + - xarray>=2022.12.0 ; extra == 'computation' + - fsspec>=2022.11.0 ; extra == 'fss' + - s3fs>=2022.11.0 ; extra == 'aws' + - gcsfs>=2022.11.0 ; extra == 'gcp' + - pandas-gbq>=0.19.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.0 ; extra == 'excel' + - python-calamine>=0.1.7 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.0.5 ; extra == 'excel' + - pyarrow>=10.0.1 ; extra == 'parquet' + - pyarrow>=10.0.1 ; extra == 'feather' + - tables>=3.8.0 ; extra == 'hdf5' + - pyreadstat>=1.2.0 ; extra == 'spss' + - sqlalchemy>=2.0.0 ; extra == 'postgresql' + - psycopg2>=2.9.6 ; extra == 'postgresql' + - adbc-driver-postgresql>=0.8.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.0 ; extra == 'mysql' + - pymysql>=1.0.2 ; extra == 'mysql' + - sqlalchemy>=2.0.0 ; extra == 'sql-other' + - adbc-driver-postgresql>=0.8.0 ; extra == 'sql-other' + - adbc-driver-sqlite>=0.8.0 ; extra == 'sql-other' + - beautifulsoup4>=4.11.2 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=4.9.2 ; extra == 'html' + - lxml>=4.9.2 ; extra == 'xml' + - matplotlib>=3.6.3 ; extra == 'plot' + - jinja2>=3.1.2 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.3.0 ; extra == 'clipboard' + - zstandard>=0.19.0 ; extra == 'compression' + - dataframe-api-compat>=0.1.7 ; extra == 'consortium-standard' + - adbc-driver-postgresql>=0.8.0 ; extra == 'all' + - adbc-driver-sqlite>=0.8.0 ; extra == 'all' + - beautifulsoup4>=4.11.2 ; extra == 'all' + - bottleneck>=1.3.6 ; extra == 'all' + - dataframe-api-compat>=0.1.7 ; extra == 'all' + - fastparquet>=2022.12.0 ; extra == 'all' + - fsspec>=2022.11.0 ; extra == 'all' + - gcsfs>=2022.11.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.46.1 ; extra == 'all' + - jinja2>=3.1.2 ; extra == 'all' + - lxml>=4.9.2 ; extra == 'all' + - matplotlib>=3.6.3 ; extra == 'all' + - numba>=0.56.4 ; extra == 'all' + - numexpr>=2.8.4 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.0 ; extra == 'all' + - pandas-gbq>=0.19.0 ; extra == 'all' + - psycopg2>=2.9.6 ; extra == 'all' + - pyarrow>=10.0.1 ; extra == 'all' + - pymysql>=1.0.2 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.0 ; extra == 'all' + - pytest>=7.3.2 ; extra == 'all' + - pytest-xdist>=2.2.0 ; extra == 'all' + - python-calamine>=0.1.7 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.3.0 ; extra == 'all' + - scipy>=1.10.0 ; extra == 'all' + - s3fs>=2022.11.0 ; extra == 'all' + - sqlalchemy>=2.0.0 ; extra == 'all' + - tables>=3.8.0 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2022.12.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.0.5 ; extra == 'all' + - zstandard>=0.19.0 ; extra == 'all' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl + name: pandas + version: 2.3.3 + sha256: bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8 requires_dist: - numpy>=1.22.4 ; python_full_version < '3.11' - numpy>=1.23.2 ; python_full_version == '3.11.*' @@ -4201,10 +8363,10 @@ packages: - xlsxwriter>=3.0.5 ; extra == 'all' - zstandard>=0.19.0 ; extra == 'all' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl name: pandas version: 2.3.3 - sha256: bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8 + sha256: f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee requires_dist: - numpy>=1.22.4 ; python_full_version < '3.11' - numpy>=1.23.2 ; python_full_version == '3.11.*' @@ -4292,10 +8454,10 @@ packages: - xlsxwriter>=3.0.5 ; extra == 'all' - zstandard>=0.19.0 ; extra == 'all' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl name: pandas version: 2.3.3 - sha256: f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee + sha256: 56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713 requires_dist: - numpy>=1.22.4 ; python_full_version < '3.11' - numpy>=1.23.2 ; python_full_version == '3.11.*' @@ -4317,215 +8479,1021 @@ packages: - gcsfs>=2022.11.0 ; extra == 'gcp' - pandas-gbq>=0.19.0 ; extra == 'gcp' - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.1.0 ; extra == 'excel' - - python-calamine>=0.1.7 ; extra == 'excel' + - openpyxl>=3.1.0 ; extra == 'excel' + - python-calamine>=0.1.7 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.0.5 ; extra == 'excel' + - pyarrow>=10.0.1 ; extra == 'parquet' + - pyarrow>=10.0.1 ; extra == 'feather' + - tables>=3.8.0 ; extra == 'hdf5' + - pyreadstat>=1.2.0 ; extra == 'spss' + - sqlalchemy>=2.0.0 ; extra == 'postgresql' + - psycopg2>=2.9.6 ; extra == 'postgresql' + - adbc-driver-postgresql>=0.8.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.0 ; extra == 'mysql' + - pymysql>=1.0.2 ; extra == 'mysql' + - sqlalchemy>=2.0.0 ; extra == 'sql-other' + - adbc-driver-postgresql>=0.8.0 ; extra == 'sql-other' + - adbc-driver-sqlite>=0.8.0 ; extra == 'sql-other' + - beautifulsoup4>=4.11.2 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=4.9.2 ; extra == 'html' + - lxml>=4.9.2 ; extra == 'xml' + - matplotlib>=3.6.3 ; extra == 'plot' + - jinja2>=3.1.2 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.3.0 ; extra == 'clipboard' + - zstandard>=0.19.0 ; extra == 'compression' + - dataframe-api-compat>=0.1.7 ; extra == 'consortium-standard' + - adbc-driver-postgresql>=0.8.0 ; extra == 'all' + - adbc-driver-sqlite>=0.8.0 ; extra == 'all' + - beautifulsoup4>=4.11.2 ; extra == 'all' + - bottleneck>=1.3.6 ; extra == 'all' + - dataframe-api-compat>=0.1.7 ; extra == 'all' + - fastparquet>=2022.12.0 ; extra == 'all' + - fsspec>=2022.11.0 ; extra == 'all' + - gcsfs>=2022.11.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.46.1 ; extra == 'all' + - jinja2>=3.1.2 ; extra == 'all' + - lxml>=4.9.2 ; extra == 'all' + - matplotlib>=3.6.3 ; extra == 'all' + - numba>=0.56.4 ; extra == 'all' + - numexpr>=2.8.4 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.0 ; extra == 'all' + - pandas-gbq>=0.19.0 ; extra == 'all' + - psycopg2>=2.9.6 ; extra == 'all' + - pyarrow>=10.0.1 ; extra == 'all' + - pymysql>=1.0.2 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.0 ; extra == 'all' + - pytest>=7.3.2 ; extra == 'all' + - pytest-xdist>=2.2.0 ; extra == 'all' + - python-calamine>=0.1.7 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.3.0 ; extra == 'all' + - scipy>=1.10.0 ; extra == 'all' + - s3fs>=2022.11.0 ; extra == 'all' + - sqlalchemy>=2.0.0 ; extra == 'all' + - tables>=3.8.0 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2022.12.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.0.5 ; extra == 'all' + - zstandard>=0.19.0 ; extra == 'all' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl + name: pandas + version: 3.0.1 + sha256: 5272627187b5d9c20e55d27caf5f2cd23e286aba25cadf73c8590e432e2b7262 + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; 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>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2024.2 ; 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.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2024.2 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + name: pandas + version: 3.0.1 + sha256: 84f0904a69e7365f79a0c77d3cdfccbfb05bf87847e3a51a41e1426b0edb9c79 + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; 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>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2024.2 ; 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.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2024.2 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + name: pandas + version: 3.0.1 + sha256: 830994d7e1f31dd7e790045235605ab61cff6c94defc774547e8b7fdfbff3dc7 + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; 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>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2024.2 ; 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.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2024.2 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/a8/14/5990826f779f79148ae9d3a2c39593dc04d61d5d90541e71b5749f35af95/pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl + name: pandas + version: 3.0.1 + sha256: 661e0f665932af88c7877f31da0dc743fe9c8f2524bdffe23d24fdcb67ef9d56 + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; 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>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2024.2 ; 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.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2024.2 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl + name: pandas + version: 3.0.1 + sha256: 24ba315ba3d6e5806063ac6eb717504e499ce30bd8c236d8693a5fd3f084c796 + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; 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>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2024.2 ; 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.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2024.2 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/d6/7d/216a1588b65a7aa5f4535570418a599d943c85afb1d95b0876fc00aa1468/pandas-3.0.1-cp313-cp313-win_amd64.whl + name: pandas + version: 3.0.1 + sha256: 9fea306c783e28884c29057a1d9baa11a349bbf99538ec1da44c8476563d1b25 + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; 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>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2024.2 ; 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.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2024.2 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/f2/85/ab6d04733a7d6ff32bfc8382bf1b07078228f5d6ebec5266b91bfc5c4ff7/pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + name: pandas + version: 3.0.1 + sha256: 1ff8cf1d2896e34343197685f432450ec99a85ba8d90cce2030c5eee2ef98791 + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' - pyxlsb>=1.0.10 ; extra == 'excel' - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=3.0.5 ; extra == 'excel' - - pyarrow>=10.0.1 ; extra == 'parquet' - - pyarrow>=10.0.1 ; extra == 'feather' - - tables>=3.8.0 ; extra == 'hdf5' - - pyreadstat>=1.2.0 ; extra == 'spss' - - sqlalchemy>=2.0.0 ; extra == 'postgresql' - - psycopg2>=2.9.6 ; extra == 'postgresql' - - adbc-driver-postgresql>=0.8.0 ; extra == 'postgresql' - - sqlalchemy>=2.0.0 ; extra == 'mysql' - - pymysql>=1.0.2 ; extra == 'mysql' - - sqlalchemy>=2.0.0 ; extra == 'sql-other' - - adbc-driver-postgresql>=0.8.0 ; extra == 'sql-other' - - adbc-driver-sqlite>=0.8.0 ; extra == 'sql-other' - - beautifulsoup4>=4.11.2 ; extra == 'html' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; 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.6.3 ; extra == 'plot' - - jinja2>=3.1.2 ; extra == 'output-formatting' + - lxml>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' - tabulate>=0.9.0 ; extra == 'output-formatting' - pyqt5>=5.15.9 ; extra == 'clipboard' - - qtpy>=2.3.0 ; extra == 'clipboard' - - zstandard>=0.19.0 ; extra == 'compression' - - dataframe-api-compat>=0.1.7 ; extra == 'consortium-standard' - - adbc-driver-postgresql>=0.8.0 ; extra == 'all' - - adbc-driver-sqlite>=0.8.0 ; extra == 'all' - - beautifulsoup4>=4.11.2 ; extra == 'all' - - bottleneck>=1.3.6 ; extra == 'all' - - dataframe-api-compat>=0.1.7 ; extra == 'all' - - fastparquet>=2022.12.0 ; extra == 'all' - - fsspec>=2022.11.0 ; extra == 'all' - - gcsfs>=2022.11.0 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2024.2 ; 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.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.46.1 ; extra == 'all' - - jinja2>=3.1.2 ; extra == 'all' - - lxml>=4.9.2 ; extra == 'all' - - matplotlib>=3.6.3 ; extra == 'all' - - numba>=0.56.4 ; extra == 'all' - - numexpr>=2.8.4 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.1.0 ; extra == 'all' - - pandas-gbq>=0.19.0 ; extra == 'all' - - psycopg2>=2.9.6 ; extra == 'all' - - pyarrow>=10.0.1 ; extra == 'all' - - pymysql>=1.0.2 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' - pyqt5>=5.15.9 ; extra == 'all' - - pyreadstat>=1.2.0 ; extra == 'all' - - pytest>=7.3.2 ; extra == 'all' - - pytest-xdist>=2.2.0 ; extra == 'all' - - python-calamine>=0.1.7 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2024.2 ; extra == 'all' - pyxlsb>=1.0.10 ; extra == 'all' - - qtpy>=2.3.0 ; extra == 'all' - - scipy>=1.10.0 ; extra == 'all' - - s3fs>=2022.11.0 ; extra == 'all' - - sqlalchemy>=2.0.0 ; extra == 'all' - - tables>=3.8.0 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' - tabulate>=0.9.0 ; extra == 'all' - - xarray>=2022.12.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=3.0.5 ; extra == 'all' - - zstandard>=0.19.0 ; extra == 'all' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl name: pandas - version: 2.3.3 - sha256: 56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713 + version: 3.0.1 + sha256: de09668c1bf3b925c07e5762291602f0d789eca1b3a781f99c1c78f6cac0e7ea requires_dist: - - numpy>=1.22.4 ; python_full_version < '3.11' - - numpy>=1.23.2 ; python_full_version == '3.11.*' - - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' - python-dateutil>=2.8.2 - - pytz>=2020.1 - - tzdata>=2022.7 - - hypothesis>=6.46.1 ; extra == 'test' - - pytest>=7.3.2 ; extra == 'test' - - pytest-xdist>=2.2.0 ; extra == 'test' - - pyarrow>=10.0.1 ; extra == 'pyarrow' - - bottleneck>=1.3.6 ; extra == 'performance' - - numba>=0.56.4 ; extra == 'performance' - - numexpr>=2.8.4 ; extra == 'performance' - - scipy>=1.10.0 ; extra == 'computation' - - xarray>=2022.12.0 ; extra == 'computation' - - fsspec>=2022.11.0 ; extra == 'fss' - - s3fs>=2022.11.0 ; extra == 'aws' - - gcsfs>=2022.11.0 ; extra == 'gcp' - - pandas-gbq>=0.19.0 ; extra == 'gcp' + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.1.0 ; extra == 'excel' - - python-calamine>=0.1.7 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' - pyxlsb>=1.0.10 ; extra == 'excel' - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=3.0.5 ; extra == 'excel' - - pyarrow>=10.0.1 ; extra == 'parquet' - - pyarrow>=10.0.1 ; extra == 'feather' - - tables>=3.8.0 ; extra == 'hdf5' - - pyreadstat>=1.2.0 ; extra == 'spss' - - sqlalchemy>=2.0.0 ; extra == 'postgresql' - - psycopg2>=2.9.6 ; extra == 'postgresql' - - adbc-driver-postgresql>=0.8.0 ; extra == 'postgresql' - - sqlalchemy>=2.0.0 ; extra == 'mysql' - - pymysql>=1.0.2 ; extra == 'mysql' - - sqlalchemy>=2.0.0 ; extra == 'sql-other' - - adbc-driver-postgresql>=0.8.0 ; extra == 'sql-other' - - adbc-driver-sqlite>=0.8.0 ; extra == 'sql-other' - - beautifulsoup4>=4.11.2 ; extra == 'html' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; 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.6.3 ; extra == 'plot' - - jinja2>=3.1.2 ; extra == 'output-formatting' + - lxml>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' - tabulate>=0.9.0 ; extra == 'output-formatting' - pyqt5>=5.15.9 ; extra == 'clipboard' - - qtpy>=2.3.0 ; extra == 'clipboard' - - zstandard>=0.19.0 ; extra == 'compression' - - dataframe-api-compat>=0.1.7 ; extra == 'consortium-standard' - - adbc-driver-postgresql>=0.8.0 ; extra == 'all' - - adbc-driver-sqlite>=0.8.0 ; extra == 'all' - - beautifulsoup4>=4.11.2 ; extra == 'all' - - bottleneck>=1.3.6 ; extra == 'all' - - dataframe-api-compat>=0.1.7 ; extra == 'all' - - fastparquet>=2022.12.0 ; extra == 'all' - - fsspec>=2022.11.0 ; extra == 'all' - - gcsfs>=2022.11.0 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2024.2 ; 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.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.46.1 ; extra == 'all' - - jinja2>=3.1.2 ; extra == 'all' - - lxml>=4.9.2 ; extra == 'all' - - matplotlib>=3.6.3 ; extra == 'all' - - numba>=0.56.4 ; extra == 'all' - - numexpr>=2.8.4 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.1.0 ; extra == 'all' - - pandas-gbq>=0.19.0 ; extra == 'all' - - psycopg2>=2.9.6 ; extra == 'all' - - pyarrow>=10.0.1 ; extra == 'all' - - pymysql>=1.0.2 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' - pyqt5>=5.15.9 ; extra == 'all' - - pyreadstat>=1.2.0 ; extra == 'all' - - pytest>=7.3.2 ; extra == 'all' - - pytest-xdist>=2.2.0 ; extra == 'all' - - python-calamine>=0.1.7 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2024.2 ; extra == 'all' - pyxlsb>=1.0.10 ; extra == 'all' - - qtpy>=2.3.0 ; extra == 'all' - - scipy>=1.10.0 ; extra == 'all' - - s3fs>=2022.11.0 ; extra == 'all' - - sqlalchemy>=2.0.0 ; extra == 'all' - - tables>=3.8.0 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' - tabulate>=0.9.0 ; extra == 'all' - - xarray>=2022.12.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=3.0.5 ; extra == 'all' - - zstandard>=0.19.0 ; extra == 'all' - requires_python: '>=3.9' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl name: pandocfilters version: 1.5.1 sha256: 93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' -- conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - sha256: ce76d5a1fc6c7ef636cbdbf14ce2d601a1bfa0dd8d286507c1fd02546fccb94b - md5: 1a884d2b1ea21abfb73911dcdb8342e4 - depends: - - bcrypt >=3.2 - - cryptography >=3.3 - - invoke >=2.0 - - pynacl >=1.5 - - python >=3.9 - license: LGPL-2.1-or-later - license_family: LGPL - purls: - - pkg:pypi/paramiko?source=hash-mapping - size: 159896 - timestamp: 1755102147074 -- pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl name: parso - version: 0.8.5 - sha256: 646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887 + version: 0.8.6 + sha256: 2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff + requires_dist: + - pytest ; extra == 'testing' + - docopt ; extra == 'testing' + - flake8==5.0.4 ; extra == 'qa' + - zuban==0.5.1 ; extra == 'qa' + - types-setuptools==67.2.0.1 ; extra == 'qa' + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl + name: pathspec + version: 1.0.4 + sha256: fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723 + requires_dist: + - hyperscan>=0.7 ; extra == 'hyperscan' + - typing-extensions>=4 ; extra == 'optional' + - google-re2>=1.1 ; extra == 're2' + - pytest>=9 ; extra == 'tests' + - typing-extensions>=4.15 ; extra == 'tests' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + name: pexpect + version: 4.9.0 + sha256: 7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 + requires_dist: + - ptyprocess>=0.5 +- pypi: https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: pillow + version: 12.0.0 + sha256: f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344 + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl + name: pillow + version: 12.0.0 + sha256: 4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905 + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl + name: pillow + version: 12.0.0 + sha256: 5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl + name: pillow + version: 12.0.0 + sha256: c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5 + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl + name: pillow + version: 12.1.1 + sha256: 6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60 requires_dist: - - pytest ; extra == 'testing' - - docopt ; extra == 'testing' - - flake8==5.0.4 ; extra == 'qa' - - mypy==0.971 ; extra == 'qa' - - types-setuptools==67.2.0.1 ; extra == 'qa' - requires_python: '>=3.6' -- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - sha256: 29ea20d0faf20374fcd61c25f6d32fb8e9a2c786a7f1473a0c3ead359470fbe1 - md5: 2908273ac396d2cd210a8127f5f1c0d6 - depends: - - python >=3.10 - license: MPL-2.0 - license_family: MOZILLA - purls: - - pkg:pypi/pathspec?source=hash-mapping - size: 53739 - timestamp: 1769677743677 -- pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - name: pexpect - version: 4.9.0 - sha256: 7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl + name: pillow + version: 12.1.1 + sha256: e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32 requires_dist: - - ptyprocess>=0.5 -- pypi: https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl name: pillow - version: 12.0.0 - sha256: f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344 + version: 12.1.1 + sha256: fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -4554,10 +9522,10 @@ packages: - trove-classifiers>=2024.10.12 ; extra == 'tests' - defusedxml ; extra == 'xmp' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl name: pillow - version: 12.0.0 - sha256: 4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905 + version: 12.1.1 + sha256: 344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -4586,10 +9554,10 @@ packages: - trove-classifiers>=2024.10.12 ; extra == 'tests' - defusedxml ; extra == 'xmp' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: pillow - version: 12.0.0 - sha256: 5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b + version: 12.1.1 + sha256: 47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -4618,10 +9586,10 @@ packages: - trove-classifiers>=2024.10.12 ; extra == 'tests' - defusedxml ; extra == 'xmp' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl name: pillow - version: 12.0.0 - sha256: c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5 + version: 12.1.1 + sha256: 365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -4650,18 +9618,92 @@ packages: - trove-classifiers>=2024.10.12 ; extra == 'tests' - defusedxml ; extra == 'xmp' requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - sha256: 7f263219cecf0ba6d74c751efa60c4676ce823157ca90aa43ebba5ac615ca0fa - md5: 4fefefb892ce9cc1539405bec2f1a6cd - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/platformdirs?source=compressed-mapping - size: 25643 - timestamp: 1771233827084 +- pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: pillow + version: 12.1.1 + sha256: 597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl + name: pillow + version: 12.1.1 + sha256: 8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2 + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + name: pip + version: 26.0.1 + sha256: bdb1b08f4274833d62c1aa29e20907365a2ceb950410df15fc9521bad440122b + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl + name: pixi-kernel + version: 0.7.1 + sha256: 93b51c8a95ca58fb4b743cb2ce5d73b951f467e7c39b0c766f20e05bdf950478 + requires_dist: + - ipykernel>=6 + - jupyter-client>=7 + - jupyter-server>=2.4 + - msgspec>=0.18 + - returns>=0.23 + - tomli>=2 ; python_full_version < '3.11' + requires_python: '>=3.10,<4.0' +- pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl + name: platformdirs + version: 4.9.2 + sha256: 9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl name: plotly version: 6.5.0 @@ -4702,6 +9744,46 @@ packages: - xarray ; extra == 'dev-optional' - plotly[dev-optional] ; extra == 'dev' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + name: plotly + version: 6.5.2 + sha256: 91757653bd9c550eeea2fa2404dba6b85d1e366d54804c340b2c874e5a7eb4a4 + requires_dist: + - narwhals>=1.15.1 + - packaging + - numpy ; extra == 'express' + - kaleido>=1.1.0 ; extra == 'kaleido' + - pytest ; extra == 'dev-core' + - requests ; extra == 'dev-core' + - ruff==0.11.12 ; extra == 'dev-core' + - plotly[dev-core] ; extra == 'dev-build' + - build ; extra == 'dev-build' + - jupyter ; extra == 'dev-build' + - plotly[dev-build] ; extra == 'dev-optional' + - plotly[kaleido] ; extra == 'dev-optional' + - anywidget ; extra == 'dev-optional' + - colorcet ; extra == 'dev-optional' + - fiona<=1.9.6 ; python_full_version < '3.9' and extra == 'dev-optional' + - geopandas ; extra == 'dev-optional' + - inflect ; extra == 'dev-optional' + - numpy ; extra == 'dev-optional' + - orjson ; extra == 'dev-optional' + - pandas ; extra == 'dev-optional' + - pdfrw ; extra == 'dev-optional' + - pillow ; extra == 'dev-optional' + - plotly-geo ; extra == 'dev-optional' + - polars[timezone] ; extra == 'dev-optional' + - pyarrow ; extra == 'dev-optional' + - pyshp ; extra == 'dev-optional' + - pytz ; extra == 'dev-optional' + - scikit-image ; extra == 'dev-optional' + - scipy ; extra == 'dev-optional' + - shapely ; extra == 'dev-optional' + - statsmodels ; extra == 'dev-optional' + - vaex ; python_full_version < '3.10' and extra == 'dev-optional' + - xarray ; extra == 'dev-optional' + - plotly[dev-optional] ; extra == 'dev' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl name: pluggy version: 1.6.0 @@ -4713,52 +9795,60 @@ packages: - pytest-benchmark ; extra == 'testing' - coverage ; extra == 'testing' requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/noarch/plumbum-1.10.0-pyhcf101f3_0.conda - sha256: 972e0c1c9f0b1763d482e885732baef7f9a0cbe8686f5e2c6bdd88838619a59a - md5: 7fd2e38f4e608f5ebd80f871352c5495 - depends: - - python >=3.10 - - pywin32-on-windows - - paramiko - - importlib_resources - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/plumbum?source=hash-mapping - size: 103911 - timestamp: 1761911487086 -- pypi: https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + name: plumbum + version: 1.10.0 + sha256: 9583d737ac901c474d99d030e4d5eec4c4e6d2d7417b1cf49728cf3be34f6dc8 + requires_dist: + - pywin32 ; platform_python_implementation != 'PyPy' and sys_platform == 'win32' + - paramiko ; extra == 'ssh' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + name: pooch + version: 1.9.0 + sha256: f265597baa9f760d25ceb29d0beb8186c243d6607b0f60b83ecf14078dbc703b + requires_dist: + - platformdirs>=2.5.0 + - packaging>=20.0 + - requests>=2.19.0 + - tqdm>=4.41.0,<5.0.0 ; extra == 'progress' + - paramiko>=2.7.0 ; extra == 'sftp' + - xxhash>=1.4.3 ; extra == 'xxhash' + - pytest-httpserver ; extra == 'test' + - pytest-localftpserver ; extra == 'test' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl + name: pre-commit + version: 4.5.1 + sha256: 3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77 + requires_dist: + - cfgv>=2.0.0 + - identify>=1.0.0 + - nodeenv>=0.11.1 + - pyyaml>=5.1 + - virtualenv>=20.10.0 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl name: prometheus-client - version: 0.23.1 - sha256: dd1913e6e76b59cfe44e7a4b83e01afc9873c1bdfd2ed8739f1e76aeca115f99 + version: 0.24.1 + sha256: 150db128af71a5c2482b36e588fc8a6b95e498750da4b17065947c16070f4055 requires_dist: - twisted ; extra == 'twisted' + - aiohttp ; extra == 'aiohttp' + - django ; extra == 'django' requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda - sha256: ebc1bb62ac612af6d40667da266ff723662394c0ca78935340a5b5c14831227b - md5: d17ae9db4dc594267181bd199bf9a551 - depends: - - python >=3.9 +- pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + name: prompt-toolkit + version: 3.0.52 + sha256: 9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955 + requires_dist: - wcwidth - constrains: - - prompt_toolkit 3.0.51 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/prompt-toolkit?source=hash-mapping - size: 271841 - timestamp: 1744724188108 -- conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda - sha256: 936189f0373836c1c77cd2d6e71ba1e583e2d3920bf6d015e96ee2d729b5e543 - md5: 1e61ab85dd7c60e5e73d853ea035dc29 - depends: - - prompt-toolkit >=3.0.51,<3.0.52.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 7182 - timestamp: 1744724189376 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: propcache + version: 0.4.1 + sha256: fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48 + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl name: propcache version: 0.4.1 @@ -4769,24 +9859,39 @@ packages: version: 0.4.1 sha256: d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311 requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl + name: propcache + version: 0.4.1 + sha256: c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl + name: propcache + version: 0.4.1 + sha256: 6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: propcache version: 0.4.1 sha256: d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl + name: propcache + version: 0.4.1 + sha256: 364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6 + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl name: propcache version: 0.4.1 sha256: 381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/55/4c/c3ed1a622b6ae2fd3c945a366e64eb35247a31e4db16cf5095e269e8eb3c/psutil-7.1.3-cp37-abi3-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl name: psutil - version: 7.1.3 - sha256: f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd + version: 7.2.2 + sha256: 1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979 requires_dist: + - psleak ; extra == 'dev' - pytest ; extra == 'dev' - pytest-instafail ; extra == 'dev' - - pytest-subtests ; extra == 'dev' - pytest-xdist ; extra == 'dev' - setuptools ; extra == 'dev' - abi3audit ; extra == 'dev' @@ -4810,27 +9915,27 @@ packages: - vulture ; extra == 'dev' - wheel ; extra == 'dev' - colorama ; os_name == 'nt' and extra == 'dev' - - pyreadline ; os_name == 'nt' and extra == 'dev' - - pywin32 ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'dev' - - wheel ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'dev' - - wmi ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - psleak ; extra == 'test' - pytest ; extra == 'test' - pytest-instafail ; extra == 'test' - - pytest-subtests ; extra == 'test' - pytest-xdist ; extra == 'test' - setuptools ; extra == 'test' - - pywin32 ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'test' - - wheel ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'test' - - wmi ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/68/3a/9f93cff5c025029a36d9a92fef47220ab4692ee7f2be0fba9f92813d0cb8/psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl name: psutil - version: 7.1.3 - sha256: bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880 + version: 7.2.2 + sha256: eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988 requires_dist: + - psleak ; extra == 'dev' - pytest ; extra == 'dev' - pytest-instafail ; extra == 'dev' - - pytest-subtests ; extra == 'dev' - pytest-xdist ; extra == 'dev' - setuptools ; extra == 'dev' - abi3audit ; extra == 'dev' @@ -4854,27 +9959,27 @@ packages: - vulture ; extra == 'dev' - wheel ; extra == 'dev' - colorama ; os_name == 'nt' and extra == 'dev' - - pyreadline ; os_name == 'nt' and extra == 'dev' - - pywin32 ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'dev' - - wheel ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'dev' - - wmi ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - psleak ; extra == 'test' - pytest ; extra == 'test' - pytest-instafail ; extra == 'test' - - pytest-subtests ; extra == 'test' - pytest-xdist ; extra == 'test' - setuptools ; extra == 'test' - - pywin32 ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'test' - - wheel ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'test' - - wmi ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/ce/b1/5f49af514f76431ba4eea935b8ad3725cdeb397e9245ab919dbc1d1dc20f/psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl name: psutil - version: 7.1.3 - sha256: 3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3 + version: 7.2.2 + sha256: 076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9 requires_dist: + - psleak ; extra == 'dev' - pytest ; extra == 'dev' - pytest-instafail ; extra == 'dev' - - pytest-subtests ; extra == 'dev' - pytest-xdist ; extra == 'dev' - setuptools ; extra == 'dev' - abi3audit ; extra == 'dev' @@ -4898,27 +10003,27 @@ packages: - vulture ; extra == 'dev' - wheel ; extra == 'dev' - colorama ; os_name == 'nt' and extra == 'dev' - - pyreadline ; os_name == 'nt' and extra == 'dev' - - pywin32 ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'dev' - - wheel ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'dev' - - wmi ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - psleak ; extra == 'test' - pytest ; extra == 'test' - pytest-instafail ; extra == 'test' - - pytest-subtests ; extra == 'test' - pytest-xdist ; extra == 'test' - setuptools ; extra == 'test' - - pywin32 ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'test' - - wheel ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'test' - - wmi ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/ef/94/46b9154a800253e7ecff5aaacdf8ebf43db99de4a2dfa18575b02548654e/psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl name: psutil - version: 7.1.3 - sha256: 2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab + version: 7.2.2 + sha256: ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486 requires_dist: + - psleak ; extra == 'dev' - pytest ; extra == 'dev' - pytest-instafail ; extra == 'dev' - - pytest-subtests ; extra == 'dev' - pytest-xdist ; extra == 'dev' - setuptools ; extra == 'dev' - abi3audit ; extra == 'dev' @@ -4942,18 +10047,18 @@ packages: - vulture ; extra == 'dev' - wheel ; extra == 'dev' - colorama ; os_name == 'nt' and extra == 'dev' - - pyreadline ; os_name == 'nt' and extra == 'dev' - - pywin32 ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'dev' - - wheel ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'dev' - - wmi ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - psleak ; extra == 'test' - pytest ; extra == 'test' - pytest-instafail ; extra == 'test' - - pytest-subtests ; extra == 'test' - pytest-xdist ; extra == 'test' - setuptools ; extra == 'test' - - pywin32 ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'test' - - wheel ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'test' - - wmi ; os_name == 'nt' and platform_python_implementation != 'PyPy' and extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' requires_python: '>=3.6' - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl name: ptyprocess @@ -4964,247 +10069,106 @@ packages: version: 0.2.3 sha256: 1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0 requires_dist: - - pytest ; extra == 'tests' -- pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - name: pycodestyle - version: 2.14.0 - sha256: dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d + - pytest ; extra == 'tests' +- pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl + name: py + version: 1.11.0 + sha256: 607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*' +- pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl + name: pycodestyle + version: 2.14.0 + sha256: dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + name: pycparser + version: '3.0' + sha256: b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + name: pydantic + version: 2.12.5 + sha256: e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d + requires_dist: + - annotated-types>=0.6.0 + - pydantic-core==2.41.5 + - typing-extensions>=4.14.1 + - typing-inspection>=0.4.2 + - email-validator>=2.0.0 ; extra == 'email' + - tzdata ; python_full_version >= '3.9' and sys_platform == 'win32' and extra == 'timezone' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl + name: pydantic-core + version: 2.41.5 + sha256: 76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl + name: pydantic-core + version: 2.41.5 + sha256: 7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl + name: pydantic-core + version: 2.41.5 + sha256: 941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9 + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl + name: pydantic-core + version: 2.41.5 + sha256: 112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34 + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl + name: pydantic-core + version: 2.41.5 + sha256: 79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11 + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: pydantic-core + version: 2.41.5 + sha256: f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b + requires_dist: + - typing-extensions>=4.14.1 requires_python: '>=3.9' -- 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/pydantic-2.12.5-pyhcf101f3_1.conda - sha256: 868569d9505b7fe246c880c11e2c44924d7613a8cdcc1f6ef85d5375e892f13d - md5: c3946ed24acdb28db1b5d63321dbca7d - depends: - - typing-inspection >=0.4.2 - - typing_extensions >=4.14.1 - - python >=3.10 - - typing-extensions >=4.6.1 - - annotated-types >=0.6.0 - - pydantic-core ==2.41.5 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/pydantic?source=hash-mapping - size: 340482 - timestamp: 1764434463101 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda - sha256: b15568ddc03bd33ea41610e5df951be4e245cd61957cbf8c2cfd12557f3d53b5 - md5: f27c39a1906771bbe56cd26a76bf0b8b - depends: - - python - - typing-extensions >=4.6.0,!=4.7.0 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.13.* *_cp313 - constrains: - - __glibc >=2.17 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pydantic-core?source=hash-mapping - size: 1940186 - timestamp: 1762989000579 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda - sha256: 73de35081774d9b445dd807ac4d4e043846159b2de348b8e6a81f1b810210fe4 - md5: e12491c39d2ea259771ce4d80a91817f - depends: - - python - - typing-extensions >=4.6.0,!=4.7.0 - - __osx >=10.13 - - python_abi 3.13.* *_cp313 - constrains: - - __osx >=10.13 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pydantic-core?source=hash-mapping - size: 1947011 - timestamp: 1762989008917 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda - sha256: 08398c0599084837ba89d69db00b3d0973dc86d6519957dc6c1b480e2571451a - md5: eaeed566f6d88c0a08d73700b34be4a2 - depends: - - python - - typing-extensions >=4.6.0,!=4.7.0 - - python 3.13.* *_cp313 - - __osx >=11.0 - - python_abi 3.13.* *_cp313 - constrains: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pydantic-core?source=hash-mapping - size: 1778337 - timestamp: 1762989007829 -- conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda - sha256: fb9391dc09dd01574c85e2342b9aa3b8664cd713401ef8fd6267865cc28988d8 - md5: 0437f87004ad7c64c98a013d1611db97 - depends: - - python - - typing-extensions >=4.6.0,!=4.7.0 - - 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/pydantic-core?source=hash-mapping - size: 1973031 - timestamp: 1762989056610 -- pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - name: pydata-sphinx-theme - version: 0.15.4 - sha256: 2136ad0e9500d0949f96167e63f3e298620040aea8f9c74621959eda5d4cf8e6 +- pypi: https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: pydantic-core + version: 2.41.5 + sha256: 406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586 requires_dist: - - sphinx>=5 - - beautifulsoup4 - - docutils!=0.17.0 - - packaging - - babel - - pygments>=2.7 - - accessible-pygments - - typing-extensions - - numpydoc ; extra == 'doc' - - linkify-it-py ; extra == 'doc' - - rich ; extra == 'doc' - - sphinxext-rediraffe ; extra == 'doc' - - sphinx-sitemap ; extra == 'doc' - - sphinx-autoapi>=3.0.0 ; extra == 'doc' - - myst-parser ; extra == 'doc' - - ablog>=0.11.8 ; extra == 'doc' - - jupyter-sphinx ; extra == 'doc' - - pandas ; extra == 'doc' - - plotly ; extra == 'doc' - - matplotlib ; extra == 'doc' - - numpy ; extra == 'doc' - - xarray ; extra == 'doc' - - sphinx-copybutton ; extra == 'doc' - - sphinx-design ; extra == 'doc' - - sphinx-togglebutton ; extra == 'doc' - - jupyterlite-sphinx ; extra == 'doc' - - sphinxcontrib-youtube>=1.4.1 ; extra == 'doc' - - sphinx-favicon>=1.0.1 ; extra == 'doc' - - ipykernel ; extra == 'doc' - - nbsphinx ; extra == 'doc' - - ipyleaflet ; extra == 'doc' - - colorama ; extra == 'doc' - - ipywidgets ; extra == 'doc' - - graphviz ; extra == 'doc' - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-regressions ; extra == 'test' - - sphinx[test] ; extra == 'test' - - pyyaml ; extra == 'dev' - - pre-commit ; extra == 'dev' - - pydata-sphinx-theme[doc,test] ; extra == 'dev' - - tox ; extra == 'dev' - - pandoc ; extra == 'dev' - - sphinx-theme-builder[cli] ; extra == 'dev' - - pytest-playwright ; extra == 'a11y' - - babel ; extra == 'i18n' - - jinja2 ; extra == 'i18n' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl - name: pyflakes - version: 3.4.0 - sha256: f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f - requires_python: '>=3.9' -- 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/linux-64/pynacl-1.6.2-py313h5008379_1.conda - sha256: 51e80a7bef95025ad47a92acb69ee0e78f01e107655c86fe76abcde2ac688166 - md5: c4426edfc5514a2c9be6871557bce52b - depends: - - __glibc >=2.17,<3.0.a0 - - cffi >=1.4.1 - - libgcc >=14 - - libsodium >=1.0.21,<1.0.22.0a0 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - six - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/pynacl?source=hash-mapping - size: 1191901 - timestamp: 1772171244923 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pynacl-1.6.2-py313hf61a874_1.conda - sha256: 2638c5a765310ac71641f37dc614792eb39b9a62059758de6b8ffc06b0639c1f - md5: 3037cfd226c8d60a492c9d0a5fe0d277 - depends: - - __osx >=11.0 - - cffi >=1.4.1 - - libsodium >=1.0.21,<1.0.22.0a0 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - six - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/pynacl?source=hash-mapping - size: 1195552 - timestamp: 1772171533952 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py313h6940bce_1.conda - sha256: ef6ab85953ebf81b3b0c6d0b6377eb1a318b07823e76d2c8e850365e60d9ca5c - md5: fca94b9ddea6d5c63ccb6b5ad6d8e232 - depends: - - __osx >=11.0 - - cffi >=1.4.1 - - libsodium >=1.0.21,<1.0.22.0a0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - - six - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/pynacl?source=hash-mapping - size: 1192924 - timestamp: 1772171603602 -- conda: https://conda.anaconda.org/conda-forge/win-64/pynacl-1.6.2-py313hed4ef92_1.conda - sha256: 0960e727d0bd70e07bca0c049c4c4afa0b41bcea050135db49f54c1c0c02ed7f - md5: 99b7617a643bed6a403fc908c1e167f0 - depends: - - cffi >=1.4.1 - - libsodium >=1.0.21,<1.0.22.0a0 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - six - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/pynacl?source=hash-mapping - size: 1186552 - timestamp: 1772171311072 + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + name: pydantic-core + version: 2.41.5 + sha256: a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6 + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + name: pygments + version: 2.19.2 + sha256: 86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b + requires_dist: + - colorama>=0.4.6 ; extra == 'windows-terminal' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl + name: pymdown-extensions + version: '10.21' + sha256: 91b879f9f864d49794c2d9534372b10150e6141096c3908a455e45ca72ad9d3f + requires_dist: + - markdown>=3.6 + - pyyaml + - pygments>=2.19.1 ; extra == 'extra' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl name: pyparsing version: 3.2.5 @@ -5213,30 +10177,23 @@ packages: - railroad-diagrams ; extra == 'diagrams' - jinja2 ; extra == 'diagrams' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl - name: pyproject-api - version: 1.10.0 - sha256: 8757c41a79c0f4ab71b99abed52b97ecf66bd20b04fa59da43b5840bac105a09 +- pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + name: pyparsing + version: 3.3.2 + sha256: 850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d requires_dist: - - packaging>=25 - - tomli>=2.3 ; python_full_version < '3.11' - - furo>=2025.9.25 ; extra == 'docs' - - sphinx-autodoc-typehints>=3.5.1 ; extra == 'docs' - - covdefaults>=2.3 ; extra == 'testing' - - pytest-cov>=7 ; extra == 'testing' - - pytest-mock>=3.15.1 ; extra == 'testing' - - pytest>=8.4.2 ; extra == 'testing' - - setuptools>=80.9 ; extra == 'testing' - requires_python: '>=3.10' + - railroad-diagrams ; extra == 'diagrams' + - jinja2 ; extra == 'diagrams' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl name: pyproject-hooks version: 1.2.0 sha256: 9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/0b/8b/6300fb80f858cda1c51ffa17075df5d846757081d11ab4aa35cef9e6258b/pytest-9.0.1-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl name: pytest - version: 9.0.1 - sha256: 67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad + version: 9.0.2 + sha256: 711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b requires_dist: - colorama>=0.4 ; sys_platform == 'win32' - exceptiongroup>=1 ; python_full_version < '3.11' @@ -5265,6 +10222,72 @@ packages: - pytest-xdist ; extra == 'testing' - virtualenv ; extra == 'testing' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl + name: pytest-xdist + version: 3.8.0 + sha256: 202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88 + requires_dist: + - execnet>=2.1 + - pytest>=7.0.0 + - filelock ; extra == 'testing' + - psutil>=3.0 ; extra == 'psutil' + - setproctitle ; extra == 'setproctitle' + requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hd63d673_3_cpython.conda + build_number: 3 + sha256: 41b29c2d62f7028bb7bb05eef3ff55f81e3c1cb40e76ba95a890a058fbc2a896 + md5: 26d8f4db8c578dedba9f2c11423e59e5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.2,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libuuid >=2.41.3,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + size: 30905206 + timestamp: 1769472446175 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda + build_number: 100 + sha256: 8a08fe5b7cb5a28aa44e2994d18dbf77f443956990753a4ca8173153ffb6eb56 + md5: 4c875ed0e78c2d407ec55eadffb8cf3d + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.2,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libuuid >=2.41.3,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.5,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + purls: [] + size: 37364553 + timestamp: 1770272309861 + python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda build_number: 101 sha256: e89da062abd0d3e76c8d3b35d3cafc5f0d05914339dcb238f9e3675f2a58d883 @@ -5292,6 +10315,53 @@ packages: size: 37174029 timestamp: 1761178179147 python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.14-h74c2667_3_cpython.conda + build_number: 3 + sha256: 327d6c5eb61657d4b76e1024da9c790d3e7aacee84487403e9eef1b730982e63 + md5: df79e5958af70212260d5e163e867d98 + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.2,<6.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + size: 15666344 + timestamp: 1769473006716 +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.12-h894a449_100_cp313.conda + build_number: 100 + sha256: 9548dcf58cf6045aa4aa1f2f3fa6110115ca616a8d5fa142a24081d2b9d91291 + md5: 99b1fa1fe8a8ab58224969f4568aadca + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.2,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.5,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + purls: [] + size: 17570178 + timestamp: 1770272361922 + python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda build_number: 101 sha256: b56484229cf83f6c84e8b138dc53f7f2fa9ee850f42bf1f6d6fa1c03c044c2d3 @@ -5316,6 +10386,53 @@ packages: size: 17521522 timestamp: 1761177097697 python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.14-h18782d2_3_cpython.conda + build_number: 3 + sha256: f862d544a455bedfa5d77305f0a42c8e3392956e364f8f92d6ca1c844fb3fbd1 + md5: b8f6a28ffd3c97367d4e58e8793ff47c + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.2,<6.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + size: 13707418 + timestamp: 1769472290774 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda + build_number: 100 + sha256: 9a4f16a64def0853f0a7b6a7beb40d498fd6b09bee10b90c3d6069b664156817 + md5: 179c0f5ae4f22bc3be567298ed0b17b9 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.2,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.5,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + purls: [] + size: 12770674 + timestamp: 1770272314517 + python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda build_number: 101 sha256: 516229f780b98783a5ef4112a5a4b5e5647d4f0177c4621e98aa60bb9bc32f98 @@ -5340,6 +10457,53 @@ packages: size: 11915380 timestamp: 1761176793936 python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.14-h0159041_3_cpython.conda + build_number: 3 + sha256: 5676dadd9d4fba1bce51bd7e5cf8fcf76f85b88b7baa15bd10ca00557e67f10e + md5: 05ded1dca7befb66ec95a9ec6d34a71a + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.2,<6.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + size: 18353938 + timestamp: 1769471078924 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.12-h09917c8_100_cp313.conda + build_number: 100 + sha256: da70aec20ff5a5ae18bbba9fdd1e18190b419605cafaafb3bdad8becf11ce94d + md5: 4440c24966d0aa0c8f1e1d5006dac2d6 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.2,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - python_abi 3.13.* *_cp313 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Python-2.0 + purls: [] + size: 16535316 + timestamp: 1770270322707 + python_site_packages_path: Lib/site-packages - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda build_number: 101 sha256: bc855b513197637c2083988d5cbdcc407a23151cdecff381bd677df33d516a01 @@ -5371,6 +10535,23 @@ packages: requires_dist: - six>=1.5 requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl + name: python-discovery + version: 1.1.0 + sha256: a162893b8809727f54594a99ad2179d2ede4bf953e12d4c7abc3cc9cdbd1437b + requires_dist: + - filelock>=3.15.4 + - platformdirs>=4.3.6,<5 + - furo>=2025.12.19 ; extra == 'docs' + - sphinx-autodoc-typehints>=3.6.3 ; extra == 'docs' + - sphinx>=9.1 ; extra == 'docs' + - sphinxcontrib-mermaid>=2 ; extra == 'docs' + - covdefaults>=2.3 ; extra == 'testing' + - coverage>=7.5.4 ; extra == 'testing' + - pytest-mock>=3.14 ; extra == 'testing' + - pytest>=8.3.5 ; extra == 'testing' + - setuptools>=75.1 ; extra == 'testing' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl name: python-engineio version: 4.12.3 @@ -5382,6 +10563,19 @@ packages: - aiohttp>=3.4 ; extra == 'asyncio-client' - sphinx ; extra == 'docs' requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl + name: python-engineio + version: 4.13.1 + sha256: f32ad10589859c11053ad7d9bb3c9695cdf862113bfb0d20bc4d890198287399 + requires_dist: + - simple-websocket>=0.10.0 + - requests>=2.21.0 ; extra == 'client' + - websocket-client>=0.54.0 ; extra == 'client' + - aiohttp>=3.11 ; extra == 'asyncio-client' + - tox ; extra == 'dev' + - sphinx ; extra == 'docs' + - furo ; extra == 'docs' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl name: python-json-logger version: 4.0.0 @@ -5421,126 +10615,114 @@ packages: - tox ; extra == 'dev' - sphinx ; extra == 'docs' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl + name: python-socketio + version: 5.16.1 + sha256: a3eb1702e92aa2f2b5d3ba00261b61f062cce51f1cfb6900bf3ab4d1934d2d35 + requires_dist: + - bidict>=0.21.0 + - python-engineio>=4.11.0 + - requests>=2.21.0 ; extra == 'client' + - websocket-client>=0.54.0 ; extra == 'client' + - aiohttp>=3.4 ; extra == 'asyncio-client' + - tox ; extra == 'dev' + - sphinx ; extra == 'docs' + - furo ; extra == 'docs' + requires_python: '>=3.8' - 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 -- pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - name: pytz - version: '2025.2' - sha256: 5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 -- 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/noarch/pywin32-on-windows-0.1.0-pyh07e9846_2.tar.bz2 - sha256: 09803b75cccc16d8586d2f41ea890658d165f4afc359973fa1c7904a2c140eae - md5: 91733394059b880d9cc0d010c20abda0 - depends: - - python >=2.7 - - pywin32 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 5282 - timestamp: 1646866839398 -- conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 - sha256: 6502696aaef571913b22a808b15c185bd8ea4aabb952685deb29e6a6765761cb - md5: 2807a0becd1d986fe1ef9b7f8135f215 - depends: - - __unix - - python >=2.7 + md5: 94305520c52a4aa3f6c2b1ff6008d9f8 + constrains: + - python 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: [] - size: 4856 - timestamp: 1646866525560 -- pypi: https://files.pythonhosted.org/packages/fc/19/b757fe28008236a4a713e813283721b8a40aa60cd7d3f83549f2e25a3155/pywinpty-3.0.2-cp313-cp313-win_amd64.whl + size: 7002 + timestamp: 1752805902938 +- pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl + name: pytz + version: '2025.2' + sha256: 5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 +- pypi: https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl + name: pywin32 + version: '311' + sha256: 3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503 +- pypi: https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl + name: pywin32 + version: '311' + sha256: 718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d +- pypi: https://files.pythonhosted.org/packages/79/c3/3e75075c7f71735f22b66fab0481f2c98e3a4d58cba55cb50ba29114bcf6/pywinpty-3.0.3-cp311-cp311-win_amd64.whl name: pywinpty - version: 3.0.2 - sha256: 18f78b81e4cfee6aabe7ea8688441d30247b73e52cd9657138015c5f4ee13a51 + version: 3.0.3 + sha256: dff25a9a6435f527d7c65608a7e62783fc12076e7d44487a4911ee91be5a8ac8 requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda - sha256: ef7df29b38ef04ec67a8888a4aa039973eaa377e8c4b59a7be0a1c50cd7e4ac6 - md5: f256753e840c3cd3766488c9437a8f8b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - 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=compressed-mapping - size: 201616 - timestamp: 1770223543730 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.3-py313h7c6a591_1.conda - sha256: ab5f6c27d24facd1832481ccd8f432c676472d57596a3feaa77880a1462cdb2a - md5: 0eaf6cf9939bb465ee62b17d04254f9e - depends: - - __osx >=10.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: 192051 - timestamp: 1770223971430 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h65a2061_1.conda - sha256: 950725516f67c9691d81bb8dde8419581c5332c5da3da10c9ba8cbb1698b825d - md5: 5d0c8b92128c93027632ca8f8dc1190f - 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=compressed-mapping - size: 188763 - timestamp: 1770224094408 -- conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_1.conda - sha256: dfaed50de8ee72a51096163b87631921688851001e38c78a841eba1ae8b35889 - md5: c1bdb8dd255c79fb9c428ad25cc6ee54 - 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 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyyaml?source=compressed-mapping - size: 180992 - timestamp: 1770223457761 +- pypi: https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl + name: pywinpty + version: 3.0.3 + sha256: 9c91dbb026050c77bdcef964e63a4f10f01a639113c4d3658332614544c467ab + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl + name: pyyaml + version: 6.0.3 + sha256: 652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl + name: pyyaml + version: 6.0.3 + sha256: 44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: pyyaml + version: 6.0.3 + sha256: b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: pyyaml + version: 6.0.3 + sha256: 0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl + name: pyyaml + version: 6.0.3 + sha256: 79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl + name: pyyaml + version: 6.0.3 + sha256: 2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl + name: pyyaml + version: 6.0.3 + sha256: 8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl + name: pyyaml + version: 6.0.3 + sha256: 9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + name: pyyaml-env-tag + version: '1.1' + sha256: 17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04 + requires_dist: + - pyyaml + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl + name: pyzmq + version: 27.1.0 + sha256: 226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86 + requires_dist: + - cffi ; implementation_name == 'pypy' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl + name: pyzmq + version: 27.1.0 + sha256: 190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97 + requires_dist: + - cffi ; implementation_name == 'pypy' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl name: pyzmq version: 27.1.0 @@ -5548,6 +10730,13 @@ packages: requires_dist: - cffi ; implementation_name == 'pypy' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl + name: pyzmq + version: 27.1.0 + sha256: 5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e + requires_dist: + - cffi ; implementation_name == 'pypy' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl name: pyzmq version: 27.1.0 @@ -5562,18 +10751,22 @@ packages: requires_dist: - cffi ; implementation_name == 'pypy' requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - sha256: 0604c6dff3af5f53e34fceb985395d08287137f220450108a795bcd1959caf14 - md5: 34fa231b5c5927684b03bb296bb94ddc - depends: - - prompt_toolkit >=2.0,<4.0 - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/questionary?source=hash-mapping - size: 31257 - timestamp: 1757356458097 +- pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl + name: questionary + version: 2.1.1 + sha256: a51af13f345f1cdea62347589fbb6df3b290306ab8930713bfae4d475a7d4a59 + requires_dist: + - prompt-toolkit>=2.0,<4.0 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/93/f7/d00d9b4a0313a6be3a3e0818e6375e15da6d7076f4ae47d1324e7ca986a1/radon-6.0.1-py2.py3-none-any.whl + name: radon + version: 6.0.1 + sha256: 632cc032364a6f8bb1010a2f6a12d0f14bc7e5ede76585ef29dc0cecf4cd8859 + requires_dist: + - mando>=0.6,<0.8 + - colorama==0.4.1 ; python_full_version < '3.5' + - colorama>=0.4.1 ; python_full_version >= '3.5' + - tomli>=2.0.1 ; extra == 'toml' - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c md5: 283b96675859b20a825f8fa30f311446 @@ -5585,6 +10778,18 @@ packages: purls: [] size: 282480 timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 + md5: d7d95fc8287ea7bf33e0e7116d2b95ec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 345073 + timestamp: 1765813471974 - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda sha256: 53017e80453c4c1d97aaf78369040418dea14cf8f46a2fa999f31bd70b36c877 md5: 342570f8e02f2f022147a7f841475784 @@ -5595,6 +10800,17 @@ packages: purls: [] size: 256712 timestamp: 1740379577668 +- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + sha256: 4614af680aa0920e82b953fece85a03007e0719c3399f13d7de64176874b80d5 + md5: eefd65452dfe7cce476a519bece46704 + depends: + - __osx >=10.13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 317819 + timestamp: 1765813692798 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 md5: 63ef3f6e6d6d5c589e64f11263dc5676 @@ -5605,16 +10821,17 @@ packages: purls: [] size: 252359 timestamp: 1740379663071 -- pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl - name: readme-renderer - version: '44.0' - sha256: 2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 - requires_dist: - - nh3>=0.2.14 - - docutils>=0.21.2 - - pygments>=2.5.1 - - cmarkgfm>=0.8.0 ; extra == 'md' - requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 + depends: + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 313930 + timestamp: 1765813902568 - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl name: referencing version: 0.37.0 @@ -5636,12 +10853,16 @@ packages: - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks' - chardet>=3.0.2,<6 ; extra == 'use-chardet-on-py3' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/af/63/ac52b32b33ae62f2076ed5c4f6b00e065e3ccbb2063e9a2e813b2bfc95bf/restructuredtext_lint-2.0.2-py3-none-any.whl - name: restructuredtext-lint - version: 2.0.2 - sha256: 374c0d3e7e0867b2335146a145343ac619400623716b211b9a010c94426bbed7 - requires_dist: - - docutils>=0.11,<1.0 +- pypi: https://files.pythonhosted.org/packages/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl + name: returns + version: 0.26.0 + sha256: 7cae94c730d6c56ffd9d0f583f7a2c0b32cfe17d141837150c8e6cff3eb30d71 + requires_dist: + - hypothesis>=6.136,<7.0 ; extra == 'check-laws' + - mypy>=1.12,<1.18 ; extra == 'compatible-mypy' + - pytest>=8.0,<9.0 ; extra == 'check-laws' + - typing-extensions>=4.0,<5.0 + requires_python: '>=3.10,<4.0' - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl name: rfc3339-validator version: 0.1.4 @@ -5662,62 +10883,254 @@ packages: - lark>=1.2.2 - pytest>=8.3.5 ; extra == 'testing' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl - name: roman-numerals-py - version: 3.1.0 - sha256: 9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c - requires_dist: - - mypy==1.15.0 ; extra == 'lint' - - ruff==0.9.7 ; extra == 'lint' - - pyright==1.1.394 ; extra == 'lint' - - pytest>=8 ; extra == 'test' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/3c/6b/0229d3bed4ddaa409e6d90b0ae967ed4380e4bdd0dad6e59b92c17d42457/rpds_py-0.29.0-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl + name: rpds-py + version: 0.30.0 + sha256: a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl + name: rpds-py + version: 0.30.0 + sha256: dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: rpds-py + version: 0.30.0 + sha256: 9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl + name: rpds-py + version: 0.30.0 + sha256: f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl name: rpds-py - version: 0.29.0 - sha256: 6410e66f02803600edb0b1889541f4b5cc298a5ccda0ad789cc50ef23b54813e + version: 0.30.0 + sha256: 806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/b3/b3/0860cdd012291dc21272895ce107f1e98e335509ba986dd83d72658b82b9/rpds_py-0.29.0-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: rpds-py - version: 0.29.0 - sha256: 521807963971a23996ddaf764c682b3e46459b3c58ccd79fefbe16718db43154 + version: 0.30.0 + sha256: 33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/b9/42/555b4ee17508beafac135c8b450816ace5a96194ce97fefc49d58e5652ea/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl name: rpds-py - version: 0.29.0 - sha256: de73e40ebc04dd5d9556f50180395322193a78ec247e637e741c1b954810f295 + version: 0.30.0 + sha256: a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/fd/d9/c5de60d9d371bbb186c3e9bf75f4fc5665e11117a25a06a6b2e0afb7380e/rpds_py-0.29.0-cp313-cp313-macosx_10_12_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl name: rpds-py - version: 0.29.0 - sha256: 1585648d0760b88292eecab5181f5651111a69d90eff35d6b78aa32998886a61 + version: 0.30.0 + sha256: e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/13/ac/9b9fe63716af8bdfddfacd0882bc1586f29985d3b988b3c62ddce2e202c3/ruff-0.14.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl name: ruff - version: 0.14.6 - sha256: 167843a6f78680746d7e226f255d920aeed5e4ad9c03258094a2d49d3028b105 + version: 0.15.4 + sha256: a4386ba2cd6c0f4ff75252845906acc7c7c8e1ac567b7bc3d373686ac8c222ba requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/36/6a/ad66d0a3315d6327ed6b01f759d83df3c4d5f86c30462121024361137b6a/ruff-0.14.6-py3-none-macosx_10_12_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl name: ruff - version: 0.14.6 - sha256: 9f7539ea257aa4d07b7ce87aed580e485c40143f2473ff2f2b75aee003186004 + version: 0.15.4 + sha256: 5a1632c66672b8b4d3e1d1782859e98d6e0b4e70829530666644286600a33992 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/a3/9d/dae6db96df28e0a15dea8e986ee393af70fc97fd57669808728080529c37/ruff-0.14.6-py3-none-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl name: ruff - version: 0.14.6 - sha256: 7f6007e55b90a2a7e93083ba48a9f23c3158c433591c33ee2e99a49b889c6332 + version: 0.15.4 + sha256: 04196ad44f0df220c2ece5b0e959c2f37c777375ec744397d21d15b50a75264f requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/fb/02/82240553b77fd1341f80ebb3eaae43ba011c7a91b4224a9f317d8e6591af/ruff-0.14.6-py3-none-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: ruff - version: 0.14.6 - sha256: 390e6480c5e3659f8a4c8d6a0373027820419ac14fa0d2713bd8e6c3e125b8b9 + version: 0.15.4 + sha256: 451a2e224151729b3b6c9ffb36aed9091b2996fe4bdbd11f47e27d8f2e8888ec requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/64/7c/d8a343b0a622987335a1ac848084079c47c21e44fcc450f9c145b11a56f6/scipp-25.11.0-cp313-cp313-macosx_11_0_arm64.whl name: scipp - version: 25.11.0 - sha256: 9b082fc7fd29919b4fee007f63db265176becb06c669a4b709feb741b76c612a + version: 25.11.0 + sha256: 9b082fc7fd29919b4fee007f63db265176becb06c669a4b709feb741b76c612a + requires_dist: + - numpy>=1.20 + - pytest ; extra == 'test' + - matplotlib ; extra == 'test' + - beautifulsoup4 ; extra == 'test' + - ipython ; extra == 'test' + - h5py ; extra == 'extra' + - scipy>=1.7.0 ; extra == 'extra' + - graphviz ; extra == 'extra' + - pooch ; extra == 'extra' + - plopp ; extra == 'extra' + - matplotlib ; extra == 'extra' + - scipp[extra] ; extra == 'all' + - ipympl ; extra == 'all' + - ipython ; extra == 'all' + - ipywidgets ; extra == 'all' + - jupyterlab ; extra == 'all' + - jupyterlab-widgets ; extra == 'all' + - jupyter-nbextensions-configurator ; extra == 'all' + - nodejs ; extra == 'all' + - pythreejs ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/71/f2/18d5be10ac890ce7490451eb55d41bf9d96e481751362a30ed1a8bc176fa/scipp-25.11.0-cp313-cp313-macosx_11_0_x86_64.whl + name: scipp + version: 25.11.0 + sha256: fd7788e3ea3dd5334ed7fb53a249413469edc5d836ca5d68b1f271691cf11269 + requires_dist: + - numpy>=1.20 + - pytest ; extra == 'test' + - matplotlib ; extra == 'test' + - beautifulsoup4 ; extra == 'test' + - ipython ; extra == 'test' + - h5py ; extra == 'extra' + - scipy>=1.7.0 ; extra == 'extra' + - graphviz ; extra == 'extra' + - pooch ; extra == 'extra' + - plopp ; extra == 'extra' + - matplotlib ; extra == 'extra' + - scipp[extra] ; extra == 'all' + - ipympl ; extra == 'all' + - ipython ; extra == 'all' + - ipywidgets ; extra == 'all' + - jupyterlab ; extra == 'all' + - jupyterlab-widgets ; extra == 'all' + - jupyter-nbextensions-configurator ; extra == 'all' + - nodejs ; extra == 'all' + - pythreejs ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/77/34/1956aed61c4abb91926f9513330afac4654cc2a711ecb73085dc4e2e5c1d/scipp-25.11.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: scipp + version: 25.11.0 + sha256: 3e91c8093dc83d433a2e53708561228a06a7e34d8775a20118d391f5b891a6e6 + requires_dist: + - numpy>=1.20 + - pytest ; extra == 'test' + - matplotlib ; extra == 'test' + - beautifulsoup4 ; extra == 'test' + - ipython ; extra == 'test' + - h5py ; extra == 'extra' + - scipy>=1.7.0 ; extra == 'extra' + - graphviz ; extra == 'extra' + - pooch ; extra == 'extra' + - plopp ; extra == 'extra' + - matplotlib ; extra == 'extra' + - scipp[extra] ; extra == 'all' + - ipympl ; extra == 'all' + - ipython ; extra == 'all' + - ipywidgets ; extra == 'all' + - jupyterlab ; extra == 'all' + - jupyterlab-widgets ; extra == 'all' + - jupyter-nbextensions-configurator ; extra == 'all' + - nodejs ; extra == 'all' + - pythreejs ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/f6/f3/9d1bb423a2dc0bbebfc98191095dd410a1268397b9c692d76a3ea971c790/scipp-25.11.0-cp313-cp313-win_amd64.whl + name: scipp + version: 25.11.0 + sha256: d44d2aa3f6634ac750a126e50a740c487aa8a2181fcb03764b29ddceeea611cf + requires_dist: + - numpy>=1.20 + - pytest ; extra == 'test' + - matplotlib ; extra == 'test' + - beautifulsoup4 ; extra == 'test' + - ipython ; extra == 'test' + - h5py ; extra == 'extra' + - scipy>=1.7.0 ; extra == 'extra' + - graphviz ; extra == 'extra' + - pooch ; extra == 'extra' + - plopp ; extra == 'extra' + - matplotlib ; extra == 'extra' + - scipp[extra] ; extra == 'all' + - ipympl ; extra == 'all' + - ipython ; extra == 'all' + - ipywidgets ; extra == 'all' + - jupyterlab ; extra == 'all' + - jupyterlab-widgets ; extra == 'all' + - jupyter-nbextensions-configurator ; extra == 'all' + - nodejs ; extra == 'all' + - pythreejs ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/26/d5/0b0ca89849806a23da4e56182a72f510bdcf911511b3a0098f8252896941/scipp-26.2.0-cp311-cp311-win_amd64.whl + name: scipp + version: 26.2.0 + sha256: ec717202c2b7d476ca1c6555171f2da0d7fee7f403858e3421f36cf0243b0799 + requires_dist: + - numpy>=2 + - pytest ; extra == 'test' + - matplotlib ; extra == 'test' + - beautifulsoup4 ; extra == 'test' + - ipython ; extra == 'test' + - h5py ; extra == 'extra' + - scipy>=1.7.0 ; extra == 'extra' + - graphviz ; extra == 'extra' + - pooch ; extra == 'extra' + - plopp ; extra == 'extra' + - matplotlib ; extra == 'extra' + - scipp[extra] ; extra == 'all' + - ipympl ; extra == 'all' + - ipython ; extra == 'all' + - ipywidgets ; extra == 'all' + - jupyterlab ; extra == 'all' + - jupyterlab-widgets ; extra == 'all' + - jupyter-nbextensions-configurator ; extra == 'all' + - nodejs ; extra == 'all' + - pythreejs ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/3c/96/565e32544b31d46707370ba9153c98e3d6e2ade120130f0c7c22dfc9d48a/scipp-26.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: scipp + version: 26.2.0 + sha256: ae686b9466226d831f46b4ce7e643d57066e0bc7d6e8dad9685f82adc9454453 + requires_dist: + - numpy>=2 + - pytest ; extra == 'test' + - matplotlib ; extra == 'test' + - beautifulsoup4 ; extra == 'test' + - ipython ; extra == 'test' + - h5py ; extra == 'extra' + - scipy>=1.7.0 ; extra == 'extra' + - graphviz ; extra == 'extra' + - pooch ; extra == 'extra' + - plopp ; extra == 'extra' + - matplotlib ; extra == 'extra' + - scipp[extra] ; extra == 'all' + - ipympl ; extra == 'all' + - ipython ; extra == 'all' + - ipywidgets ; extra == 'all' + - jupyterlab ; extra == 'all' + - jupyterlab-widgets ; extra == 'all' + - jupyter-nbextensions-configurator ; extra == 'all' + - nodejs ; extra == 'all' + - pythreejs ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/46/25/23eea063a85cc565c9e67ca0ac36b9b979c9d76215d62096746cdd8770e2/scipp-26.2.0.tar.gz + name: scipp + version: 26.2.0 + sha256: 6bd899c9047f709d1759e01b4ffe5c3767e45ffb35822f59cafac0ecfc7a6812 + requires_dist: + - numpy>=2 + - pytest ; extra == 'test' + - matplotlib ; extra == 'test' + - beautifulsoup4 ; extra == 'test' + - ipython ; extra == 'test' + - h5py ; extra == 'extra' + - scipy>=1.7.0 ; extra == 'extra' + - graphviz ; extra == 'extra' + - pooch ; extra == 'extra' + - plopp ; extra == 'extra' + - matplotlib ; extra == 'extra' + - scipp[extra] ; extra == 'all' + - ipympl ; extra == 'all' + - ipython ; extra == 'all' + - ipywidgets ; extra == 'all' + - jupyterlab ; extra == 'all' + - jupyterlab-widgets ; extra == 'all' + - jupyter-nbextensions-configurator ; extra == 'all' + - nodejs ; extra == 'all' + - pythreejs ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/d1/d2/166bce0c7420a30af57b17df2211eb53b33b8126a17e4ba6cd32099b85e7/scipp-26.2.0-cp313-cp313-win_amd64.whl + name: scipp + version: 26.2.0 + sha256: 9f536c423a40734887e7eb6ec44f56b9e81d55cc8d72a92d000d7875748ef410 requires_dist: - - numpy>=1.20 + - numpy>=2 - pytest ; extra == 'test' - matplotlib ; extra == 'test' - beautifulsoup4 ; extra == 'test' @@ -5738,12 +11151,12 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/71/f2/18d5be10ac890ce7490451eb55d41bf9d96e481751362a30ed1a8bc176fa/scipp-25.11.0-cp313-cp313-macosx_11_0_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/e4/d9/e76ce201285d50d536573047ddba5840718443436e7733439ed42f65ebe4/scipp-26.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scipp - version: 25.11.0 - sha256: fd7788e3ea3dd5334ed7fb53a249413469edc5d836ca5d68b1f271691cf11269 + version: 26.2.0 + sha256: c461709582061daf5fc6381e780669cdd041515c601fbbca86193a6a0cd8e49c requires_dist: - - numpy>=1.20 + - numpy>=2 - pytest ; extra == 'test' - matplotlib ; extra == 'test' - beautifulsoup4 ; extra == 'test' @@ -5764,64 +11177,364 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/77/34/1956aed61c4abb91926f9513330afac4654cc2a711ecb73085dc4e2e5c1d/scipp-25.11.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - name: scipp - version: 25.11.0 - sha256: 3e91c8093dc83d433a2e53708561228a06a7e34d8775a20118d391f5b891a6e6 +- pypi: https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: scipy + version: 1.16.3 + sha256: 7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88 + requires_dist: + - numpy>=1.25.2,<2.6 + - 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' + - mypy==1.10.0 ; extra == 'dev' + - typing-extensions ; extra == 'dev' + - types-psutil ; extra == 'dev' + - pycodestyle ; extra == 'dev' + - ruff>=0.0.292 ; extra == 'dev' + - cython-lint>=0.12.2 ; extra == 'dev' + - rich-click ; extra == 'dev' + - doit>=0.36.0 ; extra == 'dev' + - pydevtool ; extra == 'dev' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl + name: scipy + version: 1.16.3 + sha256: 16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d + requires_dist: + - numpy>=1.25.2,<2.6 + - 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' + - mypy==1.10.0 ; extra == 'dev' + - typing-extensions ; extra == 'dev' + - types-psutil ; extra == 'dev' + - pycodestyle ; extra == 'dev' + - ruff>=0.0.292 ; extra == 'dev' + - cython-lint>=0.12.2 ; extra == 'dev' + - rich-click ; extra == 'dev' + - doit>=0.36.0 ; extra == 'dev' + - pydevtool ; extra == 'dev' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl + name: scipy + version: 1.16.3 + sha256: d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c + requires_dist: + - numpy>=1.25.2,<2.6 + - 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' + - mypy==1.10.0 ; extra == 'dev' + - typing-extensions ; extra == 'dev' + - types-psutil ; extra == 'dev' + - pycodestyle ; extra == 'dev' + - ruff>=0.0.292 ; extra == 'dev' + - cython-lint>=0.12.2 ; extra == 'dev' + - rich-click ; extra == 'dev' + - doit>=0.36.0 ; extra == 'dev' + - pydevtool ; extra == 'dev' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl + name: scipy + version: 1.16.3 + sha256: 062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304 + requires_dist: + - numpy>=1.25.2,<2.6 + - 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' + - mypy==1.10.0 ; extra == 'dev' + - typing-extensions ; extra == 'dev' + - types-psutil ; extra == 'dev' + - pycodestyle ; extra == 'dev' + - ruff>=0.0.292 ; extra == 'dev' + - cython-lint>=0.12.2 ; extra == 'dev' + - rich-click ; extra == 'dev' + - doit>=0.36.0 ; extra == 'dev' + - pydevtool ; extra == 'dev' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: scipy + version: 1.17.1 + sha256: 43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4 + requires_dist: + - numpy>=1.26.4,<2.7 + - 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' + - click<8.3.0 ; extra == 'dev' + - 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://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl + name: scipy + version: 1.17.1 + sha256: 37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448 + requires_dist: + - numpy>=1.26.4,<2.7 + - 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' + - click<8.3.0 ; extra == 'dev' + - 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://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl + name: scipy + version: 1.17.1 + sha256: 5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c requires_dist: - - numpy>=1.20 - - pytest ; extra == 'test' - - matplotlib ; extra == 'test' - - beautifulsoup4 ; extra == 'test' - - ipython ; extra == 'test' - - h5py ; extra == 'extra' - - scipy>=1.7.0 ; extra == 'extra' - - graphviz ; extra == 'extra' - - pooch ; extra == 'extra' - - plopp ; extra == 'extra' - - matplotlib ; extra == 'extra' - - scipp[extra] ; extra == 'all' - - ipympl ; extra == 'all' - - ipython ; extra == 'all' - - ipywidgets ; extra == 'all' - - jupyterlab ; extra == 'all' - - jupyterlab-widgets ; extra == 'all' - - jupyter-nbextensions-configurator ; extra == 'all' - - nodejs ; extra == 'all' - - pythreejs ; extra == 'all' + - numpy>=1.26.4,<2.7 + - 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' + - click<8.3.0 ; extra == 'dev' + - 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://files.pythonhosted.org/packages/f6/f3/9d1bb423a2dc0bbebfc98191095dd410a1268397b9c692d76a3ea971c790/scipp-25.11.0-cp313-cp313-win_amd64.whl - name: scipp - version: 25.11.0 - sha256: d44d2aa3f6634ac750a126e50a740c487aa8a2181fcb03764b29ddceeea611cf +- pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl + name: scipy + version: 1.17.1 + sha256: d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff requires_dist: - - numpy>=1.20 - - pytest ; extra == 'test' - - matplotlib ; extra == 'test' - - beautifulsoup4 ; extra == 'test' - - ipython ; extra == 'test' - - h5py ; extra == 'extra' - - scipy>=1.7.0 ; extra == 'extra' - - graphviz ; extra == 'extra' - - pooch ; extra == 'extra' - - plopp ; extra == 'extra' - - matplotlib ; extra == 'extra' - - scipp[extra] ; extra == 'all' - - ipympl ; extra == 'all' - - ipython ; extra == 'all' - - ipywidgets ; extra == 'all' - - jupyterlab ; extra == 'all' - - jupyterlab-widgets ; extra == 'all' - - jupyter-nbextensions-configurator ; extra == 'all' - - nodejs ; extra == 'all' - - pythreejs ; extra == 'all' + - numpy>=1.26.4,<2.7 + - 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' + - click<8.3.0 ; extra == 'dev' + - 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://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl name: scipy - version: 1.16.3 - sha256: 7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88 + version: 1.17.1 + sha256: 1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec requires_dist: - - numpy>=1.25.2,<2.6 + - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' - pytest-cov ; extra == 'test' - pytest-timeout ; extra == 'test' @@ -5850,22 +11563,22 @@ packages: - jupyterlite-sphinx>=0.19.1 ; extra == 'doc' - jupyterlite-pyodide-kernel ; extra == 'doc' - linkify-it-py ; extra == 'doc' + - tabulate ; extra == 'doc' + - click<8.3.0 ; extra == 'dev' + - spin ; extra == 'dev' - mypy==1.10.0 ; extra == 'dev' - typing-extensions ; extra == 'dev' - types-psutil ; extra == 'dev' - pycodestyle ; extra == 'dev' - - ruff>=0.0.292 ; extra == 'dev' + - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' - - rich-click ; extra == 'dev' - - doit>=0.36.0 ; extra == 'dev' - - pydevtool ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl name: scipy - version: 1.16.3 - sha256: 16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d + version: 1.17.1 + sha256: 6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f requires_dist: - - numpy>=1.25.2,<2.6 + - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' - pytest-cov ; extra == 'test' - pytest-timeout ; extra == 'test' @@ -5894,22 +11607,22 @@ packages: - jupyterlite-sphinx>=0.19.1 ; extra == 'doc' - jupyterlite-pyodide-kernel ; extra == 'doc' - linkify-it-py ; extra == 'doc' + - tabulate ; extra == 'doc' + - click<8.3.0 ; extra == 'dev' + - spin ; extra == 'dev' - mypy==1.10.0 ; extra == 'dev' - typing-extensions ; extra == 'dev' - types-psutil ; extra == 'dev' - pycodestyle ; extra == 'dev' - - ruff>=0.0.292 ; extra == 'dev' + - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' - - rich-click ; extra == 'dev' - - doit>=0.36.0 ; extra == 'dev' - - pydevtool ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scipy - version: 1.16.3 - sha256: d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c + version: 1.17.1 + sha256: 581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464 requires_dist: - - numpy>=1.25.2,<2.6 + - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' - pytest-cov ; extra == 'test' - pytest-timeout ; extra == 'test' @@ -5938,22 +11651,22 @@ packages: - jupyterlite-sphinx>=0.19.1 ; extra == 'doc' - jupyterlite-pyodide-kernel ; extra == 'doc' - linkify-it-py ; extra == 'doc' + - tabulate ; extra == 'doc' + - click<8.3.0 ; extra == 'dev' + - spin ; extra == 'dev' - mypy==1.10.0 ; extra == 'dev' - typing-extensions ; extra == 'dev' - types-psutil ; extra == 'dev' - pycodestyle ; extra == 'dev' - - ruff>=0.0.292 ; extra == 'dev' + - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' - - rich-click ; extra == 'dev' - - doit>=0.36.0 ; extra == 'dev' - - pydevtool ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl name: scipy - version: 1.16.3 - sha256: 062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304 + version: 1.17.1 + sha256: e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696 requires_dist: - - numpy>=1.25.2,<2.6 + - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' - pytest-cov ; extra == 'test' - pytest-timeout ; extra == 'test' @@ -5982,26 +11695,25 @@ packages: - jupyterlite-sphinx>=0.19.1 ; extra == 'doc' - jupyterlite-pyodide-kernel ; extra == 'doc' - linkify-it-py ; extra == 'doc' + - tabulate ; extra == 'doc' + - click<8.3.0 ; extra == 'dev' + - spin ; extra == 'dev' - mypy==1.10.0 ; extra == 'dev' - typing-extensions ; extra == 'dev' - types-psutil ; extra == 'dev' - pycodestyle ; extra == 'dev' - - ruff>=0.0.292 ; extra == 'dev' + - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' - - rich-click ; extra == 'dev' - - doit>=0.36.0 ; extra == 'dev' - - pydevtool ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl name: send2trash - version: 1.8.3 - sha256: 0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9 - requires_dist: - - pyobjc-framework-cocoa ; sys_platform == 'darwin' and extra == 'nativelib' - - pywin32 ; sys_platform == 'win32' and extra == 'nativelib' - - pyobjc-framework-cocoa ; sys_platform == 'darwin' and extra == 'objc' - - pywin32 ; sys_platform == 'win32' and extra == 'win32' - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' + version: 2.1.0 + sha256: 0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c + requires_dist: + - pytest>=8 ; extra == 'test' + - pywin32>=305 ; sys_platform == 'win32' and extra == 'nativelib' + - pyobjc>=9.0 ; sys_platform == 'darwin' and extra == 'nativelib' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl name: setuptools version: 80.9.0 @@ -6059,246 +11771,84 @@ packages: - importlib-metadata>=7.0.2 ; python_full_version < '3.10' and extra == 'type' - jaraco-develop>=7.21 ; sys_platform != 'cygwin' and extra == 'type' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/c0/ba/daf16c2d1965bf6237fb696639e3e93645ac6801f7dcaf9ec694a74e9326/setuptools_git_versioning-2.1.0-py3-none-any.whl - name: setuptools-git-versioning - version: 2.1.0 - sha256: 09a15cbb9a00884e91a3591a4c9ec1ff93c24b1b4a40de39a44815196beb7ebf - requires_dist: - - packaging - - setuptools - - tomli>=2.0.1 ; python_full_version < '3.11' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - name: simple-websocket - version: 1.1.0 - sha256: 4af6069630a38ed6c561010f0e11a5bc0d4ca569b36306eb257cd9a192497c8c - requires_dist: - - wsproto - - tox ; extra == 'dev' - - flake8 ; extra == 'dev' - - pytest ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - sphinx ; extra == 'docs' - requires_python: '>=3.6' -- 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=hash-mapping - size: 18455 - timestamp: 1753199211006 -- pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - name: sniffio - version: 1.3.1 - sha256: 2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - name: snowballstemmer - version: 3.0.1 - sha256: 6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064 - requires_python: '!=3.0.*,!=3.1.*,!=3.2.*' -- pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl - name: soupsieve - version: '2.8' - sha256: 0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - name: sphinx - version: 8.2.3 - sha256: 4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3 - requires_dist: - - 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 - - jinja2>=3.1 - - pygments>=2.17 - - docutils>=0.20,<0.22 - - snowballstemmer>=2.2 - - babel>=2.13 - - alabaster>=0.7.14 - - imagesize>=1.3 - - requests>=2.30.0 - - roman-numerals-py>=1.0.0 - - packaging>=23.0 - - colorama>=0.4.6 ; sys_platform == 'win32' - - sphinxcontrib-websupport ; extra == 'docs' - - ruff==0.9.9 ; extra == 'lint' - - mypy==1.15.0 ; extra == 'lint' - - sphinx-lint>=0.9 ; extra == 'lint' - - types-colorama==0.4.15.20240311 ; extra == 'lint' - - types-defusedxml==0.7.0.20240218 ; extra == 'lint' - - types-docutils==0.21.0.20241128 ; extra == 'lint' - - types-pillow==10.2.0.20240822 ; extra == 'lint' - - types-pygments==2.19.0.20250219 ; extra == 'lint' - - types-requests==2.32.0.20241016 ; extra == 'lint' - - types-urllib3==1.26.25.14 ; extra == 'lint' - - pyright==1.1.395 ; extra == 'lint' - - pytest>=8.0 ; extra == 'lint' - - pypi-attestations==0.0.21 ; extra == 'lint' - - betterproto==2.0.0b6 ; extra == 'lint' - - pytest>=8.0 ; extra == 'test' - - pytest-xdist[psutil]>=3.4 ; extra == 'test' - - defusedxml>=0.7.1 ; extra == 'test' - - cython>=3.0 ; extra == 'test' - - setuptools>=70.0 ; extra == 'test' - - typing-extensions>=4.9 ; extra == 'test' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - name: sphinx-autodoc-typehints - version: 3.5.2 - sha256: 0accd043619f53c86705958e323b419e41667917045ac9215d7be1b493648d8c - requires_dist: - - sphinx>=8.2.3 - - furo>=2025.9.25 ; extra == 'docs' - - covdefaults>=2.3 ; extra == 'testing' - - coverage>=7.10.7 ; extra == 'testing' - - defusedxml>=0.7.1 ; extra == 'testing' - - diff-cover>=9.7.1 ; extra == 'testing' - - pytest-cov>=7 ; extra == 'testing' - - pytest>=8.4.2 ; extra == 'testing' - - sphobjinv>=2.3.1.3 ; extra == 'testing' - - typing-extensions>=4.15 ; extra == 'testing' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/51/9e/c41d68be04eef5b6202b468e0f90faf0c469f3a03353f2a218fd78279710/sphinx_book_theme-1.1.4-py3-none-any.whl - name: sphinx-book-theme - version: 1.1.4 - sha256: 843b3f5c8684640f4a2d01abd298beb66452d1b2394cd9ef5be5ebd5640ea0e1 - requires_dist: - - sphinx>=6.1 - - pydata-sphinx-theme==0.15.4 - - pre-commit ; extra == 'code-style' - - ablog ; extra == 'doc' - - ipywidgets ; extra == 'doc' - - folium ; extra == 'doc' - - numpy ; extra == 'doc' - - matplotlib ; extra == 'doc' - - numpydoc ; extra == 'doc' - - myst-nb ; extra == 'doc' - - nbclient ; extra == 'doc' - - pandas ; extra == 'doc' - - plotly ; extra == 'doc' - - sphinx-design ; extra == 'doc' - - sphinx-examples ; extra == 'doc' - - sphinx-copybutton ; extra == 'doc' - - sphinx-tabs ; extra == 'doc' - - sphinx-togglebutton ; extra == 'doc' - - sphinx-thebe ; extra == 'doc' - - sphinxcontrib-bibtex ; extra == 'doc' - - sphinxcontrib-youtube ; extra == 'doc' - - sphinxext-opengraph ; extra == 'doc' - - beautifulsoup4 ; extra == 'test' - - coverage ; extra == 'test' - - defusedxml ; extra == 'test' - - myst-nb ; extra == 'test' - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-regressions ; extra == 'test' - - sphinx-thebe ; extra == 'test' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/77/c7/52b48aec16b26c52aba854d03a3a31e0681150301dac1bea2243645a69e7/sphinx_gallery-0.19.0-py3-none-any.whl - name: sphinx-gallery - version: 0.19.0 - sha256: 4c28751973f81769d5bbbf5e4ebaa0dc49dff8c48eb7f11131eb5f6e4aa25f0e - requires_dist: - - pillow - - sphinx>=5 - - sphinxcontrib-video ; extra == 'animations' - - absl-py ; extra == 'dev' - - graphviz ; extra == 'dev' - - intersphinx-registry ; extra == 'dev' - - ipython ; extra == 'dev' - - joblib ; extra == 'dev' - - jupyterlite-sphinx>=0.17.1 ; extra == 'dev' - - lxml ; extra == 'dev' - - matplotlib ; extra == 'dev' - - numpy ; extra == 'dev' - - packaging ; extra == 'dev' - - plotly ; extra == 'dev' - - pydata-sphinx-theme ; extra == 'dev' - - pytest ; extra == 'dev' - - pytest-coverage ; extra == 'dev' - - seaborn ; extra == 'dev' - - sphinxcontrib-video ; extra == 'dev' - - statsmodels ; extra == 'dev' - - jupyterlite-sphinx ; extra == 'jupyterlite' - - joblib ; extra == 'parallel' - - numpy ; extra == 'recommender' - - graphviz ; extra == 'show-api-usage' - - memory-profiler ; extra == 'show-memory' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - name: sphinxcontrib-applehelp - version: 2.0.0 - sha256: 4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 - requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - name: sphinxcontrib-devhelp - version: 2.0.0 - sha256: aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 - requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - name: sphinxcontrib-htmlhelp - version: 2.1.0 - sha256: 166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 - requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - - html5lib ; extra == 'test' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - name: sphinxcontrib-jsmath - version: 1.0.1 - sha256: 2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 - requires_dist: - - pytest ; extra == 'test' - - flake8 ; extra == 'test' - - mypy ; extra == 'test' - requires_python: '>=3.5' -- pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - name: sphinxcontrib-qthelp - version: 2.0.0 - sha256: b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb +- pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl + name: setuptools + version: 82.0.0 + sha256: 70b18734b607bd1da571d097d236cfcfacaf01de45717d59e6e04b96877532e0 requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - - defusedxml>=0.7.1 ; extra == 'test' + - pytest>=6,!=8.1.* ; extra == 'test' + - virtualenv>=13.0.0 ; extra == 'test' + - wheel>=0.44.0 ; extra == 'test' + - pip>=19.1 ; extra == 'test' + - packaging>=24.2 ; extra == 'test' + - jaraco-envs>=2.2 ; extra == 'test' + - pytest-xdist>=3 ; extra == 'test' + - jaraco-path>=3.7.2 ; extra == 'test' + - build[virtualenv]>=1.0.3 ; extra == 'test' + - filelock>=3.4.0 ; extra == 'test' + - ini2toml[lite]>=0.14 ; extra == 'test' + - tomli-w>=1.0.0 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' + - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' + - pytest-home>=0.5 ; extra == 'test' + - pytest-subprocess ; extra == 'test' + - pyproject-hooks!=1.1 ; extra == 'test' + - jaraco-test>=5.5 ; extra == 'test' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pygments-github-lexers==0.0.5 ; extra == 'doc' + - sphinx-favicon ; extra == 'doc' + - sphinx-inline-tabs ; extra == 'doc' + - sphinx-reredirects ; extra == 'doc' + - sphinxcontrib-towncrier ; extra == 'doc' + - sphinx-notfound-page>=1,<2 ; extra == 'doc' + - pyproject-hooks!=1.1 ; extra == 'doc' + - towncrier<24.7 ; extra == 'doc' + - packaging>=24.2 ; extra == 'core' + - more-itertools>=8.8 ; extra == 'core' + - jaraco-text>=3.7 ; extra == 'core' + - importlib-metadata>=6 ; python_full_version < '3.10' and extra == 'core' + - tomli>=2.0.1 ; python_full_version < '3.11' and extra == 'core' + - wheel>=0.43.0 ; extra == 'core' + - platformdirs>=4.2.2 ; extra == 'core' + - jaraco-functools>=4 ; extra == 'core' + - more-itertools ; extra == 'core' + - pytest-checkdocs>=2.4 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - ruff>=0.13.0 ; sys_platform != 'cygwin' and extra == 'check' + - pytest-cov ; extra == 'cover' + - pytest-enabler>=2.2 ; extra == 'enabler' + - pytest-mypy ; extra == 'type' + - mypy==1.18.* ; extra == 'type' + - importlib-metadata>=7.0.2 ; python_full_version < '3.10' and extra == 'type' + - jaraco-develop>=7.21 ; sys_platform != 'cygwin' and extra == 'type' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - name: sphinxcontrib-serializinghtml - version: 2.0.0 - sha256: 6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 +- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl + name: simple-websocket + version: 1.1.0 + sha256: 4af6069630a38ed6c561010f0e11a5bc0d4ca569b36306eb257cd9a192497c8c requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' + - wsproto + - tox ; extra == 'dev' + - flake8 ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - sphinx ; extra == 'docs' + requires_python: '>=3.6' +- 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.*' +- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + name: soupsieve + version: 2.8.3 + sha256: ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95 requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl name: stack-data @@ -6313,11 +11863,26 @@ packages: - pygments ; extra == 'tests' - littleutils ; extra == 'tests' - cython ; extra == 'tests' -- pypi: https://files.pythonhosted.org/packages/f4/40/8561ce06dc46fd17242c7724ab25b257a2ac1b35f4ebf551b40ce6105cfa/stevedore-5.6.0-py3-none-any.whl - name: stevedore - version: 5.6.0 - sha256: 4a36dccefd7aeea0c70135526cecb7766c4c84c473b1af68db23d541b6dc1820 - requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + name: tabulate + version: 0.9.0 + sha256: 024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f + requires_dist: + - wcwidth ; extra == 'widechars' + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + sha256: abd9a489f059fba85c8ffa1abdaa4d515d6de6a3325238b8e81203b913cf65a9 + md5: 0f9817ffbe25f9e69ceba5ea70c52606 + depends: + - libhwloc >=2.12.2,<2.12.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 155869 + timestamp: 1767886839029 - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl name: terminado version: 0.18.1 @@ -6346,6 +11911,20 @@ packages: - pytest ; extra == 'test' - ruff ; extra == 'test' requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac + md5: cffd3bdd58090148f4cfcd831f4b26ab + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3301196 + timestamp: 1769460227866 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64 md5: 86bc20552bf46075e3d92b67f089172d @@ -6360,6 +11939,17 @@ packages: purls: [] size: 3284905 timestamp: 1763054914403 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda + sha256: 7f0d9c320288532873e2d8486c331ec6d87919c9028208d3f6ac91dc8f99a67b + md5: 6e6efb7463f8cef69dbcb4c2205bf60e + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3282953 + timestamp: 1769460532442 - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda sha256: 0d0b6cef83fec41bc0eb4f3b761c4621b7adfb14378051a8177bd9bb73d26779 md5: bd9f1de651dbd80b51281c694827f78f @@ -6371,6 +11961,17 @@ packages: purls: [] size: 3262702 timestamp: 1763055085507 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3 + md5: a9d86bc62f39b94c4661716624eb21b0 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3127137 + timestamp: 1769460817696 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda sha256: ad0c67cb03c163a109820dc9ecf77faf6ec7150e942d1e8bb13e5d39dc058ab7 md5: a73d54a5abba6543cb2f0af1bfbd6851 @@ -6394,62 +11995,83 @@ packages: purls: [] size: 3472313 timestamp: 1763055164278 -- pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - name: toml - version: 0.10.2 - sha256: 806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b - requires_python: '>=2.6,!=3.0.*,!=3.1.*,!=3.2.*' -- pypi: https://files.pythonhosted.org/packages/c7/2a/f609b420c2f564a748a2d80ebfb2ee02a73ca80223af712fca591386cafb/tornado-6.5.2-cp39-abi3-win_amd64.whl +- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + sha256: 0e79810fae28f3b69fe7391b0d43f5474d6bd91d451d5f2bde02f55ae481d5e3 + md5: 0481bfd9814bf525bd4b3ee4b51494c4 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: TCL + license_family: BSD + purls: [] + size: 3526350 + timestamp: 1769460339384 +- pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl + name: tokenize-rt + version: 6.2.0 + sha256: a152bf4f249c847a66497a4a95f63376ed68ac6abf092a2f7cfb29d044ecff44 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl + name: tomli + version: 2.4.0 + sha256: d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl + name: tomli + version: 2.4.0 + sha256: 9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl + name: tomli + version: 2.4.0 + sha256: 84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl + name: tomli + version: 2.4.0 + sha256: 3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl + name: tomli + version: 2.4.0 + sha256: b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl + name: tomli + version: 2.4.0 + sha256: 5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: tomli + version: 2.4.0 + sha256: 1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: tomli + version: 2.4.0 + sha256: 5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: tornado - version: 6.5.2 - sha256: e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f + version: 6.5.4 + sha256: e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/f2/b5/9b575a0ed3e50b00c40b08cbce82eb618229091d09f6d14bce80fc01cb0b/tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl name: tornado - version: 6.5.2 - sha256: 583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef + version: 6.5.4 + sha256: d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/f6/48/6a7529df2c9cc12efd2e8f5dd219516184d703b34c06786809670df5b3bd/tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl +- pypi: https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl name: tornado - version: 6.5.2 - sha256: 2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6 + version: 6.5.4 + sha256: fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/f9/41/fb15f06e33d7430ca89420283a8762a4e6b8025b800ea51796ab5e6d9559/tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl name: tornado - version: 6.5.2 - sha256: e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108 + version: 6.5.4 + sha256: 2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/fc/cc/e09c0d663a004945f82beecd4f147053567910479314e8d01ba71e5d5dea/tox-4.32.0-py3-none-any.whl - name: tox - version: 4.32.0 - sha256: 451e81dc02ba8d1ed20efd52ee409641ae4b5d5830e008af10fe8823ef1bd551 - requires_dist: - - cachetools>=6.2 - - chardet>=5.2 - - colorama>=0.4.6 - - filelock>=3.20 - - packaging>=25 - - platformdirs>=4.5 - - pluggy>=1.6 - - pyproject-api>=1.9.1 - - tomli>=2.3 ; python_full_version < '3.11' - - typing-extensions>=4.15 ; python_full_version < '3.11' - - virtualenv>=20.34 - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/fd/9e/8d50f3b3fc4af8c73154f64d4a2293bfa2d517a19000e70ef2d614254084/tox_gh_actions-3.5.0-py3-none-any.whl - name: tox-gh-actions - version: 3.5.0 - sha256: 070790114c92f4c94337047515ca5e077ceb269a5cb9366e0a0b3440a024eca1 - requires_dist: - - tox>=4,<5 - - devpi-process ; extra == 'testing' - - mypy ; platform_python_implementation == 'CPython' and extra == 'testing' - - pre-commit ; extra == 'testing' - - pytest>=7 ; extra == 'testing' - - pytest-cov>=4 ; extra == 'testing' - - pytest-mock>=3 ; extra == 'testing' - - pytest-randomly>=3 ; extra == 'testing' - requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl name: traitlets version: 5.14.3 @@ -6469,45 +12091,32 @@ packages: name: trove-classifiers version: 2025.11.14.15 sha256: d1dac259c1e908939862e3331177931c6df0a37af2c1a8debcc603d9115fcdd9 -- 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-inspection-0.4.2-pyhd8ed1ab_1.conda - sha256: 70db27de58a97aeb7ba7448366c9853f91b21137492e0b4430251a1870aa8ff4 - md5: a0a4a3035667fc34f29bfbd5c190baa6 - depends: - - python >=3.10 - - typing_extensions >=4.12.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/typing-inspection?source=hash-mapping - size: 18923 - timestamp: 1764158430324 -- 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=hash-mapping - size: 51692 - timestamp: 1756220668932 +- pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl + name: trove-classifiers + version: 2026.1.14.14 + sha256: 1f9553927f18d0513d8e5ff80ab8980b8202ce37ecae0e3274ed2ef11880e74d +- pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + name: typing-extensions + version: 4.15.0 + sha256: f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + name: typing-inspection + version: 0.4.2 + sha256: 4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7 + requires_dist: + - typing-extensions>=4.12.0 + requires_python: '>=3.9' - 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' +- pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + name: tzdata + version: '2025.3' + sha256: 06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 + requires_python: '>=2' - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 md5: 4222072737ccff51314b5ece9c7d6f5a @@ -6515,6 +12124,13 @@ packages: purls: [] size: 122968 timestamp: 1742727099393 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 + license: LicenseRef-Public-Domain + purls: [] + size: 119135 + timestamp: 1767016325805 - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 md5: 71b24316859acd00bdb8b38f5e2ce328 @@ -6540,6 +12156,10 @@ packages: - python-docs-theme ; extra == 'doc' - uncertainties[arrays,doc,test] ; extra == 'all' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz + name: untokenize + version: 0.1.1 + sha256: 3865dbbbb8efb4bb5eaa72f1be7f3e0be00ea8b7f125c69cbd1f5fda926f37a2 - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl name: uri-template version: 1.3.0 @@ -6566,17 +12186,28 @@ packages: - flake8-use-fstring ; extra == 'dev' - pep8-naming ; extra == 'dev' requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl name: urllib3 - version: 2.5.0 - sha256: e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc + version: 2.6.3 + sha256: bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 requires_dist: - - brotli>=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' + - brotli>=1.2.0 ; platform_python_implementation == 'CPython' and extra == 'brotli' + - brotlicffi>=1.2.0.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' - h2>=4,<5 ; extra == 'h2' - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' - - zstandard>=0.18.0 ; extra == 'zstd' + - backports-zstd>=1.0.0 ; python_full_version < '3.14' and extra == 'zstd' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/b7/ee/e9c95cda829131f71a8dff5ce0406059fd16e591c074414e31ada19ba7c3/validate_pyproject-0.25-py3-none-any.whl + name: validate-pyproject + version: '0.25' + sha256: f9d05e2686beff82f9ea954f582306b036ced3d3feb258c1110f2c2a495b1981 + requires_dist: + - fastjsonschema>=2.16.2,<=3 + - packaging>=24.2 ; extra == 'all' + - trove-classifiers>=2021.10.20 ; extra == 'all' + - tomli>=1.2.1 ; python_full_version < '3.11' and extra == 'all' + - validate-pyproject-schema-store ; extra == 'store' + requires_python: '>=3.8' - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda sha256: 82250af59af9ff3c6a635dd4c4764c631d854feb334d6747d356d949af44d7cf md5: ef02bbe151253a72b8eda264a935db66 @@ -6589,6 +12220,18 @@ packages: purls: [] size: 18861 timestamp: 1760418772353 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + sha256: 9dc40c2610a6e6727d635c62cced5ef30b7b30123f5ef67d6139e23d21744b3a + md5: 1e610f2416b6acdd231c5f573d754a0f + depends: + - vc14_runtime >=14.44.35208 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19356 + timestamp: 1767320221521 - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda sha256: e3a3656b70d1202e0d042811ceb743bd0d9f7e00e2acdf824d231b044ef6c0fd md5: 378d5dcec45eaea8d303da6f00447ac0 @@ -6602,6 +12245,19 @@ packages: purls: [] size: 682706 timestamp: 1760418629729 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + sha256: 02732f953292cce179de9b633e74928037fa3741eb5ef91c3f8bae4f761d32a5 + md5: 37eb311485d2d8b2c419449582046a42 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_34 + constrains: + - vs2015_runtime 14.44.35208.* *_34 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 683233 + timestamp: 1767320219644 - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda sha256: f3790c88fbbdc55874f41de81a4237b1b91eab75e05d0e58661518ff04d2a8a1 md5: 58f67b437acbf2764317ba273d731f1d @@ -6614,47 +12270,97 @@ packages: purls: [] size: 114846 timestamp: 1760418593847 -- pypi: https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl +- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + sha256: 878d5d10318b119bd98ed3ed874bd467acbe21996e1d81597a1dbf8030ea0ce6 + md5: 242d9f25d2ae60c76b38a5e42858e51d + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_34 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 115235 + timestamp: 1767320173250 +- pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl + name: versioningit + version: 3.3.0 + sha256: 23b1db3c4756cded9bd6b0ddec6643c261e3d0c471707da3e0b230b81ce53e4b + requires_dist: + - importlib-metadata>=3.6 ; python_full_version < '3.10' + - packaging>=17.1 + - tomli>=1.2,<3.0 ; python_full_version < '3.11' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl + name: verspec + version: 0.1.0 + sha256: 741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31 + requires_dist: + - coverage ; extra == 'test' + - flake8>=3.7 ; extra == 'test' + - mypy ; extra == 'test' + - pretend ; extra == 'test' + - pytest ; extra == 'test' +- pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl name: virtualenv - version: 20.35.4 - sha256: c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b + version: 21.1.0 + sha256: 164f5e14c5587d170cf98e60378eb91ea35bf037be313811905d3a24ea33cc07 requires_dist: - distlib>=0.3.7,<1 - - filelock>=3.12.2,<4 + - filelock>=3.24.2,<4 ; python_full_version >= '3.10' + - filelock>=3.16.1,<=3.19.1 ; python_full_version < '3.10' - importlib-metadata>=6.6 ; python_full_version < '3.8' - platformdirs>=3.9.1,<5 + - python-discovery>=1 - typing-extensions>=4.13.2 ; python_full_version < '3.11' - - furo>=2023.7.26 ; extra == 'docs' - - proselint>=0.13 ; extra == 'docs' - - sphinx>=7.1.2,!=7.3 ; extra == 'docs' - - sphinx-argparse>=0.4 ; extra == 'docs' - - sphinxcontrib-towncrier>=0.2.1a0 ; extra == 'docs' - - towncrier>=23.6 ; extra == 'docs' - - covdefaults>=2.3 ; extra == 'test' - - coverage-enable-subprocess>=1 ; extra == 'test' - - coverage>=7.2.7 ; extra == 'test' - - flaky>=3.7 ; extra == 'test' - - packaging>=23.1 ; extra == 'test' - - pytest-env>=0.8.2 ; extra == 'test' - - pytest-freezer>=0.4.8 ; (python_full_version >= '3.13' and platform_python_implementation == 'CPython' and sys_platform == 'win32' and extra == 'test') or (platform_python_implementation == 'GraalVM' and extra == 'test') or (platform_python_implementation == 'PyPy' and extra == 'test') - - pytest-mock>=3.11.1 ; extra == 'test' - - pytest-randomly>=3.12 ; extra == 'test' - - pytest-timeout>=2.1 ; extra == 'test' - - pytest>=7.4 ; extra == 'test' - - setuptools>=68 ; extra == 'test' - - time-machine>=2.10 ; platform_python_implementation == 'CPython' and extra == 'test' requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - sha256: e298b508b2473c4227206800dfb14c39e4b14fd79d4636132e9e1e4244cdf4aa - md5: c3197f8c0d5b955c904616b716aca093 - depends: - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/wcwidth?source=compressed-mapping - size: 71550 - timestamp: 1770634638503 +- pypi: https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl + name: watchdog + version: 6.0.0 + sha256: ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2 + requires_dist: + - pyyaml>=3.10 ; extra == 'watchmedo' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl + name: watchdog + version: 6.0.0 + sha256: 76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134 + requires_dist: + - pyyaml>=3.10 ; extra == 'watchmedo' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl + name: watchdog + version: 6.0.0 + sha256: 20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2 + requires_dist: + - pyyaml>=3.10 ; extra == 'watchmedo' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl + name: watchdog + version: 6.0.0 + sha256: afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c + requires_dist: + - pyyaml>=3.10 ; extra == 'watchmedo' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl + name: watchdog + version: 6.0.0 + sha256: cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680 + requires_dist: + - pyyaml>=3.10 ; extra == 'watchmedo' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl + name: watchdog + version: 6.0.0 + sha256: a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b + requires_dist: + - pyyaml>=3.10 ; extra == 'watchmedo' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + name: wcwidth + version: 0.6.0 + sha256: 1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl name: webcolors version: 25.10.0 @@ -6684,52 +12390,6 @@ packages: requires_dist: - h11>=0.16.0,<1 requires_python: '>=3.10' -- 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-64/yaml-0.2.5-h4132b18_3.conda - sha256: a335161bfa57b64e6794c3c354e7d49449b28b8d8a7c4ed02bf04c3f009953f9 - md5: a645bb90997d3fc2aea0adf6517059bd - depends: - - __osx >=10.13 - license: MIT - license_family: MIT - purls: [] - size: 79419 - timestamp: 1753484072608 -- 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 - pypi: https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl name: yarl version: 1.22.0 @@ -6766,15 +12426,132 @@ packages: - multidict>=4.0 - propcache>=0.2.1 requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae - md5: 30cd29cb87d819caead4d55184c1d115 +- pypi: https://files.pythonhosted.org/packages/24/84/e237607faf4e099dbb8a4f511cfd5efcb5f75918baad200ff7380635631b/yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl + name: yarl + version: 1.23.0 + sha256: cbb0fef01f0c6b38cb0f39b1f78fc90b807e0e3c86a7ff3ce74ad77ce5c7880c + requires_dist: + - idna>=2.0 + - multidict>=4.0 + - propcache>=0.2.1 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: yarl + version: 1.23.0 + sha256: 34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4 + requires_dist: + - idna>=2.0 + - multidict>=4.0 + - propcache>=0.2.1 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl + name: yarl + version: 1.23.0 + sha256: 4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5 + requires_dist: + - idna>=2.0 + - multidict>=4.0 + - propcache>=0.2.1 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl + name: yarl + version: 1.23.0 + sha256: baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3 + requires_dist: + - idna>=2.0 + - multidict>=4.0 + - propcache>=0.2.1 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/93/22/b85eca6fa2ad9491af48c973e4c8cf6b103a73dbb271fe3346949449fca0/yarl-1.23.0-cp311-cp311-win_amd64.whl + name: yarl + version: 1.23.0 + sha256: bf49a3ae946a87083ef3a34c8f677ae4243f5b824bfc4c69672e72b3d6719d46 + requires_dist: + - idna>=2.0 + - multidict>=4.0 + - propcache>=0.2.1 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/9a/64/c53487d9f4968045b8afa51aed7ca44f58b2589e772f32745f3744476c82/yarl-1.23.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: yarl + version: 1.23.0 + sha256: 99c8a9ed30f4164bc4c14b37a90208836cbf50d4ce2a57c71d0f52c7fb4f7598 + requires_dist: + - idna>=2.0 + - multidict>=4.0 + - propcache>=0.2.1 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl + name: yarl + version: 1.23.0 + sha256: 7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b + requires_dist: + - idna>=2.0 + - multidict>=4.0 + - propcache>=0.2.1 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/b2/0d/71ceabc14c146ba8ee3804ca7b3d42b1664c8440439de5214d366fec7d3a/yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl + name: yarl + version: 1.23.0 + sha256: dc52310451fc7c629e13c4e061cbe2dd01684d91f2f8ee2821b083c58bd72432 + requires_dist: + - idna>=2.0 + - multidict>=4.0 + - propcache>=0.2.1 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl + name: zipp + version: 3.23.0 + sha256: 071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e + requires_dist: + - pytest>=6,!=8.1.* ; extra == 'test' + - jaraco-itertools ; extra == 'test' + - jaraco-functools ; extra == 'test' + - more-itertools ; extra == 'test' + - big-o ; extra == 'test' + - pytest-ignore-flaky ; extra == 'test' + - jaraco-test ; extra == 'test' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pytest-checkdocs>=2.4 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - pytest-cov ; extra == 'cover' + - pytest-enabler>=2.2 ; extra == 'enabler' + - pytest-mypy ; extra == 'type' + requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 + md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/zipp?source=hash-mapping - size: 24194 - timestamp: 1764460141901 + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 601375 + timestamp: 1764777111296 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda + sha256: 47101a4055a70a4876ffc87b750ab2287b67eca793f21c8224be5e1ee6394d3f + md5: 727109b184d680772e3122f40136d5ca + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 528148 + timestamp: 1764777156963 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 + md5: ab136e4c34e97f34fb621d2592a393d8 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 433413 + timestamp: 1764777166076 diff --git a/pixi.toml b/pixi.toml index 7cfb7b89..fa418417 100644 --- a/pixi.toml +++ b/pixi.toml @@ -45,19 +45,16 @@ nodejs = '*' # Required for Prettier (non-Python formatting) gsl = '*' # GNU Scientific Library; required for pdffit2. [pypi-dependencies] # == [feature.default.pypi-dependencies] -pip = '*' # Native package installer +pip = '*' # Native package installer easyscience = { path = ".", editable = true, extras = ['dev'] } # Specific features: Set specific Python versions - [feature.py-min.dependencies] python = '3.11.*' [feature.py-max.dependencies] python = '3.13.*' - - ############## # ENVIRONMENTS ############## @@ -252,4 +249,4 @@ post-install = { depends-on = [ ########################## # 🔗 Main Package Shortcut ########################## -easyscience = 'python -m easyscience' \ No newline at end of file +easyscience = 'python -m easyscience' diff --git a/pyproject.toml b/pyproject.toml index b8000ce4..d0b2989d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ dependencies = [ 'uncertainties', # Propagation of uncertainties in calculations 'numpy', # Numerical computing 'scipp', # Handling and analysis of scientific data + 'pooch', # Data downloader 'jupyterlab', # Jupyter notebooks 'pixi-kernel', # Pixi Jupyter kernel ] @@ -191,15 +192,15 @@ quote-style = 'single' # But double quotes in docstrings (PEP 8, PEP 25 # https://docs.astral.sh/ruff/rules/ [tool.ruff.lint] select = [ - 'E', # General PEP 8 style errors - 'E9', # Runtime errors (e.g., syntax errors, undefined names) - 'F', # Pyflakes-specific checks (e.g., unused variables, imports) - 'F63', # Issues related to invalid escape sequences in strings - 'F7', # Type-related errors (e.g., mismatched argument types, unsupported operations) - 'F82', # Import-related errors (e.g., unresolved imports, reimported modules) - 'I', # Import sorting issues (e.g., unsorted imports) - 'S', # Security-related issues (e.g., use of insecure functions or libraries) - 'W', # General PEP 8 warnings (e.g., lines too long, trailing whitespace) + # 'E', # General PEP 8 style errors + # 'E9', # Runtime errors (e.g., syntax errors, undefined names) + # 'F', # Pyflakes-specific checks (e.g., unused variables, imports) + # 'F63', # Issues related to invalid escape sequences in strings + # 'F7', # Type-related errors (e.g., mismatched argument types, unsupported operations) + # 'F82', # Import-related errors (e.g., unresolved imports, reimported modules) + # 'I', # Import sorting issues (e.g., unsorted imports) + # 'S', # Security-related issues (e.g., use of insecure functions or libraries) + # 'W', # General PEP 8 warnings (e.g., lines too long, trailing whitespace) ] [tool.ruff.lint.per-file-ignores] diff --git a/resources/images/ec_logo.svg b/resources/images/ec_logo.svg deleted file mode 100644 index 25ee716f..00000000 --- a/resources/images/ec_logo.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/resources/images/ec_logo_single.svg b/resources/images/ec_logo_single.svg deleted file mode 100644 index d6f33918..00000000 --- a/resources/images/ec_logo_single.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - diff --git a/resources/images/ec_logo_wfont.svg b/resources/images/ec_logo_wfont.svg deleted file mode 100644 index 046d884a..00000000 --- a/resources/images/ec_logo_wfont.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - easycore - - - - - - - - \ No newline at end of file diff --git a/resources/scripts/generate_html.py b/resources/scripts/generate_html.py deleted file mode 100644 index 8f1a4cc6..00000000 --- a/resources/scripts/generate_html.py +++ /dev/null @@ -1,28 +0,0 @@ -import sys - -import requests - -org = 'easyScience' -repo = 'EasyScience' -if len(sys.argv) > 1: - repo = sys.argv[1] - -releases = requests.get(f'https://api.github.com/repos/{org}/{repo}/releases').json() # noqa: S113 - -header = ( - f'\n\n\nLinks for {repo} (alpha)\n\n\n

Links for {repo}

' -) -body = '' -for release in releases: - asset_url = release['assets_url'] - assets = requests.get(asset_url).json() # noqa: S113 - for asset in assets: - if asset['name'].endswith('.whl'): - name = asset['name'][:-4] - url = asset['browser_download_url'] - body += f'{name}
\n' -footer = '\n' - -content = '\n'.join([header, body, footer]) -with open('index.html', 'w') as fid: - fid.write(content) diff --git a/src/easyscience/__version__.py b/src/easyscience/__version__.py deleted file mode 100644 index a33997dd..00000000 --- a/src/easyscience/__version__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = '2.1.0' diff --git a/src/easyscience/base_classes/__init__.py b/src/easyscience/base_classes/__init__.py index 878d869e..6702dfbc 100644 --- a/src/easyscience/base_classes/__init__.py +++ b/src/easyscience/base_classes/__init__.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from .based_base import BasedBase from .collection_base import CollectionBase from .easy_list import EasyList diff --git a/src/easyscience/base_classes/based_base.py b/src/easyscience/base_classes/based_base.py index a2427c7f..44cbcdf7 100644 --- a/src/easyscience/base_classes/based_base.py +++ b/src/easyscience/base_classes/based_base.py @@ -1,7 +1,8 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from __future__ import annotations -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause # © 2021-2025 Contributors to the EasyScience project Set[str]: base_cls = getattr(self, '__old_class__', self.__class__) sign = signature(base_cls.__init__) - names = [param.name for param in sign.parameters.values() if param.kind == param.POSITIONAL_OR_KEYWORD] + names = [ + param.name + for param in sign.parameters.values() + if param.kind == param.POSITIONAL_OR_KEYWORD + ] return set(names[1:]) def __reduce__(self): - """ - Make the class picklable. - Due to the nature of the dynamic class definitions special measures need to be taken. + """Make the class picklable. Due to the nature of the dynamic + class definitions special measures need to be taken. :return: Tuple consisting of how to make the object :rtype: tuple @@ -63,9 +72,11 @@ def unique_name(self) -> str: @unique_name.setter def unique_name(self, new_unique_name: str): - """Set a new unique name for the object. The old name is still kept in the map. + """Set a new unique name for the object. The old name is still + kept in the map. - :param new_unique_name: New unique name for the object""" + :param new_unique_name: New unique name for the object + """ if not isinstance(new_unique_name, str): raise TypeError('Unique name has to be a string.') self._unique_name = new_unique_name @@ -73,8 +84,7 @@ def unique_name(self, new_unique_name: str): @property def name(self) -> str: - """ - Get the common name of the object. + """Get the common name of the object. :return: Common name of the object """ @@ -82,8 +92,7 @@ def name(self) -> str: @name.setter def name(self, new_name: str): - """ - Set a new common name for the object. + """Set a new common name for the object. :param new_name: New name for the object :return: None @@ -92,34 +101,32 @@ def name(self, new_name: str): @property def interface(self) -> InterfaceFactoryTemplate: - """ - Get the current interface of the object - """ + """Get the current interface of the object.""" return self._interface @interface.setter def interface(self, new_interface: InterfaceFactoryTemplate): - """ - Set the current interface to the object and generate bindings if possible. iF.e. - ``` - def __init__(self, bar, interface=None, **kwargs): - super().__init__(self, **kwargs) - self.foo = bar - self.interface = interface # As final step after initialization to set correct bindings. - ``` + """Set the current interface to the object and generate bindings + if possible. + + iF.e. ``` def __init__(self, bar, interface=None, **kwargs): + super().__init__(self, **kwargs) self.foo = bar + self.interface = interface # As final step after initialization + to set correct bindings. ``` """ self._interface = new_interface if new_interface is not None: self.generate_bindings() def generate_bindings(self): - """ - Generate or re-generate bindings to an interface (if exists) + """Generate or re-generate bindings to an interface (if exists) :raises: AttributeError """ if self.interface is None: - raise AttributeError('Interface error for generating bindings. `interface` has to be set.') + raise AttributeError( + 'Interface error for generating bindings. `interface` has to be set.' + ) interfaceable_children = [ key for key in self._global_object.map.get_edges(self) @@ -131,17 +138,16 @@ def generate_bindings(self): self.interface.generate_bindings(self) def switch_interface(self, new_interface_name: str): - """ - Switch or create a new interface. - """ + """Switch or create a new interface.""" if self.interface is None: - raise AttributeError('Interface error for generating bindings. `interface` has to be set.') + raise AttributeError( + 'Interface error for generating bindings. `interface` has to be set.' + ) self.interface.switch(new_interface_name) self.generate_bindings() def get_parameters(self) -> List[Parameter]: - """ - Get all parameter objects as a list. + """Get all parameter objects as a list. :return: List of `Parameter` objects. """ @@ -154,8 +160,7 @@ def get_parameters(self) -> List[Parameter]: return par_list def _get_linkable_attributes(self) -> List[DescriptorBase]: - """ - Get all objects which can be linked against as a list. + """Get all objects which can be linked against as a list. :return: List of `Descriptor`/`Parameter` objects. """ @@ -168,8 +173,8 @@ def _get_linkable_attributes(self) -> List[DescriptorBase]: return item_list def get_fit_parameters(self) -> List[Parameter]: - """ - Get all objects which can be fitted (and are not fixed) as a list. + """Get all objects which can be fitted (and are not fixed) as a + list. :return: List of `Parameter` objects which can be used in fitting. """ @@ -183,10 +188,11 @@ def get_fit_parameters(self) -> List[Parameter]: return fit_list def __dir__(self) -> Iterable[str]: - """ - This creates auto-completion and helps out in iPython notebooks. + """This creates auto-completion and helps out in iPython + notebooks. - :return: list of function and parameter names for auto-completion + :return: list of function and parameter names for auto- + completion """ new_class_objs = list(k for k in dir(self.__class__) if not k.startswith('_')) return sorted(new_class_objs) @@ -198,12 +204,14 @@ def __copy__(self) -> BasedBase: return new_obj def as_dict(self, skip: Optional[List[str]] = None) -> Dict[str, Any]: - """ - Convert an object into a full dictionary using `SerializerDict`. - This is a shortcut for ```obj.encode(encoder=SerializerDict)``` - - :param skip: List of field names as strings to skip when forming the dictionary - :return: encoded object containing all information to reform an EasyScience object. + """Convert an object into a full dictionary using + `SerializerDict`. This is a shortcut for + ```obj.encode(encoder=SerializerDict)``` + + :param skip: List of field names as strings to skip when forming + the dictionary + :return: encoded object containing all information to reform an + EasyScience object. """ # extend skip to include unique_name by default if skip is None: diff --git a/src/easyscience/base_classes/collection_base.py b/src/easyscience/base_classes/collection_base.py index 0a4e8272..f2de54f4 100644 --- a/src/easyscience/base_classes/collection_base.py +++ b/src/easyscience/base_classes/collection_base.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project None: - """ - Insert an object into the collection at an index. + """Insert an object into the collection at an index. :param index: Index for EasyScience object to be inserted. :type index: int @@ -119,8 +121,7 @@ def insert(self, index: int, value: Union[DescriptorBase, BasedBase, NewBase]) - raise AttributeError('Only EasyScience objects can be put into an EasyScience group') def __getitem__(self, idx: Union[int, slice]) -> Union[DescriptorBase, BasedBase, NewBase]: - """ - Get an item in the collection based on its index. + """Get an item in the collection based on its index. :param idx: index or slice of the collection. :type idx: Union[int, slice] @@ -129,7 +130,9 @@ def __getitem__(self, idx: Union[int, slice]) -> Union[DescriptorBase, BasedBase """ if isinstance(idx, slice): start, stop, step = idx.indices(len(self)) - return self.__class__(getattr(self, 'name'), *[self[i] for i in range(start, stop, step)]) + return self.__class__( + getattr(self, 'name'), *[self[i] for i in range(start, stop, step)] + ) if str(idx) in self._kwargs.keys(): return self._kwargs[str(idx)] if isinstance(idx, str): @@ -153,8 +156,7 @@ def __getitem__(self, idx: Union[int, slice]) -> Union[DescriptorBase, BasedBase return self._kwargs[keys[idx]] def __setitem__(self, key: int, value: Union[BasedBase, DescriptorBase, NewBase]) -> None: - """ - Set an item via it's index. + """Set an item via it's index. :param key: Index in self. :type key: int @@ -178,11 +180,12 @@ def __setitem__(self, key: int, value: Union[BasedBase, DescriptorBase, NewBase] # REMOVE EDGE self._global_object.map.prune_vertex_from_edge(self, old_item) else: - raise NotImplementedError('At the moment only numerical values or EasyScience objects can be set.') + raise NotImplementedError( + 'At the moment only numerical values or EasyScience objects can be set.' + ) def __delitem__(self, key: int) -> None: - """ - Try to delete an idem by key. + """Try to delete an idem by key. :param key: :type key: @@ -195,8 +198,7 @@ def __delitem__(self, key: int) -> None: del self._kwargs[keys[key]] def __len__(self) -> int: - """ - Get the number of items in this collection + """Get the number of items in this collection. :return: Number of items in this collection. :rtype: int @@ -204,8 +206,7 @@ def __len__(self) -> int: return len(self._kwargs.keys()) def _convert_to_dict(self, in_dict, encoder, skip: List[str] = [], **kwargs) -> dict: - """ - Convert ones self into a serialized form. + """Convert ones self into a serialized form. :return: dictionary of ones self :rtype: dict @@ -220,14 +221,14 @@ def _convert_to_dict(self, in_dict, encoder, skip: List[str] = [], **kwargs) -> @property def data(self) -> Tuple: - """ - The data function returns a tuple of the keyword arguments passed to the - constructor. This is useful for when you need to pass in a dictionary of data - to other functions, such as with matplotlib's plot function. + """The data function returns a tuple of the keyword arguments + passed to the constructor. This is useful for when you need to + pass in a dictionary of data to other functions, such as with + matplotlib's plot function. :param self: Access attributes of the class within the method - :return: The values of the attributes in a tuple - :doc-author: Trelent + :return: The values of the attributes in a tuple :doc-author: + Trelent """ return tuple(self._kwargs.values()) @@ -239,10 +240,10 @@ def sort( mapping: Callable[[Union[BasedBase, DescriptorBase, NewBase]], Any], reverse: bool = False, ) -> None: - """ - Sort the collection according to the given mapping. + """Sort the collection according to the given mapping. - :param mapping: mapping function to sort the collection. i.e. lambda parameter: parameter.value + :param mapping: mapping function to sort the collection. i.e. + lambda parameter: parameter.value :type mapping: Callable :param reverse: Reverse the sorting. :type reverse: bool diff --git a/src/easyscience/base_classes/easy_list.py b/src/easyscience/base_classes/easy_list.py index 6af761e6..5d164e27 100644 --- a/src/easyscience/base_classes/easy_list.py +++ b/src/easyscience/base_classes/easy_list.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project 'EasyList[ProtectedType_]': ... @overload def __getitem__(self, idx: str) -> ProtectedType_: ... def __getitem__(self, idx: int | slice | str) -> ProtectedType_ | 'EasyList[ProtectedType_]': - """ - Get an item by index, slice, or unique_name. + """Get an item by index, slice, or unique_name. :param idx: Index, slice, or unique_name of the item :return: The item or a new EasyList for slices @@ -101,9 +106,10 @@ def __setitem__(self, idx: int, value: ProtectedType_) -> None: ... @overload def __setitem__(self, idx: slice, value: Iterable[ProtectedType_]) -> None: ... - def __setitem__(self, idx: int | slice, value: ProtectedType_ | Iterable[ProtectedType_]) -> None: - """ - Set an item at an index. + def __setitem__( + self, idx: int | slice, value: ProtectedType_ | Iterable[ProtectedType_] + ) -> None: + """Set an item at an index. :param idx: Index to set :param value: New value @@ -112,7 +118,9 @@ def __setitem__(self, idx: int | slice, value: ProtectedType_ | Iterable[Protect if not isinstance(value, tuple(self._protected_types)): raise TypeError(f'Items must be one of {self._protected_types}, got {type(value)}') if value is not self._data[idx] and value in self: - warnings.warn(f'Item with unique name "{self._get_key(value)}" already in EasyList, it will be ignored') + warnings.warn( + f'Item with unique name "{self._get_key(value)}" already in EasyList, it will be ignored' + ) return self._data[idx] = value elif isinstance(idx, slice): @@ -121,20 +129,25 @@ def __setitem__(self, idx: int | slice, value: ProtectedType_ | Iterable[Protect replaced = self._data[idx] new_values = list(value) if len(new_values) != len(replaced): - raise ValueError('Length of new values must match the length of the slice being replaced') + raise ValueError( + 'Length of new values must match the length of the slice being replaced' + ) for i, v in enumerate(new_values): if not isinstance(v, tuple(self._protected_types)): raise TypeError(f'Items must be one of {self._protected_types}, got {type(v)}') if v in self and replaced[i] is not v: - warnings.warn(f'Item with unique name "{v.unique_name}" already in EasyList, it will be ignored') - new_values[i] = replaced[i] # Keep the original value if the new one is a duplicate + warnings.warn( + f'Item with unique name "{v.unique_name}" already in EasyList, it will be ignored' + ) + new_values[i] = replaced[ + i + ] # Keep the original value if the new one is a duplicate self._data[idx] = new_values else: raise TypeError('Index must be an int or slice') def __delitem__(self, idx: int | slice | str) -> None: - """ - Delete an item by index, slice, or name. + """Delete an item by index, slice, or name. :param idx: Index, slice, or name of item to delete """ @@ -154,8 +167,7 @@ def __len__(self) -> int: return len(self._data) def insert(self, index: int, value: ProtectedType_) -> None: - """ - Insert an item at an index. + """Insert an item at an index. :param index: Index to insert at :param value: Item to insert @@ -165,13 +177,15 @@ def insert(self, index: int, value: ProtectedType_) -> None: elif not isinstance(value, tuple(self._protected_types)): raise TypeError(f'Items must be one of {self._protected_types}, got {type(value)}') if value in self: - warnings.warn(f'Item with unique name "{self._get_key(value)}" already in EasyList, it will be ignored') + warnings.warn( + f'Item with unique name "{self._get_key(value)}" already in EasyList, it will be ignored' + ) return self._data.insert(index, value) def _get_key(self, obj) -> str: - """ - Get the unique name of an object. + """Get the unique name of an object. + Can be overridden to use a different attribute as the key. :param object: Object to get the key for :return: The key of the object @@ -182,7 +196,9 @@ def _get_key(self, obj) -> str: # Overwriting methods def __repr__(self) -> str: - return f'{self.__class__.__name__} of length {len(self)} of type(s) {self._protected_types}' + return ( + f'{self.__class__.__name__} of length {len(self)} of type(s) {self._protected_types}' + ) def __contains__(self, item: ProtectedType_ | str) -> bool: if isinstance(item, str): @@ -193,8 +209,7 @@ def __reversed__(self): return self._data.__reversed__() def sort(self, key: Callable[[ProtectedType_], Any] = None, reverse: bool = False) -> None: - """ - Sort the collection according to the given key function. + """Sort the collection according to the given key function. :param key: Mapping function to sort by :param reverse: Whether to reverse the sort @@ -212,8 +227,7 @@ def index(self, value: ProtectedType_ | str, start: int = 0, stop: int = None) - return self._data.index(value, start, stop) def pop(self, index: int | str = -1) -> ProtectedType_: - """ - Remove and return an item at the given index or unique_name. + """Remove and return an item at the given index or unique_name. :param index: Index or unique_name of the item to remove :return: The removed item @@ -231,29 +245,31 @@ def pop(self, index: int | str = -1) -> ProtectedType_: # Serialization support def to_dict(self) -> dict: - """ - Convert the EasyList to a dictionary for serialization. + """Convert the EasyList to a dictionary for serialization. :return: Dictionary representation of the EasyList """ dict_repr = super().to_dict() if self._protected_types != [NewBase]: dict_repr['protected_types'] = [ - {'@module': cls_.__module__, '@class': cls_.__name__} for cls_ in self._protected_types + {'@module': cls_.__module__, '@class': cls_.__name__} + for cls_ in self._protected_types ] # noqa: E501 dict_repr['data'] = [item.to_dict() for item in self._data] return dict_repr @classmethod def from_dict(cls, obj_dict: Dict[str, Any]) -> NewBase: - """ - Re-create an EasyScience object from a full encoded dictionary. + """Re-create an EasyScience object from a full encoded + dictionary. :param obj_dict: dictionary containing the serialized contents (from `SerializerDict`) of an EasyScience object :return: Reformed EasyScience object """ if not SerializerBase._is_serialized_easyscience_object(obj_dict): - raise ValueError('Input must be a dictionary representing an EasyScience EasyList object.') + raise ValueError( + 'Input must be a dictionary representing an EasyScience EasyList object.' + ) temp_dict = copy.deepcopy(obj_dict) # Make a copy to avoid mutating the input if temp_dict['@class'] == cls.__name__: if 'protected_types' in temp_dict: @@ -267,7 +283,9 @@ def from_dict(cls, obj_dict: Dict[str, Any]) -> NewBase: cls_ = getattr(mod, classname) protected_types[i] = cls_ else: - raise ImportError(f'Could not import class {classname} from module {modname}') + raise ImportError( + f'Could not import class {classname} from module {modname}' + ) else: raise ValueError( 'Each protected type must be a serialized EasyScience class with @module and @class keys' @@ -278,4 +296,6 @@ def from_dict(cls, obj_dict: Dict[str, Any]) -> NewBase: data = kwargs.pop('data', []) return cls(data, protected_types=protected_types, **kwargs) else: - raise ValueError(f'Class name in dictionary does not match the expected class: {cls.__name__}.') + raise ValueError( + f'Class name in dictionary does not match the expected class: {cls.__name__}.' + ) diff --git a/src/easyscience/base_classes/model_base.py b/src/easyscience/base_classes/model_base.py index 3a6a4061..f2cb9773 100644 --- a/src/easyscience/base_classes/model_base.py +++ b/src/easyscience/base_classes/model_base.py @@ -1,7 +1,8 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from __future__ import annotations -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause # © 2021-2025 Contributors to the EasyScience project Parameter: return self._my_param + @my_param.setter def my_param(self, new_value: float) -> None: self._my_param.value = new_value @@ -43,8 +45,7 @@ def __init__(self, unique_name: Optional[str] = None, display_name: Optional[str super().__init__(unique_name=unique_name, display_name=display_name) def get_all_variables(self) -> List[DescriptorBase]: - """ - Get all `Descriptor` and `Parameter` objects as a list. + """Get all `Descriptor` and `Parameter` objects as a list. :return: List of `Descriptor` and `Parameter` objects. """ @@ -58,40 +59,39 @@ def get_all_variables(self) -> List[DescriptorBase]: return vars def get_all_parameters(self) -> List[Parameter]: - """ - Get all `Parameter` objects as a list. + """Get all `Parameter` objects as a list. :return: List of `Parameter` objects. """ return [param for param in self.get_all_variables() if isinstance(param, Parameter)] def get_fittable_parameters(self) -> List[Parameter]: - """ - Get all parameters which can be fitted as a list. + """Get all parameters which can be fitted as a list. :return: List of `Parameter` objects. """ return [param for param in self.get_all_parameters() if param.independent] def get_free_parameters(self) -> List[Parameter]: - """ - Get all parameters which are currently free to be fitted as a list. + """Get all parameters which are currently free to be fitted as a + list. :return: List of `Parameter` objects. """ return [param for param in self.get_fittable_parameters() if not param.fixed] def get_fit_parameters(self) -> List[Parameter]: - """ - This is an alias for `get_free_parameters`. - To be removed when fully moved to new base classes and minimizer can be changed. + """This is an alias for `get_free_parameters`. + + To be removed when fully moved to new base classes and minimizer + can be changed. """ return self.get_free_parameters() @classmethod def from_dict(cls, obj_dict: Dict[str, Any]) -> ModelBase: - """ - Re-create an EasyScience object with DescriptorNumber attributes from a full encoded dictionary. + """Re-create an EasyScience object with DescriptorNumber + attributes from a full encoded dictionary. :param obj_dict: dictionary containing the serialized contents (from `SerializerDict`) of an EasyScience object :return: Reformed EasyScience object @@ -116,4 +116,6 @@ def from_dict(cls, obj_dict: Dict[str, Any]) -> ModelBase: This should be fixed in the class definition. Error: {e}""") from e return cls_instance else: - raise ValueError(f'Class name in dictionary does not match the expected class: {cls.__name__}.') + raise ValueError( + f'Class name in dictionary does not match the expected class: {cls.__name__}.' + ) diff --git a/src/easyscience/base_classes/new_base.py b/src/easyscience/base_classes/new_base.py index 604233bd..b4cdd372 100644 --- a/src/easyscience/base_classes/new_base.py +++ b/src/easyscience/base_classes/new_base.py @@ -1,7 +1,8 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from __future__ import annotations -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause # © 2021-2025 Contributors to the EasyScience project Set[str]: - """ - This method is used by the serializer to determine which arguments are needed - by the constructor to deserialize the object. + """This method is used by the serializer to determine which + arguments are needed by the constructor to deserialize the + object. """ sign = signature(self.__class__.__init__) - names = [param.name for param in sign.parameters.values() if param.kind == param.POSITIONAL_OR_KEYWORD] + names = [ + param.name + for param in sign.parameters.values() + if param.kind == param.POSITIONAL_OR_KEYWORD + ] return set(names[1:]) @property @@ -58,9 +64,11 @@ def unique_name(self) -> str: @unique_name.setter def unique_name(self, new_unique_name: str): - """Set a new unique name for the object. The old name is still kept in the map. + """Set a new unique name for the object. The old name is still + kept in the map. - :param new_unique_name: New unique name for the object""" + :param new_unique_name: New unique name for the object + """ if not isinstance(new_unique_name, str): raise TypeError('Unique name has to be a string.') self._unique_name = new_unique_name @@ -69,8 +77,7 @@ def unique_name(self, new_unique_name: str): @property def display_name(self) -> str: - """ - Get a pretty display name. + """Get a pretty display name. :return: The pretty display name. """ @@ -82,8 +89,7 @@ def display_name(self) -> str: @display_name.setter @property_stack def display_name(self, name: str | None) -> None: - """ - Set the pretty display name. + """Set the pretty display name. :param name: Pretty display name of the object. """ @@ -92,11 +98,13 @@ def display_name(self, name: str | None) -> None: self._display_name = name def to_dict(self, skip: Optional[List[str]] = None) -> Dict[str, Any]: - """ - Convert an EasyScience object into a full dictionary using `SerializerBase`s generic `convert_to_dict` method. + """Convert an EasyScience object into a full dictionary using + `SerializerBase`s generic `convert_to_dict` method. - :param skip: List of field names as strings to skip when forming the dictionary - :return: encoded object containing all information to reform an EasyScience object. + :param skip: List of field names as strings to skip when forming + the dictionary + :return: encoded object containing all information to reform an + EasyScience object. """ serializer = SerializerBase() if skip is None: @@ -109,8 +117,8 @@ def to_dict(self, skip: Optional[List[str]] = None) -> Dict[str, Any]: @classmethod def from_dict(cls, obj_dict: Dict[str, Any]) -> NewBase: - """ - Re-create an EasyScience object from a full encoded dictionary. + """Re-create an EasyScience object from a full encoded + dictionary. :param obj_dict: dictionary containing the serialized contents (from `SerializerDict`) of an EasyScience object :return: Reformed EasyScience object @@ -121,13 +129,16 @@ def from_dict(cls, obj_dict: Dict[str, Any]) -> NewBase: kwargs = SerializerBase.deserialize_dict(obj_dict) return cls(**kwargs) else: - raise ValueError(f'Class name in dictionary does not match the expected class: {cls.__name__}.') + raise ValueError( + f'Class name in dictionary does not match the expected class: {cls.__name__}.' + ) def __dir__(self) -> Iterable[str]: - """ - This creates auto-completion and helps out in iPython notebooks. + """This creates auto-completion and helps out in iPython + notebooks. - :return: list of function and parameter names for auto-completion + :return: list of function and parameter names for auto- + completion """ new_class_objs = list(k for k in dir(self.__class__) if not k.startswith('_')) return sorted(new_class_objs) diff --git a/src/easyscience/base_classes/obj_base.py b/src/easyscience/base_classes/obj_base.py index b42991f8..0847dab2 100644 --- a/src/easyscience/base_classes/obj_base.py +++ b/src/easyscience/base_classes/obj_base.py @@ -1,7 +1,8 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from __future__ import annotations -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause # © 2021-2025 Contributors to the EasyScience project None: - """ - Dynamically add a component to the class. This is an internal method, though can be called remotely. - The recommended alternative is to use typing, i.e. + """Dynamically add a component to the class. This is an internal + method, though can be called remotely. The recommended + alternative is to use typing, i.e. .. code-block:: python class Foo(Bar): def __init__(self, foo: Parameter, bar: Parameter): super(Foo, self).__init__(bar=bar) - self._add_component("foo", foo) + self._add_component('foo', foo) :param key: Name of component to be added :param component: Component to be added @@ -133,7 +134,9 @@ def getter(obj: SerializerComponent) -> SerializerComponent: @staticmethod def __setter(key: str) -> Callable[[SerializerComponent], None]: def setter(obj: SerializerComponent, value: float) -> None: - if issubclass(obj._kwargs[key].__class__, (DescriptorBase)) and not issubclass(value.__class__, (DescriptorBase)): + if issubclass(obj._kwargs[key].__class__, (DescriptorBase)) and not issubclass( + value.__class__, (DescriptorBase) + ): obj._kwargs[key].value = value else: obj._kwargs[key] = value diff --git a/src/easyscience/fitting/__init__.py b/src/easyscience/fitting/__init__.py index f34b8b81..3684d122 100644 --- a/src/easyscience/fitting/__init__.py +++ b/src/easyscience/fitting/__init__.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from .available_minimizers import AvailableMinimizers from .fitter import Fitter from .minimizers.utils import FitResults diff --git a/src/easyscience/fitting/available_minimizers.py b/src/easyscience/fitting/available_minimizers.py index 2d1fb717..0b9952d3 100644 --- a/src/easyscience/fitting/available_minimizers.py +++ b/src/easyscience/fitting/available_minimizers.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + import warnings from dataclasses import dataclass from enum import Enum @@ -13,7 +16,11 @@ lmfit_engine_available = True except ImportError: # TODO make this a proper message (use logging?) - warnings.warn('LMFit minimization is not available. Probably lmfit has not been installed.', ImportWarning, stacklevel=2) + warnings.warn( + 'LMFit minimization is not available. Probably lmfit has not been installed.', + ImportWarning, + stacklevel=2, + ) bumps_engine_available = False try: @@ -22,7 +29,11 @@ bumps_engine_available = True except ImportError: # TODO make this a proper message (use logging?) - warnings.warn('Bumps minimization is not available. Probably bumps has not been installed.', ImportWarning, stacklevel=2) + warnings.warn( + 'Bumps minimization is not available. Probably bumps has not been installed.', + ImportWarning, + stacklevel=2, + ) dfo_engine_available = False try: @@ -31,7 +42,11 @@ dfo_engine_available = True except ImportError: # TODO make this a proper message (use logging?) - warnings.warn('DFO minimization is not available. Probably dfols has not been installed.', ImportWarning, stacklevel=2) + warnings.warn( + 'DFO minimization is not available. Probably dfols has not been installed.', + ImportWarning, + stacklevel=2, + ) @dataclass diff --git a/src/easyscience/fitting/calculators/__init__.py b/src/easyscience/fitting/calculators/__init__.py index a3ca5d43..13f632fa 100644 --- a/src/easyscience/fitting/calculators/__init__.py +++ b/src/easyscience/fitting/calculators/__init__.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project +# SPDX-License-Identifier: BSD-3-Clause + from __future__ import annotations -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause # © 2021-2025 Contributors to the EasyScience project List[str]: - """ - Return all available interfaces. + """Return all available interfaces. :return: List of available interface names :rtype: List[str] @@ -95,8 +97,7 @@ def available_interfaces(self) -> List[str]: @property def current_interface(self) -> ABCMeta: - """ - Returns the constructor for the currently selected interface. + """Returns the constructor for the currently selected interface. :return: Interface constructor :rtype: InterfaceTemplate @@ -105,8 +106,8 @@ def current_interface(self) -> ABCMeta: @property def current_interface_name(self) -> str: - """ - Returns the constructor name for the currently selected interface. + """Returns the constructor name for the currently selected + interface. :return: Interface constructor name :rtype: str @@ -117,8 +118,7 @@ def current_interface_name(self) -> str: def fit_func( self, ) -> Callable: # , x_array: np.ndarray, *args, **kwargs) -> np.ndarray: - """ - Pass through to the underlying interfaces fitting function. + """Pass through to the underlying interfaces fitting function. :param x_array: points to be calculated at :type x_array: np.ndarray @@ -128,7 +128,8 @@ def fit_func( :type kwargs: Any :return: points calculated at positional values `x` :rtype: np.ndarray - #""" + # + """ def __fit_func(*args, **kwargs): return self.__interface_obj.fit_func(*args, **kwargs) @@ -139,8 +140,9 @@ def call(self, *args, **kwargs): return self.fit_func(*args, **kwargs) def generate_bindings(self, model, *args, ifun=None, **kwargs): - """ - Automatically bind a `Parameter` to the corresponding interface. + """Automatically bind a `Parameter` to the corresponding + interface. + :param name: parameter name :type name: str :return: binding property @@ -189,9 +191,7 @@ def __state_restore__(cls, interface_str): @staticmethod def return_name(this_interface) -> str: - """ - Return an interfaces name - """ + """Return an interfaces name.""" interface_name = this_interface.__name__ if hasattr(this_interface, 'name'): interface_name = getattr(this_interface, 'name') diff --git a/src/easyscience/fitting/fitter.py b/src/easyscience/fitting/fitter.py index 1ccacbe1..16ea1da5 100644 --- a/src/easyscience/fitting/fitter.py +++ b/src/easyscience/fitting/fitter.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project object: # TODO: remove this method when we are ready to adjust the dependent products def initialize(self, fit_object, fit_function: Callable) -> None: - """ - Set the model and callable in the calculator interface. + """Set the model and callable in the calculator interface. :param fit_object: The EasyScience model object :param fit_function: The function to be optimized against. @@ -57,9 +57,10 @@ def initialize(self, fit_object, fit_function: Callable) -> None: # TODO: remove this method when we are ready to adjust the dependent products def create(self, minimizer_enum: Union[AvailableMinimizers, str] = DEFAULT_MINIMIZER) -> None: - """ - Create the required minimizer. - :param minimizer_enum: The enum of the minimization engine to create. + """Create the required minimizer. + + :param minimizer_enum: The enum of the minimization engine to + create. """ if isinstance(minimizer_enum, str): print(f'minimizer should be set with enum {minimizer_enum}') @@ -67,10 +68,10 @@ def create(self, minimizer_enum: Union[AvailableMinimizers, str] = DEFAULT_MINIM self._update_minimizer(minimizer_enum) def switch_minimizer(self, minimizer_enum: Union[AvailableMinimizers, str]) -> None: - """ - Switch minimizer and initialize. + """Switch minimizer and initialize. - :param minimizer_enum: The enum of the minimizer to create and instantiate. + :param minimizer_enum: The enum of the minimizer to create and + instantiate. """ if isinstance(minimizer_enum, str): print(f'minimizer should be set with enum {minimizer_enum}') @@ -79,13 +80,16 @@ def switch_minimizer(self, minimizer_enum: Union[AvailableMinimizers, str]) -> N self._update_minimizer(minimizer_enum) def _update_minimizer(self, minimizer_enum: AvailableMinimizers) -> None: - self._minimizer = factory(minimizer_enum=minimizer_enum, fit_object=self._fit_object, fit_function=self.fit_function) + self._minimizer = factory( + minimizer_enum=minimizer_enum, + fit_object=self._fit_object, + fit_function=self.fit_function, + ) self._enum_current_minimizer = minimizer_enum @property def available_minimizers(self) -> List[str]: - """ - Get a list of the names of available fitting minimizers + """Get a list of the names of available fitting minimizers. :return: List of available fitting minimizers :rtype: List[str] @@ -94,8 +98,7 @@ def available_minimizers(self) -> List[str]: @property def minimizer(self) -> MinimizerBase: - """ - Get the current fitting minimizer object. + """Get the current fitting minimizer object. :return: :rtype: MinimizerBase @@ -104,8 +107,7 @@ def minimizer(self) -> MinimizerBase: @property def tolerance(self) -> float: - """ - Get the tolerance for the minimizer. + """Get the tolerance for the minimizer. :return: Tolerance for the minimizer """ @@ -113,8 +115,7 @@ def tolerance(self) -> float: @tolerance.setter def tolerance(self, tolerance: float) -> None: - """ - Set the tolerance for the minimizer. + """Set the tolerance for the minimizer. :param tolerance: Tolerance for the minimizer """ @@ -122,8 +123,7 @@ def tolerance(self, tolerance: float) -> None: @property def max_evaluations(self) -> int: - """ - Get the maximal number of evaluations for the minimizer. + """Get the maximal number of evaluations for the minimizer. :return: Maximal number of steps for the minimizer """ @@ -131,25 +131,24 @@ def max_evaluations(self) -> int: @max_evaluations.setter def max_evaluations(self, max_evaluations: int) -> None: - """ - Set the maximal number of evaluations for the minimizer. + """Set the maximal number of evaluations for the minimizer. - :param max_evaluations: Maximal number of steps for the minimizer + :param max_evaluations: Maximal number of steps for the + minimizer """ self._max_evaluations = max_evaluations @property def fit_function(self) -> Callable: - """ - The raw fit function that the optimizer will call (no wrapping) - :return: Raw fit function + """The raw fit function that the optimizer will call (no + wrapping) :return: Raw fit function. """ return self._fit_function @fit_function.setter def fit_function(self, fit_function: Callable) -> None: - """ - Set the raw fit function to a new one. + """Set the raw fit function to a new one. + :param fit_function: New fit function :return: None """ @@ -158,26 +157,25 @@ def fit_function(self, fit_function: Callable) -> None: @property def fit_object(self): - """ - The EasyScience object which will be used as a model - :return: EasyScience Model + """The EasyScience object which will be used as a model :return: + + EasyScience Model. """ return self._fit_object @fit_object.setter def fit_object(self, fit_object) -> None: - """ - Set the EasyScience object which wil be used as a model - :param fit_object: New EasyScience object - :return: None + """Set the EasyScience object which wil be used as a model + :param fit_object: New EasyScience object :return: None. """ self._fit_object = fit_object self._update_minimizer(self._enum_current_minimizer) def _fit_function_wrapper(self, real_x=None, flatten: bool = True) -> Callable: - """ - Simple fit function which injects the real X (independent) values into the - optimizer function. This will also flatten the results if needed. + """Simple fit function which injects the real X (independent) + values into the optimizer function. + + This will also flatten the results if needed. :param real_x: Independent x parameters to be injected :param flatten: Should the result be a flat 1D array? :return: Wrapped optimizer function. @@ -197,10 +195,13 @@ def wrapped_fit_function(x, **kwargs): @property def fit(self) -> Callable: - """ - Property which wraps the current `fit` function from the fitting interface. This property return a wrapped fit - function which converts the input data into the correct shape for the optimizer, wraps the fit function to - re-constitute the independent variables and once the fit is completed, reshape the inputs to those expected. + """Property which wraps the current `fit` function from the + fitting interface. + + This property return a wrapped fit function which converts the + input data into the correct shape for the optimizer, wraps the + fit function to re-constitute the independent variables and once + the fit is completed, reshape the inputs to those expected. """ @functools.wraps(self._minimizer.fit) @@ -211,20 +212,25 @@ def inner_fit_callable( vectorized: bool = False, **kwargs, ) -> FitResults: - """ - This is a wrapped callable which performs the actual fitting. It is split into + """This is a wrapped callable which performs the actual + fitting. It is split into. + 3 sections, PRE/ FIT/ POST. - PRE = Reshaping the input data into the correct dimensions for the optimizer - FIT = Wrapping the fit function and performing the fit - POST = Reshaping the outputs so it is coherent with the inputs. """ # Precompute - Reshape all independents into the correct dimensionality - x_fit, x_new, y_new, weights, dims = self._precompute_reshaping(x, y, weights, vectorized) + x_fit, x_new, y_new, weights, dims = self._precompute_reshaping( + x, y, weights, vectorized + ) self._dependent_dims = dims # Fit fit_fun_org = self._fit_function - fit_fun_wrap = self._fit_function_wrapper(x_new, flatten=True) # This should be wrapped. + fit_fun_wrap = self._fit_function_wrapper( + x_new, flatten=True + ) # This should be wrapped. self.fit_function = fit_fun_wrap f_res = self._minimizer.fit( x_fit, @@ -250,8 +256,8 @@ def _precompute_reshaping( weights: Optional[np.ndarray], vectorized: bool, ): - """ - Check the dimensions of the inputs and reshape if necessary. + """Check the dimensions of the inputs and reshape if necessary. + :param x: ND matrix of dependent points :param y: N-1D matrix of independent points :param kwargs: Additional key-word arguments @@ -293,9 +299,11 @@ def _precompute_reshaping( return x_for_fit, x_new, y_new, weights, x_shape @staticmethod - def _post_compute_reshaping(fit_result: FitResults, x: np.ndarray, y: np.ndarray) -> FitResults: - """ - Reshape the output of the fitter into the correct dimensions. + def _post_compute_reshaping( + fit_result: FitResults, x: np.ndarray, y: np.ndarray + ) -> FitResults: + """Reshape the output of the fitter into the correct dimensions. + :param fit_result: Output from the fitter :param x: Input x independent :param y: Input y dependent diff --git a/src/easyscience/fitting/minimizers/__init__.py b/src/easyscience/fitting/minimizers/__init__.py index 5ca5ee06..9ffdf17f 100644 --- a/src/easyscience/fitting/minimizers/__init__.py +++ b/src/easyscience/fitting/minimizers/__init__.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project +# SPDX-License-Identifier: BSD-3-Clause + from typing import Callable from .. import available_minimizers @@ -12,7 +15,9 @@ from .minimizer_bumps import Bumps -def factory(minimizer_enum: AvailableMinimizers, fit_object, fit_function: Callable) -> MinimizerBase: +def factory( + minimizer_enum: AvailableMinimizers, fit_object, fit_function: Callable +) -> MinimizerBase: if minimizer_enum.package == 'lm': minimizer = LMFit(obj=fit_object, fit_function=fit_function, minimizer_enum=minimizer_enum) diff --git a/src/easyscience/fitting/minimizers/minimizer_base.py b/src/easyscience/fitting/minimizers/minimizer_base.py index 0b864657..a64af0f2 100644 --- a/src/easyscience/fitting/minimizers/minimizer_base.py +++ b/src/easyscience/fitting/minimizers/minimizer_base.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project FitResults: - """ - Perform a fit using the engine. + """Perform a fit using the engine. :param x: points to be calculated at :type x: np.ndarray @@ -89,10 +89,13 @@ def fit( :return: Fit results """ - def evaluate(self, x: np.ndarray, minimizer_parameters: Optional[dict[str, float]] = None, **kwargs) -> np.ndarray: - """ - Evaluate the fit function for values of x. Parameters used are either the latest or user supplied. - If the parameters are user supplied, it must be in a dictionary of {'parameter_name': parameter_value,...}. + def evaluate( + self, x: np.ndarray, minimizer_parameters: Optional[dict[str, float]] = None, **kwargs + ) -> np.ndarray: + """Evaluate the fit function for values of x. Parameters used + are either the latest or user supplied. If the parameters are + user supplied, it must be in a dictionary of {'parameter_name': + parameter_value,...}. :param x: x values for which the fit function will be evaluated :type x: np.ndarray @@ -129,10 +132,11 @@ def _get_method_kwargs(self, passed_method: Optional[str] = None) -> dict[str, s @abstractmethod def convert_to_pars_obj(self, par_list: Optional[Union[list]] = None): - """ - Create an engine compatible container with the `Parameters` converted from the base object. + """Create an engine compatible container with the `Parameters` + converted from the base object. - :param par_list: If only a single/selection of parameter is required. Specify as a list + :param par_list: If only a single/selection of parameter is + required. Specify as a list :type par_list: List[str] :return: engine Parameters compatible object """ @@ -140,8 +144,7 @@ def convert_to_pars_obj(self, par_list: Optional[Union[list]] = None): @staticmethod @abstractmethod def supported_methods() -> List[str]: - """ - Return a list of supported methods for the minimizer. + """Return a list of supported methods for the minimizer. :return: List of supported methods :rtype: List[str] @@ -150,8 +153,7 @@ def supported_methods() -> List[str]: @staticmethod @abstractmethod def all_methods() -> List[str]: - """ - Return a list of all available methods for the minimizer. + """Return a list of all available methods for the minimizer. :return: List of all available methods :rtype: List[str] @@ -160,15 +162,15 @@ def all_methods() -> List[str]: @staticmethod @abstractmethod def convert_to_par_object(obj): # todo after constraint changes, add type hint: obj: ObjBase - """ - Convert an `EasyScience.variable.Parameter` object to an engine Parameter object. + """Convert an `EasyScience.variable.Parameter` object to an + engine Parameter object. """ def _prepare_parameters(self, parameters: dict[str, float]) -> dict[str, float]: - """ - Prepare the parameters for the minimizer. + """Prepare the parameters for the minimizer. - :param parameters: Dict of parameters for the minimizer with names as keys. + :param parameters: Dict of parameters for the minimizer with + names as keys. """ pars = self._cached_pars @@ -179,9 +181,8 @@ def _prepare_parameters(self, parameters: dict[str, float]) -> dict[str, float]: return parameters def _generate_fit_function(self) -> Callable: - """ - Using the user supplied `fit_function`, wrap it in such a way we can update `Parameter` on - iterations. + """Using the user supplied `fit_function`, wrap it in such a way + we can update `Parameter` on iterations. :return: a fit function which is compatible with bumps models """ @@ -197,8 +198,8 @@ def _generate_fit_function(self) -> Callable: # Make a new fit function def _fit_function(x: np.ndarray, **kwargs): - """ - Wrapped fit function which now has an EasyScience compatible form + """Wrapped fit function which now has an EasyScience + compatible form. :param x: array of data points to be calculated :type x: np.ndarray @@ -227,14 +228,16 @@ def _fit_function(x: np.ndarray, **kwargs): @staticmethod def _create_signature(parameters: Dict[int, Parameter]) -> Signature: - """ - Wrap the function signature. + """Wrap the function signature. + This is done as lmfit wants the function to be in the form: f = (x, a=1, b=2)... Where we need to be generic. Note that this won't hold for much outside of this scope. """ wrapped_parameters = [] - wrapped_parameters.append(InspectParameter('x', InspectParameter.POSITIONAL_OR_KEYWORD, annotation=_empty)) + wrapped_parameters.append( + InspectParameter('x', InspectParameter.POSITIONAL_OR_KEYWORD, annotation=_empty) + ) for name, parameter in parameters.items(): default_value = parameter.value @@ -250,7 +253,9 @@ def _create_signature(parameters: Dict[int, Parameter]) -> Signature: return Signature(wrapped_parameters) @staticmethod - def _error_from_jacobian(jacobian: np.ndarray, residuals: np.ndarray, confidence: float = 0.95) -> np.ndarray: + def _error_from_jacobian( + jacobian: np.ndarray, residuals: np.ndarray, confidence: float = 0.95 + ) -> np.ndarray: from scipy import stats JtJi = np.linalg.inv(np.dot(jacobian.T, jacobian)) diff --git a/src/easyscience/fitting/minimizers/minimizer_bumps.py b/src/easyscience/fitting/minimizers/minimizer_bumps.py index 3315d2eb..99353a77 100644 --- a/src/easyscience/fitting/minimizers/minimizer_bumps.py +++ b/src/easyscience/fitting/minimizers/minimizer_bumps.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project FitResults: - """ - Perform a fit using the lmfit engine. + """Perform a fit using the lmfit engine. :param x: points to be calculated at :type x: np.ndarray @@ -97,12 +97,10 @@ def fit( :param method: Method for minimization :type method: str :return: Fit results - :rtype: ModelResult - - For standard least squares, the weights should be 1/sigma, where - sigma is the standard deviation of the measurement. For - unweighted least squares, these should be 1. - + :rtype: ModelResult For standard least squares, the weights + should be 1/sigma, where sigma is the standard deviation of + the measurement. For unweighted least squares, these should + be 1. """ method_dict = self._get_method_kwargs(method) @@ -129,7 +127,9 @@ def fit( if tolerance is not None: minimizer_kwargs['ftol'] = tolerance # tolerance for change in function value - minimizer_kwargs['xtol'] = tolerance # tolerance for change in parameter value, could be an independent value + minimizer_kwargs['xtol'] = ( + tolerance # tolerance for change in parameter value, could be an independent value + ) if max_evaluations is not None: minimizer_kwargs['steps'] = max_evaluations @@ -158,10 +158,11 @@ def fit( return results def convert_to_pars_obj(self, par_list: Optional[List] = None) -> List[BumpsParameter]: - """ - Create a container with the `Parameters` converted from the base object. + """Create a container with the `Parameters` converted from the + base object. - :param par_list: If only a single/selection of parameter is required. Specify as a list + :param par_list: If only a single/selection of parameter is + required. Specify as a list :type par_list: List[str] :return: bumps Parameters list :rtype: List[BumpsParameter] @@ -175,8 +176,8 @@ def convert_to_pars_obj(self, par_list: Optional[List] = None) -> List[BumpsPara # For some reason I have to double staticmethod :-/ @staticmethod def convert_to_par_object(obj) -> BumpsParameter: - """ - Convert an `EasyScience.variable.Parameter` object to a bumps Parameter object + """Convert an `EasyScience.variable.Parameter` object to a bumps + Parameter object. :return: bumps Parameter compatible object. :rtype: BumpsParameter @@ -192,9 +193,9 @@ def convert_to_par_object(obj) -> BumpsParameter: ) def _make_model(self, parameters: Optional[List[BumpsParameter]] = None) -> Callable: - """ - Generate a bumps model from the supplied `fit_function` and parameters in the base object. - Note that this makes a callable as it needs to be initialized with *x*, *y*, *weights* + """Generate a bumps model from the supplied `fit_function` and + parameters in the base object. Note that this makes a callable + as it needs to be initialized with *x*, *y*, *weights* Weights are converted to dy (standard deviation of y). @@ -208,19 +209,25 @@ def _make_func(x, y, weights): bumps_pars = {} if not parameters: for name, par in obj._cached_pars.items(): - bumps_pars[MINIMIZER_PARAMETER_PREFIX + str(name)] = obj.convert_to_par_object(par) + bumps_pars[MINIMIZER_PARAMETER_PREFIX + str(name)] = ( + obj.convert_to_par_object(par) + ) else: for par in parameters: - bumps_pars[MINIMIZER_PARAMETER_PREFIX + par.unique_name] = obj.convert_to_par_object(par) + bumps_pars[MINIMIZER_PARAMETER_PREFIX + par.unique_name] = ( + obj.convert_to_par_object(par) + ) return Curve(fit_func, x, y, dy=1 / weights, **bumps_pars) return _make_func return _outer(self) - def _set_parameter_fit_result(self, fit_result, stack_status: bool, par_list: List[BumpsParameter]): - """ - Update parameters to their final values and assign a std error to them. + def _set_parameter_fit_result( + self, fit_result, stack_status: bool, par_list: List[BumpsParameter] + ): + """Update parameters to their final values and assign a std + error to them. :param fit_result: Fit object which contains info on the fit :return: None @@ -245,8 +252,7 @@ def _set_parameter_fit_result(self, fit_result, stack_status: bool, par_list: Li global_object.stack.endMacro() def _gen_fit_results(self, fit_results, **kwargs) -> FitResults: - """ - Convert fit results into the unified `FitResults` format + """Convert fit results into the unified `FitResults` format. :param fit_result: Fit object which contains info on the fit :return: fit results container diff --git a/src/easyscience/fitting/minimizers/minimizer_dfo.py b/src/easyscience/fitting/minimizers/minimizer_dfo.py index dacef618..aab217ab 100644 --- a/src/easyscience/fitting/minimizers/minimizer_dfo.py +++ b/src/easyscience/fitting/minimizers/minimizer_dfo.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project FitResults: - """ - Perform a fit using the DFO-ls engine. + """Perform a fit using the DFO-ls engine. :param x: points to be calculated at :type x: np.ndarray @@ -84,11 +84,10 @@ def fit( :param method: Method for minimization :type method: str :return: Fit results - :rtype: ModelResult - - For standard least squares, the weights should be 1/sigma, where - sigma is the standard deviation of the measurement. For - unweighted least squares, these should be 1. + :rtype: ModelResult For standard least squares, the weights + should be 1/sigma, where sigma is the standard deviation of + the measurement. For unweighted least squares, these should + be 1. """ x, y, weights = np.asarray(x), np.asarray(y), np.asarray(weights) @@ -132,22 +131,18 @@ def fit( return results def convert_to_pars_obj(self, par_list: Optional[list] = None): - """ - Required by interface but not needed for DFO-LS - """ + """Required by interface but not needed for DFO-LS.""" pass @staticmethod def convert_to_par_object(obj) -> None: - """ - Required by interface but not needed for DFO-LS - """ + """Required by interface but not needed for DFO-LS.""" pass def _make_model(self, parameters: Optional[List[Parameter]] = None) -> Callable: - """ - Generate a model from the supplied `fit_function` and parameters in the base object. - Note that this makes a callable as it needs to be initialized with *x*, *y*, *weights* + """Generate a model from the supplied `fit_function` and + parameters in the base object. Note that this makes a callable + as it needs to be initialized with *x*, *y*, *weights* :return: Callable model which returns residuals :rtype: Callable @@ -176,11 +171,12 @@ def _residuals(pars_values: List[float]) -> np.ndarray: return _outer(self) def _set_parameter_fit_result(self, fit_result, stack_status, ci: float = 0.95) -> None: - """ - Update parameters to their final values and assign a std error to them. + """Update parameters to their final values and assign a std + error to them. :param fit_result: Fit object which contains info on the fit - :param ci: Confidence interval for calculating errors. Default 95% + :param ci: Confidence interval for calculating errors. Default + 95% :return: None :rtype: noneType """ @@ -203,8 +199,7 @@ def _set_parameter_fit_result(self, fit_result, stack_status, ci: float = 0.95) global_object.stack.endMacro() def _gen_fit_results(self, fit_results, weights, **kwargs) -> FitResults: - """ - Convert fit results into the unified `FitResults` format + """Convert fit results into the unified `FitResults` format. :param fit_result: Fit object which contains info on the fit :return: fit results container @@ -242,8 +237,8 @@ def _dfo_fit( model: Callable, **kwargs, ): - """ - Method to convert EasyScience styling to DFO-LS styling (yes, again) + """Method to convert EasyScience styling to DFO-LS styling (yes, + again) :param model: Model which accepts f(x[0]) :type model: Callable diff --git a/src/easyscience/fitting/minimizers/minimizer_lmfit.py b/src/easyscience/fitting/minimizers/minimizer_lmfit.py index 2c63cea3..0b5859db 100644 --- a/src/easyscience/fitting/minimizers/minimizer_lmfit.py +++ b/src/easyscience/fitting/minimizers/minimizer_lmfit.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project FitResults: - """ - Perform a fit using the lmfit engine. + """Perform a fit using the lmfit engine. :param method: :type method: @@ -106,16 +107,15 @@ def fit( :type model: LMModel :param parameters: Optional parameters for the fit :type parameters: LMParameters - :param minimizer_kwargs: Arguments to be passed directly to the minimizer + :param minimizer_kwargs: Arguments to be passed directly to the + minimizer :type minimizer_kwargs: dict :param kwargs: Additional arguments for the fitting function. :return: Fit results - :rtype: ModelResult - - For standard least squares, the weights should be 1/sigma, where - sigma is the standard deviation of the measurement. For - unweighted least squares, these should be 1. - + :rtype: ModelResult For standard least squares, the weights + should be 1/sigma, where sigma is the standard deviation of + the measurement. For unweighted least squares, these should + be 1. """ x, y, weights = np.asarray(x), np.asarray(y), np.asarray(weights) @@ -165,7 +165,9 @@ def fit( raise FitError(e) return results - def _get_fit_kws(self, method: str, tolerance: float, minimizer_kwargs: dict[str:str]) -> dict[str:str]: + def _get_fit_kws( + self, method: str, tolerance: float, minimizer_kwargs: dict[str:str] + ) -> dict[str:str]: if minimizer_kwargs is None: minimizer_kwargs = {} if tolerance is not None: @@ -176,22 +178,25 @@ def _get_fit_kws(self, method: str, tolerance: float, minimizer_kwargs: dict[str return minimizer_kwargs def convert_to_pars_obj(self, parameters: Optional[List[Parameter]] = None) -> LMParameters: - """ - Create an lmfit compatible container with the `Parameters` converted from the base object. + """Create an lmfit compatible container with the `Parameters` + converted from the base object. - :param parameters: If only a single/selection of parameter is required. Specify as a list + :param parameters: If only a single/selection of parameter is + required. Specify as a list :return: lmfit Parameters compatible object """ if parameters is None: # Assume that we have a ObjBase for which we can obtain a list parameters = self._object.get_fit_parameters() - lm_parameters = LMParameters().add_many([self.convert_to_par_object(parameter) for parameter in parameters]) + lm_parameters = LMParameters().add_many([ + self.convert_to_par_object(parameter) for parameter in parameters + ]) return lm_parameters @staticmethod def convert_to_par_object(parameter: Parameter) -> LMParameter: - """ - Convert an EasyScience Parameter object to a lmfit Parameter object. + """Convert an EasyScience Parameter object to a lmfit Parameter + object. :return: lmfit Parameter compatible object. :rtype: LMParameter @@ -209,8 +214,8 @@ def convert_to_par_object(parameter: Parameter) -> LMParameter: ) def _make_model(self, pars: Optional[LMParameters] = None) -> LMModel: - """ - Generate a lmfit model from the supplied `fit_function` and parameters in the base object. + """Generate a lmfit model from the supplied `fit_function` and + parameters in the base object. :return: Callable lmfit model :rtype: LMModel @@ -247,8 +252,8 @@ def _make_model(self, pars: Optional[LMParameters] = None) -> LMModel: return model def _set_parameter_fit_result(self, fit_result: ModelResult, stack_status: bool): - """ - Update parameters to their final values and assign a std error to them. + """Update parameters to their final values and assign a std + error to them. :param fit_result: Fit object which contains info on the fit :return: None diff --git a/src/easyscience/fitting/minimizers/utils.py b/src/easyscience/fitting/minimizers/utils.py index 60ab00a6..3f3d6d41 100644 --- a/src/easyscience/fitting/minimizers/utils.py +++ b/src/easyscience/fitting/minimizers/utils.py @@ -1,9 +1,12 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + import numpy as np class FitResults: - """ - At the moment this is just a dummy way of unifying the returned fit parameters. + """At the moment this is just a dummy way of unifying the returned + fit parameters. """ __slots__ = [ diff --git a/src/easyscience/fitting/multi_fitter.py b/src/easyscience/fitting/multi_fitter.py index a30bdcec..a78f4d5a 100644 --- a/src/easyscience/fitting/multi_fitter.py +++ b/src/easyscience/fitting/multi_fitter.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project Callable: - """ - Simple fit function which injects the N real X (independent) values into the - optimizer function. This will also flatten the results if needed. + """Simple fit function which injects the N real X (independent) + values into the optimizer function. + + This will also flatten the results if needed. :param real_x: List of independent x parameters to be injected :param flatten: Should the result be a flat 1D array? :return: Wrapped optimizer function. @@ -65,8 +69,9 @@ def _precompute_reshaping( weights: Optional[List[np.ndarray]], vectorized: bool, ): - """ - Convert an array of X's and Y's to an acceptable shape for fitting. + """Convert an array of X's and Y's to an acceptable shape for + fitting. + :param x: List of independent variables. :param y: List of dependent variables. :param vectorized: Is the fn input vectorized or point based? @@ -75,13 +80,17 @@ def _precompute_reshaping( """ if weights is None: weights = [None] * len(x) - _, _x_new, _y_new, _weights, _dims = Fitter._precompute_reshaping(x[0], y[0], weights[0], vectorized) + _, _x_new, _y_new, _weights, _dims = Fitter._precompute_reshaping( + x[0], y[0], weights[0], vectorized + ) x_new = [_x_new] y_new = [_y_new] w_new = [_weights] dims = [_dims] for _x, _y, _w in zip(x[1::], y[1::], weights[1::]): - _, _x_new, _y_new, _weights, _dims = Fitter._precompute_reshaping(_x, _y, _w, vectorized) + _, _x_new, _y_new, _weights, _dims = Fitter._precompute_reshaping( + _x, _y, _w, vectorized + ) x_new.append(_x_new) y_new.append(_y_new) w_new.append(_weights) @@ -100,12 +109,10 @@ def _post_compute_reshaping( x: List[np.ndarray], y: List[np.ndarray], ) -> List[FitResults]: - """ - Take a fit results object and split it into n chuncks based on the size of the x, y inputs - :param fit_result_obj: Result from a multifit - :param x: List of X co-ords - :param y: List of Y co-ords - :return: List of fit results + """Take a fit results object and split it into n chuncks based + on the size of the x, y inputs :param fit_result_obj: Result + from a multifit :param x: List of X co-ords :param y: List of Y + co-ords :return: List of fit results. """ cls = fit_result_obj.__class__ @@ -123,8 +130,12 @@ def _post_compute_reshaping( current_results.p0 = fit_result_obj.p0 current_results.x = this_x current_results.y_obs = y[idx] - current_results.y_calc = np.reshape(fit_result_obj.y_calc[sp:ep], current_results.y_obs.shape) - current_results.y_err = np.reshape(fit_result_obj.y_err[sp:ep], current_results.y_obs.shape) + current_results.y_calc = np.reshape( + fit_result_obj.y_calc[sp:ep], current_results.y_obs.shape + ) + current_results.y_err = np.reshape( + fit_result_obj.y_err[sp:ep], current_results.y_obs.shape + ) current_results.engine_result = fit_result_obj.engine_result # Attach an additional field for the un-modified results diff --git a/src/easyscience/global_object/__init__.py b/src/easyscience/global_object/__init__.py index 2adc1bc2..24dd991a 100644 --- a/src/easyscience/global_object/__init__.py +++ b/src/easyscience/global_object/__init__.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from .global_object import GlobalObject # noqa: F401 from .hugger.hugger import ScriptManager # noqa: F401 from .logger import Logger # noqa: F401 diff --git a/src/easyscience/global_object/global_object.py b/src/easyscience/global_object/global_object.py index 63726d01..14e6ec24 100644 --- a/src/easyscience/global_object/global_object.py +++ b/src/easyscience/global_object/global_object.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project str: - """ - Generate a generic unique name for the object using the class name and a global iterator. - Names are in the format `name_prefix_0`, `name_prefix_1`, `name_prefix_2`, etc. + """Generate a generic unique name for the object using the class + name and a global iterator. Names are in the format + `name_prefix_0`, `name_prefix_1`, `name_prefix_2`, etc. :param name_prefix: The prefix to be used for the name """ - names_with_prefix = [name for name in self.map.vertices() if name.startswith(name_prefix + '_')] + names_with_prefix = [ + name for name in self.map.vertices() if name.startswith(name_prefix + '_') + ] if names_with_prefix: name_with_prefix_count = [0] for name in names_with_prefix: diff --git a/src/easyscience/global_object/hugger/__init__.py b/src/easyscience/global_object/hugger/__init__.py index 867a21c4..f669fbb0 100644 --- a/src/easyscience/global_object/hugger/__init__.py +++ b/src/easyscience/global_object/hugger/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project +# SPDX-License-Identifier: BSD-3-Clause +# © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project bool: @staticmethod def _caller_name(skip: int = 2): """Get a name of a caller in the format module.class.method - `skip` specifies how many levels of stack to skip while getting caller - name. skip=1 means "who calls me", skip=2 "who calls my caller" etc. - An empty string is returned if skipped levels exceed stack height + `skip` specifies how many levels of stack to skip while getting + caller name. + + skip=1 means "who calls me", skip=2 "who calls my caller" etc. + An empty string is returned if skipped levels exceed stack + height https://gist.github.com/techtonik/2151727#gistcomment-2333747 """ diff --git a/src/easyscience/global_object/hugger/property.py b/src/easyscience/global_object/hugger/property.py index a18f913b..b5ef116b 100644 --- a/src/easyscience/global_object/hugger/property.py +++ b/src/easyscience/global_object/hugger/property.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project str: @@ -174,7 +178,9 @@ def patch_get(self, func: Callable) -> Callable: @wraps(func) def inner(*args, **kwargs): if global_object.debug: - print(f'{self.klass.__name__}.{self.prop_name} has been called with {args[1:]}, {kwargs}') + print( + f'{self.klass.__name__}.{self.prop_name} has been called with {args[1:]}, {kwargs}' + ) res = func(*args, **kwargs) self._append_args(*args, **kwargs) self._append_result(res) @@ -187,7 +193,9 @@ def patch_set(self, func: Callable) -> Callable: @wraps(func) def inner(*args, **kwargs): if global_object.debug: - print(f'{self.klass.__name__}.{self.prop_name} has been set with {args[1:]}, {kwargs}') + print( + f'{self.klass.__name__}.{self.prop_name} has been set with {args[1:]}, {kwargs}' + ) self._append_args(*args, **kwargs) self._append_log(self.makeEntry('set', None, *args, **kwargs)) return func(*args, **kwargs) diff --git a/src/easyscience/global_object/logger.py b/src/easyscience/global_object/logger.py index f4fa3a42..bdc4da93 100644 --- a/src/easyscience/global_object/logger.py +++ b/src/easyscience/global_object/logger.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project logging: - """ - Create a logger - :param color: + """Create a logger :param color: + :param logger_name: logger name. Usually __name__ on creation - :param defaults: Do you want to associate any current file loggers with this logger + :param defaults: Do you want to associate any current file + loggers with this logger :return: A logger """ logger = logging.getLogger(logger_name) diff --git a/src/easyscience/global_object/map.py b/src/easyscience/global_object/map.py index a9d0b576..e3e10699 100644 --- a/src/easyscience/global_object/map.py +++ b/src/easyscience/global_object/map.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project List[str]: """Returns the vertices of a map. Uses a retry loop to handle RuntimeError that can occur when the - WeakValueDictionary is modified during iteration (e.g., by garbage collection). + WeakValueDictionary is modified during iteration (e.g., by + garbage collection). """ while True: try: @@ -102,7 +105,7 @@ def vertices(self) -> List[str]: continue def edges(self): - """returns the edges of a map""" + """Returns the edges of a map.""" return self.__generate_edges() @property @@ -186,10 +189,10 @@ def get_edges(self, start_obj) -> List[str]: raise AttributeError def __generate_edges(self) -> list: - """A static method generating the edges of the - map. Edges are represented as sets - with one (a loop back to the vertex) or two - vertices + """A static method generating the edges of the map. + + Edges are represented as sets with one (a loop back to the + vertex) or two vertices """ edges = [] # Iterate over a snapshot of items and snapshot neighbour lists to @@ -221,7 +224,7 @@ def prune(self, key: str): del self._store[key] def find_isolated_vertices(self) -> list: - """returns a list of isolated vertices.""" + """Returns a list of isolated vertices.""" isolated = [] for vertex, neighbours in self._snapshot_items(): if not list(neighbours): @@ -229,8 +232,7 @@ def find_isolated_vertices(self) -> list: return isolated def find_path(self, start_vertex: str, end_vertex: str, path=[]) -> list: - """find a path from start_vertex to end_vertex - in map""" + """Find a path from start_vertex to end_vertex in map.""" graph = self.__type_dict path = path + [start_vertex] @@ -246,8 +248,7 @@ def find_path(self, start_vertex: str, end_vertex: str, path=[]) -> list: return [] def find_all_paths(self, start_vertex: str, end_vertex: str, path=[]) -> list: - """find all paths from start_vertex to - end_vertex in map""" + """Find all paths from start_vertex to end_vertex in map.""" graph = self.__type_dict path = path + [start_vertex] @@ -264,9 +265,11 @@ def find_all_paths(self, start_vertex: str, end_vertex: str, path=[]) -> list: return paths def reverse_route(self, end_vertex: str, start_vertex: Optional[str] = None) -> List: - """ - In this case we have an object and want to know the connections to get to another in reverse. - We might not know the start_object. In which case we follow the shortest path to a base vertex. + """In this case we have an object and want to know the + connections to get to another in reverse. + + We might not know the start_object. In which case we follow the + shortest path to a base vertex. :param end_obj: :type end_obj: :param start_obj: @@ -291,7 +294,7 @@ def reverse_route(self, end_vertex: str, start_vertex: Optional[str] = None) -> return optimum_path def is_connected(self, vertices_encountered=None, start_vertex=None) -> bool: - """determines if the map is connected""" + """Determines if the map is connected.""" if vertices_encountered is None: vertices_encountered = set() graph = self.__type_dict @@ -302,14 +305,19 @@ def is_connected(self, vertices_encountered=None, start_vertex=None) -> bool: vertices_encountered.add(start_vertex) if len(vertices_encountered) != len(vertices): for vertex in list(graph[start_vertex]): - if vertex not in vertices_encountered and self.is_connected(vertices_encountered, vertex): + if vertex not in vertices_encountered and self.is_connected( + vertices_encountered, vertex + ): return True else: return True return False def _clear(self): - """Reset the map to an empty state. Only to be used for testing""" + """Reset the map to an empty state. + + Only to be used for testing + """ self._store.clear() self.__type_dict.clear() gc.collect() diff --git a/src/easyscience/global_object/undo_redo.py b/src/easyscience/global_object/undo_redo.py index 7317ec23..667afb41 100644 --- a/src/easyscience/global_object/undo_redo.py +++ b/src/easyscience/global_object/undo_redo.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project None: self._obj = obj @@ -29,15 +28,11 @@ def __init__(self, obj) -> None: @abc.abstractmethod def undo(self) -> NoReturn: - """ - Undo implementation which should be overwritten - """ + """Undo implementation which should be overwritten.""" @abc.abstractmethod def redo(self) -> NoReturn: - """ - Redo implementation which should be overwritten - """ + """Redo implementation which should be overwritten.""" @property def text(self) -> str: @@ -68,8 +63,9 @@ def inner(obj, *args, **kwargs): class NotarizedDict(UserDict): - """ - A simple dict drop in for EasyScience group classes. This is used as it wraps the get/set methods + """A simple dict drop in for EasyScience group classes. + + This is used as it wraps the get/set methods """ def __init__(self, **kwargs): @@ -101,8 +97,8 @@ def reorder(self, **kwargs): class CommandHolder: - """ - A holder for one or more commands which are added to the stack + """A holder for one or more commands which are added to the + stack. """ def __init__(self, text: str = None): @@ -149,9 +145,7 @@ def text(self, text: str): class UndoStack: - """ - Implement a version of QUndoStack without the QT - """ + """Implement a version of QUndoStack without the QT.""" def __init__(self, max_history: Union[int, type(None)] = None): self._history = deque(maxlen=max_history) @@ -183,9 +177,7 @@ def future(self) -> deque: return self._future def push(self, command: T_) -> NoReturn: - """ - Add a command to the history stack - """ + """Add a command to the history stack.""" # If we're not enabled, then what are we doing! if not self.enabled or self._command_running: # Do the command and leave. @@ -220,17 +212,13 @@ def pop(self) -> T_: return popped def clear(self) -> None: # NoReturn: - """ - Remove any commands on the stack and reset the state - """ + """Remove any commands on the stack and reset the state.""" self._history = deque(maxlen=self._max_history) self._future = deque(maxlen=self._max_history) self._macro_running = False def undo(self) -> NoReturn: - """ - Undo the last change to the stack - """ + """Undo the last change to the stack.""" if self.canUndo(): # Move the command from the past to the future this_command_stack = self._history.popleft() @@ -247,9 +235,7 @@ def undo(self) -> NoReturn: self._command_running = False def redo(self) -> NoReturn: - """ - Redo the last `undo` command on the stack - """ + """Redo the last `undo` command on the stack.""" if self.canRedo(): # Move from the future to the past this_command_stack = self._future.popleft() @@ -267,8 +253,8 @@ def redo(self) -> NoReturn: self._command_running = False def beginMacro(self, text: str) -> NoReturn: - """ - Start a bulk update i.e. multiple commands under one undo/redo command + """Start a bulk update i.e. multiple commands under one + undo/redo command. """ if self._macro_running: raise AssertionError('Cannot start a macro when one is already running') @@ -277,38 +263,30 @@ def beginMacro(self, text: str) -> NoReturn: self._macro_running = True def endMacro(self) -> NoReturn: - """ - End a bulk update i.e. multiple commands under one undo/redo command + """End a bulk update i.e. multiple commands under one undo/redo + command. """ if not self._macro_running: raise AssertionError('Cannot end a macro when one is not running') self._macro_running = False def canUndo(self) -> bool: - """ - Can the last command be undone? - """ + """Can the last command be undone?""" return len(self._history) > 0 and not self._macro_running def canRedo(self) -> bool: - """ - Can we redo a command? - """ + """Can we redo a command?""" return len(self._future) > 0 and not self._macro_running def redoText(self) -> str: - """ - Text associated with a redo item. - """ + """Text associated with a redo item.""" text = '' if self.canRedo(): text = self.future[0].text return text def undoText(self) -> str: - """ - Text associated with a undo item. - """ + """Text associated with a undo item.""" text = '' if self.canUndo(): text = self.history[0].text @@ -316,9 +294,7 @@ def undoText(self) -> str: class PropertyStack(UndoCommand): - """ - Stack operator for when a property setter is wrapped. - """ + """Stack operator for when a property setter is wrapped.""" def __init__(self, parent, func: Callable, old_value: Any, new_value: Any, text: str = None): # self.setText("Setting {} to {}".format(func.__name__, new_value)) diff --git a/src/easyscience/io/__init__.py b/src/easyscience/io/__init__.py index b21e648c..23cf474b 100644 --- a/src/easyscience/io/__init__.py +++ b/src/easyscience/io/__init__.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project any: - """ - Abstract implementation of an encoder. + """Abstract implementation of an encoder. :param obj: Object to be encoded. - :param skip: List of field names as strings to skip when forming the encoded object - :param kwargs: Any additional key word arguments to be passed to the encoder - :return: encoded object containing all information to reform an EasyScience object. + :param skip: List of field names as strings to skip when forming + the encoded object + :param kwargs: Any additional key word arguments to be passed to + the encoder + :return: encoded object containing all information to reform an + EasyScience object. """ pass @@ -50,8 +55,8 @@ def encode(self, obj: SerializerComponent, skip: Optional[List[str]] = None, **k @classmethod @abstractmethod def decode(cls, obj: Any) -> Any: - """ - Re-create an EasyScience object from the output of an encoder. The default decoder is `SerializerDict`. + """Re-create an EasyScience object from the output of an + encoder. The default decoder is `SerializerDict`. :param obj: encoded EasyScience object :return: Reformed EasyScience object @@ -60,8 +65,8 @@ def decode(cls, obj: Any) -> Any: @staticmethod def get_arg_spec(func: Callable) -> Tuple[Any, List[str]]: - """ - Get the full argument specification of a function (typically `__init__`) + """Get the full argument specification of a function (typically + `__init__`) :param func: Function to be inspected :return: Tuple of argument spec and arguments @@ -73,8 +78,7 @@ def get_arg_spec(func: Callable) -> Tuple[Any, List[str]]: @staticmethod def _encode_objs(obj: Any) -> Dict[str, Any]: - """ - A JSON serializable dict representation of an object. + """A JSON serializable dict representation of an object. :param obj: any object to be encoded :param skip: List of field names as strings to skip when forming the encoded object @@ -117,9 +121,7 @@ def _convert_to_dict( full_encode: bool = False, **kwargs, ) -> dict: - """ - A JSON serializable dict representation of an object. - """ + """A JSON serializable dict representation of an object.""" if skip is None: skip = [] @@ -189,7 +191,9 @@ def runner(o): 'determine the dict format. Alternatively, ' 'you can implement both as_dict and from_dict.' ) - d[c] = self._recursive_encoder(a, skip=skip, encoder=self, full_encode=full_encode, **kwargs) + d[c] = self._recursive_encoder( + a, skip=skip, encoder=self, full_encode=full_encode, **kwargs + ) if spec.varargs is not None and getattr(obj, spec.varargs, None) is not None: d.update({spec.varargs: getattr(obj, spec.varargs)}) if hasattr(obj, '_kwargs'): @@ -223,12 +227,11 @@ def runner(o): @staticmethod def _convert_from_dict(d): - """ - Recursive method to support decoding dicts and lists containing EasyScience objects + """Recursive method to support decoding dicts and lists + containing EasyScience objects. :param d: Dictionary containing JSONed EasyScience objects :return: Reformed EasyScience object - """ T_ = type(d) if isinstance(d, dict): @@ -249,7 +252,11 @@ def _convert_from_dict(d): mod = __import__(modname, globals(), locals(), [classname], 0) if hasattr(mod, classname): cls_ = getattr(mod, classname) - data = {k: SerializerBase._convert_from_dict(v) for k, v in d.items() if not k.startswith('@')} + data = { + k: SerializerBase._convert_from_dict(v) + for k, v in d.items() + if not k.startswith('@') + } return cls_(**data) elif np is not None and modname == 'numpy' and classname == 'array': if d['dtype'].startswith('complex'): @@ -262,20 +269,24 @@ def _convert_from_dict(d): @staticmethod def deserialize_dict(in_dict: Dict[str, Any]) -> Dict[str, Any]: - """ - Deserialize a dictionary using from_dict for ES objects and SerializerBase otherwise. - This method processes constructor arguments, skipping metadata keys starting with '@'. + """Deserialize a dictionary using from_dict for ES objects and + SerializerBase otherwise. This method processes constructor + arguments, skipping metadata keys starting with '@'. :param in_dict: dictionary to deserialize :return: deserialized dictionary with constructor arguments """ - d = {key: SerializerBase._deserialize_value(value) for key, value in in_dict.items() if not key.startswith('@')} + d = { + key: SerializerBase._deserialize_value(value) + for key, value in in_dict.items() + if not key.startswith('@') + } return d @staticmethod def _deserialize_value(value: Any) -> Any: - """ - Deserialize a single value, using specialized handling for ES objects. + """Deserialize a single value, using specialized handling for ES + objects. :param value: :return: deserialized value @@ -301,18 +312,21 @@ def _deserialize_value(value: Any) -> Any: @staticmethod def _is_serialized_easyscience_object(value: Any) -> bool: - """ - Check if a value represents a serialized ES object. + """Check if a value represents a serialized ES object. :param value: :return: True if this is a serialized ES object """ - return isinstance(value, dict) and '@module' in value and value['@module'].startswith('easy') and '@class' in value + return ( + isinstance(value, dict) + and '@module' in value + and value['@module'].startswith('easy') + and '@class' in value + ) @staticmethod def _import_class(module_name: str, class_name: str): - """ - Import a class from a module name and class name. + """Import a class from a module name and class name. :param module_name: name of the module :param class_name: name of the class @@ -330,24 +344,33 @@ def _import_class(module_name: str, class_name: str): return getattr(module, class_name) - def _recursive_encoder(self, obj, skip: List[str] = [], encoder=None, full_encode=False, **kwargs): - """ - Walk through an object encoding it - """ + def _recursive_encoder( + self, obj, skip: List[str] = [], encoder=None, full_encode=False, **kwargs + ): + """Walk through an object encoding it.""" if encoder is None: encoder = SerializerBase() T_ = type(obj) if issubclass(T_, (list, tuple, MutableSequence)): # Is it a core MutableSequence? - if hasattr(obj, 'encode') and obj.__class__.__module__ != 'builtins': # strings have encode + if ( + hasattr(obj, 'encode') and obj.__class__.__module__ != 'builtins' + ): # strings have encode return encoder._convert_to_dict(obj, skip, full_encode, **kwargs) elif hasattr(obj, 'to_dict') and obj.__class__.__module__.startswith('easy'): return encoder._convert_to_dict(obj, skip, full_encode, **kwargs) else: - return [self._recursive_encoder(it, skip, encoder, full_encode, **kwargs) for it in obj] + return [ + self._recursive_encoder(it, skip, encoder, full_encode, **kwargs) for it in obj + ] if isinstance(obj, dict): - return {kk: self._recursive_encoder(vv, skip, encoder, full_encode, **kwargs) for kk, vv in obj.items()} - if hasattr(obj, 'encode') and obj.__class__.__module__ != 'builtins': # strings have encode + return { + kk: self._recursive_encoder(vv, skip, encoder, full_encode, **kwargs) + for kk, vv in obj.items() + } + if ( + hasattr(obj, 'encode') and obj.__class__.__module__ != 'builtins' + ): # strings have encode return encoder._convert_to_dict(obj, skip, full_encode, **kwargs) elif hasattr(obj, 'to_dict') and obj.__class__.__module__.startswith('easy'): return encoder._convert_to_dict(obj, skip, full_encode, **kwargs) diff --git a/src/easyscience/io/serializer_component.py b/src/easyscience/io/serializer_component.py index 85da9961..e67dbb99 100644 --- a/src/easyscience/io/serializer_component.py +++ b/src/easyscience/io/serializer_component.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project Any: - """ - Use an encoder to covert an EasyScience object into another format. Default is to a dictionary using `SerializerDict`. + def encode( + self, skip: Optional[List[str]] = None, encoder: Optional[SerializerBase] = None, **kwargs + ) -> Any: + """Use an encoder to covert an EasyScience object into another + format. Default is to a dictionary using `SerializerDict`. :param skip: List of field names as strings to skip when forming the encoded object :param encoder: The encoder to be used for encoding the data. Default is `SerializerDict` @@ -44,11 +47,12 @@ def encode(self, skip: Optional[List[str]] = None, encoder: Optional[SerializerB @classmethod def decode(cls, obj: Any, decoder: Optional[SerializerBase] = None) -> Any: - """ - Re-create an EasyScience object from the output of an encoder. The default decoder is `SerializerDict`. + """Re-create an EasyScience object from the output of an + encoder. The default decoder is `SerializerDict`. :param obj: encoded EasyScience object - :param decoder: decoder to be used to reform the EasyScience object + :param decoder: decoder to be used to reform the EasyScience + object :return: Reformed EasyScience object """ @@ -57,20 +61,22 @@ def decode(cls, obj: Any, decoder: Optional[SerializerBase] = None) -> Any: return decoder.decode(obj) def as_dict(self, skip: Optional[List[str]] = None) -> Dict[str, Any]: - """ - Convert an EasyScience object into a full dictionary using `SerializerDict`. - This is a shortcut for ```obj.encode(encoder=SerializerDict)``` - - :param skip: List of field names as strings to skip when forming the dictionary - :return: encoded object containing all information to reform an EasyScience object. + """Convert an EasyScience object into a full dictionary using + `SerializerDict`. This is a shortcut for + ```obj.encode(encoder=SerializerDict)``` + + :param skip: List of field names as strings to skip when forming + the dictionary + :return: encoded object containing all information to reform an + EasyScience object. """ return self.encode(skip=skip, encoder=SerializerDict) @classmethod def from_dict(cls, obj_dict: Dict[str, Any]) -> None: - """ - Re-create an EasyScience object from a full encoded dictionary. + """Re-create an EasyScience object from a full encoded + dictionary. :param obj_dict: dictionary containing the serialized contents (from `SerializerDict`) of an EasyScience object :return: Reformed EasyScience object diff --git a/src/easyscience/io/serializer_dict.py b/src/easyscience/io/serializer_dict.py index 8fe423c1..2a9ae1d5 100644 --- a/src/easyscience/io/serializer_dict.py +++ b/src/easyscience/io/serializer_dict.py @@ -1,9 +1,10 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from __future__ import annotations __author__ = 'https://github.com/materialsvirtuallab/monty/blob/master/monty/json.py' __version__ = '3.0.0' -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause # © 2021-2025 Contributors to the EasyScience project SerializerComponent: - """ - Re-create an EasyScience object from the dictionary representation. + """Re-create an EasyScience object from the dictionary + representation. :param d: Dict representation of an EasyScience object. :return: EasyScience object. diff --git a/src/easyscience/job/__init__.py b/src/easyscience/job/__init__.py index 5a1770f5..6b57432c 100644 --- a/src/easyscience/job/__init__.py +++ b/src/easyscience/job/__init__.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project +# SPDX-License-Identifier: BSD-3-Clause + from __future__ import annotations __author__ = 'https://github.com/materialsvirtuallab/monty/blob/master/monty/json.py' __version__ = '3.0.0' -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause # © 2021-2025 Contributors to the EasyScience project ComponentSerializer: class DataDictSerializer(DictSerializer): - """ - This is a serializer that can encode the data in an EasyScience object to a JSON encoded dictionary. + """This is a serializer that can encode the data in an EasyScience + object to a JSON encoded dictionary. """ def encode( @@ -75,13 +79,16 @@ def encode( full_encode: bool = False, **kwargs, ) -> Dict[str, Any]: - """ - Convert an EasyScience object to a JSON encoded data dictionary + """Convert an EasyScience object to a JSON encoded data + dictionary. :param obj: Object to be encoded. - :param skip: List of field names as strings to skip when forming the encoded object - :param full_encode: Should the data also be JSON encoded (default False) - :param kwargs: Any additional key word arguments to be passed to the encoder + :param skip: List of field names as strings to skip when forming + the encoded object + :param full_encode: Should the data also be JSON encoded + (default False) + :param kwargs: Any additional key word arguments to be passed to + the encoder :return: object encoded to data dictionary. """ @@ -96,18 +103,18 @@ def encode( @classmethod def decode(cls, d: Dict[str, Any]) -> ComponentSerializer: - """ - This function is not implemented as a data dictionary does not contain the necessary information to re-form an - EasyScience object. + """This function is not implemented as a data dictionary does + not contain the necessary information to re-form an EasyScience + object. """ - raise NotImplementedError('It is not possible to reconstitute objects from data only dictionary.') + raise NotImplementedError( + 'It is not possible to reconstitute objects from data only dictionary.' + ) @staticmethod def _parse_dict(in_dict: Dict[str, Any]) -> Dict[str, Any]: - """ - Strip out any non-data from a dictionary - """ + """Strip out any non-data from a dictionary.""" out_dict = dict() for key in in_dict.keys(): @@ -119,5 +126,8 @@ def _parse_dict(in_dict: Dict[str, Any]) -> Dict[str, Any]: if isinstance(in_dict[key], dict): out_dict[key] = DataDictSerializer._parse_dict(in_dict[key]) elif isinstance(in_dict[key], list): - out_dict[key] = [DataDictSerializer._parse_dict(x) if isinstance(x, dict) else x for x in in_dict[key]] + out_dict[key] = [ + DataDictSerializer._parse_dict(x) if isinstance(x, dict) else x + for x in in_dict[key] + ] return out_dict diff --git a/src/easyscience/legacy/json.py b/src/easyscience/legacy/json.py index 6464e52a..0df9e9e0 100644 --- a/src/easyscience/legacy/json.py +++ b/src/easyscience/legacy/json.py @@ -1,10 +1,11 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from __future__ import annotations __author__ = 'https://github.com/materialsvirtuallab/monty/blob/master/monty/json.py' __version__ = '3.0.0' -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause # © 2021-2025 Contributors to the EasyScience project str: - """ - Returns a json string representation of the ComponentSerializer object. + """Returns a json string representation of the + ComponentSerializer object. """ ENCODER = type( JsonEncoderTemplate.__name__, @@ -37,8 +38,8 @@ def decode(cls, data: str) -> ComponentSerializer: class JsonDataSerializer(BaseEncoderDecoder): def encode(self, obj: ComponentSerializer, skip: List[str] = []) -> str: - """ - Returns a json string representation of the ComponentSerializer object. + """Returns a json string representation of the + ComponentSerializer object. """ from .dict import DataDictSerializer @@ -57,13 +58,15 @@ def encode(self, obj: ComponentSerializer, skip: List[str] = []) -> str: @classmethod def decode(cls, data: str) -> ComponentSerializer: - raise NotImplementedError('It is not possible to reconstitute objects from data only objects.') + raise NotImplementedError( + 'It is not possible to reconstitute objects from data only objects.' + ) class JsonEncoderTemplate(json.JSONEncoder): - """ - A Json Encoder which supports the ComponentSerializer API, plus adds support for - numpy arrays, datetime objects, bson ObjectIds (requires bson). + """A Json Encoder which supports the ComponentSerializer API, plus + adds support for numpy arrays, datetime objects, bson ObjectIds + (requires bson). Usage:: @@ -92,13 +95,12 @@ def default(self, o) -> dict: # pylint: disable=E0202 class JsonDecoderTemplate(json.JSONDecoder): - """ - A Json Decoder which supports the ComponentSerializer API. By default, the - decoder attempts to find a module and name associated with a dict. If - found, the decoder will generate a Pymatgen as a priority. If that fails, - the original decoded dictionary from the string is returned. Note that - nested lists and dicts containing pymatgen object will be decoded correctly - as well. + """A Json Decoder which supports the ComponentSerializer API. By + default, the decoder attempts to find a module and name associated + with a dict. If found, the decoder will generate a Pymatgen as a + priority. If that fails, the original decoded dictionary from the + string is returned. Note that nested lists and dicts containing + pymatgen object will be decoded correctly as well. Usage: @@ -109,8 +111,7 @@ class JsonDecoderTemplate(json.JSONDecoder): _converter = BaseEncoderDecoder._convert_from_dict def decode(self, s): - """ - Overrides decode from JSONDecoder. + """Overrides decode from JSONDecoder. :param s: string :return: Object. diff --git a/src/easyscience/legacy/legacy_core.py b/src/easyscience/legacy/legacy_core.py index daddabee..c4c45a25 100644 --- a/src/easyscience/legacy/legacy_core.py +++ b/src/easyscience/legacy/legacy_core.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project Any: - """ - Use an encoder to covert an EasyScience object into another format. Default is to a dictionary using `DictSerializer`. + def encode( + self, + skip: Optional[List[str]] = None, + encoder: Optional[BaseEncoderDecoder] = None, + **kwargs, + ) -> Any: + """Use an encoder to covert an EasyScience object into another + format. Default is to a dictionary using `DictSerializer`. :param skip: List of field names as strings to skip when forming the encoded object :param encoder: The encoder to be used for encoding the data. Default is `DictSerializer` @@ -48,11 +57,12 @@ def encode(self, skip: Optional[List[str]] = None, encoder: Optional[BaseEncoder @classmethod def decode(cls, obj: Any, decoder: Optional[BaseEncoderDecoder] = None) -> Any: - """ - Re-create an EasyScience object from the output of an encoder. The default decoder is `DictSerializer`. + """Re-create an EasyScience object from the output of an + encoder. The default decoder is `DictSerializer`. :param obj: encoded EasyScience object - :param decoder: decoder to be used to reform the EasyScience object + :param decoder: decoder to be used to reform the EasyScience + object :return: Reformed EasyScience object """ @@ -61,20 +71,22 @@ def decode(cls, obj: Any, decoder: Optional[BaseEncoderDecoder] = None) -> Any: return decoder.decode(obj) def as_dict(self, skip: Optional[List[str]] = None) -> Dict[str, Any]: - """ - Convert an EasyScience object into a full dictionary using `DictSerializer`. - This is a shortcut for ```obj.encode(encoder=DictSerializer)``` - - :param skip: List of field names as strings to skip when forming the dictionary - :return: encoded object containing all information to reform an EasyScience object. + """Convert an EasyScience object into a full dictionary using + `DictSerializer`. This is a shortcut for + ```obj.encode(encoder=DictSerializer)``` + + :param skip: List of field names as strings to skip when forming + the dictionary + :return: encoded object containing all information to reform an + EasyScience object. """ return self.encode(skip=skip, encoder=DictSerializer) @classmethod def from_dict(cls, obj_dict: Dict[str, Any]) -> None: - """ - Re-create an EasyScience object from a full encoded dictionary. + """Re-create an EasyScience object from a full encoded + dictionary. :param obj_dict: dictionary containing the serialized contents (from `DictSerializer`) of an EasyScience object :return: Reformed EasyScience object @@ -82,9 +94,14 @@ def from_dict(cls, obj_dict: Dict[str, Any]) -> None: return cls.decode(obj_dict, decoder=DictSerializer) - def encode_data(self, skip: Optional[List[str]] = None, encoder: Optional[BaseEncoderDecoder] = None, **kwargs) -> Any: - """ - Returns just the data in an EasyScience object win the format specified by an encoder. + def encode_data( + self, + skip: Optional[List[str]] = None, + encoder: Optional[BaseEncoderDecoder] = None, + **kwargs, + ) -> Any: + """Returns just the data in an EasyScience object win the format + specified by an encoder. :param skip: List of field names as strings to skip when forming the dictionary :param encoder: The encoder to be used for encoding the data. Default is `DataDictSerializer` @@ -97,20 +114,23 @@ def encode_data(self, skip: Optional[List[str]] = None, encoder: Optional[BaseEn return self.encode(skip=skip, encoder=encoder, **kwargs) def as_data_dict(self, skip: Optional[List[str]] = None) -> Dict[str, Any]: - """ - Returns a dictionary containing just the data of an EasyScience object. + """Returns a dictionary containing just the data of an + EasyScience object. - :param skip: List of field names as strings to skip when forming the dictionary - :return: dictionary containing just the data of an EasyScience object. + :param skip: List of field names as strings to skip when forming + the dictionary + :return: dictionary containing just the data of an EasyScience + object. """ return self.encode(skip=skip, encoder=DataDictSerializer) def unsafe_hash(self) -> sha1: - """ - Returns an hash of the current object. This uses a generic but low - performance method of converting the object to a dictionary, flattening - any nested keys, and then performing a hash on the resulting object + """Returns an hash of the current object. + + This uses a generic but low performance method of converting the + object to a dictionary, flattening any nested keys, and then + performing a hash on the resulting object """ def flatten(obj, seperator='.'): @@ -119,9 +139,15 @@ def flatten(obj, seperator='.'): flat_dict = {} for key, value in obj.items(): if isinstance(value, dict): - flat_dict.update({seperator.join([key, _key]): _value for _key, _value in flatten(value).items()}) + flat_dict.update({ + seperator.join([key, _key]): _value + for _key, _value in flatten(value).items() + }) elif isinstance(value, list): - list_dict = {'{}{}{}'.format(key, seperator, num): item for num, item in enumerate(value)} + list_dict = { + '{}{}{}'.format(key, seperator, num): item + for num, item in enumerate(value) + } flat_dict.update(flatten(list_dict)) else: flat_dict[key] = value diff --git a/src/easyscience/legacy/xml.py b/src/easyscience/legacy/xml.py index e0898409..fedf3ca5 100644 --- a/src/easyscience/legacy/xml.py +++ b/src/easyscience/legacy/xml.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project str: - """ - Convert an EasyScience object to an XML encoded string. Note that for speed the `fast` setting can be changed to - `True`. An XML document with initial block *data* is returned. + """Convert an EasyScience object to an XML encoded string. Note + that for speed the `fast` setting can be changed to `True`. An + XML document with initial block *data* is returned. :param obj: Object to be encoded. - :param skip: List of field names as strings to skip when forming the encoded object + :param skip: List of field names as strings to skip when forming + the encoded object :param data_only: Should only the object's data be encoded. - :param fast: Should the returned string be pretty? This can be turned off for speed. - :param use_header: Should a header of `'?xml version="1.0" encoding="UTF-8"?'` be included? - :param kwargs: Any additional key-words to pass to the Dictionary Serializer. + :param fast: Should the returned string be pretty? This can be + turned off for speed. + :param use_header: Should a header of `'?xml version="1.0" + encoding="UTF-8"?'` be included? + :param kwargs: Any additional key-words to pass to the + Dictionary Serializer. :return: string containing the XML encoded object """ @@ -74,8 +79,8 @@ def encode( @classmethod def decode(cls, data: str) -> ComponentSerializer: - """ - Decode an EasyScience object which has been encoded in XML format. + """Decode an EasyScience object which has been encoded in XML + format. :param data: String containing XML encoded data. :return: Reformed EasyScience object. @@ -89,9 +94,7 @@ def decode(cls, data: str) -> ComponentSerializer: @staticmethod def _element_to_dict(element, out_dict): - """ - Convert an XML element to a dictionary recursively. - """ + """Convert an XML element to a dictionary recursively.""" label = element.tag if label[0] == '_': @@ -113,9 +116,7 @@ def _element_to_dict(element, out_dict): @staticmethod def string_to_variable(in_string: str): - """ - Convert an XML encoded string to JSON form. - """ + """Convert an XML encoded string to JSON form.""" if in_string is None: return in_string in_string = in_string.strip() @@ -137,8 +138,8 @@ def string_to_variable(in_string: str): return value def _check_class(self, element, key: str, value: Any, skip: Optional[List[str]] = None): - """ - Add a value to an element or create a new element based on input type. + """Add a value to an element or create a new element based on + input type. """ T_ = type(value) if isinstance(value, dict): diff --git a/src/easyscience/models/__init__.py b/src/easyscience/models/__init__.py index a9aed973..c6db2e37 100644 --- a/src/easyscience/models/__init__.py +++ b/src/easyscience/models/__init__.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project = 2: s += [f'{self.coefficients[1].value}x'] if len(self.coefficients) >= 3: - s += [f'{c.value}x^{i + 2}' for i, c in enumerate(self.coefficients[2:]) if c.value != 0] + s += [ + f'{c.value}x^{i + 2}' + for i, c in enumerate(self.coefficients[2:]) + if c.value != 0 + ] s.reverse() s = ' + '.join(s) return 'Polynomial({}, {})'.format(self.name, s) diff --git a/src/easyscience/utils/__init__.py b/src/easyscience/utils/__init__.py index 462d95af..f669fbb0 100644 --- a/src/easyscience/utils/__init__.py +++ b/src/easyscience/utils/__init__.py @@ -1,3 +1,4 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project +# SPDX-License-Identifier: BSD-3-Clause + from .descriptor_any_type import DescriptorAnyType from .descriptor_array import DescriptorArray from .descriptor_base import DescriptorBase diff --git a/src/easyscience/variable/descriptor_any_type.py b/src/easyscience/variable/descriptor_any_type.py index c00ccb01..24879569 100644 --- a/src/easyscience/variable/descriptor_any_type.py +++ b/src/easyscience/variable/descriptor_any_type.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from __future__ import annotations import numbers @@ -15,9 +18,11 @@ class DescriptorAnyType(DescriptorBase): - """ - A `Descriptor` for any type that does not fit the other Descriptors. Should be avoided when possible. - It was created to hold the symmetry operations used in the SpaceGroup class of EasyCrystallography. + """A `Descriptor` for any type that does not fit the other + Descriptors. + + Should be avoided when possible. It was created to hold the symmetry + operations used in the SpaceGroup class of EasyCrystallography. """ def __init__( @@ -30,7 +35,7 @@ def __init__( display_name: Optional[str] = None, parent: Optional[Any] = None, ): - """Constructor for the DescriptorAnyType class + """Constructor for the DescriptorAnyType class. param name: Name of the descriptor param value: Value of the descriptor @@ -54,8 +59,7 @@ def __init__( @property def value(self) -> numbers.Number: - """ - Get the value. + """Get the value. :return: Value of self. """ @@ -64,8 +68,7 @@ def value(self) -> numbers.Number: @value.setter @property_stack def value(self, value: Union[list, np.ndarray]) -> None: - """ - Set the value of self. + """Set the value of self. :param value: New value for the DescriptorAnyType. """ @@ -75,8 +78,8 @@ def __copy__(self) -> DescriptorAnyType: return super().__copy__() def __repr__(self) -> str: - """ - Return a string representation of the DescriptorAnyType, showing its name and value. + """Return a string representation of the DescriptorAnyType, + showing its name and value. """ if hasattr(self._value, '__repr__'): diff --git a/src/easyscience/variable/descriptor_array.py b/src/easyscience/variable/descriptor_array.py index 9e9b8e6f..0965574a 100644 --- a/src/easyscience/variable/descriptor_array.py +++ b/src/easyscience/variable/descriptor_array.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from __future__ import annotations import numbers @@ -23,8 +26,9 @@ class DescriptorArray(DescriptorBase): - """ - A `Descriptor` for Array values with units. The internal representation is a scipp array. + """A `Descriptor` for Array values with units. + + The internal representation is a scipp array. """ def __init__( @@ -40,7 +44,7 @@ def __init__( parent: Optional[Any] = None, dimensions: Optional[list] = None, ): - """Constructor for the DescriptorArray class + """Constructor for the DescriptorArray class. param name: Name of the descriptor param value: List containing the values of the descriptor @@ -72,13 +76,17 @@ def __init__( variance = np.astype(variance, 'float') if not isinstance(unit, sc.Unit) and not isinstance(unit, str): - raise TypeError(f'{unit=} must be a scipp unit or a string representing a valid scipp unit') + raise TypeError( + f'{unit=} must be a scipp unit or a string representing a valid scipp unit' + ) if dimensions is None: # Autogenerate dimensions if not supplied dimensions = ['dim' + str(i) for i in range(len(value.shape))] if not len(dimensions) == len(value.shape): - raise ValueError(f'Length of dimensions ({dimensions=}) does not match length of value {value=}.') + raise ValueError( + f'Length of dimensions ({dimensions=}) does not match length of value {value=}.' + ) self._dimensions = dimensions try: @@ -104,8 +112,7 @@ def __init__( @classmethod def from_scipp(cls, name: str, full_value: Variable, **kwargs) -> DescriptorArray: - """ - Create a DescriptorArray from a scipp array. + """Create a DescriptorArray from a scipp array. :param name: Name of the descriptor :param full_value: Value of the descriptor as a scipp variable @@ -125,8 +132,8 @@ def from_scipp(cls, name: str, full_value: Variable, **kwargs) -> DescriptorArra @property def full_value(self) -> Variable: - """ - Get the value of self as a scipp array. This should be usable for most cases. + """Get the value of self as a scipp array. This should be usable + for most cases. :return: Value of self with unit. """ @@ -140,8 +147,8 @@ def full_value(self, full_value: Variable) -> None: @property def value(self) -> numbers.Number: - """ - Get the value without units. The Scipp array can be obtained from `obj.full_value`. + """Get the value without units. The Scipp array can be obtained + from `obj.full_value`. :return: Value of self without unit. """ @@ -150,11 +157,12 @@ def value(self) -> numbers.Number: @value.setter @property_stack def value(self, value: Union[list, np.ndarray]) -> None: - """ - Set the value of self. Ensures the input is an array and matches the shape of the existing array. - The full value can be obtained from `obj.full_value`. + """Set the value of self. Ensures the input is an array and + matches the shape of the existing array. The full value can be + obtained from `obj.full_value`. - :param value: New value for the DescriptorArray, must be a list or numpy array. + :param value: New value for the DescriptorArray, must be a list + or numpy array. """ if not isinstance(value, (list, np.ndarray)): raise TypeError(f'{value=} must be a list or numpy array.') @@ -169,8 +177,7 @@ def value(self, value: Union[list, np.ndarray]) -> None: @property def dimensions(self) -> list: - """ - Get the dimensions used for the underlying scipp array. + """Get the dimensions used for the underlying scipp array. :return: dimensions of self. """ @@ -178,8 +185,8 @@ def dimensions(self) -> list: @dimensions.setter def dimensions(self, dimensions: Union[list]) -> None: - """ - Set the dimensions of self. Ensures that the input has a shape compatible with self.full_value. + """Set the dimensions of self. Ensures that the input has a + shape compatible with self.full_value. :param value: list of dimensions. """ @@ -191,14 +198,15 @@ def dimensions(self, dimensions: Union[list]) -> None: self._dimensions = dimensions # Also rename the dims of the scipp array - rename_dict = {old_dim: new_dim for (old_dim, new_dim) in zip(self.full_value.dims, dimensions)} + rename_dict = { + old_dim: new_dim for (old_dim, new_dim) in zip(self.full_value.dims, dimensions) + } renamed_array = self._array.rename_dims(rename_dict) self._array = renamed_array @property def unit(self) -> str: - """ - Get the unit. + """Get the unit. :return: Unit as a string. """ @@ -215,8 +223,7 @@ def unit(self, unit_str: str) -> None: @property def variance(self) -> np.ndarray: - """ - Get the variance as a Numpy ndarray. + """Get the variance as a Numpy ndarray. :return: variance. """ @@ -225,16 +232,19 @@ def variance(self) -> np.ndarray: @variance.setter @property_stack def variance(self, variance: Union[list, np.ndarray]) -> None: - """ - Set the variance of self. Ensures the input is an array and matches the shape of the existing values. + """Set the variance of self. Ensures the input is an array and + matches the shape of the existing values. - :param variance: New variance for the DescriptorArray, must be a list or numpy array. + :param variance: New variance for the DescriptorArray, must be a + list or numpy array. """ if variance is not None: if not isinstance(variance, (list, np.ndarray)): raise TypeError(f'{variance=} must be a list or numpy array.') if isinstance(variance, list): - variance = np.array(variance) # Convert lists to numpy arrays for consistent handling. + variance = np.array( + variance + ) # Convert lists to numpy arrays for consistent handling. if variance.shape != self._array.shape: raise ValueError(f'{variance=} must have the same shape as the array values.') @@ -247,10 +257,11 @@ def variance(self, variance: Union[list, np.ndarray]) -> None: @property def error(self) -> Optional[np.ndarray]: - """ - The standard deviations, calculated as the square root of variances. + """The standard deviations, calculated as the square root of + variances. - :return: A numpy array of standard deviations, or None if variances are not set. + :return: A numpy array of standard deviations, or None if + variances are not set. """ if self._array.variances is None: return None @@ -259,8 +270,8 @@ def error(self) -> Optional[np.ndarray]: @error.setter @property_stack def error(self, error: Union[list, np.ndarray]) -> None: - """ - Set the standard deviation for the parameter, which updates the variances. + """Set the standard deviation for the parameter, which updates + the variances. :param error: A list or numpy array of standard deviations. """ @@ -282,8 +293,7 @@ def error(self, error: Union[list, np.ndarray]) -> None: self._array.variances = None def convert_unit(self, unit_str: str) -> None: - """ - Convert the value from one unit system to another. + """Convert the value from one unit system to another. :param unit_str: New unit in string form """ @@ -306,21 +316,22 @@ def set_array(obj, scalar): # Push to undo stack self._global_object.stack.push( - PropertyStack(self, set_array, old_array, new_array, text=f'Convert unit to {unit_str}') + PropertyStack( + self, set_array, old_array, new_array, text=f'Convert unit to {unit_str}' + ) ) # Update the array self._array = new_array def __copy__(self) -> DescriptorArray: - """ - Return a copy of the current DescriptorArray. - """ + """Return a copy of the current DescriptorArray.""" return super().__copy__() def __repr__(self) -> str: - """ - Return a string representation of the DescriptorArray, showing its name, value, variance, and unit. + """Return a string representation of the DescriptorArray, + showing its name, value, variance, and unit. + Large arrays are summarized for brevity. """ # Base string with name @@ -355,9 +366,10 @@ def __repr__(self) -> str: return string def as_dict(self, skip: Optional[List[str]] = None) -> Dict[str, Any]: - """ - Dict representation of the current DescriptorArray. The dict contains the value, unit and variances, - in addition to the properties of DescriptorBase. + """Dict representation of the current DescriptorArray. + + The dict contains the value, unit and variances, in addition to + the properties of DescriptorBase. """ raw_dict = super().as_dict(skip=skip) raw_dict['value'] = self._array.values @@ -372,13 +384,16 @@ def _apply_operation( operation: Callable, units_must_match: bool = True, ) -> DescriptorArray: - """ - Perform element-wise operations with another DescriptorNumber, DescriptorArray, list, or number. + """Perform element-wise operations with another + DescriptorNumber, DescriptorArray, list, or number. - :param other: The object to operate on. Must be a DescriptorArray or DescriptorNumber with compatible units, - or a list with the same shape if the DescriptorArray is dimensionless. + :param other: The object to operate on. Must be a + DescriptorArray or DescriptorNumber with compatible units, + or a list with the same shape if the DescriptorArray is + dimensionless. :param operation: The operation to perform - :return: A new DescriptorArray representing the result of the operation. + :return: A new DescriptorArray representing the result of the + operation. """ if isinstance(other, numbers.Number): # Does not need to be dimensionless for multiplication and division @@ -392,10 +407,14 @@ def _apply_operation( # Ensure dimensions match if np.shape(other) != self._array.values.shape: - raise ValueError(f'Shape of {other=} must match the shape of DescriptorArray values') + raise ValueError( + f'Shape of {other=} must match the shape of DescriptorArray values' + ) other = sc.array(dims=self._array.dims, values=other) - new_full_value = operation(self._array, other) # Let scipp handle operation for uncertainty propagation + new_full_value = operation( + self._array, other + ) # Let scipp handle operation for uncertainty propagation elif isinstance(other, DescriptorNumber): try: @@ -403,7 +422,9 @@ def _apply_operation( other_converted.convert_unit(self.unit) except UnitError: if units_must_match: - raise UnitError(f'Values with units {self.unit} and {other.unit} are not compatible') from None + raise UnitError( + f'Values with units {self.unit} and {other.unit} are not compatible' + ) from None # Operations with a DescriptorNumber that has a variance WILL introduce # correlations between the elements of the DescriptorArray. # See, https://content.iospress.com/articles/journal-of-neutron-research/jnr220049 @@ -418,7 +439,9 @@ def _apply_operation( UserWarning, ) # Cheeky copy() of broadcasted scipp array to force scipp to perform the broadcast here - broadcasted = sc.broadcast(other_converted.full_value, dims=self._array.dims, shape=self._array.shape).copy() + broadcasted = sc.broadcast( + other_converted.full_value, dims=self._array.dims, shape=self._array.shape + ).copy() new_full_value = operation(self.full_value, broadcasted) elif isinstance(other, DescriptorArray): @@ -427,7 +450,9 @@ def _apply_operation( other_converted.convert_unit(self.unit) except UnitError: if units_must_match: - raise UnitError(f'Values with units {self.unit} and {other.unit} are incompatible') from None + raise UnitError( + f'Values with units {self.unit} and {other.unit} are incompatible' + ) from None # Ensure dimensions match if self.full_value.dims != other_converted.full_value.dims: @@ -451,8 +476,9 @@ def _rapply_operation( operation: Callable, units_must_match: bool = True, ) -> DescriptorArray: - """ - Handle reverse operations for DescriptorArrays, DescriptorNumbers, lists, and scalars. + """Handle reverse operations for DescriptorArrays, + DescriptorNumbers, lists, and scalars. + Ensures unit compatibility when `other` is a DescriptorNumber. """ @@ -470,7 +496,9 @@ def reversed_operation(a, b): # the units for mul/div, but if the conversion # fails it's no big deal. if units_must_match: - raise UnitError(f'Values with units {self.unit} and {other.unit} are incompatible') from None + raise UnitError( + f'Values with units {self.unit} and {other.unit} are incompatible' + ) from None result = self._apply_operation(other, reversed_operation, units_must_match) # Revert `self` to its original unit self.convert_unit(original_unit) @@ -480,45 +508,59 @@ def reversed_operation(a, b): return self._apply_operation(other, reversed_operation, units_must_match) def __array_ufunc__(self, ufunc, method, *inputs, **kwargs): - """ - DescriptorArray does not generally support Numpy array functions. - For example, `np.argwhere(descriptorArray: DescriptorArray)` should fail. - Modify this function if you want to add such functionality. + """DescriptorArray does not generally support Numpy array + functions. + + For example, `np.argwhere(descriptorArray: DescriptorArray)` + should fail. Modify this function if you want to add such + functionality. """ return NotImplemented def __array_function__(self, func, types, args, kwargs): - """ - DescriptorArray does not generally support Numpy array functions. - For example, `np.argwhere(descriptorArray: DescriptorArray)` should fail. - Modify this function if you want to add such functionality. + """DescriptorArray does not generally support Numpy array + functions. + + For example, `np.argwhere(descriptorArray: DescriptorArray)` + should fail. Modify this function if you want to add such + functionality. """ return NotImplemented - def __add__(self, other: Union[DescriptorArray, DescriptorNumber, list, numbers.Number]) -> DescriptorArray: - """ - Perform element-wise addition with another DescriptorNumber, DescriptorArray, list, or number. + def __add__( + self, other: Union[DescriptorArray, DescriptorNumber, list, numbers.Number] + ) -> DescriptorArray: + """Perform element-wise addition with another DescriptorNumber, + DescriptorArray, list, or number. - :param other: The object to add. Must be a DescriptorArray or DescriptorNumber with compatible units, - or a list with the same shape if the DescriptorArray is dimensionless, or a number. - :return: A new DescriptorArray representing the result of the addition. + :param other: The object to add. Must be a DescriptorArray or + DescriptorNumber with compatible units, or a list with the + same shape if the DescriptorArray is dimensionless, or a + number. + :return: A new DescriptorArray representing the result of the + addition. """ return self._apply_operation(other, operator.add) def __radd__(self, other: Union[DescriptorNumber, list, numbers.Number]) -> DescriptorArray: - """ - Handle reverse addition for DescriptorArrays, DescriptorNumbers, lists, and scalars. + """Handle reverse addition for DescriptorArrays, + DescriptorNumbers, lists, and scalars. + Ensures unit compatibility when `other` is a DescriptorNumber. """ return self._rapply_operation(other, operator.add) - def __sub__(self, other: Union[DescriptorArray, list, np.ndarray, numbers.Number]) -> DescriptorArray: - """ - Perform element-wise subtraction with another DescriptorArray, list, or number. + def __sub__( + self, other: Union[DescriptorArray, list, np.ndarray, numbers.Number] + ) -> DescriptorArray: + """Perform element-wise subtraction with another + DescriptorArray, list, or number. - :param other: The object to subtract. Must be a DescriptorArray with compatible units, - or a list with the same shape if the DescriptorArray is dimensionless. - :return: A new DescriptorArray representing the result of the subtraction. + :param other: The object to subtract. Must be a DescriptorArray + with compatible units, or a list with the same shape if the + DescriptorArray is dimensionless. + :return: A new DescriptorArray representing the result of the + subtraction. """ if isinstance(other, (DescriptorArray, DescriptorNumber, list, numbers.Number)): # Leverage __neg__ and __add__ for subtraction @@ -532,12 +574,14 @@ def __sub__(self, other: Union[DescriptorArray, list, np.ndarray, numbers.Number return NotImplemented def __rsub__(self, other: Union[DescriptorNumber, list, numbers.Number]) -> DescriptorArray: - """ - Perform element-wise subtraction with another DescriptorNumber, list, or number. + """Perform element-wise subtraction with another + DescriptorNumber, list, or number. - :param other: The object to subtract. Must be a DescriptorArray with compatible units, - or a list with the same shape if the DescriptorArray is dimensionless. - :return: A new DescriptorArray representing the result of the subtraction. + :param other: The object to subtract. Must be a DescriptorArray + with compatible units, or a list with the same shape if the + DescriptorArray is dimensionless. + :return: A new DescriptorArray representing the result of the + subtraction. """ if isinstance(other, (DescriptorNumber, list, numbers.Number)): if isinstance(other, list): @@ -549,34 +593,44 @@ def __rsub__(self, other: Union[DescriptorNumber, list, numbers.Number]) -> Desc else: return NotImplemented - def __mul__(self, other: Union[DescriptorArray, DescriptorNumber, list, numbers.Number]) -> DescriptorArray: - """ - Perform element-wise multiplication with another DescriptorNumber, DescriptorArray, list, or number. + def __mul__( + self, other: Union[DescriptorArray, DescriptorNumber, list, numbers.Number] + ) -> DescriptorArray: + """Perform element-wise multiplication with another + DescriptorNumber, DescriptorArray, list, or number. - :param other: The object to multiply. Must be a DescriptorArray or DescriptorNumber with compatible units, - or a list with the same shape if the DescriptorArray is dimensionless. - :return: A new DescriptorArray representing the result of the addition. + :param other: The object to multiply. Must be a DescriptorArray + or DescriptorNumber with compatible units, or a list with + the same shape if the DescriptorArray is dimensionless. + :return: A new DescriptorArray representing the result of the + addition. """ if not isinstance(other, (DescriptorArray, DescriptorNumber, list, numbers.Number)): return NotImplemented return self._apply_operation(other, operator.mul, units_must_match=False) def __rmul__(self, other: Union[DescriptorNumber, list, numbers.Number]) -> DescriptorArray: - """ - Handle reverse multiplication for DescriptorNumbers, lists, and scalars. + """Handle reverse multiplication for DescriptorNumbers, lists, + and scalars. + Ensures unit compatibility when `other` is a DescriptorNumber. """ if not isinstance(other, (DescriptorNumber, list, numbers.Number)): return NotImplemented return self._rapply_operation(other, operator.mul, units_must_match=False) - def __truediv__(self, other: Union[DescriptorArray, DescriptorNumber, list, numbers.Number]) -> DescriptorArray: - """ - Perform element-wise division with another DescriptorNumber, DescriptorArray, list, or number. + def __truediv__( + self, other: Union[DescriptorArray, DescriptorNumber, list, numbers.Number] + ) -> DescriptorArray: + """Perform element-wise division with another DescriptorNumber, + DescriptorArray, list, or number. - :param other: The object to use as a denominator. Must be a DescriptorArray or DescriptorNumber with compatible units, - or a list with the same shape if the DescriptorArray is dimensionless. - :return: A new DescriptorArray representing the result of the addition. + :param other: The object to use as a denominator. Must be a + DescriptorArray or DescriptorNumber with compatible units, + or a list with the same shape if the DescriptorArray is + dimensionless. + :return: A new DescriptorArray representing the result of the + addition. """ if not isinstance(other, (DescriptorArray, DescriptorNumber, list, numbers.Number)): return NotImplemented @@ -592,9 +646,12 @@ def __truediv__(self, other: Union[DescriptorArray, DescriptorNumber, list, numb raise ZeroDivisionError('Cannot divide by zero') return self._apply_operation(other, operator.truediv, units_must_match=False) - def __rtruediv__(self, other: Union[DescriptorNumber, list, numbers.Number]) -> DescriptorArray: - """ - Handle reverse division for DescriptorNumbers, lists, and scalars. + def __rtruediv__( + self, other: Union[DescriptorNumber, list, numbers.Number] + ) -> DescriptorArray: + """Handle reverse division for DescriptorNumbers, lists, and + scalars. + Ensures unit compatibility when `other` is a DescriptorNumber. """ if not isinstance(other, (DescriptorNumber, list, numbers.Number)): @@ -609,12 +666,13 @@ def __rtruediv__(self, other: Union[DescriptorNumber, list, numbers.Number]) -> return inverse_result def __pow__(self, other: Union[DescriptorNumber, numbers.Number]) -> DescriptorArray: - """ - Perform element-wise exponentiation with another DescriptorNumber or number. + """Perform element-wise exponentiation with another + DescriptorNumber or number. - :param other: The object to use as a denominator. Must be a number or DescriptorNumber with - no unit or variance. - :return: A new DescriptorArray representing the result of the addition. + :param other: The object to use as a denominator. Must be a + number or DescriptorNumber with no unit or variance. + :return: A new DescriptorArray representing the result of the + addition. """ if not isinstance(other, (numbers.Number, DescriptorNumber)): return NotImplemented @@ -640,27 +698,26 @@ def __pow__(self, other: Union[DescriptorNumber, numbers.Number]) -> DescriptorA return descriptor_number def __rpow__(self, other: numbers.Number): - """ - Defers reverse pow with a descriptor array, `a ** array`. - Exponentiation with regards to an array does not make sense, - and is not implemented. + """Defers reverse pow with a descriptor array, `a ** array`. + + Exponentiation with regards to an array does not make sense, and + is not implemented. """ raise ValueError('Raising a value to the power of an array does not make sense.') def __neg__(self) -> DescriptorArray: - """ - Negate all values in the DescriptorArray. - """ + """Negate all values in the DescriptorArray.""" new_value = -self.full_value descriptor_array = DescriptorArray.from_scipp(name=self.name, full_value=new_value) descriptor_array.name = descriptor_array.unique_name return descriptor_array def __abs__(self) -> DescriptorArray: - """ - Replace all elements in the DescriptorArray with their - absolute values. Note that this is different from the - norm of the DescriptorArray. + """Replace all elements in the DescriptorArray with their + absolute values. + + Note that this is different from the norm of the + DescriptorArray. """ new_value = abs(self.full_value) descriptor_array = DescriptorArray.from_scipp(name=self.name, full_value=new_value) @@ -668,25 +725,27 @@ def __abs__(self) -> DescriptorArray: return descriptor_array def __getitem__(self, a) -> DescriptorArray: - """ - Slice using scipp syntax. + """Slice using scipp syntax. + Defer slicing to scipp. """ - descriptor = DescriptorArray.from_scipp(name=self.name, full_value=self.full_value.__getitem__(a)) + descriptor = DescriptorArray.from_scipp( + name=self.name, full_value=self.full_value.__getitem__(a) + ) descriptor.name = descriptor.unique_name return descriptor def __delitem__(self, a): - """ - Defer slicing to scipp. + """Defer slicing to scipp. + This should fail, since scipp does not support __delitem__. """ return self.full_value.__delitem__(a) def __setitem__(self, a, b: Union[numbers.Number, list, DescriptorNumber, DescriptorArray]): - """ - __setitem via slice is not allowed, since we currently do not give back a - view to the DescriptorArray upon calling __getitem__. + """__setitem via slice is not allowed, since we currently do not + give back a view to the DescriptorArray upon calling + __getitem__. """ raise AttributeError( f'{self.__class__.__name__} cannot be edited via slicing. Edit the underlying scipp\ @@ -697,14 +756,17 @@ def __setitem__(self, a, b: Union[numbers.Number, list, DescriptorNumber, Descri def trace( self, dimension1: Optional[str] = None, dimension2: Optional[str] = None ) -> Union[DescriptorArray, DescriptorNumber]: - """ - Computes the trace over the descriptor array. The submatrix defined `dimension1` and `dimension2` must be square. - For a rank `k` tensor, the trace will run over the firs two dimensions, resulting in a rank `k-2` tensor. + """Computes the trace over the descriptor array. The submatrix + defined `dimension1` and `dimension2` must be square. For a rank + `k` tensor, the trace will run over the firs two dimensions, + resulting in a rank `k-2` tensor. :param dimension1, dimension2: First and second dimension to perform trace over. Must be in `self.dimensions`. If not defined, the trace will be taken over the first two dimensions. """ - if (dimension1 is not None and dimension2 is None) or (dimension1 is None and dimension2 is not None): + if (dimension1 is not None and dimension2 is None) or ( + dimension1 is None and dimension2 is not None + ): raise ValueError('Either both or none of `dimension1` and `dimension2` must be set.') if dimension1 is not None and dimension2 is not None: @@ -717,7 +779,9 @@ def trace( raise ValueError(f'Dimension {dim=} does not exist in `self.dimensions`.') index = self.dimensions.index(dim) axes.append(index) - remaining_dimensions = [dim for dim in self.dimensions if dim not in (dimension1, dimension2)] + remaining_dimensions = [ + dim for dim in self.dimensions if dim not in (dimension1, dimension2) + ] else: # Take the first two dimensions axes = (0, 1) @@ -725,7 +789,11 @@ def trace( remaining_dimensions = self.dimensions[2:] trace_value = np.trace(self.value, axis1=axes[0], axis2=axes[1]) - trace_variance = np.trace(self.variance, axis1=axes[0], axis2=axes[1]) if self.variance is not None else None + trace_variance = ( + np.trace(self.variance, axis1=axes[0], axis2=axes[1]) + if self.variance is not None + else None + ) # The trace reduces a rank k tensor to a k-2. if remaining_dimensions == []: # No remaining dimensions; the trace is a scalar @@ -733,16 +801,23 @@ def trace( constructor = DescriptorNumber.from_scipp else: # Else, the result is some array - trace = sc.array(dims=remaining_dimensions, values=trace_value, unit=self.unit, variances=trace_variance) + trace = sc.array( + dims=remaining_dimensions, + values=trace_value, + unit=self.unit, + variances=trace_variance, + ) constructor = DescriptorArray.from_scipp descriptor = constructor(name=self.name, full_value=trace) descriptor.name = descriptor.unique_name return descriptor - def sum(self, dim: Optional[Union[str, list]] = None) -> Union[DescriptorArray, DescriptorNumber]: - """ - Uses scipp to sum over the requested dims. + def sum( + self, dim: Optional[Union[str, list]] = None + ) -> Union[DescriptorArray, DescriptorNumber]: + """Uses scipp to sum over the requested dims. + :param dim: The dim(s) in the scipp array to sum over. If `None`, will sum over all dims. """ new_full_value = self.full_value.sum(dim=dim) @@ -783,8 +858,8 @@ def sum(self, dim: Optional[Union[str, list]] = None) -> Union[DescriptorArray, # new_full_value = operation(self._array, other) # Let scipp handle operation for uncertainty propagation def _base_unit(self) -> str: - """ - Returns the base unit of the current array. + """Returns the base unit of the current array. + For example, if the unit is `100m`, returns `m`. """ string = str(self._array.unit) diff --git a/src/easyscience/variable/descriptor_base.py b/src/easyscience/variable/descriptor_base.py index 4bb54e4a..50e6a8c7 100644 --- a/src/easyscience/variable/descriptor_base.py +++ b/src/easyscience/variable/descriptor_base.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project str: - """ - Get the name of the object. + """Get the name of the object. :return: name of the object. """ @@ -96,8 +98,7 @@ def name(self) -> str: @name.setter @property_stack def name(self, new_name: str) -> None: - """ - Set the name. + """Set the name. :param new_name: name of the object. """ @@ -107,8 +108,7 @@ def name(self, new_name: str) -> None: @property def display_name(self) -> str: - """ - Get a pretty display name. + """Get a pretty display name. :return: The pretty display name. """ @@ -120,8 +120,7 @@ def display_name(self) -> str: @display_name.setter @property_stack def display_name(self, name: str) -> None: - """ - Set the pretty display name. + """Set the pretty display name. :param name: Pretty display name of the object. """ @@ -131,8 +130,7 @@ def display_name(self, name: str) -> None: @property def description(self) -> str: - """ - Get the description of the object. + """Get the description of the object. :return: description of the object. """ @@ -140,8 +138,7 @@ def description(self) -> str: @description.setter def description(self, description: str) -> None: - """ - Set the description of the object. + """Set the description of the object. :param description: description of the object. """ @@ -151,8 +148,7 @@ def description(self, description: str) -> None: @property def url(self) -> str: - """ - Get the url of the object. + """Get the url of the object. :return: url of the object. """ @@ -160,8 +156,7 @@ def url(self) -> str: @url.setter def url(self, url: str) -> None: - """ - Set the url of the object. + """Set the url of the object. :param url: url of the object. """ @@ -171,8 +166,7 @@ def url(self, url: str) -> None: @property def unique_name(self) -> str: - """ - Get the unique name of this object. + """Get the unique name of this object. :return: Unique name of this object """ @@ -180,9 +174,11 @@ def unique_name(self) -> str: @unique_name.setter def unique_name(self, new_unique_name: str): - """Set a new unique name for the object. The old name is still kept in the map. + """Set a new unique name for the object. The old name is still + kept in the map. - :param new_unique_name: New unique name for the object""" + :param new_unique_name: New unique name for the object + """ if not isinstance(new_unique_name, str): raise TypeError('Unique name has to be a string.') self._unique_name = new_unique_name diff --git a/src/easyscience/variable/descriptor_bool.py b/src/easyscience/variable/descriptor_bool.py index 72c41cd8..030a911e 100644 --- a/src/easyscience/variable/descriptor_bool.py +++ b/src/easyscience/variable/descriptor_bool.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from __future__ import annotations from typing import Any @@ -9,9 +12,7 @@ class DescriptorBool(DescriptorBase): - """ - A `Descriptor` for boolean values. - """ + """A `Descriptor` for boolean values.""" def __init__( self, @@ -39,8 +40,7 @@ def __init__( @property def value(self) -> bool: - """ - Get the value of self. + """Get the value of self. :return: Value of self """ @@ -49,8 +49,7 @@ def value(self) -> bool: @value.setter @property_stack def value(self, value: bool) -> None: - """ - Set the value of self. + """Set the value of self. :param value: New value of self :return: None diff --git a/src/easyscience/variable/descriptor_number.py b/src/easyscience/variable/descriptor_number.py index 38b233f1..dc1b1eeb 100644 --- a/src/easyscience/variable/descriptor_number.py +++ b/src/easyscience/variable/descriptor_number.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from __future__ import annotations import numbers @@ -22,8 +25,7 @@ # Why is this a decorator? Because otherwise we would need a flag on the convert_unit method to avoid # infinite recursion. This is a bit cleaner as it avoids the need for a internal only flag on a user method. def notify_observers(func): - """ - Decorator to notify observers of a change in the descriptor. + """Decorator to notify observers of a change in the descriptor. :param func: Function to be decorated :return: Decorated function @@ -38,8 +40,9 @@ def wrapper(self, *args, **kwargs): class DescriptorNumber(DescriptorBase): - """ - A `Descriptor` for Number values with units. The internal representation is a scipp scalar. + """A `Descriptor` for Number values with units. + + The internal representation is a scipp scalar. """ def __init__( @@ -55,7 +58,7 @@ def __init__( parent: Optional[Any] = None, **kwargs: Any, # Additional keyword arguments (used for (de)serialization) ): - """Constructor for the DescriptorNumber class + """Constructor for the DescriptorNumber class. param name: Name of the descriptor param value: Value of the descriptor @@ -82,7 +85,9 @@ def __init__( raise ValueError(f'{variance=} must be positive') variance = float(variance) if not isinstance(unit, sc.Unit) and not isinstance(unit, str): - raise TypeError(f'{unit=} must be a scipp unit or a string representing a valid scipp unit') + raise TypeError( + f'{unit=} must be a scipp unit or a string representing a valid scipp unit' + ) try: self._scalar = sc.scalar(float(value), unit=unit, variance=variance) except Exception as message: @@ -102,8 +107,7 @@ def __init__( @classmethod def from_scipp(cls, name: str, full_value: Variable, **kwargs) -> DescriptorNumber: - """ - Create a DescriptorNumber from a scipp constant. + """Create a DescriptorNumber from a scipp constant. :param name: Name of the descriptor :param value: Value of the descriptor as a scipp scalar @@ -114,7 +118,13 @@ def from_scipp(cls, name: str, full_value: Variable, **kwargs) -> DescriptorNumb raise TypeError(f'{full_value=} must be a scipp scalar') if len(full_value.dims) != 0: raise TypeError(f'{full_value=} must be a scipp scalar') - return cls(name=name, value=full_value.value, unit=full_value.unit, variance=full_value.variance, **kwargs) + return cls( + name=name, + value=full_value.value, + unit=full_value.unit, + variance=full_value.variance, + **kwargs, + ) def _attach_observer(self, observer: DescriptorNumber) -> None: """Attach an observer to the descriptor.""" @@ -134,9 +144,11 @@ def _notify_observers(self) -> None: observer._update() def _validate_dependencies(self, origin=None) -> None: - """Ping all observers to check if any cyclic dependencies have been introduced. + """Ping all observers to check if any cyclic dependencies have + been introduced. - :param origin: Unique_name of the origin of this validation check. Used to avoid cyclic depenencies. + :param origin: Unique_name of the origin of this validation + check. Used to avoid cyclic depenencies. """ if origin == self.unique_name: raise RuntimeError( @@ -151,8 +163,8 @@ def _validate_dependencies(self, origin=None) -> None: @property def full_value(self) -> Variable: - """ - Get the value of self as a scipp scalar. This is should be usable for most cases. + """Get the value of self as a scipp scalar. This is should be + usable for most cases. :return: Value of self with unit. """ @@ -166,8 +178,8 @@ def full_value(self, full_value: Variable) -> None: @property def value(self) -> numbers.Number: - """ - Get the value. This should be usable for most cases. The full value can be obtained from `obj.full_value`. + """Get the value. This should be usable for most cases. The full + value can be obtained from `obj.full_value`. :return: Value of self with unit. """ @@ -177,8 +189,8 @@ def value(self) -> numbers.Number: @notify_observers @property_stack def value(self, value: numbers.Number) -> None: - """ - Set the value of self. This should be usable for most cases. The full value can be obtained from `obj.full_value`. + """Set the value of self. This should be usable for most cases. + The full value can be obtained from `obj.full_value`. :param value: New value of self """ @@ -188,8 +200,7 @@ def value(self, value: numbers.Number) -> None: @property def unit(self) -> str: - """ - Get the unit. + """Get the unit. :return: Unit as a string. """ @@ -206,8 +217,7 @@ def unit(self, unit_str: str) -> None: @property def variance(self) -> float: - """ - Get the variance. + """Get the variance. :return: variance. """ @@ -217,8 +227,7 @@ def variance(self) -> float: @notify_observers @property_stack def variance(self, variance_float: float) -> None: - """ - Set the variance. + """Set the variance. :param variance_float: Variance as a float """ @@ -232,8 +241,7 @@ def variance(self, variance_float: float) -> None: @property def error(self) -> float: - """ - The standard deviation for the parameter. + """The standard deviation for the parameter. :return: Error associated with parameter """ @@ -245,8 +253,7 @@ def error(self) -> float: @notify_observers @property_stack def error(self, value: float) -> None: - """ - Set the standard deviation for the parameter. + """Set the standard deviation for the parameter. :param value: New error value """ @@ -263,8 +270,7 @@ def error(self, value: float) -> None: # When we convert units internally, we dont want to notify observers as this can cause infinite recursion. # Therefore the convert_unit method is split into two methods, a private internal method and a public method. def _convert_unit(self, unit_str: str) -> None: - """ - Convert the value from one unit system to another. + """Convert the value from one unit system to another. :param unit_str: New unit in string form """ @@ -287,7 +293,9 @@ def set_scalar(obj, scalar): # Push to undo stack self._global_object.stack.push( - PropertyStack(self, set_scalar, old_scalar, new_scalar, text=f'Convert unit to {unit_str}') + PropertyStack( + self, set_scalar, old_scalar, new_scalar, text=f'Convert unit to {unit_str}' + ) ) # Update the scalar @@ -296,8 +304,7 @@ def set_scalar(obj, scalar): # When the user calls convert_unit, we want to notify observers of the change to propagate the change. @notify_observers def convert_unit(self, unit_str: str) -> None: - """ - Convert the value from one unit system to another. + """Convert the value from one unit system to another. :param unit_str: New unit in string form """ @@ -312,7 +319,9 @@ def __repr__(self) -> str: string = '<' string += self.__class__.__name__ + ' ' string += f"'{self._name}': " - if np.abs(self._scalar.value) > 1e4 or (np.abs(self._scalar.value) < 1e-4 and self._scalar.value != 0): + if np.abs(self._scalar.value) > 1e4 or ( + np.abs(self._scalar.value) < 1e-4 and self._scalar.value != 0 + ): # Use scientific notation for large or small values string += f'{self._scalar.value:.3e}' if self.variance: @@ -350,7 +359,9 @@ def __add__(self, other: Union[DescriptorNumber, numbers.Number]) -> DescriptorN try: other._convert_unit(self.unit) except UnitError: - raise UnitError(f'Values with units {self.unit} and {other.unit} cannot be added') from None + raise UnitError( + f'Values with units {self.unit} and {other.unit} cannot be added' + ) from None new_value = self.full_value + other.full_value other._convert_unit(original_unit) else: @@ -380,7 +391,9 @@ def __sub__(self, other: Union[DescriptorNumber, numbers.Number]) -> DescriptorN try: other._convert_unit(self.unit) except UnitError: - raise UnitError(f'Values with units {self.unit} and {other.unit} cannot be subtracted') from None + raise UnitError( + f'Values with units {self.unit} and {other.unit} cannot be subtracted' + ) from None new_value = self.full_value - other.full_value other._convert_unit(original_unit) else: @@ -493,8 +506,8 @@ def __abs__(self) -> DescriptorNumber: return descriptor_number def _base_unit(self) -> str: - """ - Extract the base unit from the unit string by removing numeric components and scientific notation. + """Extract the base unit from the unit string by removing + numeric components and scientific notation. """ string = str(self._scalar.unit) for i, letter in enumerate(string): diff --git a/src/easyscience/variable/descriptor_str.py b/src/easyscience/variable/descriptor_str.py index 17110166..dffc0d11 100644 --- a/src/easyscience/variable/descriptor_str.py +++ b/src/easyscience/variable/descriptor_str.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from __future__ import annotations from typing import Any @@ -9,9 +12,7 @@ class DescriptorStr(DescriptorBase): - """ - A `Descriptor` for string values. - """ + """A `Descriptor` for string values.""" def __init__( self, @@ -37,8 +38,7 @@ def __init__( @property def value(self) -> str: - """ - Get the value of self. + """Get the value of self. :return: Value of self with unit. """ @@ -47,8 +47,7 @@ def value(self) -> str: @value.setter @property_stack def value(self, value: str) -> None: - """ - Set the value of self. + """Set the value of self. :param value: New value of self :return: None diff --git a/src/easyscience/variable/parameter.py b/src/easyscience/variable/parameter.py index 6ea8d1a6..9c094387 100644 --- a/src/easyscience/variable/parameter.py +++ b/src/easyscience/variable/parameter.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project max: raise ValueError(f'{value=} can not be greater than {max=}') if np.isclose(min, max, rtol=1e-9, atol=0.0): - raise ValueError('The min and max bounds cannot be identical. Please use fixed=True instead to fix the value.') + raise ValueError( + 'The min and max bounds cannot be identical. Please use fixed=True instead to fix the value.' + ) if not isinstance(fixed, bool): raise TypeError('`fixed` must be either True or False') self._independent = True @@ -128,14 +132,20 @@ def from_dependency( desired_unit: str | sc.Unit | None = None, **kwargs, ) -> Parameter: # noqa: E501 - """ - Create a dependent Parameter directly from a dependency expression. + """Create a dependent Parameter directly from a dependency + expression. :param name: The name of the parameter - :param dependency_expression: The dependency expression to evaluate. This should be a string which can be evaluated by the ASTEval interpreter. - :param dependency_map: A dictionary of dependency expression symbol name and dependency object pairs. This is inserted into the asteval interpreter to resolve dependencies. - :param desired_unit: The desired unit of the dependent parameter. - :param kwargs: Additional keyword arguments to pass to the Parameter constructor. + :param dependency_expression: The dependency expression to + evaluate. This should be a string which can be evaluated by + the ASTEval interpreter. + :param dependency_map: A dictionary of dependency expression + symbol name and dependency object pairs. This is inserted + into the asteval interpreter to resolve dependencies. + :param desired_unit: The desired unit of the dependent + parameter. + :param kwargs: Additional keyword arguments to pass to the + Parameter constructor. :return: A new dependent Parameter object. """ # noqa: E501 # Set default values for required parameters for the constructor, they get overwritten by the dependency anyways @@ -151,8 +161,10 @@ def from_dependency( return parameter def _update(self) -> None: - """ - Update the parameter. This is called by the DescriptorNumbers/Parameters who have this Parameter as a dependency. + """Update the parameter. + + This is called by the DescriptorNumbers/Parameters who have this + Parameter as a dependency. """ if not self._independent: # Update the value of the parameter using the dependency interpreter @@ -161,10 +173,14 @@ def _update(self) -> None: self._scalar.unit = temporary_parameter.unit self._scalar.variance = temporary_parameter.variance self._min.value = ( - temporary_parameter.min if isinstance(temporary_parameter, Parameter) else temporary_parameter.value + temporary_parameter.min + if isinstance(temporary_parameter, Parameter) + else temporary_parameter.value ) # noqa: E501 self._max.value = ( - temporary_parameter.max if isinstance(temporary_parameter, Parameter) else temporary_parameter.value + temporary_parameter.max + if isinstance(temporary_parameter, Parameter) + else temporary_parameter.value ) # noqa: E501 self._min.unit = temporary_parameter.unit self._max.unit = temporary_parameter.unit @@ -182,8 +198,8 @@ def make_dependent_on( dependency_map: Optional[dict] = None, desired_unit: str | sc.Unit | None = None, ) -> None: - """ - Make this parameter dependent on another parameter. This will overwrite the current value, unit, variance, min and max. + """Make this parameter dependent on another parameter. This will + overwrite the current value, unit, variance, min and max. How to use the dependency map: If a parameter c has a dependency expression of 'a + b', where a and b are parameters belonging to the model class, @@ -204,10 +220,11 @@ def make_dependent_on( :param desired_unit: The desired unit of the dependent parameter. If None, the default unit of the dependency expression result is used. - """ # noqa: E501 if not isinstance(dependency_expression, str): - raise TypeError('`dependency_expression` must be a string representing a valid dependency expression.') + raise TypeError( + '`dependency_expression` must be a string representing a valid dependency expression.' + ) if not (isinstance(dependency_map, dict) or dependency_map is None): raise TypeError( '`dependency_map` must be a dictionary of dependencies and their' @@ -242,7 +259,9 @@ def make_dependent_on( self._independent = False self._dependency_string = dependency_expression self._dependency_map = dependency_map if dependency_map is not None else {} - if desired_unit is not None and not (isinstance(desired_unit, str) or isinstance(desired_unit, sc.Unit)): + if desired_unit is not None and not ( + isinstance(desired_unit, str) or isinstance(desired_unit, sc.Unit) + ): raise TypeError('`desired_unit` must be a string representing a valid unit.') self._desired_unit = desired_unit # List of allowed python constructs for the asteval interpreter @@ -283,7 +302,9 @@ def make_dependent_on( value._attach_observer(self) # Check the dependency expression for errors try: - dependency_result = self._dependency_interpreter.eval(self._clean_dependency_string, raise_errors=True) + dependency_result = self._dependency_interpreter.eval( + self._clean_dependency_string, raise_errors=True + ) except NameError as message: self._revert_dependency() raise NameError( @@ -329,9 +350,9 @@ def make_dependent_on( self._update() def make_independent(self) -> None: - """ - Make this parameter independent. - This will remove the dependency expression, the dependency map and the dependency interpreter. + """Make this parameter independent. This will remove the + dependency expression, the dependency map and the dependency + interpreter. :return: None """ @@ -349,8 +370,7 @@ def make_independent(self) -> None: @property def independent(self) -> bool: - """ - Is the parameter independent? + """Is the parameter independent? :return: True = independent, False = dependent """ @@ -364,8 +384,7 @@ def independent(self, value: bool) -> None: @property def dependency_expression(self) -> str: - """ - Get the dependency expression of this parameter. + """Get the dependency expression of this parameter. :return: The dependency expression of this parameter. """ @@ -382,8 +401,7 @@ def dependency_expression(self, new_expression: str) -> None: @property def dependency_map(self) -> Dict[str, DescriptorNumber]: - """ - Get the dependency map of this parameter. + """Get the dependency map of this parameter. :return: The dependency map of this parameter. """ @@ -394,12 +412,13 @@ def dependency_map(self) -> Dict[str, DescriptorNumber]: @dependency_map.setter def dependency_map(self, new_map: Dict[str, DescriptorNumber]) -> None: - raise AttributeError('Dependency map is read-only. Use `make_dependent_on` to change the dependency map.') + raise AttributeError( + 'Dependency map is read-only. Use `make_dependent_on` to change the dependency map.' + ) @property def value_no_call_back(self) -> numbers.Number: - """ - Get the currently hold value of self suppressing call back. + """Get the currently hold value of self suppressing call back. :return: Value of self without unit. """ @@ -407,9 +426,9 @@ def value_no_call_back(self) -> numbers.Number: @property def full_value(self) -> Variable: - """ - Get the value of self as a scipp scalar. This is should be usable for most cases. - If a scipp scalar is not acceptable then the raw value can be obtained through `obj.value`. + """Get the value of self as a scipp scalar. This is should be + usable for most cases. If a scipp scalar is not acceptable then + the raw value can be obtained through `obj.value`. :return: Value of self with unit and variance. """ @@ -423,8 +442,7 @@ def full_value(self, scalar: Variable) -> None: @property def value(self) -> numbers.Number: - """ - Get the value of self as a Number. + """Get the value of self as a Number. :return: Value of self without unit. """ @@ -437,8 +455,8 @@ def value(self) -> numbers.Number: @value.setter @property_stack def value(self, value: numbers.Number) -> None: - """ - Set the value of self. This only updates the value of the scipp scalar. + """Set the value of self. This only updates the value of the + scipp scalar. :param value: New value of self """ @@ -460,35 +478,39 @@ def value(self, value: numbers.Number) -> None: # Notify observers of the change self._notify_observers() else: - raise AttributeError('This is a dependent parameter, its value cannot be set directly.') + raise AttributeError( + 'This is a dependent parameter, its value cannot be set directly.' + ) @DescriptorNumber.variance.setter def variance(self, variance_float: float) -> None: - """ - Set the variance. + """Set the variance. :param variance_float: Variance as a float """ if self._independent: DescriptorNumber.variance.fset(self, variance_float) else: - raise AttributeError('This is a dependent parameter, its variance cannot be set directly.') + raise AttributeError( + 'This is a dependent parameter, its variance cannot be set directly.' + ) @DescriptorNumber.error.setter def error(self, value: float) -> None: - """ - Set the standard deviation for the parameter. + """Set the standard deviation for the parameter. :param value: New error value """ if self._independent: DescriptorNumber.error.fset(self, value) else: - raise AttributeError('This is a dependent parameter, its error cannot be set directly.') + raise AttributeError( + 'This is a dependent parameter, its error cannot be set directly.' + ) def _convert_unit(self, unit_str: str) -> None: - """ - Perform unit conversion. The value, max and min can change on unit change. + """Perform unit conversion. The value, max and min can change on + unit change. :param new_unit: new unit :return: None @@ -500,8 +522,8 @@ def _convert_unit(self, unit_str: str) -> None: @notify_observers def convert_unit(self, unit_str: str) -> None: - """ - Perform unit conversion. The value, max and min can change on unit change. + """Perform unit conversion. The value, max and min can change on + unit change. :param new_unit: new unit :return: None @@ -509,14 +531,16 @@ def convert_unit(self, unit_str: str) -> None: self._convert_unit(unit_str) def set_desired_unit(self, unit_str: str | sc.Unit | None) -> None: - """ - Set the desired unit for a dependent Parameter. This will convert the parameter to the desired unit. + """Set the desired unit for a dependent Parameter. This will + convert the parameter to the desired unit. :param unit_str: The desired unit as a string. """ if self._independent: - raise AttributeError('This is an independent parameter, desired unit can only be set for dependent parameters.') + raise AttributeError( + 'This is an independent parameter, desired unit can only be set for dependent parameters.' + ) if not (isinstance(unit_str, str) or isinstance(unit_str, sc.Unit) or unit_str is None): raise TypeError('`unit_str` must be a string representing a valid unit.') @@ -525,15 +549,16 @@ def set_desired_unit(self, unit_str: str | sc.Unit | None) -> None: old_unit_for_message = self.unit self._convert_unit(unit_str) except Exception as e: - raise UnitError(f'Failed to convert unit from {old_unit_for_message} to {unit_str}: {e}') + raise UnitError( + f'Failed to convert unit from {old_unit_for_message} to {unit_str}: {e}' + ) self._desired_unit = unit_str self._update() @property def min(self) -> numbers.Number: - """ - Get the minimum value for fitting. + """Get the minimum value for fitting. :return: minimum value """ @@ -553,19 +578,24 @@ def min(self, min_value: numbers.Number) -> None: if not isinstance(min_value, numbers.Number): raise TypeError('`min` must be a number') if np.isclose(min_value, self._max.value, rtol=1e-9, atol=0.0): - raise ValueError('The min and max bounds cannot be identical. Please use fixed=True instead to fix the value.') + raise ValueError( + 'The min and max bounds cannot be identical. Please use fixed=True instead to fix the value.' + ) if min_value <= self.value: self._min.value = min_value else: - raise ValueError(f'The current value ({self.value}) is smaller than the desired min value ({min_value}).') + raise ValueError( + f'The current value ({self.value}) is smaller than the desired min value ({min_value}).' + ) self._notify_observers() else: - raise AttributeError('This is a dependent parameter, its minimum value cannot be set directly.') + raise AttributeError( + 'This is a dependent parameter, its minimum value cannot be set directly.' + ) @property def max(self) -> numbers.Number: - """ - Get the maximum value for fitting. + """Get the maximum value for fitting. :return: maximum value """ @@ -585,19 +615,24 @@ def max(self, max_value: numbers.Number) -> None: if not isinstance(max_value, numbers.Number): raise TypeError('`max` must be a number') if np.isclose(max_value, self._min.value, rtol=1e-9, atol=0.0): - raise ValueError('The min and max bounds cannot be identical. Please use fixed=True instead to fix the value.') + raise ValueError( + 'The min and max bounds cannot be identical. Please use fixed=True instead to fix the value.' + ) if max_value >= self.value: self._max.value = max_value else: - raise ValueError(f'The current value ({self.value}) is greater than the desired max value ({max_value}).') + raise ValueError( + f'The current value ({self.value}) is greater than the desired max value ({max_value}).' + ) self._notify_observers() else: - raise AttributeError('This is a dependent parameter, its maximum value cannot be set directly.') + raise AttributeError( + 'This is a dependent parameter, its maximum value cannot be set directly.' + ) @property def fixed(self) -> bool: - """ - Can the parameter vary while fitting? + """Can the parameter vary while fitting? :return: True = fixed, False = can vary """ @@ -620,7 +655,9 @@ def fixed(self, fixed: bool) -> None: if self._global_object.stack.enabled: # Remove the recorded change from the stack global_object.stack.pop() - raise AttributeError('This is a dependent parameter, dependent parameters cannot be fixed.') + raise AttributeError( + 'This is a dependent parameter, dependent parameters cannot be fixed.' + ) # Is this alias really needed? @property @@ -632,7 +669,9 @@ def free(self, value: bool) -> None: self.fixed = not value def as_dict(self, skip: Optional[List[str]] = None) -> Dict[str, Any]: - """Overwrite the as_dict method to handle dependency information.""" + """Overwrite the as_dict method to handle dependency + information. + """ raw_dict = super().as_dict(skip=skip) # Add dependency information for dependent parameters @@ -649,13 +688,17 @@ def as_dict(self, skip: Optional[List[str]] = None) -> Dict[str, Any]: # Convert dependency_map to use serializer_ids raw_dict['_dependency_map_serializer_ids'] = {} for key, obj in self._dependency_map.items(): - raw_dict['_dependency_map_serializer_ids'][key] = obj._DescriptorNumber__serializer_id + raw_dict['_dependency_map_serializer_ids'][key] = ( + obj._DescriptorNumber__serializer_id + ) return raw_dict def _revert_dependency(self, skip_detach=False) -> None: - """ - Revert the dependency to the old dependency. This is used when an error is raised during setting the dependency. + """Revert the dependency to the old dependency. + + This is used when an error is raised during setting the + dependency. """ if self._previous_independent is True: self.make_independent() @@ -671,10 +714,11 @@ def _revert_dependency(self, skip_detach=False) -> None: del self._previous_independent def _process_dependency_unique_names(self, dependency_expression: str): - """ - Add the unique names of the parameters to the ASTEval interpreter. This is used to evaluate the dependency expression. + """Add the unique names of the parameters to the ASTEval + interpreter. This is used to evaluate the dependency expression. - :param dependency_expression: The dependency expression to be evaluated + :param dependency_expression: The dependency expression to be + evaluated """ # Get the unique_names from the expression string regardless of the quotes used inputted_unique_names = re.findall("('.+?')", dependency_expression) @@ -692,7 +736,9 @@ def _process_dependency_unique_names(self, dependency_expression: str): dependent_parameter = self._global_object.map.get_item_by_key(stripped_name) if isinstance(dependent_parameter, DescriptorNumber): self._dependency_map['__' + stripped_name + '__'] = dependent_parameter - clean_dependency_string = clean_dependency_string.replace(name, '__' + stripped_name + '__') + clean_dependency_string = clean_dependency_string.replace( + name, '__' + stripped_name + '__' + ) else: raise ValueError( f'The object with unique_name {stripped_name} is not a Parameter or DescriptorNumber. ' @@ -702,8 +748,8 @@ def _process_dependency_unique_names(self, dependency_expression: str): @classmethod def from_dict(cls, obj_dict: dict) -> 'Parameter': - """ - Custom deserialization to handle parameter dependencies. + """Custom deserialization to handle parameter dependencies. + Override the parent method to handle dependency information. """ # Extract dependency information before creating the parameter @@ -733,9 +779,7 @@ def __copy__(self) -> Parameter: return new_obj def __repr__(self) -> str: - """ - Return printable representation of a Parameter object. - """ + """Return printable representation of a Parameter object.""" super_str = super().__repr__() super_str = super_str[:-1] s = [] @@ -756,19 +800,29 @@ def __add__(self, other: Union[DescriptorNumber, Parameter, numbers.Number]) -> new_full_value = self.full_value + other min_value = self.min + other max_value = self.max + other - elif isinstance(other, DescriptorNumber): # Parameter inherits from DescriptorNumber and is also handled here + elif isinstance( + other, DescriptorNumber + ): # Parameter inherits from DescriptorNumber and is also handled here other_unit = other.unit try: other._convert_unit(self.unit) except UnitError: - raise UnitError(f'Values with units {self.unit} and {other.unit} cannot be added') from None + raise UnitError( + f'Values with units {self.unit} and {other.unit} cannot be added' + ) from None new_full_value = self.full_value + other.full_value - min_value = self.min + other.min if isinstance(other, Parameter) else self.min + other.value - max_value = self.max + other.max if isinstance(other, Parameter) else self.max + other.value + min_value = ( + self.min + other.min if isinstance(other, Parameter) else self.min + other.value + ) + max_value = ( + self.max + other.max if isinstance(other, Parameter) else self.max + other.value + ) other._convert_unit(other_unit) else: return NotImplemented - parameter = Parameter.from_scipp(name=self.name, full_value=new_full_value, min=min_value, max=max_value) + parameter = Parameter.from_scipp( + name=self.name, full_value=new_full_value, min=min_value, max=max_value + ) parameter.name = parameter.unique_name return parameter @@ -779,19 +833,25 @@ def __radd__(self, other: Union[DescriptorNumber, numbers.Number]) -> Parameter: new_full_value = self.full_value + other min_value = self.min + other max_value = self.max + other - elif isinstance(other, DescriptorNumber): # Parameter inherits from DescriptorNumber and is also handled here + elif isinstance( + other, DescriptorNumber + ): # Parameter inherits from DescriptorNumber and is also handled here original_unit = self.unit try: self._convert_unit(other.unit) except UnitError: - raise UnitError(f'Values with units {other.unit} and {self.unit} cannot be added') from None + raise UnitError( + f'Values with units {other.unit} and {self.unit} cannot be added' + ) from None new_full_value = self.full_value + other.full_value min_value = self.min + other.value max_value = self.max + other.value self._convert_unit(original_unit) else: return NotImplemented - parameter = Parameter.from_scipp(name=self.name, full_value=new_full_value, min=min_value, max=max_value) + parameter = Parameter.from_scipp( + name=self.name, full_value=new_full_value, min=min_value, max=max_value + ) parameter.name = parameter.unique_name return parameter @@ -802,12 +862,16 @@ def __sub__(self, other: Union[DescriptorNumber, Parameter, numbers.Number]) -> new_full_value = self.full_value - other min_value = self.min - other max_value = self.max - other - elif isinstance(other, DescriptorNumber): # Parameter inherits from DescriptorNumber and is also handled here + elif isinstance( + other, DescriptorNumber + ): # Parameter inherits from DescriptorNumber and is also handled here other_unit = other.unit try: other._convert_unit(self.unit) except UnitError: - raise UnitError(f'Values with units {self.unit} and {other.unit} cannot be subtracted') from None + raise UnitError( + f'Values with units {self.unit} and {other.unit} cannot be subtracted' + ) from None new_full_value = self.full_value - other.full_value if isinstance(other, Parameter): min_value = self.min - other.max if other.max != np.inf else -np.inf @@ -818,7 +882,9 @@ def __sub__(self, other: Union[DescriptorNumber, Parameter, numbers.Number]) -> other._convert_unit(other_unit) else: return NotImplemented - parameter = Parameter.from_scipp(name=self.name, full_value=new_full_value, min=min_value, max=max_value) + parameter = Parameter.from_scipp( + name=self.name, full_value=new_full_value, min=min_value, max=max_value + ) parameter.name = parameter.unique_name return parameter @@ -829,19 +895,25 @@ def __rsub__(self, other: Union[DescriptorNumber, numbers.Number]) -> Parameter: new_full_value = other - self.full_value min_value = other - self.max max_value = other - self.min - elif isinstance(other, DescriptorNumber): # Parameter inherits from DescriptorNumber and is also handled here + elif isinstance( + other, DescriptorNumber + ): # Parameter inherits from DescriptorNumber and is also handled here original_unit = self.unit try: self._convert_unit(other.unit) except UnitError: - raise UnitError(f'Values with units {other.unit} and {self.unit} cannot be subtracted') from None + raise UnitError( + f'Values with units {other.unit} and {self.unit} cannot be subtracted' + ) from None new_full_value = other.full_value - self.full_value min_value = other.value - self.max max_value = other.value - self.min self._convert_unit(original_unit) else: return NotImplemented - parameter = Parameter.from_scipp(name=self.name, full_value=new_full_value, min=min_value, max=max_value) + parameter = Parameter.from_scipp( + name=self.name, full_value=new_full_value, min=min_value, max=max_value + ) parameter.name = parameter.unique_name return parameter @@ -849,16 +921,22 @@ def __mul__(self, other: Union[DescriptorNumber, Parameter, numbers.Number]) -> if isinstance(other, numbers.Number): new_full_value = self.full_value * other if other == 0: - descriptor_number = DescriptorNumber.from_scipp(name=self.name, full_value=new_full_value) + descriptor_number = DescriptorNumber.from_scipp( + name=self.name, full_value=new_full_value + ) descriptor_number.name = descriptor_number.unique_name return descriptor_number combinations = [self.min * other, self.max * other] - elif isinstance(other, DescriptorNumber): # Parameter inherits from DescriptorNumber and is also handled here + elif isinstance( + other, DescriptorNumber + ): # Parameter inherits from DescriptorNumber and is also handled here new_full_value = self.full_value * other.full_value if ( other.value == 0 and type(other) is DescriptorNumber ): # Only return DescriptorNumber if other is strictly 0, i.e. not a parameter # noqa: E501 - descriptor_number = DescriptorNumber.from_scipp(name=self.name, full_value=new_full_value) + descriptor_number = DescriptorNumber.from_scipp( + name=self.name, full_value=new_full_value + ) descriptor_number.name = descriptor_number.unique_name return descriptor_number if isinstance(other, Parameter): @@ -881,7 +959,9 @@ def __mul__(self, other: Union[DescriptorNumber, Parameter, numbers.Number]) -> return NotImplemented min_value = min(combinations) max_value = max(combinations) - parameter = Parameter.from_scipp(name=self.name, full_value=new_full_value, min=min_value, max=max_value) + parameter = Parameter.from_scipp( + name=self.name, full_value=new_full_value, min=min_value, max=max_value + ) parameter._convert_unit(parameter._base_unit()) parameter.name = parameter.unique_name return parameter @@ -890,14 +970,20 @@ def __rmul__(self, other: Union[DescriptorNumber, numbers.Number]) -> Parameter: if isinstance(other, numbers.Number): new_full_value = other * self.full_value if other == 0: - descriptor_number = DescriptorNumber.from_scipp(name=self.name, full_value=new_full_value) + descriptor_number = DescriptorNumber.from_scipp( + name=self.name, full_value=new_full_value + ) descriptor_number.name = descriptor_number.unique_name return descriptor_number combinations = [other * self.min, other * self.max] - elif isinstance(other, DescriptorNumber): # Parameter inherits from DescriptorNumber and is also handled here + elif isinstance( + other, DescriptorNumber + ): # Parameter inherits from DescriptorNumber and is also handled here new_full_value = other.full_value * self.full_value if other.value == 0: - descriptor_number = DescriptorNumber.from_scipp(name=self.name, full_value=new_full_value) + descriptor_number = DescriptorNumber.from_scipp( + name=self.name, full_value=new_full_value + ) descriptor_number.name = descriptor_number.unique_name return descriptor_number combinations = [self.min * other.value, self.max * other.value] @@ -905,7 +991,9 @@ def __rmul__(self, other: Union[DescriptorNumber, numbers.Number]) -> Parameter: return NotImplemented min_value = min(combinations) max_value = max(combinations) - parameter = Parameter.from_scipp(name=self.name, full_value=new_full_value, min=min_value, max=max_value) + parameter = Parameter.from_scipp( + name=self.name, full_value=new_full_value, min=min_value, max=max_value + ) parameter._convert_unit(parameter._base_unit()) parameter.name = parameter.unique_name return parameter @@ -916,7 +1004,9 @@ def __truediv__(self, other: Union[DescriptorNumber, Parameter, numbers.Number]) raise ZeroDivisionError('Cannot divide by zero') new_full_value = self.full_value / other combinations = [self.min / other, self.max / other] - elif isinstance(other, DescriptorNumber): # Parameter inherits from DescriptorNumber and is also handled here + elif isinstance( + other, DescriptorNumber + ): # Parameter inherits from DescriptorNumber and is also handled here other_value = other.value if other_value == 0: raise ZeroDivisionError('Cannot divide by zero') @@ -951,7 +1041,9 @@ def __truediv__(self, other: Union[DescriptorNumber, Parameter, numbers.Number]) return NotImplemented min_value = min(combinations) max_value = max(combinations) - parameter = Parameter.from_scipp(name=self.name, full_value=new_full_value, min=min_value, max=max_value) + parameter = Parameter.from_scipp( + name=self.name, full_value=new_full_value, min=min_value, max=max_value + ) parameter._convert_unit(parameter._base_unit()) parameter.name = parameter.unique_name return parameter @@ -964,14 +1056,20 @@ def __rtruediv__(self, other: Union[DescriptorNumber, numbers.Number]) -> Parame new_full_value = other / self.full_value other_value = other if other_value == 0: - descriptor_number = DescriptorNumber.from_scipp(name=self.name, full_value=new_full_value) + descriptor_number = DescriptorNumber.from_scipp( + name=self.name, full_value=new_full_value + ) descriptor_number.name = descriptor_number.unique_name return descriptor_number - elif isinstance(other, DescriptorNumber): # Parameter inherits from DescriptorNumber and is also handled here + elif isinstance( + other, DescriptorNumber + ): # Parameter inherits from DescriptorNumber and is also handled here new_full_value = other.full_value / self.full_value other_value = other.value if other_value == 0: - descriptor_number = DescriptorNumber.from_scipp(name=self.name, full_value=new_full_value) + descriptor_number = DescriptorNumber.from_scipp( + name=self.name, full_value=new_full_value + ) descriptor_number.name = descriptor_number.unique_name return descriptor_number else: @@ -992,7 +1090,9 @@ def __rtruediv__(self, other: Union[DescriptorNumber, numbers.Number]) -> Parame combinations = [other_value / self.min, other_value / self.max] min_value = min(combinations) max_value = max(combinations) - parameter = Parameter.from_scipp(name=self.name, full_value=new_full_value, min=min_value, max=max_value) + parameter = Parameter.from_scipp( + name=self.name, full_value=new_full_value, min=min_value, max=max_value + ) parameter._convert_unit(parameter._base_unit()) parameter.name = parameter.unique_name return parameter @@ -1000,7 +1100,9 @@ def __rtruediv__(self, other: Union[DescriptorNumber, numbers.Number]) -> Parame def __pow__(self, other: Union[DescriptorNumber, numbers.Number]) -> Parameter: if isinstance(other, numbers.Number): exponent = other - elif type(other) is DescriptorNumber: # Strictly a DescriptorNumber, We can't raise to the power of a Parameter + elif ( + type(other) is DescriptorNumber + ): # Strictly a DescriptorNumber, We can't raise to the power of a Parameter if other.unit != 'dimensionless': raise UnitError('Exponents must be dimensionless') if other.variance is not None: @@ -1017,7 +1119,9 @@ def __pow__(self, other: Union[DescriptorNumber, numbers.Number]) -> Parameter: if np.isnan(new_full_value.value): raise ValueError('The result of the exponentiation is not a number') if exponent == 0: - descriptor_number = DescriptorNumber.from_scipp(name=self.name, full_value=new_full_value) + descriptor_number = DescriptorNumber.from_scipp( + name=self.name, full_value=new_full_value + ) descriptor_number.name = descriptor_number.unique_name return descriptor_number elif exponent < 0: @@ -1041,7 +1145,9 @@ def __pow__(self, other: Union[DescriptorNumber, numbers.Number]) -> Parameter: combinations = [combination for combination in combinations if combination >= 0] min_value = min(combinations) max_value = max(combinations) - parameter = Parameter.from_scipp(name=self.name, full_value=new_full_value, min=min_value, max=max_value) + parameter = Parameter.from_scipp( + name=self.name, full_value=new_full_value, min=min_value, max=max_value + ) parameter.name = parameter.unique_name return parameter @@ -1049,7 +1155,9 @@ def __neg__(self) -> Parameter: new_full_value = -self.full_value min_value = -self.max max_value = -self.min - parameter = Parameter.from_scipp(name=self.name, full_value=new_full_value, min=min_value, max=max_value) + parameter = Parameter.from_scipp( + name=self.name, full_value=new_full_value, min=min_value, max=max_value + ) parameter.name = parameter.unique_name return parameter @@ -1060,15 +1168,18 @@ def __abs__(self) -> Parameter: combinations.append(0.0) min_value = min(combinations) max_value = max(combinations) - parameter = Parameter.from_scipp(name=self.name, full_value=new_full_value, min=min_value, max=max_value) + parameter = Parameter.from_scipp( + name=self.name, full_value=new_full_value, min=min_value, max=max_value + ) parameter.name = parameter.unique_name return parameter def resolve_pending_dependencies(self) -> None: """Resolve pending dependencies after deserialization. - This method should be called after all parameters have been deserialized - to establish dependency relationships using serializer_ids. + This method should be called after all parameters have been + deserialized to establish dependency relationships using + serializer_ids. """ if hasattr(self, '_pending_dependency_string'): dependency_string = self._pending_dependency_string @@ -1083,7 +1194,9 @@ def resolve_pending_dependencies(self) -> None: if dep_obj is not None: dependency_map[key] = dep_obj else: - raise ValueError(f"Cannot find parameter with serializer_id '{serializer_id}'") + raise ValueError( + f"Cannot find parameter with serializer_id '{serializer_id}'" + ) # Establish the dependency relationship try: @@ -1101,9 +1214,13 @@ def resolve_pending_dependencies(self) -> None: delattr(self, '_pending_desired_unit') def _find_parameter_by_serializer_id(self, serializer_id: str) -> Optional['DescriptorNumber']: - """Find a parameter by its serializer_id from all parameters in the global map.""" + """Find a parameter by its serializer_id from all parameters in + the global map. + """ for obj in self._global_object.map._store.values(): - if isinstance(obj, DescriptorNumber) and hasattr(obj, '_DescriptorNumber__serializer_id'): + if isinstance(obj, DescriptorNumber) and hasattr( + obj, '_DescriptorNumber__serializer_id' + ): if obj._DescriptorNumber__serializer_id == serializer_id: return obj return None diff --git a/src/easyscience/variable/parameter_dependency_resolver.py b/src/easyscience/variable/parameter_dependency_resolver.py index e6b7cbd6..7632635a 100644 --- a/src/easyscience/variable/parameter_dependency_resolver.py +++ b/src/easyscience/variable/parameter_dependency_resolver.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project None: - """ - Recursively find all Parameter objects in an object hierarchy and resolve their pending dependencies. + """Recursively find all Parameter objects in an object hierarchy and + resolve their pending dependencies. - This function should be called after deserializing a complex object that contains Parameters - with dependencies to ensure all dependency relationships are properly established. + This function should be called after deserializing a complex object + that contains Parameters with dependencies to ensure all dependency + relationships are properly established. - :param obj: The object to search for Parameters (can be a single Parameter, list, dict, or complex object) + :param obj: The object to search for Parameters (can be a single + Parameter, list, dict, or complex object) """ def _collect_parameters(item: Any, parameters: List[Parameter]) -> None: @@ -78,13 +81,15 @@ def _collect_parameters(item: Any, parameters: List[Parameter]) -> None: print(f'Successfully resolved dependencies for {resolved_count} parameter(s).') if error_count > 0: - error_message = f'Failed to resolve dependencies for {error_count} parameter(s):\n' + '\n'.join(errors) + error_message = ( + f'Failed to resolve dependencies for {error_count} parameter(s):\n' + '\n'.join(errors) + ) raise ValueError(error_message) def get_parameters_with_pending_dependencies(obj: Any) -> List[Parameter]: - """ - Find all Parameter objects in an object hierarchy that have pending dependencies. + """Find all Parameter objects in an object hierarchy that have + pending dependencies. :param obj: The object to search for Parameters :return: List of Parameters with pending dependencies @@ -92,7 +97,9 @@ def get_parameters_with_pending_dependencies(obj: Any) -> List[Parameter]: parameters_with_pending = [] def _collect_pending_parameters(item: Any) -> None: - """Recursively collect all Parameter objects with pending dependencies.""" + """Recursively collect all Parameter objects with pending + dependencies. + """ if isinstance(item, Parameter): if hasattr(item, '_pending_dependency_string'): parameters_with_pending.append(item) @@ -126,15 +133,19 @@ def _collect_pending_parameters(item: Any) -> None: return parameters_with_pending -def deserialize_and_resolve_parameters(params_data: Dict[str, Dict[str, Any]]) -> Dict[str, Parameter]: - """ - Deserialize parameters from a dictionary and resolve their dependencies. +def deserialize_and_resolve_parameters( + params_data: Dict[str, Dict[str, Any]], +) -> Dict[str, Parameter]: + """Deserialize parameters from a dictionary and resolve their + dependencies. - This is a convenience function that combines Parameter.from_dict() deserialization - with dependency resolution in a single call. + This is a convenience function that combines Parameter.from_dict() + deserialization with dependency resolution in a single call. - :param params_data: Dictionary mapping parameter names to their serialized data - :return: Dictionary mapping parameter names to deserialized Parameters with resolved dependencies + :param params_data: Dictionary mapping parameter names to their + serialized data + :return: Dictionary mapping parameter names to deserialized + Parameters with resolved dependencies """ # Deserialize all parameters first new_params = {} diff --git a/tests/integration/fitting/test_fitter.py b/tests/integration/fitting/test_fitter.py index d5c9b255..df48894a 100644 --- a/tests/integration/fitting/test_fitter.py +++ b/tests/integration/fitting/test_fitter.py @@ -1,16 +1,17 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project Parameter: @@ -84,14 +85,12 @@ def check_fit_results(result, sp_sin, ref_sin, x, **kwargs): assert result.chi2 == pytest.approx(0, abs=1.5e-3 * (len(result.x) - result.n_pars)) assert result.reduced_chi == pytest.approx(0, abs=1.5e-3) assert result.success - if "sp_ref1" in kwargs.keys(): - sp_ref1 = kwargs["sp_ref1"] + if 'sp_ref1' in kwargs.keys(): + sp_ref1 = kwargs['sp_ref1'] for key, value in sp_ref1.items(): assert key in result.p.keys() assert key in result.p0.keys() - assert result.p0[key] == pytest.approx( - value - ) # Bumps does something strange here + assert result.p0[key] == pytest.approx(value) # Bumps does something strange here assert np.all(result.x == x) for item1, item2 in zip(sp_sin._kwargs.values(), ref_sin._kwargs.values()): # assert item.error > 0 % This does not work as some methods don't calculate error @@ -103,7 +102,7 @@ def check_fit_results(result, sp_sin, ref_sin, x, **kwargs): @pytest.mark.parametrize( - "fit_engine", + 'fit_engine', [ None, AvailableMinimizers.LMFit, @@ -127,7 +126,7 @@ def test_basic_fit(fit_engine: AvailableMinimizers): try: f.switch_minimizer(fit_engine) except AttributeError: - pytest.skip(msg=f"{fit_engine} is not installed") + pytest.skip(msg=f'{fit_engine} is not installed') result = f.fit(x=x, y=y, weights=weights) @@ -140,7 +139,7 @@ def test_basic_fit(fit_engine: AvailableMinimizers): @pytest.mark.parametrize( - "fit_engine", + 'fit_engine', [ None, AvailableMinimizers.LMFit, @@ -160,11 +159,11 @@ def test_fit_result(fit_engine): sp_sin.phase.fixed = False sp_ref1 = { - f"p{item1.unique_name}": item1.value + f'p{item1.unique_name}': item1.value for item1, item2 in zip(sp_sin._kwargs.values(), ref_sin._kwargs.values()) } sp_ref2 = { - f"p{item1.unique_name}": item2.value + f'p{item1.unique_name}': item2.value for item1, item2 in zip(sp_sin._kwargs.values(), ref_sin._kwargs.values()) } @@ -174,14 +173,14 @@ def test_fit_result(fit_engine): try: f.switch_minimizer(fit_engine) except AttributeError: - pytest.skip(msg=f"{fit_engine} is not installed") + pytest.skip(msg=f'{fit_engine} is not installed') result = f.fit(x, y, weights=weights) check_fit_results(result, sp_sin, ref_sin, x, sp_ref1=sp_ref1, sp_ref2=sp_ref2) @pytest.mark.parametrize( - "fit_engine", + 'fit_engine', [ None, AvailableMinimizers.LMFit, @@ -205,7 +204,7 @@ def test_basic_max_evaluations(fit_engine): try: f.switch_minimizer(fit_engine) except AttributeError: - pytest.skip(msg=f"{fit_engine} is not installed") + pytest.skip(msg=f'{fit_engine} is not installed') f.max_evaluations = 3 try: result = f.fit(x=x, y=y, weights=weights) @@ -214,11 +213,11 @@ def test_basic_max_evaluations(fit_engine): assert sp_sin.offset.value != pytest.approx(ref_sin.offset.value, rel=1e-3) except FitError as e: # DFO throws a different error - assert "Objective has been called MAXFUN times" in str(e) + assert 'Objective has been called MAXFUN times' in str(e) @pytest.mark.parametrize( - "fit_engine,tolerance", + 'fit_engine,tolerance', [ (None, 10), (AvailableMinimizers.LMFit, 10), @@ -242,7 +241,7 @@ def test_basic_tolerance(fit_engine, tolerance): try: f.switch_minimizer(fit_engine) except AttributeError: - pytest.skip(msg=f"{fit_engine} is not installed") + pytest.skip(msg=f'{fit_engine} is not installed') f.tolerance = tolerance result = f.fit(x=x, y=y, weights=weights) # Result should not be the same as the reference @@ -250,7 +249,7 @@ def test_basic_tolerance(fit_engine, tolerance): assert sp_sin.offset.value != pytest.approx(ref_sin.offset.value, rel=1e-3) -@pytest.mark.parametrize("fit_method", ["leastsq", "powell", "cobyla"]) +@pytest.mark.parametrize('fit_method', ['leastsq', 'powell', 'cobyla']) def test_lmfit_methods(fit_method): ref_sin = AbsSin(0.2, np.pi) sp_sin = AbsSin(0.354, 3.05) @@ -269,7 +268,7 @@ def test_lmfit_methods(fit_method): # @pytest.mark.xfail(reason="known bumps issue") -@pytest.mark.parametrize("fit_method", ["newton", "lm"]) +@pytest.mark.parametrize('fit_method', ['newton', 'lm']) def test_bumps_methods(fit_method): ref_sin = AbsSin(0.2, np.pi) sp_sin = AbsSin(0.354, 3.05) @@ -282,14 +281,14 @@ def test_bumps_methods(fit_method): sp_sin.phase.fixed = False f = Fitter(sp_sin, sp_sin) - f.switch_minimizer("Bumps") + f.switch_minimizer('Bumps') assert fit_method in f._minimizer.supported_methods() result = f.fit(x, y, weights=weights, method=fit_method) check_fit_results(result, sp_sin, ref_sin, x) @pytest.mark.parametrize( - "fit_engine", + 'fit_engine', [AvailableMinimizers.LMFit, AvailableMinimizers.Bumps, AvailableMinimizers.DFO], ) def test_dependent_parameter(fit_engine): @@ -303,21 +302,21 @@ def test_dependent_parameter(fit_engine): f = Fitter(sp_sin, sp_sin) sp_sin.offset.make_dependent_on( - dependency_expression="2*phase", dependency_map={"phase": sp_sin.phase} + dependency_expression='2*phase', dependency_map={'phase': sp_sin.phase} ) if fit_engine is not None: try: f.switch_minimizer(fit_engine) except AttributeError: - pytest.skip(msg=f"{fit_engine} is not installed") + pytest.skip(msg=f'{fit_engine} is not installed') result = f.fit(x, y, weights=weights) check_fit_results(result, sp_sin, ref_sin, x) @pytest.mark.parametrize( - "fit_engine", + 'fit_engine', [ None, AvailableMinimizers.LMFit, @@ -337,12 +336,12 @@ def test_2D_vectorized(fit_engine): try: ff.switch_minimizer(fit_engine) except AttributeError: - pytest.skip(msg=f"{fit_engine} is not installed") + pytest.skip(msg=f'{fit_engine} is not installed') try: result = ff.fit(x=XY, y=mm(XY), weights=weights, vectorized=True) except FitError as e: - if "Unable to allocate" in str(e): - pytest.skip(msg="MemoryError - Matrix too large") + if 'Unable to allocate' in str(e): + pytest.skip(msg='MemoryError - Matrix too large') else: raise e assert result.n_pars == len(m2.get_fit_parameters()) @@ -355,7 +354,7 @@ def test_2D_vectorized(fit_engine): @pytest.mark.parametrize( - "fit_engine", + 'fit_engine', [ None, AvailableMinimizers.LMFit, @@ -375,14 +374,12 @@ def test_2D_non_vectorized(fit_engine): try: ff.switch_minimizer(fit_engine) except AttributeError: - pytest.skip(msg=f"{fit_engine} is not installed") + pytest.skip(msg=f'{fit_engine} is not installed') try: - result = ff.fit( - x=XY, y=mm(XY.reshape(-1, 2)), weights=weights, vectorized=False - ) + result = ff.fit(x=XY, y=mm(XY.reshape(-1, 2)), weights=weights, vectorized=False) except FitError as e: - if "Unable to allocate" in str(e): - pytest.skip(msg="MemoryError - Matrix too large") + if 'Unable to allocate' in str(e): + pytest.skip(msg='MemoryError - Matrix too large') else: raise e assert result.n_pars == len(m2.get_fit_parameters()) @@ -391,13 +388,11 @@ def test_2D_non_vectorized(fit_engine): assert np.all(result.x == XY) y_calc_ref = m2(XY.reshape(-1, 2)) assert result.y_calc == pytest.approx(y_calc_ref, abs=1e-2) - assert result.residual == pytest.approx( - mm(XY.reshape(-1, 2)) - y_calc_ref, abs=1e-2 - ) + assert result.residual == pytest.approx(mm(XY.reshape(-1, 2)) - y_calc_ref, abs=1e-2) @pytest.mark.parametrize( - "fit_engine", + 'fit_engine', [ None, AvailableMinimizers.LMFit, @@ -426,7 +421,7 @@ def test_fixed_parameter_does_not_change(fit_engine): try: f.switch_minimizer(fit_engine) except AttributeError: - pytest.skip(msg=f"{fit_engine} is not installed") + pytest.skip(msg=f'{fit_engine} is not installed') result = f.fit(x=x, y=y, weights=weights) @@ -454,13 +449,11 @@ def test_fitter_new_model_base_integration(): # EXPECT assert model.slope.value == pytest.approx(ground_truth.slope.value, rel=1e-3) - assert model.intercept.value == pytest.approx( - ground_truth.intercept.value, rel=1e-3 - ) + assert model.intercept.value == pytest.approx(ground_truth.intercept.value, rel=1e-3) @pytest.mark.parametrize( - "fit_engine", + 'fit_engine', [ None, AvailableMinimizers.LMFit, @@ -501,7 +494,7 @@ def run_fit(weights): try: f.switch_minimizer(fit_engine) except AttributeError: - pytest.skip(msg=f"{fit_engine} is not installed") + pytest.skip(msg=f'{fit_engine} is not installed') f.fit(x=x, y=y, weights=weights) return model.offset.value, model.phase.value @@ -511,6 +504,4 @@ def run_fit(weights): # The fit should shift more toward the distorted region # when it has higher weight - assert abs(offset_high - ref_sin.offset.value) > abs( - offset_low - ref_sin.offset.value - ) + assert abs(offset_high - ref_sin.offset.value) > abs(offset_low - ref_sin.offset.value) diff --git a/tests/integration/fitting/test_multi_fitter.py b/tests/integration/fitting/test_multi_fitter.py index fb2c7802..3b34a1d9 100644 --- a/tests/integration/fitting/test_multi_fitter.py +++ b/tests/integration/fitting/test_multi_fitter.py @@ -1,14 +1,15 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project +# SPDX-License-Identifier: BSD-3-Clause -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project +# SPDX-License-Identifier: BSD-3-Clause -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project +# SPDX-License-Identifier: BSD-3-Clause + +from unittest.mock import MagicMock + +import pytest + from easyscience import AvailableMinimizers -from easyscience.fitting.minimizers.factory import factory from easyscience.fitting.available_minimizers import from_string_to_enum from easyscience.fitting.minimizers import MinimizerBase -from unittest.mock import MagicMock -import pytest +from easyscience.fitting.minimizers.factory import factory + class TestFactory: def pull_minminizer(self, minimizer: AvailableMinimizers) -> MinimizerBase: @@ -12,36 +18,78 @@ def pull_minminizer(self, minimizer: AvailableMinimizers) -> MinimizerBase: minimizer = factory(minimizer, mock_fit_object, mock_fit_function) return minimizer - @pytest.mark.parametrize('minimizer_method,minimizer_enum', [('leastsq', AvailableMinimizers.LMFit), ('leastsq', AvailableMinimizers.LMFit_leastsq), ('powell', AvailableMinimizers.LMFit_powell), ('cobyla', AvailableMinimizers.LMFit_cobyla), ('differential_evolution', AvailableMinimizers.LMFit_differential_evolution), ('least_squares', AvailableMinimizers.LMFit_scipy_least_squares)]) + @pytest.mark.parametrize( + 'minimizer_method,minimizer_enum', + [ + ('leastsq', AvailableMinimizers.LMFit), + ('leastsq', AvailableMinimizers.LMFit_leastsq), + ('powell', AvailableMinimizers.LMFit_powell), + ('cobyla', AvailableMinimizers.LMFit_cobyla), + ('differential_evolution', AvailableMinimizers.LMFit_differential_evolution), + ('least_squares', AvailableMinimizers.LMFit_scipy_least_squares), + ], + ) def test_factory_lm_fit(self, minimizer_method, minimizer_enum): minimizer = self.pull_minminizer(minimizer_enum) assert minimizer._method == minimizer_method assert minimizer.package == 'lmfit' - @pytest.mark.parametrize('minimizer_method,minimizer_enum', [('amoeba', AvailableMinimizers.Bumps), ('amoeba', AvailableMinimizers.Bumps_simplex), ('newton', AvailableMinimizers.Bumps_newton), ('lm', AvailableMinimizers.Bumps_lm)]) + @pytest.mark.parametrize( + 'minimizer_method,minimizer_enum', + [ + ('amoeba', AvailableMinimizers.Bumps), + ('amoeba', AvailableMinimizers.Bumps_simplex), + ('newton', AvailableMinimizers.Bumps_newton), + ('lm', AvailableMinimizers.Bumps_lm), + ], + ) def test_factory_bumps_fit(self, minimizer_method, minimizer_enum): minimizer = self.pull_minminizer(minimizer_enum) assert minimizer._method == minimizer_method assert minimizer.package == 'bumps' - @pytest.mark.parametrize('minimizer_method,minimizer_enum', [('leastsq', AvailableMinimizers.DFO), ('leastsq', AvailableMinimizers.DFO_leastsq)]) + @pytest.mark.parametrize( + 'minimizer_method,minimizer_enum', + [('leastsq', AvailableMinimizers.DFO), ('leastsq', AvailableMinimizers.DFO_leastsq)], + ) def test_factory_dfo_fit(self, minimizer_method, minimizer_enum): minimizer = self.pull_minminizer(minimizer_enum) assert minimizer._method == minimizer_method assert minimizer.package == 'dfo' -@pytest.mark.parametrize('minimizer_name,expected', [('LMFit', AvailableMinimizers.LMFit), ('LMFit_leastsq', AvailableMinimizers.LMFit_leastsq), ('LMFit_powell', AvailableMinimizers.LMFit_powell), ('LMFit_cobyla', AvailableMinimizers.LMFit_cobyla), ('LMFit_differential_evolution', AvailableMinimizers.LMFit_differential_evolution), ('LMFit_scipy_least_squares', AvailableMinimizers.LMFit_scipy_least_squares) ]) +@pytest.mark.parametrize( + 'minimizer_name,expected', + [ + ('LMFit', AvailableMinimizers.LMFit), + ('LMFit_leastsq', AvailableMinimizers.LMFit_leastsq), + ('LMFit_powell', AvailableMinimizers.LMFit_powell), + ('LMFit_cobyla', AvailableMinimizers.LMFit_cobyla), + ('LMFit_differential_evolution', AvailableMinimizers.LMFit_differential_evolution), + ('LMFit_scipy_least_squares', AvailableMinimizers.LMFit_scipy_least_squares), + ], +) def test_from_string_to_enum_lmfit(minimizer_name, expected): assert from_string_to_enum(minimizer_name) == expected -@pytest.mark.parametrize('minimizer_name,expected', [('Bumps', AvailableMinimizers.Bumps), ('Bumps_simplex', AvailableMinimizers.Bumps_simplex), ('Bumps_newton', AvailableMinimizers.Bumps_newton), ('Bumps_lm', AvailableMinimizers.Bumps_lm)]) +@pytest.mark.parametrize( + 'minimizer_name,expected', + [ + ('Bumps', AvailableMinimizers.Bumps), + ('Bumps_simplex', AvailableMinimizers.Bumps_simplex), + ('Bumps_newton', AvailableMinimizers.Bumps_newton), + ('Bumps_lm', AvailableMinimizers.Bumps_lm), + ], +) def test_from_string_to_enum_bumps(minimizer_name, expected): assert from_string_to_enum(minimizer_name) == expected -@pytest.mark.parametrize('minimizer_name,expected', [('DFO', AvailableMinimizers.DFO), ('DFO_leastsq', AvailableMinimizers.DFO_leastsq)]) +@pytest.mark.parametrize( + 'minimizer_name,expected', + [('DFO', AvailableMinimizers.DFO), ('DFO_leastsq', AvailableMinimizers.DFO_leastsq)], +) def test_from_string_to_enum_dfo(minimizer_name, expected): assert from_string_to_enum(minimizer_name) == expected @@ -59,4 +107,4 @@ def test_available_minimizers(): assert AvailableMinimizers.Bumps_lm assert AvailableMinimizers.DFO assert AvailableMinimizers.DFO_leastsq - assert len(AvailableMinimizers) == 12 \ No newline at end of file + assert len(AvailableMinimizers) == 12 diff --git a/tests/unit/fitting/minimizers/test_minimizer_base.py b/tests/unit/fitting/minimizers/test_minimizer_base.py index e4fcb005..6598bd28 100644 --- a/tests/unit/fitting/minimizers/test_minimizer_base.py +++ b/tests/unit/fitting/minimizers/test_minimizer_base.py @@ -1,30 +1,31 @@ -import pytest - -from unittest.mock import MagicMock +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause from inspect import Parameter as InspectParameter from inspect import Signature from inspect import _empty +from unittest.mock import MagicMock + +import pytest +from easyscience import Parameter from easyscience.fitting.minimizers.minimizer_base import MinimizerBase from easyscience.fitting.minimizers.utils import FitError -from easyscience import Parameter -class TestMinimizerBase(): + +class TestMinimizerBase: @pytest.fixture def minimizer(self): # This avoids the error: TypeError: Can't instantiate abstract class with abstract methods __init__ MinimizerBase.__abstractmethods__ = set() MinimizerBase.supported_methods = MagicMock(return_value=['method']) - self._mock_minimizer_enum = MagicMock(package='package', method='method') + self._mock_minimizer_enum = MagicMock(package='package', method='method') minimizer = MinimizerBase( - obj='obj', - fit_function='fit_function', - minimizer_enum=self._mock_minimizer_enum + obj='obj', fit_function='fit_function', minimizer_enum=self._mock_minimizer_enum ) return minimizer - + def test_init_exception(self): # When Then MinimizerBase.__abstractmethods__ = set() @@ -34,8 +35,8 @@ def test_init_exception(self): with pytest.raises(FitError): MinimizerBase( obj='obj', - fit_function='fit_function', - minimizer_enum=MagicMock(package='package', method='not_a_method') + fit_function='fit_function', + minimizer_enum=MagicMock(package='package', method='not_a_method'), ) def test_init(self, minimizer: MinimizerBase): @@ -46,35 +47,51 @@ def test_init(self, minimizer: MinimizerBase): assert minimizer._cached_pars_vals == {} assert minimizer._cached_model == None assert minimizer._fit_function == None - + def test_enum(self, minimizer: MinimizerBase): assert minimizer.enum == self._mock_minimizer_enum def test_evaluate(self, minimizer: MinimizerBase): # When minimizer._fit_function = MagicMock(return_value='fit_function_return') - minimizer._prepare_parameters = MagicMock(return_value={'prepared_parms_key': 'prepared_parms_val'}) + minimizer._prepare_parameters = MagicMock( + return_value={'prepared_parms_key': 'prepared_parms_val'} + ) # Then - result = minimizer.evaluate('x', minimizer_parameters={'parms_key': 'parms_val'}, kwargs={'kwargs_key': 'kwargs_val'}) + result = minimizer.evaluate( + 'x', + minimizer_parameters={'parms_key': 'parms_val'}, + kwargs={'kwargs_key': 'kwargs_val'}, + ) # Expect assert result == 'fit_function_return' - minimizer._fit_function.assert_called_once_with('x', prepared_parms_key='prepared_parms_val', kwargs={'kwargs_key': 'kwargs_val'}) + minimizer._fit_function.assert_called_once_with( + 'x', prepared_parms_key='prepared_parms_val', kwargs={'kwargs_key': 'kwargs_val'} + ) minimizer._prepare_parameters.assert_called_once_with({'parms_key': 'parms_val'}) def test_evaluate_no_fit_function(self, minimizer: MinimizerBase): # When mock_fit_function = MagicMock() minimizer._fit_function = None - minimizer._prepare_parameters = MagicMock(return_value={'prepared_parms_key': 'prepared_parms_val'}) + minimizer._prepare_parameters = MagicMock( + return_value={'prepared_parms_key': 'prepared_parms_val'} + ) minimizer._generate_fit_function = MagicMock(return_value=mock_fit_function) # Then - minimizer.evaluate('x', minimizer_parameters={'parms_key': 'parms_val'}, kwargs={'kwargs_key': 'kwargs_val'}) + minimizer.evaluate( + 'x', + minimizer_parameters={'parms_key': 'parms_val'}, + kwargs={'kwargs_key': 'kwargs_val'}, + ) # Expect - mock_fit_function.assert_called_once_with('x', prepared_parms_key='prepared_parms_val', kwargs={'kwargs_key': 'kwargs_val'}) + mock_fit_function.assert_called_once_with( + 'x', prepared_parms_key='prepared_parms_val', kwargs={'kwargs_key': 'kwargs_val'} + ) minimizer._prepare_parameters.assert_called_once_with({'parms_key': 'parms_val'}) def test_evaluate_no_parameters(self, minimizer: MinimizerBase): @@ -99,16 +116,9 @@ def test_evaluate_exception(self, minimizer: MinimizerBase): def test_prepare_parameters(self, minimizer: MinimizerBase): # When - parameters = { - 'pa': 1, - 'pb': 2 - } - - minimizer._cached_pars = { - 'a': MagicMock(), - 'b': MagicMock(), - 'c': MagicMock() - } + parameters = {'pa': 1, 'pb': 2} + + minimizer._cached_pars = {'a': MagicMock(), 'b': MagicMock(), 'c': MagicMock()} minimizer._cached_pars['a'].value = 3 minimizer._cached_pars['b'].value = 4 minimizer._cached_pars['c'].value = 5 @@ -117,11 +127,7 @@ def test_prepare_parameters(self, minimizer: MinimizerBase): parameters = minimizer._prepare_parameters(parameters) # Expect - assert parameters == { - 'pa': 1, - 'pb': 2, - 'pc': 5 - } + assert parameters == {'pa': 1, 'pb': 2, 'pc': 5} def test_generate_fit_function(self, minimizer: MinimizerBase) -> None: # When @@ -159,12 +165,16 @@ def test_create_signature(self, minimizer: MinimizerBase) -> None: # Then signature = minimizer._create_signature(pars) - + # Expect wrapped_parameters = [ InspectParameter('x', InspectParameter.POSITIONAL_OR_KEYWORD, annotation=_empty), - InspectParameter('p1', InspectParameter.POSITIONAL_OR_KEYWORD, annotation=_empty, default=1.0), - InspectParameter('p2', InspectParameter.POSITIONAL_OR_KEYWORD, annotation=_empty, default=2.0) + InspectParameter( + 'p1', InspectParameter.POSITIONAL_OR_KEYWORD, annotation=_empty, default=1.0 + ), + InspectParameter( + 'p2', InspectParameter.POSITIONAL_OR_KEYWORD, annotation=_empty, default=2.0 + ), ] expected_signature = Signature(wrapped_parameters) assert signature == expected_signature @@ -177,7 +187,7 @@ def test_get_method_dict(self, minimizer: MinimizerBase) -> None: assert result == {'method': 'method'} def test_get_method_dict_no_self(self, minimizer: MinimizerBase) -> None: - # When + # When minimizer._method = None # Then @@ -203,4 +213,3 @@ def test_get_method_dict_not_supported_method(self, minimizer: MinimizerBase) -> # Then Expect with pytest.raises(FitError): result = minimizer._get_method_kwargs('not_supported_method') - diff --git a/tests/unit/fitting/minimizers/test_minimizer_bumps.py b/tests/unit/fitting/minimizers/test_minimizer_bumps.py index 703b0617..c7ba0658 100644 --- a/tests/unit/fitting/minimizers/test_minimizer_bumps.py +++ b/tests/unit/fitting/minimizers/test_minimizer_bumps.py @@ -1,21 +1,23 @@ -import pytest +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause from unittest.mock import MagicMock + import numpy as np +import pytest import easyscience.fitting.minimizers.minimizer_bumps - from easyscience.fitting.minimizers.minimizer_bumps import Bumps from easyscience.fitting.minimizers.utils import FitError -class TestBumpsFit(): +class TestBumpsFit: @pytest.fixture def minimizer(self) -> Bumps: minimizer = Bumps( obj='obj', - fit_function='fit_function', - minimizer_enum=MagicMock(package='bumps', method='amoeba') + fit_function='fit_function', + minimizer_enum=MagicMock(package='bumps', method='amoeba'), ) return minimizer @@ -27,8 +29,8 @@ def test_init_exception(self) -> None: with pytest.raises(FitError): Bumps( obj='obj', - fit_function='fit_function', - minimizer_enum=MagicMock(package='bumps', method='not_amoeba') + fit_function='fit_function', + minimizer_enum=MagicMock(package='bumps', method='not_amoeba'), ) def test_all_methods(self, minimizer: Bumps) -> None: @@ -42,10 +44,13 @@ def test_supported_methods(self, minimizer: Bumps) -> None: def test_fit(self, minimizer: Bumps, monkeypatch) -> None: # When from easyscience import global_object + global_object.stack.enabled = False mock_bumps_fit = MagicMock(return_value='fit') - monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_bumps, "bumps_fit", mock_bumps_fit) + monkeypatch.setattr( + easyscience.fitting.minimizers.minimizer_bumps, 'bumps_fit', mock_bumps_fit + ) # Prepare a mock parameter with .name = 'pmock_parm_1' mock_bumps_param = MagicMock() @@ -54,7 +59,9 @@ def test_fit(self, minimizer: Bumps, monkeypatch) -> None: mock_FitProblem_instance = MagicMock() mock_FitProblem_instance._parameters = [mock_bumps_param] mock_FitProblem = MagicMock(return_value=mock_FitProblem_instance) - monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_bumps, "FitProblem", mock_FitProblem) + monkeypatch.setattr( + easyscience.fitting.minimizers.minimizer_bumps, 'FitProblem', mock_FitProblem + ) mock_model = MagicMock() mock_model_function = MagicMock(return_value=mock_model) @@ -70,8 +77,9 @@ def test_fit(self, minimizer: Bumps, monkeypatch) -> None: def fake_set_parameter_fit_result(fit_result, stack_status, par_list): # Simulate what the real function does: update _cached_pars for index, name in enumerate([par.name for par in par_list]): - dict_name = name[len('p'):] # Remove prefix 'p' + dict_name = name[len('p') :] # Remove prefix 'p' minimizer._cached_pars[dict_name].value = 42 # Arbitrary value + minimizer._set_parameter_fit_result = fake_set_parameter_fit_result # Then @@ -85,12 +93,22 @@ def fake_set_parameter_fit_result(fit_result, stack_status, par_list): mock_model_function.assert_called_once_with(1.0, 2.0, 1) mock_FitProblem.assert_called_once_with(mock_model) - @pytest.mark.parametrize("weights", [np.array([1, 2, 3, 4]), np.array([[1, 2, 3], [4, 5, 6]]), np.repeat(np.nan,3), np.zeros(3), np.repeat(np.inf,3), -np.ones(3)], ids=["wrong_length", "multidimensional", "NaNs", "zeros", "Infs", "negative"]) + @pytest.mark.parametrize( + 'weights', + [ + np.array([1, 2, 3, 4]), + np.array([[1, 2, 3], [4, 5, 6]]), + np.repeat(np.nan, 3), + np.zeros(3), + np.repeat(np.inf, 3), + -np.ones(3), + ], + ids=['wrong_length', 'multidimensional', 'NaNs', 'zeros', 'Infs', 'negative'], + ) def test_fit_weight_exceptions(self, minimizer: Bumps, weights) -> None: # When Then Expect with pytest.raises(ValueError): minimizer.fit(x=np.array([1, 2, 3]), y=np.array([1, 2, 3]), weights=weights) - def test_make_model(self, minimizer: Bumps, monkeypatch) -> None: # When @@ -99,20 +117,22 @@ def test_make_model(self, minimizer: Bumps, monkeypatch) -> None: mock_parm_1 = MagicMock() mock_parm_1.unique_name = 'mock_parm_1' - minimizer.convert_to_par_object = MagicMock(return_value='converted_parm_1') + minimizer.convert_to_par_object = MagicMock(return_value='converted_parm_1') mock_Curve = MagicMock(return_value='curve') - monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_bumps, "Curve", mock_Curve) + monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_bumps, 'Curve', mock_Curve) # Then model = minimizer._make_model(parameters=[mock_parm_1]) - curve_for_model = model(x=np.array([1, 2]), y=np.array([10, 20]), weights=np.array([100, 200])) + curve_for_model = model( + x=np.array([1, 2]), y=np.array([10, 20]), weights=np.array([100, 200]) + ) # Expect minimizer._generate_fit_function.assert_called_once_with() assert mock_Curve.call_args[0][0] == mock_fit_function - assert all(mock_Curve.call_args[0][1] == np.array([1,2])) - assert all(mock_Curve.call_args[0][2] == np.array([10,20])) + assert all(mock_Curve.call_args[0][1] == np.array([1, 2])) + assert all(mock_Curve.call_args[0][2] == np.array([10, 20])) assert curve_for_model == 'curve' def test_set_parameter_fit_result_no_stack_status(self, minimizer: Bumps): @@ -125,7 +145,7 @@ def test_set_parameter_fit_result_no_stack_status(self, minimizer: Bumps): minimizer._cached_pars['b'].value = 'b' mock_cached_model = MagicMock() - mock_cached_model.pars = {'pa':0, 'pb': 0} + mock_cached_model.pars = {'pa': 0, 'pb': 0} minimizer._cached_model = mock_cached_model mock_fit_result = MagicMock() @@ -152,7 +172,9 @@ def test_gen_fit_results(self, minimizer: Bumps, monkeypatch): # When mock_domain_fit_results = MagicMock() mock_FitResults = MagicMock(return_value=mock_domain_fit_results) - monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_bumps, "FitResults", mock_FitResults) + monkeypatch.setattr( + easyscience.fitting.minimizers.minimizer_bumps, 'FitResults', mock_FitResults + ) mock_fit_result = MagicMock() mock_fit_result.success = True @@ -170,22 +192,29 @@ def test_gen_fit_results(self, minimizer: Bumps, monkeypatch): mock_cached_par_2.value = 'par_value_2' minimizer._cached_pars = {'par_1': mock_cached_par_1, 'par_2': mock_cached_par_2} - minimizer._p_0 = 'p_0' + minimizer._p_0 = 'p_0' minimizer.evaluate = MagicMock(return_value='evaluate') # Then - domain_fit_results = minimizer._gen_fit_results(mock_fit_result, **{'kwargs_set_key': 'kwargs_set_val'}) + domain_fit_results = minimizer._gen_fit_results( + mock_fit_result, **{'kwargs_set_key': 'kwargs_set_val'} + ) # Expect assert domain_fit_results == mock_domain_fit_results assert domain_fit_results.kwargs_set_key == 'kwargs_set_val' - assert domain_fit_results.success == True + assert domain_fit_results.success == True assert domain_fit_results.y_obs == 'y' assert domain_fit_results.x == 'x' assert domain_fit_results.p == {'ppar_1': 'par_value_1', 'ppar_2': 'par_value_2'} assert domain_fit_results.p0 == 'p_0' assert domain_fit_results.y_calc == 'evaluate' assert domain_fit_results.y_err == 'dy' - assert str(domain_fit_results.minimizer_engine) == "" + assert ( + str(domain_fit_results.minimizer_engine) + == "" + ) assert domain_fit_results.fit_args is None - minimizer.evaluate.assert_called_once_with('x', minimizer_parameters={'ppar_1': 'par_value_1', 'ppar_2': 'par_value_2'}) + minimizer.evaluate.assert_called_once_with( + 'x', minimizer_parameters={'ppar_1': 'par_value_1', 'ppar_2': 'par_value_2'} + ) diff --git a/tests/unit/fitting/minimizers/test_minimizer_dfo.py b/tests/unit/fitting/minimizers/test_minimizer_dfo.py index 439afea0..bbf558f1 100644 --- a/tests/unit/fitting/minimizers/test_minimizer_dfo.py +++ b/tests/unit/fitting/minimizers/test_minimizer_dfo.py @@ -1,44 +1,46 @@ -import pytest +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause from unittest.mock import MagicMock + import numpy as np +import pytest import easyscience.fitting.minimizers.minimizer_dfo -from easyscience.variable import Parameter - from easyscience.fitting.minimizers.minimizer_dfo import DFO from easyscience.fitting.minimizers.utils import FitError +from easyscience.variable import Parameter class TestDFOFit: @pytest.fixture def minimizer(self) -> DFO: minimizer = DFO( - obj="obj", - fit_function="fit_function", - minimizer_enum=MagicMock(package="dfo", method="leastsq"), + obj='obj', + fit_function='fit_function', + minimizer_enum=MagicMock(package='dfo', method='leastsq'), ) return minimizer def test_init(self, minimizer: DFO) -> None: assert minimizer._p_0 == {} - assert minimizer.package == "dfo" + assert minimizer.package == 'dfo' def test_init_exception(self) -> None: with pytest.raises(FitError): DFO( - obj="obj", - fit_function="fit_function", - minimizer_enum=MagicMock(package="dfo", method="not_leastsq"), + obj='obj', + fit_function='fit_function', + minimizer_enum=MagicMock(package='dfo', method='not_leastsq'), ) def test_supported_methods(self, minimizer: DFO) -> None: # When Then Expect - assert minimizer.supported_methods() == ["leastsq"] + assert minimizer.supported_methods() == ['leastsq'] def test_supported_methods(self, minimizer: DFO) -> None: # When Then Expect - assert minimizer.supported_methods() == ["leastsq"] + assert minimizer.supported_methods() == ['leastsq'] def test_fit(self, minimizer: DFO) -> None: # When @@ -49,55 +51,53 @@ def test_fit(self, minimizer: DFO) -> None: mock_model = MagicMock() mock_model_function = MagicMock(return_value=mock_model) minimizer._make_model = MagicMock(return_value=mock_model_function) - minimizer._dfo_fit = MagicMock(return_value="fit") + minimizer._dfo_fit = MagicMock(return_value='fit') minimizer._set_parameter_fit_result = MagicMock() - minimizer._gen_fit_results = MagicMock(return_value="gen_fit_results") + minimizer._gen_fit_results = MagicMock(return_value='gen_fit_results') cached_par = MagicMock() cached_par.value = 1 - cached_pars = {"mock_parm_1": cached_par} + cached_pars = {'mock_parm_1': cached_par} minimizer._cached_pars = cached_pars # Then result = minimizer.fit(x=1.0, y=2.0, weights=1) # Expect - assert result == "gen_fit_results" + assert result == 'gen_fit_results' minimizer._dfo_fit.assert_called_once_with(cached_pars, mock_model) minimizer._make_model.assert_called_once_with(parameters=None) - minimizer._set_parameter_fit_result.assert_called_once_with("fit", False) - minimizer._gen_fit_results.assert_called_once_with("fit", 1) + minimizer._set_parameter_fit_result.assert_called_once_with('fit', False) + minimizer._gen_fit_results.assert_called_once_with('fit', 1) mock_model_function.assert_called_once_with(1.0, 2.0, 1) def test_generate_fit_function(self, minimizer: DFO) -> None: # When - minimizer._original_fit_function = MagicMock(return_value="fit_function_result") + minimizer._original_fit_function = MagicMock(return_value='fit_function_result') minimizer._object = MagicMock() mock_parm_1 = MagicMock() - mock_parm_1.unique_name = "mock_parm_1" + mock_parm_1.unique_name = 'mock_parm_1' mock_parm_1.value = 1.0 mock_parm_1.error = 0.1 mock_parm_2 = MagicMock() - mock_parm_2.unique_name = "mock_parm_2" + mock_parm_2.unique_name = 'mock_parm_2' mock_parm_2.value = 2.0 mock_parm_2.error = 0.2 - minimizer._object.get_fit_parameters = MagicMock( - return_value=[mock_parm_1, mock_parm_2] - ) + minimizer._object.get_fit_parameters = MagicMock(return_value=[mock_parm_1, mock_parm_2]) # Then fit_function = minimizer._generate_fit_function() fit_function_result = fit_function([10.0]) # Expect - assert "fit_function_result" == fit_function_result + assert 'fit_function_result' == fit_function_result minimizer._original_fit_function.assert_called_once_with([10.0]) - assert minimizer._cached_pars["mock_parm_1"] == mock_parm_1 - assert minimizer._cached_pars["mock_parm_2"] == mock_parm_2 + assert minimizer._cached_pars['mock_parm_1'] == mock_parm_1 + assert minimizer._cached_pars['mock_parm_2'] == mock_parm_2 @pytest.mark.parametrize( - "weights", + 'weights', [ np.array([1, 2, 3, 4]), np.array([[1, 2, 3], [4, 5, 6]]), @@ -106,7 +106,7 @@ def test_generate_fit_function(self, minimizer: DFO) -> None: np.repeat(np.inf, 3), -np.ones(3), ], - ids=["wrong_length", "multidimensional", "NaNs", "zeros", "Infs", "negative"], + ids=['wrong_length', 'multidimensional', 'NaNs', 'zeros', 'Infs', 'negative'], ) def test_fit_weight_exceptions(self, minimizer: DFO, weights) -> None: # When Then Expect @@ -119,10 +119,10 @@ def test_make_model(self, minimizer: DFO) -> None: minimizer._generate_fit_function = MagicMock(return_value=mock_fit_function) mock_parm_1 = MagicMock() - mock_parm_1.unique_name = "mock_parm_1" + mock_parm_1.unique_name = 'mock_parm_1' mock_parm_1.value = 1000.0 mock_parm_2 = MagicMock() - mock_parm_2.unique_name = "mock_parm_2" + mock_parm_2.unique_name = 'mock_parm_2' mock_parm_2.value = 2000.0 # Then @@ -135,98 +135,92 @@ def test_make_model(self, minimizer: DFO) -> None: # Expect minimizer._generate_fit_function.assert_called_once_with() - assert all( - np.array([-0.01, -0.01]) == residuals_for_model(np.array([1111, 2222])) - ) + assert all(np.array([-0.01, -0.01]) == residuals_for_model(np.array([1111, 2222]))) assert all(mock_fit_function.call_args[0][0] == np.array([1, 2])) assert mock_fit_function.call_args[1] == { - "pmock_parm_1": 1111, - "pmock_parm_2": 2222, + 'pmock_parm_1': 1111, + 'pmock_parm_2': 2222, } def test_set_parameter_fit_result_no_stack_status(self, minimizer: DFO): # When minimizer._cached_pars = { - "a": MagicMock(), - "b": MagicMock(), + 'a': MagicMock(), + 'b': MagicMock(), } - minimizer._cached_pars["a"].value = "a" - minimizer._cached_pars["b"].value = "b" + minimizer._cached_pars['a'].value = 'a' + minimizer._cached_pars['b'].value = 'b' mock_fit_result = MagicMock() mock_fit_result.x = [1.0, 2.0] - mock_fit_result.jacobian = "jacobian" - mock_fit_result.resid = "resid" + mock_fit_result.jacobian = 'jacobian' + mock_fit_result.resid = 'resid' - minimizer._error_from_jacobian = MagicMock( - return_value=np.array([[0.1, 0.0], [0.0, 0.2]]) - ) + minimizer._error_from_jacobian = MagicMock(return_value=np.array([[0.1, 0.0], [0.0, 0.2]])) # Then minimizer._set_parameter_fit_result(mock_fit_result, False) # Expect - assert minimizer._cached_pars["a"].value == 1.0 - assert minimizer._cached_pars["a"].error == 0.1 - assert minimizer._cached_pars["b"].value == 2.0 - assert minimizer._cached_pars["b"].error == 0.2 - minimizer._error_from_jacobian.assert_called_once_with( - "jacobian", "resid", 0.95 - ) + assert minimizer._cached_pars['a'].value == 1.0 + assert minimizer._cached_pars['a'].error == 0.1 + assert minimizer._cached_pars['b'].value == 2.0 + assert minimizer._cached_pars['b'].error == 0.2 + minimizer._error_from_jacobian.assert_called_once_with('jacobian', 'resid', 0.95) def test_gen_fit_results(self, minimizer: DFO, monkeypatch): # When mock_domain_fit_results = MagicMock() mock_FitResults = MagicMock(return_value=mock_domain_fit_results) monkeypatch.setattr( - easyscience.fitting.minimizers.minimizer_dfo, "FitResults", mock_FitResults + easyscience.fitting.minimizers.minimizer_dfo, 'FitResults', mock_FitResults ) mock_fit_result = MagicMock() mock_fit_result.flag = False mock_cached_model = MagicMock() - mock_cached_model.x = "x" - mock_cached_model.y = "y" + mock_cached_model.x = 'x' + mock_cached_model.y = 'y' minimizer._cached_model = mock_cached_model mock_cached_par_1 = MagicMock() - mock_cached_par_1.value = "par_value_1" + mock_cached_par_1.value = 'par_value_1' mock_cached_par_2 = MagicMock() - mock_cached_par_2.value = "par_value_2" + mock_cached_par_2.value = 'par_value_2' minimizer._cached_pars = { - "par_1": mock_cached_par_1, - "par_2": mock_cached_par_2, + 'par_1': mock_cached_par_1, + 'par_2': mock_cached_par_2, } - minimizer._p_0 = "p_0" - minimizer.evaluate = MagicMock(return_value="evaluate") + minimizer._p_0 = 'p_0' + minimizer.evaluate = MagicMock(return_value='evaluate') # Then domain_fit_results = minimizer._gen_fit_results( - mock_fit_result, "weights", **{"kwargs_set_key": "kwargs_set_val"} + mock_fit_result, 'weights', **{'kwargs_set_key': 'kwargs_set_val'} ) # Expect assert domain_fit_results == mock_domain_fit_results - assert domain_fit_results.kwargs_set_key == "kwargs_set_val" + assert domain_fit_results.kwargs_set_key == 'kwargs_set_val' assert domain_fit_results.success == True - assert domain_fit_results.y_obs == "y" - assert domain_fit_results.x == "x" + assert domain_fit_results.y_obs == 'y' + assert domain_fit_results.x == 'x' assert domain_fit_results.p == { - "ppar_1": "par_value_1", - "ppar_2": "par_value_2", + 'ppar_1': 'par_value_1', + 'ppar_2': 'par_value_2', } - assert domain_fit_results.p0 == "p_0" - assert domain_fit_results.y_calc == "evaluate" - assert domain_fit_results.y_err == "weights" + assert domain_fit_results.p0 == 'p_0' + assert domain_fit_results.y_calc == 'evaluate' + assert domain_fit_results.y_err == 'weights' assert ( str(domain_fit_results.minimizer_engine) == "" ) assert domain_fit_results.fit_args is None minimizer.evaluate.assert_called_once_with( - "x", minimizer_parameters={"ppar_1": "par_value_1", "ppar_2": "par_value_2"} + 'x', minimizer_parameters={'ppar_1': 'par_value_1', 'ppar_2': 'par_value_2'} ) def test_dfo_fit(self, minimizer: DFO, monkeypatch): @@ -241,28 +235,26 @@ def test_dfo_fit(self, minimizer: DFO, monkeypatch): mock_parm_2.max = 20.0 pars = {1: mock_parm_1, 2: mock_parm_2} - kwargs = {"kwargs_set_key": "kwargs_set_val"} + kwargs = {'kwargs_set_key': 'kwargs_set_val'} mock_dfols = MagicMock() mock_results = MagicMock() - mock_results.msg = "Success" + mock_results.msg = 'Success' mock_dfols.solve = MagicMock(return_value=mock_results) - monkeypatch.setattr( - easyscience.fitting.minimizers.minimizer_dfo, "dfols", mock_dfols - ) + monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_dfo, 'dfols', mock_dfols) # Then - results = minimizer._dfo_fit(pars, "model", **kwargs) + results = minimizer._dfo_fit(pars, 'model', **kwargs) # Expect assert results == mock_results - assert mock_dfols.solve.call_args[0][0] == "model" + assert mock_dfols.solve.call_args[0][0] == 'model' assert all(mock_dfols.solve.call_args[0][1] == np.array([1.0, 2.0])) - assert all(mock_dfols.solve.call_args[1]["bounds"][0] == np.array([0.1, 0.2])) - assert all(mock_dfols.solve.call_args[1]["bounds"][1] == np.array([10.0, 20.0])) - assert mock_dfols.solve.call_args[1]["scaling_within_bounds"] is True - assert mock_dfols.solve.call_args[1]["kwargs_set_key"] == "kwargs_set_val" + assert all(mock_dfols.solve.call_args[1]['bounds'][0] == np.array([0.1, 0.2])) + assert all(mock_dfols.solve.call_args[1]['bounds'][1] == np.array([10.0, 20.0])) + assert mock_dfols.solve.call_args[1]['scaling_within_bounds'] is True + assert mock_dfols.solve.call_args[1]['kwargs_set_key'] == 'kwargs_set_val' def test_dfo_fit_no_scaling(self, minimizer: DFO, monkeypatch): # When @@ -276,46 +268,40 @@ def test_dfo_fit_no_scaling(self, minimizer: DFO, monkeypatch): mock_parm_2.max = 20.0 pars = {1: mock_parm_1, 2: mock_parm_2} - kwargs = {"kwargs_set_key": "kwargs_set_val"} + kwargs = {'kwargs_set_key': 'kwargs_set_val'} mock_dfols = MagicMock() mock_results = MagicMock() - mock_results.msg = "Success" + mock_results.msg = 'Success' mock_dfols.solve = MagicMock(return_value=mock_results) - monkeypatch.setattr( - easyscience.fitting.minimizers.minimizer_dfo, "dfols", mock_dfols - ) + monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_dfo, 'dfols', mock_dfols) # Then - results = minimizer._dfo_fit(pars, "model", **kwargs) + results = minimizer._dfo_fit(pars, 'model', **kwargs) # Expect assert results == mock_results - assert mock_dfols.solve.call_args[0][0] == "model" + assert mock_dfols.solve.call_args[0][0] == 'model' assert all(mock_dfols.solve.call_args[0][1] == np.array([1.0, 2.0])) - assert all( - mock_dfols.solve.call_args[1]["bounds"][0] == np.array([-np.inf, 0.2]) - ) - assert all(mock_dfols.solve.call_args[1]["bounds"][1] == np.array([10.0, 20.0])) - assert not "scaling_within_bounds" in list(mock_dfols.solve.call_args[1].keys()) - assert "kwargs_set_key" in list(mock_dfols.solve.call_args[1].keys()) - assert mock_dfols.solve.call_args[1]["kwargs_set_key"] == "kwargs_set_val" + assert all(mock_dfols.solve.call_args[1]['bounds'][0] == np.array([-np.inf, 0.2])) + assert all(mock_dfols.solve.call_args[1]['bounds'][1] == np.array([10.0, 20.0])) + assert 'scaling_within_bounds' not in list(mock_dfols.solve.call_args[1].keys()) + assert 'kwargs_set_key' in list(mock_dfols.solve.call_args[1].keys()) + assert mock_dfols.solve.call_args[1]['kwargs_set_key'] == 'kwargs_set_val' def test_dfo_fit_exception(self, minimizer: DFO, monkeypatch): # When pars = {1: MagicMock(Parameter)} - kwargs = {"kwargs_set_key": "kwargs_set_val"} + kwargs = {'kwargs_set_key': 'kwargs_set_val'} mock_dfols = MagicMock() mock_results = MagicMock() - mock_results.msg = "Failed" + mock_results.msg = 'Failed' mock_dfols.solve = MagicMock(return_value=mock_results) - monkeypatch.setattr( - easyscience.fitting.minimizers.minimizer_dfo, "dfols", mock_dfols - ) + monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_dfo, 'dfols', mock_dfols) # Then Expect with pytest.raises(FitError): - minimizer._dfo_fit(pars, "model", **kwargs) + minimizer._dfo_fit(pars, 'model', **kwargs) diff --git a/tests/unit/fitting/minimizers/test_minimizer_lmfit.py b/tests/unit/fitting/minimizers/test_minimizer_lmfit.py index 1185082f..62d7ec45 100644 --- a/tests/unit/fitting/minimizers/test_minimizer_lmfit.py +++ b/tests/unit/fitting/minimizers/test_minimizer_lmfit.py @@ -1,22 +1,25 @@ -import pytest +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause from unittest.mock import MagicMock +import numpy as np +import pytest +from lmfit import Parameter as LMParameter + import easyscience.fitting.minimizers.minimizer_lmfit -from easyscience.fitting.minimizers.minimizer_lmfit import LMFit from easyscience import Parameter -from lmfit import Parameter as LMParameter +from easyscience.fitting.minimizers.minimizer_lmfit import LMFit from easyscience.fitting.minimizers.utils import FitError -import numpy as np -class TestLMFit(): +class TestLMFit: @pytest.fixture def minimizer(self) -> LMFit: minimizer = LMFit( obj='obj', - fit_function='fit_function', - minimizer_enum=MagicMock(package='lm', method='leastsq') + fit_function='fit_function', + minimizer_enum=MagicMock(package='lm', method='leastsq'), ) return minimizer @@ -27,11 +30,22 @@ def test_init_exception(self) -> None: with pytest.raises(FitError): LMFit( obj='obj', - fit_function='fit_function', - minimizer_enum=MagicMock(package='dfo', method='not_leastsq') + fit_function='fit_function', + minimizer_enum=MagicMock(package='dfo', method='not_leastsq'), ) - @pytest.mark.parametrize("weights", [np.array([1, 2, 3, 4]), np.array([[1, 2, 3], [4, 5, 6]]), np.repeat(np.nan,3), np.zeros(3), np.repeat(np.inf,3), -np.ones(3)], ids=["wrong_length", "multidimensional", "NaNs", "zeros", "Infs", "negative"]) + @pytest.mark.parametrize( + 'weights', + [ + np.array([1, 2, 3, 4]), + np.array([[1, 2, 3], [4, 5, 6]]), + np.repeat(np.nan, 3), + np.zeros(3), + np.repeat(np.inf, 3), + -np.ones(3), + ], + ids=['wrong_length', 'multidimensional', 'NaNs', 'zeros', 'Infs', 'negative'], + ) def test_fit_weight_exceptions(self, minimizer: LMFit, weights) -> None: # When Then Expect with pytest.raises(ValueError): @@ -41,7 +55,9 @@ def test_make_model(self, minimizer: LMFit, monkeypatch) -> None: # When mock_lm_model = MagicMock() mock_LMModel = MagicMock(return_value=mock_lm_model) - monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_lmfit, "LMModel", mock_LMModel) + monkeypatch.setattr( + easyscience.fitting.minimizers.minimizer_lmfit, 'LMModel', mock_LMModel + ) minimizer._generate_fit_function = MagicMock(return_value='model') mock_parm_1 = MagicMock(LMParameter) mock_parm_1.value = 1.0 @@ -55,10 +71,12 @@ def test_make_model(self, minimizer: LMFit, monkeypatch) -> None: # Then model = minimizer._make_model(pars=pars) - + # Expect minimizer._generate_fit_function.assert_called_once_with() - mock_LMModel.assert_called_once_with('model', independent_vars=['x'], param_names=['pkey_1', 'pkey_2']) + mock_LMModel.assert_called_once_with( + 'model', independent_vars=['x'], param_names=['pkey_1', 'pkey_2'] + ) mock_lm_model.set_param_hint.assert_called_with('pkey_2', value=2.0, min=-20.0, max=20.0) assert mock_lm_model.set_param_hint.call_count == 2 assert model == mock_lm_model @@ -67,7 +85,9 @@ def test_make_model_no_pars(self, minimizer: LMFit, monkeypatch) -> None: # When mock_lm_model = MagicMock() mock_LMModel = MagicMock(return_value=mock_lm_model) - monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_lmfit, "LMModel", mock_LMModel) + monkeypatch.setattr( + easyscience.fitting.minimizers.minimizer_lmfit, 'LMModel', mock_LMModel + ) minimizer._generate_fit_function = MagicMock(return_value='model') mock_parm_1 = MagicMock(Parameter) mock_parm_1.value = 1.0 @@ -81,10 +101,12 @@ def test_make_model_no_pars(self, minimizer: LMFit, monkeypatch) -> None: # Then model = minimizer._make_model() - + # Expect minimizer._generate_fit_function.assert_called_once_with() - mock_LMModel.assert_called_once_with('model', independent_vars=['x'], param_names=['pkey_1', 'pkey_2']) + mock_LMModel.assert_called_once_with( + 'model', independent_vars=['x'], param_names=['pkey_1', 'pkey_2'] + ) mock_lm_model.set_param_hint.assert_called_with('pkey_2', value=2.0, min=-20.0, max=20.0) assert mock_lm_model.set_param_hint.call_count == 2 assert model == mock_lm_model @@ -92,6 +114,7 @@ def test_make_model_no_pars(self, minimizer: LMFit, monkeypatch) -> None: def test_fit(self, minimizer: LMFit) -> None: # When from easyscience import global_object + global_object.stack.enabled = False mock_model = MagicMock() @@ -105,7 +128,9 @@ def test_fit(self, minimizer: LMFit) -> None: # Expect assert result == 'gen_fit_results' - mock_model.fit.assert_called_once_with(2.0, x=1.0, weights=1, max_nfev=None, fit_kws={}, method='leastsq') + mock_model.fit.assert_called_once_with( + 2.0, x=1.0, weights=1, max_nfev=None, fit_kws={}, method='leastsq' + ) minimizer._make_model.assert_called_once_with() minimizer._set_parameter_fit_result.assert_called_once_with('fit', False) minimizer._gen_fit_results.assert_called_once_with('fit') @@ -122,7 +147,9 @@ def test_fit_model(self, minimizer: LMFit) -> None: minimizer.fit(x=1.0, y=2.0, weights=1, model=mock_model) # Expect - mock_model.fit.assert_called_once_with(2.0, x=1.0, weights=1, max_nfev=None, fit_kws={}, method='leastsq') + mock_model.fit.assert_called_once_with( + 2.0, x=1.0, weights=1, max_nfev=None, fit_kws={}, method='leastsq' + ) minimizer._make_model.assert_not_called() def test_fit_method(self, minimizer: LMFit) -> None: @@ -139,7 +166,9 @@ def test_fit_method(self, minimizer: LMFit) -> None: minimizer.fit(x=1.0, y=2.0, weights=1, method='method_passed') # Expect - mock_model.fit.assert_called_once_with(2.0, x=1.0, weights=1, max_nfev=None, fit_kws={}, method='method_passed') + mock_model.fit.assert_called_once_with( + 2.0, x=1.0, weights=1, max_nfev=None, fit_kws={}, method='method_passed' + ) minimizer.supported_methods.assert_called_once_with() def test_fit_kwargs(self, minimizer: LMFit) -> None: @@ -151,10 +180,24 @@ def test_fit_kwargs(self, minimizer: LMFit) -> None: minimizer._gen_fit_results = MagicMock(return_value='gen_fit_results') # Then - minimizer.fit(x=1.0, y=2.0, weights=1, minimizer_kwargs={'minimizer_key': 'minimizer_val'}, engine_kwargs={'engine_key': 'engine_val'}) + minimizer.fit( + x=1.0, + y=2.0, + weights=1, + minimizer_kwargs={'minimizer_key': 'minimizer_val'}, + engine_kwargs={'engine_key': 'engine_val'}, + ) # Expect - mock_model.fit.assert_called_once_with(2.0, x=1.0, weights=1, max_nfev=None, fit_kws={'minimizer_key': 'minimizer_val'}, method='leastsq', engine_key='engine_val') + mock_model.fit.assert_called_once_with( + 2.0, + x=1.0, + weights=1, + max_nfev=None, + fit_kws={'minimizer_key': 'minimizer_val'}, + method='leastsq', + engine_key='engine_val', + ) def test_fit_exception(self, minimizer: LMFit) -> None: # When @@ -169,14 +212,16 @@ def test_fit_exception(self, minimizer: LMFit) -> None: def test_convert_to_pars_obj(self, minimizer: LMFit, monkeypatch) -> None: # When minimizer._object = MagicMock() - minimizer._object.get_fit_parameters = MagicMock(return_value = ['parm_1', 'parm_2']) + minimizer._object.get_fit_parameters = MagicMock(return_value=['parm_1', 'parm_2']) minimizer.convert_to_par_object = MagicMock(return_value='convert_to_par_object') mock_lm_parameter = MagicMock() mock_lm_parameter.add_many = MagicMock(return_value='add_many') mock_LMParameters = MagicMock(return_value=mock_lm_parameter) - monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_lmfit, "LMParameters", mock_LMParameters) + monkeypatch.setattr( + easyscience.fitting.minimizers.minimizer_lmfit, 'LMParameters', mock_LMParameters + ) # Then pars = minimizer.convert_to_pars_obj() @@ -186,7 +231,10 @@ def test_convert_to_pars_obj(self, minimizer: LMFit, monkeypatch) -> None: assert minimizer.convert_to_par_object.call_count == 2 minimizer._object.get_fit_parameters.assert_called_once_with() minimizer.convert_to_par_object.assert_called_with('parm_2') - mock_lm_parameter.add_many.assert_called_once_with(['convert_to_par_object', 'convert_to_par_object']) + mock_lm_parameter.add_many.assert_called_once_with([ + 'convert_to_par_object', + 'convert_to_par_object', + ]) def test_convert_to_pars_obj_with_parameters(self, minimizer: LMFit, monkeypatch) -> None: # When @@ -195,7 +243,9 @@ def test_convert_to_pars_obj_with_parameters(self, minimizer: LMFit, monkeypatch mock_lm_parameter = MagicMock() mock_lm_parameter.add_many = MagicMock(return_value='add_many') mock_LMParameters = MagicMock(return_value=mock_lm_parameter) - monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_lmfit, "LMParameters", mock_LMParameters) + monkeypatch.setattr( + easyscience.fitting.minimizers.minimizer_lmfit, 'LMParameters', mock_LMParameters + ) # Then pars = minimizer.convert_to_pars_obj(['parm_1', 'parm_2']) @@ -204,13 +254,18 @@ def test_convert_to_pars_obj_with_parameters(self, minimizer: LMFit, monkeypatch assert pars == 'add_many' assert minimizer.convert_to_par_object.call_count == 2 minimizer.convert_to_par_object.assert_called_with('parm_2') - mock_lm_parameter.add_many.assert_called_once_with(['convert_to_par_object', 'convert_to_par_object']) + mock_lm_parameter.add_many.assert_called_once_with([ + 'convert_to_par_object', + 'convert_to_par_object', + ]) def test_convert_to_par_object(self, minimizer: LMFit, monkeypatch) -> None: # When mock_lm_parameter = MagicMock() mock_LMParameter = MagicMock(return_value=mock_lm_parameter) - monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_lmfit, "LMParameter", mock_LMParameter) + monkeypatch.setattr( + easyscience.fitting.minimizers.minimizer_lmfit, 'LMParameter', mock_LMParameter + ) mock_parm = MagicMock(Parameter) mock_parm.value = 1.0 @@ -224,7 +279,15 @@ def test_convert_to_par_object(self, minimizer: LMFit, monkeypatch) -> None: # Expect assert par == mock_lm_parameter - mock_LMParameter.assert_called_once_with('pkey_converted', value=1.0, vary=False, min=-10.0, max=10.0, expr=None, brute_step=None) + mock_LMParameter.assert_called_once_with( + 'pkey_converted', + value=1.0, + vary=False, + min=-10.0, + max=10.0, + expr=None, + brute_step=None, + ) def test_set_parameter_fit_result_no_stack_status(self, minimizer: LMFit) -> None: # When @@ -286,10 +349,12 @@ def test_gen_fit_results(self, minimizer: LMFit, monkeypatch) -> None: # When mock_domain_fit_results = MagicMock() mock_FitResults = MagicMock(return_value=mock_domain_fit_results) - monkeypatch.setattr(easyscience.fitting.minimizers.minimizer_lmfit, "FitResults", mock_FitResults) + monkeypatch.setattr( + easyscience.fitting.minimizers.minimizer_lmfit, 'FitResults', mock_FitResults + ) mock_fit_result = MagicMock() - mock_fit_result.success ='success' + mock_fit_result.success = 'success' mock_fit_result.data = 'data' mock_fit_result.userkws = {'x': 'x_val'} mock_fit_result.values = 'values' @@ -298,18 +363,22 @@ def test_gen_fit_results(self, minimizer: LMFit, monkeypatch) -> None: mock_fit_result.weights = 10 # Then - domain_fit_results = minimizer._gen_fit_results(mock_fit_result, **{'kwargs_set_key': 'kwargs_set_val'}) + domain_fit_results = minimizer._gen_fit_results( + mock_fit_result, **{'kwargs_set_key': 'kwargs_set_val'} + ) # Expect assert domain_fit_results == mock_domain_fit_results assert domain_fit_results.kwargs_set_key == 'kwargs_set_val' - assert domain_fit_results.success == 'success' + assert domain_fit_results.success == 'success' assert domain_fit_results.y_obs == 'data' assert domain_fit_results.x == 'x_val' assert domain_fit_results.p == 'values' assert domain_fit_results.p0 == 'init_values' assert domain_fit_results.y_calc == 'best_fit' assert domain_fit_results.y_err == 0.1 - assert str(domain_fit_results.minimizer_engine) == "" + assert ( + str(domain_fit_results.minimizer_engine) + == "" + ) assert domain_fit_results.fit_args is None - diff --git a/tests/unit/fitting/test_fitter.py b/tests/unit/fitting/test_fitter.py index dede119c..c6500f1f 100644 --- a/tests/unit/fitting/test_fitter.py +++ b/tests/unit/fitting/test_fitter.py @@ -1,13 +1,17 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from unittest.mock import MagicMock -import pytest import numpy as np +import pytest + import easyscience.fitting.fitter -from easyscience import Fitter from easyscience import AvailableMinimizers +from easyscience import Fitter -class TestFitter(): +class TestFitter: @pytest.fixture def fitter(self, monkeypatch): monkeypatch.setattr(Fitter, '_update_minimizer', MagicMock()) @@ -20,7 +24,7 @@ def test_constructor(self, fitter: Fitter): assert fitter._fit_object == self.mock_fit_object assert fitter._fit_function == self.mock_fit_function assert fitter._dependent_dims is None - assert fitter._enum_current_minimizer is None #== AvailableMinimizers.LMFit_leastsq + assert fitter._enum_current_minimizer is None # == AvailableMinimizers.LMFit_leastsq assert fitter._minimizer is None fitter._update_minimizer.assert_called_once_with(AvailableMinimizers.LMFit_leastsq) @@ -88,7 +92,7 @@ def test_create(self, fitter: Fitter, monkeypatch): # Expect mock_string_to_enum.assert_called_once_with('great-minimizer') fitter._update_minimizer.assert_called_once_with(10) - + def test_switch_minimizer(self, fitter: Fitter, monkeypatch): # When mock_minimizer = MagicMock() @@ -127,23 +131,32 @@ def test_available_minimizers(self, fitter: Fitter): # Then Expect assert minimizers == [ - 'LMFit', 'LMFit_leastsq', 'LMFit_powell', 'LMFit_cobyla', 'LMFit_differential_evolution', 'LMFit_scipy_least_squares', - 'Bumps', 'Bumps_simplex', 'Bumps_newton', 'Bumps_lm', - 'DFO', 'DFO_leastsq' + 'LMFit', + 'LMFit_leastsq', + 'LMFit_powell', + 'LMFit_cobyla', + 'LMFit_differential_evolution', + 'LMFit_scipy_least_squares', + 'Bumps', + 'Bumps_simplex', + 'Bumps_newton', + 'Bumps_lm', + 'DFO', + 'DFO_leastsq', ] def test_minimizer(self, fitter: Fitter): # When fitter._minimizer = 'minimizer' - # Then + # Then minimizer = fitter.minimizer # Expect assert minimizer == 'minimizer' def test_fit_function(self, fitter: Fitter): - # When Then + # When Then fit_function = fitter.fit_function # Expect @@ -161,7 +174,7 @@ def test_set_fit_function(self, fitter: Fitter): fitter._update_minimizer.assert_called_with('current_minimizer') def test_fit_object(self, fitter: Fitter): - # When Then + # When Then fit_object = fitter.fit_object # Expect @@ -180,7 +193,9 @@ def test_set_fit_object(self, fitter: Fitter): def test_fit(self, fitter: Fitter): # When - fitter._precompute_reshaping = MagicMock(return_value=('x_fit', 'x_new', 'y_new', 'weights', 'dims')) + fitter._precompute_reshaping = MagicMock( + return_value=('x_fit', 'x_new', 'y_new', 'weights', 'dims') + ) fitter._fit_function_wrapper = MagicMock(return_value='wrapped_fit_function') fitter._post_compute_reshaping = MagicMock(return_value='fit_result') fitter._minimizer = MagicMock() @@ -191,7 +206,7 @@ def test_fit(self, fitter: Fitter): # Expect fitter._precompute_reshaping.assert_called_once_with('x', 'y', 'weights', 'vectorized') - fitter._fit_function_wrapper.assert_called_once_with('x_new', flatten=True) + fitter._fit_function_wrapper.assert_called_once_with('x_new', flatten=True) fitter._post_compute_reshaping.assert_called_once_with('result', 'x', 'y') assert result == 'fit_result' assert fitter._dependent_dims == 'dims' @@ -200,8 +215,8 @@ def test_fit(self, fitter: Fitter): def test_post_compute_reshaping(self, fitter: Fitter): # When fit_result = MagicMock() - fit_result.y_calc = np.array([[10], [20], [30]]) - fit_result.y_err = np.array([[40], [50], [60]]) + fit_result.y_calc = np.array([[10], [20], [30]]) + fit_result.y_err = np.array([[40], [50], [60]]) x = np.array([1, 2, 3]) y = np.array([4, 5, 6]) @@ -210,10 +225,11 @@ def test_post_compute_reshaping(self, fitter: Fitter): # Expect assert np.array_equal(result.y_calc, np.array([10, 20, 30])) - assert np.array_equal(result.y_err, np.array([40, 50, 60])) + assert np.array_equal(result.y_err, np.array([40, 50, 60])) assert np.array_equal(result.x, x) assert np.array_equal(result.y_obs, y) + # TODO # def test_fit_function_wrapper() # def test_precompute_reshaping() diff --git a/tests/unit/global_object/test_entry_list_comprehensive.py b/tests/unit/global_object/test_entry_list_comprehensive.py index e8c038fe..a8bc4e55 100644 --- a/tests/unit/global_object/test_entry_list_comprehensive.py +++ b/tests/unit/global_object/test_entry_list_comprehensive.py @@ -1,72 +1,73 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project +# SPDX-License-Identifier: BSD-3-Clause + + import pytest -import easyscience + +from easyscience import Parameter +from easyscience import global_object from easyscience.global_object.global_object import GlobalObject from easyscience.variable import DescriptorBool -from easyscience import Parameter, ObjBase, global_object -from unittest.mock import patch, MagicMock + class TestGlobalObject: def test_init(self): @@ -11,7 +16,7 @@ def test_init(self): global_object = GlobalObject() # Expect - assert global_object.log == GlobalObject().log + assert global_object.log == GlobalObject().log assert global_object.map == GlobalObject().map assert global_object.stack == GlobalObject().stack assert global_object.debug == GlobalObject().debug @@ -19,24 +24,30 @@ def test_init(self): def test_generate_unique_name(self): # When Then global_object = GlobalObject() - name = global_object.generate_unique_name("name_prefix") + name = global_object.generate_unique_name('name_prefix') # Expect - assert name == "name_prefix_0" + assert name == 'name_prefix_0' def test_generate_unique_name_already_taken(self): # When global_object = GlobalObject() # Block the other_name_prefix_2 name - keep_due_toweakref_1 = DescriptorBool(name="test", value=True, unique_name="other_name_prefix_2") - keep_due_toweakref_2 = DescriptorBool(name="test", value=True, unique_name="other_name_prefix_a_3") - keep_due_toweakref_3 = DescriptorBool(name="test", value=True, unique_name="almost_other_name_prefix_3") + keep_due_toweakref_1 = DescriptorBool( + name='test', value=True, unique_name='other_name_prefix_2' + ) + keep_due_toweakref_2 = DescriptorBool( + name='test', value=True, unique_name='other_name_prefix_a_3' + ) + keep_due_toweakref_3 = DescriptorBool( + name='test', value=True, unique_name='almost_other_name_prefix_3' + ) - # Then - name = global_object.generate_unique_name("other_name_prefix") + # Then + name = global_object.generate_unique_name('other_name_prefix') # Expect - assert name == "other_name_prefix_3" + assert name == 'other_name_prefix_3' @pytest.fixture def clear_global_map(self): @@ -50,7 +61,7 @@ def test_singleton_behavior(self): # When obj1 = GlobalObject() obj2 = GlobalObject() - + # Then assert obj1 is obj2 assert id(obj1) == id(obj2) @@ -61,23 +72,24 @@ def test_instantiate_stack(self, clear_global_map): """Test stack instantiation""" # Given global_obj = GlobalObject() - + # When global_obj.instantiate_stack() - + # Then assert global_obj.stack is not None from easyscience.global_object.undo_redo import UndoStack + assert isinstance(global_obj.stack, UndoStack) def test_debug_property(self): """Test debug property access""" # Given global_obj = GlobalObject() - + # When/Then assert global_obj.debug is False # Default value - + # Test that it's the same across instances global_obj2 = GlobalObject() assert global_obj.debug is global_obj2.debug @@ -86,70 +98,70 @@ def test_generate_unique_name_empty_map(self, clear_global_map): """Test unique name generation with empty map""" # Given global_obj = GlobalObject() - + # When - name = global_obj.generate_unique_name("test") - + name = global_obj.generate_unique_name('test') + # Then - assert name == "test_0" + assert name == 'test_0' def test_generate_unique_name_with_gaps(self, clear_global_map): """Test unique name generation with gaps in numbering""" # Given global_obj = GlobalObject() # Create objects with non-sequential names - keep1 = DescriptorBool(name="test", value=True, unique_name="prefix_0") - keep2 = DescriptorBool(name="test", value=True, unique_name="prefix_2") - keep3 = DescriptorBool(name="test", value=True, unique_name="prefix_5") - + keep1 = DescriptorBool(name='test', value=True, unique_name='prefix_0') + keep2 = DescriptorBool(name='test', value=True, unique_name='prefix_2') + keep3 = DescriptorBool(name='test', value=True, unique_name='prefix_5') + # When - name = global_obj.generate_unique_name("prefix") - + name = global_obj.generate_unique_name('prefix') + # Then - Should pick the highest + 1 - assert name == "prefix_6" + assert name == 'prefix_6' def test_generate_unique_name_non_numeric_suffix(self, clear_global_map): """Test that non-numeric suffixes are ignored""" # Given global_obj = GlobalObject() - keep1 = DescriptorBool(name="test", value=True, unique_name="prefix_abc") - keep2 = DescriptorBool(name="test", value=True, unique_name="prefix_1") - + keep1 = DescriptorBool(name='test', value=True, unique_name='prefix_abc') + keep2 = DescriptorBool(name='test', value=True, unique_name='prefix_1') + # When - name = global_obj.generate_unique_name("prefix") - + name = global_obj.generate_unique_name('prefix') + # Then - assert name == "prefix_2" + assert name == 'prefix_2' def test_generate_unique_name_similar_prefixes(self, clear_global_map): """Test that similar but different prefixes don't interfere""" # Given global_obj = GlobalObject() - keep1 = DescriptorBool(name="test", value=True, unique_name="test_param_5") - keep2 = DescriptorBool(name="test", value=True, unique_name="test_parameter_10") - + keep1 = DescriptorBool(name='test', value=True, unique_name='test_param_5') + keep2 = DescriptorBool(name='test', value=True, unique_name='test_parameter_10') + # When - name1 = global_obj.generate_unique_name("test_param") - name2 = global_obj.generate_unique_name("test_parameter") - + name1 = global_obj.generate_unique_name('test_param') + name2 = global_obj.generate_unique_name('test_parameter') + # Then - assert name1 == "test_param_6" - assert name2 == "test_parameter_11" + assert name1 == 'test_param_6' + assert name2 == 'test_parameter_11' def test_integration_with_parameter_creation(self, clear_global_map): """Test GlobalObject integration with Parameter creation""" # Given global_obj = GlobalObject() - + # When - param1 = Parameter(name="test1", value=1.0) - param2 = Parameter(name="test2", value=2.0) - + param1 = Parameter(name='test1', value=1.0) + param2 = Parameter(name='test2', value=2.0) + # Then assert len(global_obj.map.vertices()) == 2 assert param1.unique_name in global_obj.map.vertices() assert param2.unique_name in global_obj.map.vertices() - + # Test retrieval retrieved1 = global_obj.map.get_item_by_key(param1.unique_name) assert retrieved1 is param1 @@ -158,8 +170,9 @@ def test_script_manager_access(self): """Test that script manager is accessible""" # Given global_obj = GlobalObject() - + # Then assert hasattr(global_obj, 'script') from easyscience.global_object.hugger.hugger import ScriptManager + assert isinstance(global_obj.script, ScriptManager) diff --git a/tests/unit/global_object/test_integration_comprehensive.py b/tests/unit/global_object/test_integration_comprehensive.py index 1ea9f584..186fb51d 100644 --- a/tests/unit/global_object/test_integration_comprehensive.py +++ b/tests/unit/global_object/test_integration_comprehensive.py @@ -1,21 +1,23 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project sub_container -> parameter - param = Parameter(name="value", value=42.0) - sub_container = ObjBase(name="sub", value=param) - main_container = ObjBase(name="main", sub=sub_container) - + param = Parameter(name='value', value=42.0) + sub_container = ObjBase(name='sub', value=param) + main_container = ObjBase(name='main', sub=sub_container) + # When - Find path from main to parameter - path = global_obj.map.find_path( - main_container.unique_name, - param.unique_name - ) - + path = global_obj.map.find_path(main_container.unique_name, param.unique_name) + # Then - Should find the path through the hierarchy assert len(path) >= 2 assert path[0] == main_container.unique_name assert path[-1] == param.unique_name - + # When - Find reverse path - reverse_path = global_obj.map.reverse_route( - param.unique_name, - main_container.unique_name - ) - + reverse_path = global_obj.map.reverse_route(param.unique_name, main_container.unique_name) + # Then - Should be the reverse assert reverse_path[0] == param.unique_name assert reverse_path[-1] == main_container.unique_name - + def test_map_connectivity_with_isolated_objects(self, clear_all): """Test map connectivity detection""" # Given global_obj = GlobalObject() - + # When - Create connected objects - param1 = Parameter(name="connected1", value=1.0) - param2 = Parameter(name="connected2", value=2.0) - container = ObjBase(name="container", p1=param1, p2=param2) - + param1 = Parameter(name='connected1', value=1.0) + param2 = Parameter(name='connected2', value=2.0) + container = ObjBase(name='container', p1=param1, p2=param2) + # Then - Map should be connected # TODO: Depending on implementation, connectivity might vary # assert global_obj.map.is_connected() - + # When - Create isolated object - isolated = Parameter(name="isolated", value=99.0) + isolated = Parameter(name='isolated', value=99.0) # Remove its automatic connection by clearing edges # (In real usage, isolated objects would be rare) - + # Then - Map might still be connected depending on implementation # This tests the connectivity algorithm connectivity = global_obj.map.is_connected() assert isinstance(connectivity, bool) - + def test_error_handling_integration(self, clear_all): """Test error handling across the global object system""" # Given global_obj = GlobalObject() - + # When - Try to get non-existent object - with pytest.raises(ValueError, match="Item not in map"): - global_obj.map.get_item_by_key("non_existent") - + with pytest.raises(ValueError, match='Item not in map'): + global_obj.map.get_item_by_key('non_existent') + # When - Try to add object with duplicate name - param1 = Parameter(name="test", value=1.0) + param1 = Parameter(name='test', value=1.0) param1_name = param1.unique_name - + # Create another with same unique name (should fail in add_vertex) - with pytest.raises(ValueError, match="already exists"): + with pytest.raises(ValueError, match='already exists'): # This simulates what would happen if we tried to add duplicate global_obj.map.add_vertex(param1) # param1 already added during creation - + def test_memory_pressure_simulation(self, clear_all): """Test system behavior under memory pressure""" # Given global_obj = GlobalObject() - + # When - Create many objects objects = [] for i in range(100): - param = Parameter(name=f"param_{i}", value=float(i)) - obj = ObjBase(name=f"obj_{i}", param=param) + param = Parameter(name=f'param_{i}', value=float(i)) + obj = ObjBase(name=f'obj_{i}', param=param) objects.append((param, obj)) - + initial_vertex_count = len(global_obj.map.vertices()) assert initial_vertex_count == 200 # 100 params + 100 objs - + # When - Delete half the objects objects_to_delete = [objects[i] for i in range(0, 100, 2)] for item in objects_to_delete: objects.remove(item) del item - + # Force garbage collection gc.collect() - + # Then - Map should have fewer vertices current_vertex_count = len(global_obj.map.vertices()) assert current_vertex_count <= initial_vertex_count - + # When - Delete all remaining objects del objects gc.collect() - + # Then - Map should be mostly empty (might have some remaining references) final_vertex_count = len(global_obj.map.vertices()) assert final_vertex_count < initial_vertex_count - + def test_serialization_integration_with_global_state(self, clear_all): """Test serialization integration with global state management""" # Given global_obj = GlobalObject() - + # Create objects - param = Parameter(name="test_param", value=123.45, unit="kg") - obj = ObjBase(name="test_obj", param=param) - + param = Parameter(name='test_param', value=123.45, unit='kg') + obj = ObjBase(name='test_obj', param=param) + original_vertex_count = len(global_obj.map.vertices()) - + # When - Serialize objects param_dict = param.as_dict() obj_dict = obj.as_dict() - + # Clear global state global_obj.map._clear() assert len(global_obj.map.vertices()) == 0 - + # When - Deserialize objects new_param = Parameter.from_dict(param_dict) new_obj = ObjBase.from_dict(obj_dict) - + # Then - Should be registered in global map again assert len(global_obj.map.vertices()) >= 2 assert global_obj.map.is_known(new_param) assert global_obj.map.is_known(new_obj) - + # Objects should be functionally equivalent assert new_param.name == param.name assert new_param.value == param.value assert new_param.unit == param.unit - + def test_debug_mode_integration(self, clear_all): """Test debug mode behavior across the system""" # Given global_obj = GlobalObject() original_debug = global_obj.debug - + try: # When - Enable debug mode global_obj.debug = True - + if not global_obj.stack: global_obj.instantiate_stack() global_obj.stack.enabled = True - + # Create and modify objects - param = Parameter(name="debug_test", value=1.0) - + param = Parameter(name='debug_test', value=1.0) + # This should trigger debug output in property_stack decorator with patch('builtins.print') as mock_print: param.value = 2.0 - + # Should have printed debug info (if debug mode works) # Note: This depends on the debug implementation details - + # Test that operations still work normally assert param.value == 2.0 assert global_obj.stack.canUndo() - + finally: # Restore original debug state global_obj.debug = original_debug - + def test_concurrent_access_simulation(self, clear_all): """Simulate concurrent access patterns""" import threading import time - + # Given global_obj = GlobalObject() results = [] errors = [] - + def create_objects(thread_id, count=10): """Create objects in a thread""" try: for i in range(count): - param = Parameter(name=f"thread_{thread_id}_param_{i}", value=float(i)) + param = Parameter(name=f'thread_{thread_id}_param_{i}', value=float(i)) results.append(param.unique_name) time.sleep(0.001) # Small delay to encourage race conditions except Exception as e: - errors.append(f"Thread {thread_id}: {e}") - + errors.append(f'Thread {thread_id}: {e}') + # When - Create objects concurrently threads = [] for thread_id in range(3): thread = threading.Thread(target=create_objects, args=(thread_id, 5)) threads.append(thread) - + for thread in threads: thread.start() - + for thread in threads: thread.join() - + # Then - Should not have errors and all objects should be created - assert len(errors) == 0, f"Errors occurred: {errors}" + assert len(errors) == 0, f'Errors occurred: {errors}' assert len(results) == 15 # 3 threads * 5 objects each assert len(set(results)) == 15 # All unique names should be unique - + # All objects should be in the map for unique_name in results: - assert unique_name in global_obj.map.vertices() \ No newline at end of file + assert unique_name in global_obj.map.vertices() diff --git a/tests/unit/global_object/test_map.py b/tests/unit/global_object/test_map.py index a2783e6e..0a2f9cc6 100644 --- a/tests/unit/global_object/test_map.py +++ b/tests/unit/global_object/test_map.py @@ -1,133 +1,137 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project = original_count # Should be at least the same or more - + def test_add_edge(self, clear, base_object, parameter_object): """Test adding edges between objects""" # When global_object.map.add_edge(base_object, parameter_object) - + # Then edges = global_object.map.get_edges(base_object) assert parameter_object.unique_name in edges - + def test_add_edge_unknown_start_object(self, clear, parameter_object): """Test adding edge with unknown start object""" # Given unknown_obj = MagicMock() - unknown_obj.unique_name = "unknown" - + unknown_obj.unique_name = 'unknown' + # When/Then - with pytest.raises(AttributeError, match="Start object not in map"): + with pytest.raises(AttributeError, match='Start object not in map'): global_object.map.add_edge(unknown_obj, parameter_object) - + def test_get_edges(self, clear, base_object, parameter_object): """Test getting edges for an object""" # Given global_object.map.add_edge(base_object, parameter_object) - + # When edges = global_object.map.get_edges(base_object) - + # Then assert isinstance(edges, list) assert parameter_object.unique_name in edges - + def test_get_edges_unknown_object(self, clear): """Test getting edges for unknown object""" # Given unknown_obj = MagicMock() - unknown_obj.unique_name = "unknown" - + unknown_obj.unique_name = 'unknown' + # When/Then with pytest.raises(AttributeError): global_object.map.get_edges(unknown_obj) - + def test_prune_vertex_from_edge(self, clear, base_object, parameter_object): """Test removing edge between objects""" # Given global_object.map.add_edge(base_object, parameter_object) assert parameter_object.unique_name in global_object.map.get_edges(base_object) - + # When global_object.map.prune_vertex_from_edge(base_object, parameter_object) - + # Then edges = global_object.map.get_edges(base_object) assert parameter_object.unique_name not in edges - + def test_prune_vertex_from_edge_none_child(self, clear, base_object): """Test pruning edge with None child""" # When/Then - Should not raise error global_object.map.prune_vertex_from_edge(base_object, None) - + def test_prune_vertex(self, clear, base_object): """Test pruning a vertex completely""" # Given unique_name = base_object.unique_name assert global_object.map.is_known(base_object) - + # When global_object.map.prune(unique_name) - + # Then assert not global_object.map.is_known(base_object) assert unique_name not in global_object.map.vertices() - + def test_edges_generation(self, clear, base_object, parameter_object): """Test edge generation""" # Given global_object.map.add_edge(base_object, parameter_object) - + # When edges = global_object.map.edges() - + # Then assert isinstance(edges, list) expected_edge = {base_object.unique_name, parameter_object.unique_name} assert expected_edge in edges - + def test_type_filtering_properties(self, clear): """Test type filtering properties""" # Given - obj1 = ObjBase(name="obj1") # 'created' type - obj2 = Parameter(name="obj2", value=1) # 'created' type - + obj1 = ObjBase(name='obj1') # 'created' type + obj2 = Parameter(name='obj2', value=1) # 'created' type + global_object.map.change_type(obj1, 'argument') global_object.map.change_type(obj2, 'returned') - + # When/Then argument_objs = global_object.map.argument_objs created_objs = global_object.map.created_objs returned_objs = global_object.map.returned_objs - + assert obj1.unique_name in argument_objs assert obj1.unique_name in created_objs # Should still be there assert obj2.unique_name in created_objs assert obj2.unique_name in returned_objs - + def test_find_path_simple(self, clear, base_object, parameter_object): """Test finding path between objects""" # Given global_object.map.add_edge(base_object, parameter_object) - + # When path = global_object.map.find_path(base_object.unique_name, parameter_object.unique_name) - + # Then assert path == [base_object.unique_name, parameter_object.unique_name] - + def test_find_path_same_vertex(self, clear, base_object): """Test finding path to same vertex""" # When path = global_object.map.find_path(base_object.unique_name, base_object.unique_name) - + # Then assert path == [base_object.unique_name] - + def test_find_path_no_path(self, clear, base_object, parameter_object): """Test finding path when no path exists""" # When - No edge added path = global_object.map.find_path(base_object.unique_name, parameter_object.unique_name) - + # Then assert path == [] - + def test_find_all_paths(self, clear, base_object, parameter_object): """Test finding all paths between objects""" # Given global_object.map.add_edge(base_object, parameter_object) - + # When - paths = global_object.map.find_all_paths(base_object.unique_name, parameter_object.unique_name) - + paths = global_object.map.find_all_paths( + base_object.unique_name, parameter_object.unique_name + ) + # Then assert len(paths) == 1 assert paths[0] == [base_object.unique_name, parameter_object.unique_name] - + def test_reverse_route_with_start(self, clear, base_object, parameter_object): """Test reverse route with specified start""" # Given global_object.map.add_edge(base_object, parameter_object) - + # When - route = global_object.map.reverse_route(parameter_object.unique_name, base_object.unique_name) - + route = global_object.map.reverse_route( + parameter_object.unique_name, base_object.unique_name + ) + # Then assert route == [parameter_object.unique_name, base_object.unique_name] - + def test_reverse_route_without_start(self, clear, base_object, parameter_object): """Test reverse route without specified start""" # Given global_object.map.add_edge(base_object, parameter_object) - + # When route = global_object.map.reverse_route(parameter_object.unique_name) - + # Then assert len(route) >= 1 assert route[0] == parameter_object.unique_name - + def test_is_connected_single_vertex(self, clear, base_object): """Test connectivity with single vertex""" # When/Then assert global_object.map.is_connected() is True - + def test_is_connected_multiple_vertices(self, clear, base_object, parameter_object): """Test connectivity with multiple connected vertices""" # Given global_object.map.add_edge(base_object, parameter_object) - + # When/Then assert global_object.map.is_connected() is True - + def test_map_repr(self, clear, base_object, parameter_object): """Test map string representation""" # When repr_str = str(global_object.map) - + # Then - assert "Map object" in repr_str - assert "2" in repr_str # Should show vertex count - + assert 'Map object' in repr_str + assert '2' in repr_str # Should show vertex count + def test_get_item_by_key_not_found(self, clear): """Test getting item by non-existent key""" # When/Then - with pytest.raises(ValueError, match="Item not in map"): - global_object.map.get_item_by_key("non_existent") - + with pytest.raises(ValueError, match='Item not in map'): + global_object.map.get_item_by_key('non_existent') + def test_clear_with_finalizers(self, clear): """Test clearing map properly calls finalizers""" # Given - obj = ObjBase(name="test") + obj = ObjBase(name='test') original_count = len(global_object.map.vertices()) - + # When global_object.map._clear() - + # Then assert len(global_object.map.vertices()) == 0 - + def test_map_initialization(self): """Test Map initialization""" # When test_map = Map() - + # Then assert len(test_map.vertices()) == 0 assert test_map.edges() == [] def test_vertices_retry_on_runtime_error(self, clear): """Test that vertices() retries when RuntimeError occurs during iteration. - + This tests the thread-safety fix for WeakValueDictionary modification during iteration (e.g., by garbage collection). """ # Given test_map = Map() - + # Create a mock _store that raises RuntimeError on first iteration attempt call_count = 0 original_store = test_map._store - + class MockWeakValueDict: def __init__(self): self.data = {} self.iteration_count = 0 - + def __iter__(self): self.iteration_count += 1 if self.iteration_count == 1: # First iteration raises RuntimeError (simulates GC interference) - raise RuntimeError("dictionary changed size during iteration") + raise RuntimeError('dictionary changed size during iteration') # Subsequent iterations succeed return iter(self.data) - + def __len__(self): return len(self.data) - + mock_store = MockWeakValueDict() test_map._store = mock_store - + # When vertices = test_map.vertices() - + # Then assert vertices == [] assert mock_store.iteration_count == 2 # Should have retried once def test_add_vertex_cleans_stale_type_dict_entry(self, clear): """Test that add_vertex cleans up stale __type_dict entries. - + This can happen when a weak reference was collected but the finalizer hasn't run yet, and a new object is created with the same unique_name. """ # Given test_map = Map() - + # Manually add a stale entry to __type_dict (simulating GC collected but finalizer not run) - stale_name = "StaleObject_0" + stale_name = 'StaleObject_0' test_map._Map__type_dict[stale_name] = _EntryList() - + # Create a mock object with the same unique_name mock_obj = MagicMock() mock_obj.unique_name = stale_name - + # When - Adding the object should clean up the stale entry first test_map.add_vertex(mock_obj, 'created') - + # Then - Object should be added successfully assert stale_name in test_map._store assert stale_name in test_map._Map__type_dict @@ -568,20 +579,20 @@ def test_add_vertex_cleans_stale_type_dict_entry(self, clear): def test_prune_key_not_in_store(self, clear): """Test that prune handles case when key is not in _store. - + This defensive check prevents KeyError when the weak reference has already been garbage collected but __type_dict entry remains. """ # Given test_map = Map() - + # Manually add entry to __type_dict without corresponding _store entry - orphan_key = "OrphanObject_0" + orphan_key = 'OrphanObject_0' test_map._Map__type_dict[orphan_key] = _EntryList() - + # When - Pruning should not raise error test_map.prune(orphan_key) - + # Then - Entry should be removed from __type_dict assert orphan_key not in test_map._Map__type_dict @@ -591,10 +602,10 @@ def test_prune_key_in_both_dicts(self, clear, base_object): unique_name = base_object.unique_name assert unique_name in global_object.map._store assert unique_name in global_object.map._Map__type_dict - + # When global_object.map.prune(unique_name) - + # Then assert unique_name not in global_object.map._Map__type_dict # Note: _store entry may or may not exist depending on weak ref state @@ -602,14 +613,14 @@ def test_prune_key_in_both_dicts(self, clear, base_object): def test_prune_nonexistent_key(self, clear): """Test that prune handles nonexistent key gracefully.""" # When/Then - Should not raise error - global_object.map.prune("nonexistent_key") + global_object.map.prune('nonexistent_key') def test_reset_type_unknown_object(self, clear): """Test reset_type with object not in map.""" # Given unknown_obj = MagicMock() - unknown_obj.unique_name = "unknown" - + unknown_obj.unique_name = 'unknown' + # When/Then - Should not raise error global_object.map.reset_type(unknown_obj, 'argument') @@ -617,34 +628,34 @@ def test_change_type_unknown_object(self, clear): """Test change_type with object not in map.""" # Given unknown_obj = MagicMock() - unknown_obj.unique_name = "unknown" - + unknown_obj.unique_name = 'unknown' + # When/Then - Should not raise error global_object.map.change_type(unknown_obj, 'argument') def test_find_path_start_not_in_graph(self, clear): """Test find_path when start vertex is not in graph.""" # When - path = global_object.map.find_path("nonexistent", "also_nonexistent") - + path = global_object.map.find_path('nonexistent', 'also_nonexistent') + # Then assert path == [] def test_find_all_paths_start_not_in_graph(self, clear): """Test find_all_paths when start vertex is not in graph.""" # When - paths = global_object.map.find_all_paths("nonexistent", "also_nonexistent") - + paths = global_object.map.find_all_paths('nonexistent', 'also_nonexistent') + # Then assert paths == [] def test_find_isolated_vertices(self, clear, base_object, parameter_object): """Test finding isolated vertices (vertices with no outgoing edges).""" # Given - No edges added, both objects are isolated - + # When isolated = global_object.map.find_isolated_vertices() - + # Then assert base_object.unique_name in isolated assert parameter_object.unique_name in isolated @@ -653,10 +664,10 @@ def test_find_isolated_vertices_with_edges(self, clear, base_object, parameter_o """Test finding isolated vertices when some have edges.""" # Given global_object.map.add_edge(base_object, parameter_object) - + # When isolated = global_object.map.find_isolated_vertices() - + # Then # base_object has an edge, so it's not isolated assert base_object.unique_name not in isolated @@ -666,7 +677,7 @@ def test_find_isolated_vertices_with_edges(self, clear, base_object, parameter_o def test_prune_vertex_from_edge_edge_not_exists(self, clear, base_object, parameter_object): """Test pruning edge that doesn't exist.""" # Given - No edge added between objects - + # When/Then - Should not raise error global_object.map.prune_vertex_from_edge(base_object, parameter_object) @@ -674,20 +685,20 @@ def test_prune_vertex_from_edge_parent_not_in_map(self, clear, parameter_object) """Test pruning edge when parent is not in map.""" # Given unknown_obj = MagicMock() - unknown_obj.unique_name = "unknown" - + unknown_obj.unique_name = 'unknown' + # When/Then - Should not raise error (vertex1 not in type_dict) global_object.map.prune_vertex_from_edge(unknown_obj, parameter_object) def test_created_internal_property(self, clear): """Test created_internal property.""" # Given - obj = ObjBase(name="internal_obj") + obj = ObjBase(name='internal_obj') global_object.map.change_type(obj, 'created_internal') - + # When internal_objs = global_object.map.created_internal - + # Then assert obj.unique_name in internal_objs @@ -696,10 +707,10 @@ def test_clear_empties_both_dicts(self, clear, base_object, parameter_object): # Given assert len(global_object.map._store) == 2 assert len(global_object.map._Map__type_dict) == 2 - + # When global_object.map._clear() - + # Then assert len(global_object.map._store) == 0 assert len(global_object.map._Map__type_dict) == 0 @@ -708,18 +719,18 @@ def test_entry_list_delitem(self): """Test _EntryList __delitem__ method.""" # Given entry = _EntryList() - entry.append("item1") - entry.append("item2") - entry.append("item3") - + entry.append('item1') + entry.append('item2') + entry.append('item3') + # When del entry[1] - + # Then assert len(entry) == 2 - assert "item2" not in entry - assert "item1" in entry - assert "item3" in entry + assert 'item2' not in entry + assert 'item1' in entry + assert 'item3' in entry def test_entry_list_repr_with_finalizer(self): """Test _EntryList repr when finalizer is set.""" @@ -727,10 +738,10 @@ def test_entry_list_repr_with_finalizer(self): entry = _EntryList() entry.type = 'created' entry.finalizer = MagicMock() # Non-None finalizer - + # When repr_str = str(entry) - + # Then assert 'created' in repr_str assert 'With a finalizer' in repr_str @@ -740,10 +751,9 @@ def test_entry_list_remove_type_unknown(self): # Given entry = _EntryList() entry.type = 'created' - + # When - Try to remove unknown type entry.remove_type('unknown_type') - + # Then - Should not change anything assert 'created' in entry.type - diff --git a/tests/unit/global_object/test_undo_redo.py b/tests/unit/global_object/test_undo_redo.py index 212681ac..505ad4d7 100644 --- a/tests/unit/global_object/test_undo_redo.py +++ b/tests/unit/global_object/test_undo_redo.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project np.ndarray: @@ -304,7 +308,7 @@ def __call__(self, x: np.ndarray) -> np.ndarray: try: f.switch_minimizer(fit_engine) except AttributeError: - pytest.skip(msg=f"{fit_engine} is not installed") + pytest.skip(msg=f'{fit_engine} is not installed') from easyscience import global_object @@ -313,16 +317,17 @@ def __call__(self, x: np.ndarray) -> np.ndarray: # assert l1.c.value == pytest.approx(l2.c.value, rel=l2.c.error * 3) # assert l1.m.value == pytest.approx(l2.m.value, rel=l2.m.error * 3) - assert global_object.stack.undoText() == "Fitting routine" + assert global_object.stack.undoText() == 'Fitting routine' global_object.stack.undo() assert l2.m.value == m_sp assert l2.c.value == c_sp - assert global_object.stack.redoText() == "Fitting routine" + assert global_object.stack.redoText() == 'Fitting routine' global_object.stack.redo() - assert l2.m.value == res.p[f"p{l2.m.unique_name}"] - assert l2.c.value == res.p[f"p{l2.c.unique_name}"] + assert l2.m.value == res.p[f'p{l2.m.unique_name}'] + assert l2.c.value == res.p[f'p{l2.c.unique_name}'] + # TODO: Check if this test is needed # @pytest.mark.parametrize('math_funcs', [pytest.param([Parameter.__add__, float.__add__], id='Addition'), @@ -347,41 +352,41 @@ def __call__(self, x: np.ndarray) -> np.ndarray: # p2 = Parameter('b', b) # p1 = p_fun(p1, p2) - + # assert p1.value == result_value # global_object.stack.undo() # assert p1.value == a # global_object.stack.redo() # assert p1.value == result_value - # # Perform basic + error - # p1 = Parameter('a', a, error=sa) - # p2 = Parameter('b', b, error=sb) - # p1 = p_fun(p1, p2) - # assert p1.value == result_value - # assert p1.error == result_error - # global_object.stack.undo() - # assert p1.value == a - # assert p1.error == sa - # global_object.stack.redo() - # assert p1.value == result_value - # assert p1.error == result_error - - # # Perform basic + units - # p1 = Parameter('a', a, error=sa, units='m/s') - # p2 = Parameter('b', b, error=sb, units='m/s') - # p1 = p_fun(p1, p2) - # assert p1.value == result_value - # assert p1.error == result_error - # assert str(p1.unit) == 'meter / second' - # global_object.stack.undo() - # assert p1.value == a - # assert p1.error == sa - # assert str(p1.unit) == 'meter / second' - # global_object.stack.redo() - # assert p1.value == result_value - # assert p1.error == result_error - # assert str(p1.unit) == 'meter / second' +# # Perform basic + error +# p1 = Parameter('a', a, error=sa) +# p2 = Parameter('b', b, error=sb) +# p1 = p_fun(p1, p2) +# assert p1.value == result_value +# assert p1.error == result_error +# global_object.stack.undo() +# assert p1.value == a +# assert p1.error == sa +# global_object.stack.redo() +# assert p1.value == result_value +# assert p1.error == result_error + +# # Perform basic + units +# p1 = Parameter('a', a, error=sa, units='m/s') +# p2 = Parameter('b', b, error=sb, units='m/s') +# p1 = p_fun(p1, p2) +# assert p1.value == result_value +# assert p1.error == result_error +# assert str(p1.unit) == 'meter / second' +# global_object.stack.undo() +# assert p1.value == a +# assert p1.error == sa +# assert str(p1.unit) == 'meter / second' +# global_object.stack.redo() +# assert p1.value == result_value +# assert p1.error == result_error +# assert str(p1.unit) == 'meter / second' # @pytest.mark.parametrize('math_funcs', [pytest.param([Parameter.__imul__, float.__mul__, diff --git a/tests/unit/global_object/test_undo_redo_comprehensive.py b/tests/unit/global_object/test_undo_redo_comprehensive.py index 024731a7..1d93e8ba 100644 --- a/tests/unit/global_object/test_undo_redo_comprehensive.py +++ b/tests/unit/global_object/test_undo_redo_comprehensive.py @@ -1,142 +1,152 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2021-2025 Contributors to the EasyScience project Any: return self._convert_to_dict(obj, skip=skip, **kwargs) - + @classmethod def decode(cls, obj: Any) -> Any: return cls._convert_from_dict(obj) class TestSerializerBase: - @pytest.fixture def clear(self): """Clear everything before and after each test""" @@ -90,150 +94,138 @@ def clear(self): @pytest.fixture def serializer(self): return ConcreteSerializer() - + @pytest.fixture def mock_obj(self): - return MockSerializerComponent("test_obj", 42, "optional_value") - + return MockSerializerComponent('test_obj', 42, 'optional_value') + def test_abstract_methods_are_placeholders(self): """Test that SerializerBase can be instantiated but abstract methods just pass""" # SerializerBase can actually be instantiated (abstract methods just pass) base = SerializerBase() - + # Abstract methods don't raise exceptions - they just pass/return None result = base.encode(Mock()) assert result is None - + result = SerializerBase.decode({}) assert result is None - + def test_get_arg_spec(self): """Test get_arg_spec static method""" - def example_func(self, arg1, arg2, arg3="default"): + + def example_func(self, arg1, arg2, arg3='default'): pass - + spec, args = SerializerBase.get_arg_spec(example_func) - + assert args == ['arg1', 'arg2', 'arg3'] assert hasattr(spec, 'args') assert hasattr(spec, 'defaults') - + def test_encode_objs_datetime(self): """Test _encode_objs with datetime objects""" dt = datetime.datetime(2023, 10, 17, 14, 30, 45, 123456) result = SerializerBase._encode_objs(dt) - + expected = { '@module': 'datetime', - '@class': 'datetime', - 'string': '2023-10-17 14:30:45.123456' + '@class': 'datetime', + 'string': '2023-10-17 14:30:45.123456', } assert result == expected - + def test_encode_objs_numpy_array_real(self): """Test _encode_objs with real numpy arrays""" arr = np.array([1, 2, 3], dtype=np.int32) result = SerializerBase._encode_objs(arr) - - expected = { - '@module': 'numpy', - '@class': 'array', - 'dtype': 'int32', - 'data': [1, 2, 3] - } + + expected = {'@module': 'numpy', '@class': 'array', 'dtype': 'int32', 'data': [1, 2, 3]} assert result == expected - + def test_encode_objs_numpy_array_complex(self): """Test _encode_objs with complex numpy arrays""" - arr = np.array([1+2j, 3+4j], dtype=np.complex128) + arr = np.array([1 + 2j, 3 + 4j], dtype=np.complex128) result = SerializerBase._encode_objs(arr) - + expected = { '@module': 'numpy', '@class': 'array', 'dtype': 'complex128', - 'data': [[1.0, 3.0], [2.0, 4.0]] # [real, imag] + 'data': [[1.0, 3.0], [2.0, 4.0]], # [real, imag] } assert result == expected - + def test_encode_objs_numpy_scalar(self): """Test _encode_objs with numpy scalars""" scalar = np.int32(42) result = SerializerBase._encode_objs(scalar) - + assert result == 42 assert isinstance(result, int) - + def test_encode_objs_json_serializable(self): """Test _encode_objs with JSON serializable objects""" # Should return the object unchanged if it's JSON serializable - data = {"key": "value", "number": 42} + data = {'key': 'value', 'number': 42} result = SerializerBase._encode_objs(data) assert result == data - + def test_encode_objs_non_serializable(self): """Test _encode_objs with non-serializable objects""" + class NonSerializable: def __init__(self): - self.value = "test" - + self.value = 'test' + obj = NonSerializable() result = SerializerBase._encode_objs(obj) # Should return the object unchanged if not serializable assert result is obj - + def test_convert_from_dict_datetime(self): """Test _convert_from_dict with datetime objects""" dt_dict = { '@module': 'datetime', '@class': 'datetime', - 'string': '2023-10-17 14:30:45.123456' + 'string': '2023-10-17 14:30:45.123456', } - + result = SerializerBase._convert_from_dict(dt_dict) expected = datetime.datetime(2023, 10, 17, 14, 30, 45, 123456) assert result == expected - + def test_convert_from_dict_datetime_no_microseconds(self): """Test _convert_from_dict with datetime without microseconds""" - dt_dict = { - '@module': 'datetime', - '@class': 'datetime', - 'string': '2023-10-17 14:30:45' - } - + dt_dict = {'@module': 'datetime', '@class': 'datetime', 'string': '2023-10-17 14:30:45'} + result = SerializerBase._convert_from_dict(dt_dict) expected = datetime.datetime(2023, 10, 17, 14, 30, 45) assert result == expected - + def test_convert_from_dict_numpy_array_real(self): """Test _convert_from_dict with real numpy arrays""" - arr_dict = { - '@module': 'numpy', - '@class': 'array', - 'dtype': 'int32', - 'data': [1, 2, 3] - } - + arr_dict = {'@module': 'numpy', '@class': 'array', 'dtype': 'int32', 'data': [1, 2, 3]} + result = SerializerBase._convert_from_dict(arr_dict) expected = np.array([1, 2, 3], dtype=np.int32) np.testing.assert_array_equal(result, expected) assert result.dtype == expected.dtype - + def test_convert_from_dict_numpy_array_complex(self): """Test _convert_from_dict with complex numpy arrays""" arr_dict = { '@module': 'numpy', '@class': 'array', 'dtype': 'complex128', - 'data': [[1.0, 3.0], [2.0, 4.0]] + 'data': [[1.0, 3.0], [2.0, 4.0]], } - + result = SerializerBase._convert_from_dict(arr_dict) - expected = np.array([1+2j, 3+4j], dtype=np.complex128) + expected = np.array([1 + 2j, 3 + 4j], dtype=np.complex128) np.testing.assert_array_equal(result, expected) assert result.dtype == expected.dtype - + def test_convert_from_dict_easyscience_object(self, clear): """Test _convert_from_dict with EasyScience objects""" param_dict = { @@ -249,40 +241,40 @@ def test_convert_from_dict_easyscience_object(self, clear): 'fixed': False, 'url': '', 'description': '', - 'display_name': 'test_param' + 'display_name': 'test_param', } - + result = SerializerBase._convert_from_dict(param_dict) assert isinstance(result, Parameter) assert result.name == 'test_param' assert result.value == 5.0 assert str(result.unit) == 'm' - + def test_convert_from_dict_list(self): """Test _convert_from_dict with lists""" data = [ {'@module': 'datetime', '@class': 'datetime', 'string': '2023-10-17 14:30:45'}, {'key': 'value'}, - 42 + 42, ] - + result = SerializerBase._convert_from_dict(data) assert isinstance(result, list) assert len(result) == 3 assert isinstance(result[0], datetime.datetime) assert result[1] == {'key': 'value'} assert result[2] == 42 - + def test_convert_from_dict_regular_dict(self): """Test _convert_from_dict with regular dictionaries""" data = {'key': 'value', 'number': 42} result = SerializerBase._convert_from_dict(data) assert result == data - + def test_convert_to_dict_basic(self, serializer, mock_obj, clear): """Test _convert_to_dict with basic object""" result = serializer._convert_to_dict(mock_obj) - + assert '@module' in result assert '@class' in result assert '@version' in result @@ -294,42 +286,42 @@ def test_convert_to_dict_basic(self, serializer, mock_obj, clear): def test_convert_to_dict_with_skip(self, serializer, mock_obj, clear): """Test _convert_to_dict with skip parameter""" result = serializer._convert_to_dict(mock_obj, skip=['value', 'optional_param']) - + assert 'name' in result assert 'value' not in result assert 'optional_param' not in result def test_convert_to_dict_with_redirect(self, serializer, clear): """Test _convert_to_dict with _REDIRECT""" - obj = MockSerializerWithRedirect("redirect_test", 10) + obj = MockSerializerWithRedirect('redirect_test', 10) result = serializer._convert_to_dict(obj) - + assert result['special_attr'] == 20 # 10 * 2 from redirect assert 'none_attr' not in result # Should be skipped due to None redirect def test_convert_to_dict_with_custom_convert_to_dict(self, serializer, clear): """Test _convert_to_dict with custom _convert_to_dict method""" - obj = MockSerializerWithConvertToDict("custom_test", 5) + obj = MockSerializerWithConvertToDict('custom_test', 5) result = serializer._convert_to_dict(obj) - + assert result['custom_field'] == 'added_by_convert_to_dict' assert result['name'] == 'custom_test' assert result['value'] == 5 def test_convert_to_dict_with_enum_object(self, serializer, clear): """Test _convert_to_dict when the object itself is an enum""" - + # Test that enum values in objects remain as enums without full_encode class MockObjWithEnum(SerializerComponent): def __init__(self, name: str, enum_val: TestEnum): self.name = name self.enum_val = enum_val - self.unique_name = f"obj_{name}" + self.unique_name = f'obj_{name}' self._global_object = True - - obj = MockObjWithEnum("test", TestEnum.TEST_VALUE) + + obj = MockObjWithEnum('test', TestEnum.TEST_VALUE) result = serializer._convert_to_dict(obj) - + # The enum field should remain as an enum object (not encoded as dict) assert isinstance(result['enum_val'], TestEnum) assert result['enum_val'] == TestEnum.TEST_VALUE @@ -337,87 +329,87 @@ def __init__(self, name: str, enum_val: TestEnum): def test_convert_to_dict_full_encode(self, serializer, clear): """Test _convert_to_dict with full_encode=True""" dt = datetime.datetime(2023, 10, 17, 14, 30, 45) - + class MockObjWithDateTime(SerializerComponent): def __init__(self, name: str, dt: datetime.datetime): self.name = name self.dt = dt - self.unique_name = f"dt_{name}" + self.unique_name = f'dt_{name}' self._global_object = True - - obj = MockObjWithDateTime("test", dt) + + obj = MockObjWithDateTime('test', dt) result = serializer._convert_to_dict(obj, full_encode=True) - + assert isinstance(result['dt'], dict) assert result['dt']['@module'] == 'datetime' assert result['dt']['@class'] == 'datetime' def test_convert_to_dict_without_global_object(self, serializer): """Test _convert_to_dict with object without _global_object""" - + class MockObjNoGlobal(SerializerComponent): def __init__(self, name: str): self.name = name - - obj = MockObjNoGlobal("test") + + obj = MockObjNoGlobal('test') result = serializer._convert_to_dict(obj) - + assert result['name'] == 'test' assert 'unique_name' not in result def test_convert_to_dict_with_arg_spec(self, serializer, clear): """Test _convert_to_dict with custom _arg_spec""" - + class MockObjCustomArgSpec(SerializerComponent): - def __init__(self, name: str, value: int, extra: str = "default"): + def __init__(self, name: str, value: int, extra: str = 'default'): self.name = name self.value = value self.extra = extra self._arg_spec = ['name', 'value'] # Skip 'extra' - self.unique_name = f"custom_spec_{name}" + self.unique_name = f'custom_spec_{name}' self._global_object = True - - obj = MockObjCustomArgSpec("test", 42, "not_default") + + obj = MockObjCustomArgSpec('test', 42, 'not_default') result = serializer._convert_to_dict(obj) - + assert 'name' in result assert 'value' in result assert 'extra' not in result def test_recursive_encoder_with_lists(self, serializer, clear): """Test _recursive_encoder with lists""" - mock_obj = MockSerializerComponent("list_test", 1) - data = [mock_obj, "string", 42, {"key": "value"}] - + mock_obj = MockSerializerComponent('list_test', 1) + data = [mock_obj, 'string', 42, {'key': 'value'}] + result = serializer._recursive_encoder(data) - + assert isinstance(result, list) assert len(result) == 4 assert isinstance(result[0], dict) # Encoded mock object assert result[0]['name'] == 'list_test' - assert result[1] == "string" + assert result[1] == 'string' assert result[2] == 42 - assert result[3] == {"key": "value"} + assert result[3] == {'key': 'value'} def test_recursive_encoder_with_dicts(self, serializer, clear): """Test _recursive_encoder with dictionaries""" - mock_obj = MockSerializerComponent("dict_test", 2) - data = {"obj": mock_obj, "simple": "value"} - + mock_obj = MockSerializerComponent('dict_test', 2) + data = {'obj': mock_obj, 'simple': 'value'} + result = serializer._recursive_encoder(data) - + assert isinstance(result, dict) assert isinstance(result['obj'], dict) # Encoded mock object assert result['obj']['name'] == 'dict_test' - assert result['simple'] == "value" + assert result['simple'] == 'value' def test_recursive_encoder_with_tuples(self, serializer, clear): """Test _recursive_encoder with tuples""" - mock_obj = MockSerializerComponent("tuple_test", 3) - data = (mock_obj, "string", 42) - + mock_obj = MockSerializerComponent('tuple_test', 3) + data = (mock_obj, 'string', 42) + result = serializer._recursive_encoder(data) - + assert isinstance(result, list) # Tuples become lists assert len(result) == 3 assert isinstance(result[0], dict) # Encoded mock object @@ -426,22 +418,22 @@ def test_recursive_encoder_with_tuples(self, serializer, clear): def test_recursive_encoder_builtin_encode_method(self, serializer): """Test _recursive_encoder doesn't encode builtin objects with encode method""" # Strings have an encode method but are builtin - data = ["test_string", b"bytes"] - + data = ['test_string', b'bytes'] + result = serializer._recursive_encoder(data) - - assert result == ["test_string", b"bytes"] + + assert result == ['test_string', b'bytes'] def test_recursive_encoder_with_mutable_sequence(self, serializer, clear): """Test _recursive_encoder with MutableSequence objects""" from easyscience.base_classes import CollectionBase - - d0 = DescriptorNumber("a", 0) # type: ignore - d1 = DescriptorNumber("b", 1) # type: ignore - collection = CollectionBase("test_collection", d0, d1) - + + d0 = DescriptorNumber('a', 0) # type: ignore + d1 = DescriptorNumber('b', 1) # type: ignore + collection = CollectionBase('test_collection', d0, d1) + result = serializer._recursive_encoder(collection) - + assert isinstance(result, dict) assert result['@class'] == 'CollectionBase' assert 'data' in result @@ -452,77 +444,77 @@ def test_convert_to_dict_no_version(self, mock_import, serializer, clear): mock_module = Mock() del mock_module.__version__ # Remove version attribute mock_import.return_value = mock_module - - mock_obj = MockSerializerComponent("no_version", 1) + + mock_obj = MockSerializerComponent('no_version', 1) result = serializer._convert_to_dict(mock_obj) - + assert result['@version'] is None @patch('easyscience.io.serializer_base.import_module') def test_convert_to_dict_import_error(self, mock_import, serializer, clear): """Test _convert_to_dict when import_module raises ImportError""" - mock_import.side_effect = ImportError("Module not found") - - mock_obj = MockSerializerComponent("import_error", 1) + mock_import.side_effect = ImportError('Module not found') + + mock_obj = MockSerializerComponent('import_error', 1) result = serializer._convert_to_dict(mock_obj) - + assert result['@version'] is None def test_convert_to_dict_attribute_error_handling(self, serializer, clear): """Test _convert_to_dict handles AttributeError for missing attributes""" - + class MockObjMissingAttrs(SerializerComponent): - def __init__(self, name: str, missing_param: str = "default"): + def __init__(self, name: str, missing_param: str = 'default'): self.name = name - self.unique_name = f"missing_{name}" + self.unique_name = f'missing_{name}' self._global_object = True # Don't set missing_param attribute to trigger AttributeError - - obj = MockObjMissingAttrs("test") - - with pytest.raises(NotImplementedError, match="Unable to automatically determine as_dict"): + + obj = MockObjMissingAttrs('test') + + with pytest.raises(NotImplementedError, match='Unable to automatically determine as_dict'): serializer._convert_to_dict(obj) def test_convert_to_dict_with_kwargs_attribute(self, serializer, clear): """Test _convert_to_dict with _kwargs attribute handling""" - + class MockObjWithKwargs(SerializerComponent): def __init__(self, name: str, value: int): self.name = name self.value = value - self.unique_name = f"kwargs_{name}" + self.unique_name = f'kwargs_{name}' self._global_object = True # Set up _kwargs to test the kwargs handling path self._kwargs = {'extra_param': 'extra_value'} - - obj = MockObjWithKwargs("test", 42) + + obj = MockObjWithKwargs('test', 42) result = serializer._convert_to_dict(obj) - + # The extra_param from _kwargs should be included assert result['extra_param'] == 'extra_value' def test_convert_to_dict_varargs_handling(self, serializer, clear): """Test _convert_to_dict with varargs (*args) handling""" - + class MockObjWithVarargs(SerializerComponent): def __init__(self, name: str, *args): self.name = name self.args = args - self.unique_name = f"varargs_{name}" + self.unique_name = f'varargs_{name}' self._global_object = True - - obj = MockObjWithVarargs("test", "arg1", "arg2", "arg3") + + obj = MockObjWithVarargs('test', 'arg1', 'arg2', 'arg3') result = serializer._convert_to_dict(obj) - + assert result['name'] == 'test' if 'args' in result: - assert result['args'] == ("arg1", "arg2", "arg3") + assert result['args'] == ('arg1', 'arg2', 'arg3') def test_encode_objs_edge_cases(self): """Test _encode_objs with edge cases""" # Test with None assert SerializerBase._encode_objs(None) is None - + # Test with empty numpy array empty_arr = np.array([]) result = SerializerBase._encode_objs(empty_arr) @@ -533,33 +525,29 @@ def test_convert_from_dict_edge_cases(self): """Test _convert_from_dict with edge cases""" # Test with None assert SerializerBase._convert_from_dict(None) is None - + # Test with empty dict assert SerializerBase._convert_from_dict({}) == {} - + # Test with empty list assert SerializerBase._convert_from_dict([]) == [] - + # Test with bson.objectid (should not be processed) - bson_dict = { - '@module': 'bson.objectid', - '@class': 'ObjectId', - 'value': 'some_id' - } + bson_dict = {'@module': 'bson.objectid', '@class': 'ObjectId', 'value': 'some_id'} result = SerializerBase._convert_from_dict(bson_dict) assert result == bson_dict def test_concrete_serializer_implementation(self, clear): """Test that ConcreteSerializer works correctly""" serializer = ConcreteSerializer() - mock_obj = MockSerializerComponent("concrete_test", 100) - + mock_obj = MockSerializerComponent('concrete_test', 100) + # Test encode encoded = serializer.encode(mock_obj) assert isinstance(encoded, dict) assert encoded['name'] == 'concrete_test' assert encoded['value'] == 100 - + # Test decode global_object.map._clear() # Clear before decode decoded = ConcreteSerializer.decode(encoded) @@ -569,15 +557,16 @@ def test_concrete_serializer_implementation(self, clear): def test_get_arg_spec_with_complex_function(self): """Test get_arg_spec with more complex function signatures""" - def complex_func(self, required_arg, optional_arg="default", *args, **kwargs): + + def complex_func(self, required_arg, optional_arg='default', *args, **kwargs): pass - + spec, args = SerializerBase.get_arg_spec(complex_func) - + assert args == ['required_arg', 'optional_arg'] assert spec.varargs == 'args' assert spec.varkw == 'kwargs' - assert spec.defaults == ("default",) + assert spec.defaults == ('default',) @patch('easyscience.io.serializer_base.np', None) def test_encode_objs_without_numpy(self): @@ -585,64 +574,60 @@ def test_encode_objs_without_numpy(self): # This test patches np to None to simulate numpy not being installed dt = datetime.datetime(2023, 10, 17, 14, 30, 45) result = SerializerBase._encode_objs(dt) - - expected = { - '@module': 'datetime', - '@class': 'datetime', - 'string': '2023-10-17 14:30:45' - } + + expected = {'@module': 'datetime', '@class': 'datetime', 'string': '2023-10-17 14:30:45'} assert result == expected def test_recursive_encoder_with_nested_structures(self, serializer, clear): """Test _recursive_encoder with deeply nested structures""" - mock_obj = MockSerializerComponent("nested", 1) - - data = { - "level1": { - "level2": [mock_obj, {"level3": mock_obj}] - } - } - + mock_obj = MockSerializerComponent('nested', 1) + + data = {'level1': {'level2': [mock_obj, {'level3': mock_obj}]}} + result = serializer._recursive_encoder(data) - + assert isinstance(result, dict) - assert isinstance(result["level1"], dict) - assert isinstance(result["level1"]["level2"], list) - assert isinstance(result["level1"]["level2"][0], dict) # Encoded object - assert result["level1"]["level2"][0]["name"] == "nested" - assert isinstance(result["level1"]["level2"][1]["level3"], dict) # Encoded object + assert isinstance(result['level1'], dict) + assert isinstance(result['level1']['level2'], list) + assert isinstance(result['level1']['level2'][0], dict) # Encoded object + assert result['level1']['level2'][0]['name'] == 'nested' + assert isinstance(result['level1']['level2'][1]['level3'], dict) # Encoded object def test_import_class(self): # When Then - cls = SerializerBase._import_class(module_name="easyscience", class_name="Parameter") + cls = SerializerBase._import_class(module_name='easyscience', class_name='Parameter') # Expect assert cls is Parameter def test_import_class_missing_module(self): # When Then Expect with pytest.raises(ImportError): - SerializerBase._import_class(module_name="non_existent_module", class_name="Parameter") + SerializerBase._import_class(module_name='non_existent_module', class_name='Parameter') def test_import_class_missing_class(self): # When Then Expect with pytest.raises(ValueError): - SerializerBase._import_class(module_name="easyscience", class_name="NonExistentClass") - - @pytest.mark.parametrize("dict, expected", [ - ({ '@module': 'easyscience', - '@class': 'Parameter', - 'name': 'param1', - 'value': 10.0 - }, - True - ), - ({ - '@module': 'numpy', - '@class': 'array', - 'unique_name': 'unique1', - 'display_name': 'Display 1' - }, False - )], ids=['valid_easyscience_dict', 'invalid_numpy_dict']) + SerializerBase._import_class(module_name='easyscience', class_name='NonExistentClass') + + @pytest.mark.parametrize( + 'dict, expected', + [ + ( + {'@module': 'easyscience', '@class': 'Parameter', 'name': 'param1', 'value': 10.0}, + True, + ), + ( + { + '@module': 'numpy', + '@class': 'array', + 'unique_name': 'unique1', + 'display_name': 'Display 1', + }, + False, + ), + ], + ids=['valid_easyscience_dict', 'invalid_numpy_dict'], + ) def test_is_serialized_easyscience_object_false(self, dict, expected): # When Then result = SerializerBase._is_serialized_easyscience_object(dict) @@ -651,25 +636,20 @@ def test_is_serialized_easyscience_object_false(self, dict, expected): def test_deserialize_value_non_easyscience(self): # When - serialized_dict = { - '@module': 'numpy', - '@class': 'array', - 'dtype': 'int64', - 'data': [0, 1] - } + serialized_dict = {'@module': 'numpy', '@class': 'array', 'dtype': 'int64', 'data': [0, 1]} # Then obj = SerializerBase._deserialize_value(serialized_dict) # Expect - assert isinstance(obj, np.ndarray) + assert isinstance(obj, np.ndarray) assert obj.dtype == np.int64 def test_deserialize_value_easyscience_uses_from_dict(self, monkeypatch): # When serialized_dict = { - '@module': 'easyscience.base_classes', - '@class': 'NewBase', - 'display_name': 'test', - } + '@module': 'easyscience.base_classes', + '@class': 'NewBase', + 'display_name': 'test', + } monkeypatch.setattr(NewBase, 'from_dict', MagicMock()) # Then obj = SerializerBase._deserialize_value(serialized_dict) @@ -679,10 +659,10 @@ def test_deserialize_value_easyscience_uses_from_dict(self, monkeypatch): def test_deserialize_value_easyscience_no_from_dict(self, monkeypatch): # When serialized_dict = { - '@module': 'easyscience.base_classes', - '@class': 'NewBase', - 'display_name': 'test', - } + '@module': 'easyscience.base_classes', + '@class': 'NewBase', + 'display_name': 'test', + } monkeypatch.delattr(NewBase, 'from_dict') monkeypatch.setattr(SerializerBase, '_convert_from_dict', MagicMock()) # Then @@ -693,39 +673,40 @@ def test_deserialize_value_easyscience_no_from_dict(self, monkeypatch): def test_deserialize_value_easyscience_import_error(self, monkeypatch): # When serialized_dict = { - '@module': 'easyscience.base_classes', - '@class': 'NewBase', - 'display_name': 'test', - } + '@module': 'easyscience.base_classes', + '@class': 'NewBase', + 'display_name': 'test', + } monkeypatch.setattr(SerializerBase, '_import_class', MagicMock(side_effect=ImportError())) monkeypatch.setattr(SerializerBase, '_convert_from_dict', MagicMock()) # Then obj = SerializerBase._deserialize_value(serialized_dict) # Expect SerializerBase._convert_from_dict.assert_called_once_with(serialized_dict) - + def test_deserialize_dict(self, monkeypatch): # When serialized_dict = { - '@module': 'easyscience', + '@module': 'easyscience', '@class': 'ParameterContainer', 'param1': { '@module': 'easyscience', '@class': 'Parameter', 'name': 'param1', - 'value': 10.0 + 'value': 10.0, }, - 'array1': { - '@module': 'numpy', - '@class': 'array', - 'dtype': 'int64', - 'data': [0, 1] - } + 'array1': {'@module': 'numpy', '@class': 'array', 'dtype': 'int64', 'data': [0, 1]}, } - monkeypatch.setattr(SerializerBase, '_deserialize_value', MagicMock(side_effect=[ - Parameter(name='param1', value=10.0), - np.array([0, 1], dtype=np.int64) - ])) + monkeypatch.setattr( + SerializerBase, + '_deserialize_value', + MagicMock( + side_effect=[ + Parameter(name='param1', value=10.0), + np.array([0, 1], dtype=np.int64), + ] + ), + ) # Then result = SerializerBase.deserialize_dict(serialized_dict) # Expect @@ -733,4 +714,4 @@ def test_deserialize_dict(self, monkeypatch): SerializerBase._deserialize_value.assert_any_call(serialized_dict['array1']) assert isinstance(result['param1'], Parameter) assert isinstance(result['array1'], np.ndarray) - assert result['array1'].dtype == np.int64 \ No newline at end of file + assert result['array1'].dtype == np.int64 diff --git a/tests/unit/io/test_serializer_component.py b/tests/unit/io/test_serializer_component.py index 80994b4d..54a50716 100644 --- a/tests/unit/io/test_serializer_component.py +++ b/tests/unit/io/test_serializer_component.py @@ -1,8 +1,10 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause -import numpy as np from copy import deepcopy from typing import Type +import numpy as np import pytest import easyscience @@ -10,52 +12,50 @@ from easyscience import Parameter dp_param_dict = { - "argnames": "dp_kwargs, dp_cls", - "argvalues": ( + 'argnames': 'dp_kwargs, dp_cls', + 'argvalues': ( [ { - "@module": DescriptorNumber.__module__, - "@class": DescriptorNumber.__name__, - "@version": easyscience.__version__, - "name": "test", - "value": 1.0, - "variance": None, - "unit": "dimensionless", - "description": "", - "url": "", - "display_name": "test", + '@module': DescriptorNumber.__module__, + '@class': DescriptorNumber.__name__, + '@version': easyscience.__version__, + 'name': 'test', + 'value': 1.0, + 'variance': None, + 'unit': 'dimensionless', + 'description': '', + 'url': '', + 'display_name': 'test', }, DescriptorNumber, ], [ { - "@module": Parameter.__module__, - "@class": Parameter.__name__, - "@version": easyscience.__version__, - "name": "test", - "unit": "km", - "value": 1.0, - "variance": 0.0, - "min": -np.inf, - "max": np.inf, - "fixed": False, - "url": "https://www.boo.com", - "description": "", - "display_name": "test", + '@module': Parameter.__module__, + '@class': Parameter.__name__, + '@version': easyscience.__version__, + 'name': 'test', + 'unit': 'km', + 'value': 1.0, + 'variance': 0.0, + 'min': -np.inf, + 'max': np.inf, + 'fixed': False, + 'url': 'https://www.boo.com', + 'description': '', + 'display_name': 'test', }, Parameter, ], ), - "ids": ["DescriptorNumber", "Parameter"], + 'ids': ['DescriptorNumber', 'Parameter'], } -_skip_opt = [[], None] + [ - k for k in dp_param_dict["argvalues"][0][0].keys() if k[0] != "@" -] +_skip_opt = [[], None] + [k for k in dp_param_dict['argvalues'][0][0].keys() if k[0] != '@'] skip_dict = { - "argnames": "skip", - "argvalues": _skip_opt, - "ids": ["skip_" + str(opt) for opt in _skip_opt], + 'argnames': 'skip', + 'argvalues': _skip_opt, + 'ids': ['skip_' + str(opt) for opt in _skip_opt], } @@ -72,7 +72,7 @@ def check_dict(check, item): @pytest.mark.parametrize(**skip_dict) @pytest.mark.parametrize(**dp_param_dict) def test_variable_as_dict_methods(dp_kwargs: dict, dp_cls: Type[DescriptorNumber], skip): - data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} + data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != '@'} obj = dp_cls(**data_dict) @@ -94,4 +94,3 @@ def test_variable_as_dict_methods(dp_kwargs: dict, dp_cls: Type[DescriptorNumber assert len(dif) == 0 check_dict(dp_kwargs, enc) - diff --git a/tests/unit/io/test_serializer_dict.py b/tests/unit/io/test_serializer_dict.py index 7d75f02d..a902c21a 100644 --- a/tests/unit/io/test_serializer_dict.py +++ b/tests/unit/io/test_serializer_dict.py @@ -1,17 +1,19 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause from copy import deepcopy from typing import Type import pytest -from easyscience.io.serializer_dict import SerializerDict from easyscience import DescriptorNumber from easyscience import ObjBase +from easyscience import global_object +from easyscience.io.serializer_dict import SerializerDict from .test_serializer_component import check_dict from .test_serializer_component import dp_param_dict from .test_serializer_component import skip_dict -from easyscience import global_object def recursive_remove(d, remove_keys: list) -> dict: @@ -36,7 +38,7 @@ def recursive_remove(d, remove_keys: list) -> dict: @pytest.mark.parametrize(**skip_dict) @pytest.mark.parametrize(**dp_param_dict) def test_variable_SerializerDict(dp_kwargs: dict, dp_cls: Type[DescriptorNumber], skip): - data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} + data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != '@'} obj = dp_cls(**data_dict) @@ -59,12 +61,13 @@ def test_variable_SerializerDict(dp_kwargs: dict, dp_cls: Type[DescriptorNumber] check_dict(dp_kwargs, enc) + ######################################################################################################################## # TESTING DECODING ######################################################################################################################## @pytest.mark.parametrize(**dp_param_dict) def test_variable_SerializerDict_decode(dp_kwargs: dict, dp_cls: Type[DescriptorNumber]): - data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} + data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != '@'} obj = dp_cls(**data_dict) @@ -76,12 +79,12 @@ def test_variable_SerializerDict_decode(dp_kwargs: dict, dp_cls: Type[Descriptor if hasattr(obj, k) and hasattr(dec, k): assert getattr(obj, k) == getattr(dec, k) else: - raise AttributeError(f"{k} not found in decoded object") + raise AttributeError(f'{k} not found in decoded object') @pytest.mark.parametrize(**dp_param_dict) def test_variable_SerializerDict_from_dict(dp_kwargs: dict, dp_cls: Type[DescriptorNumber]): - data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} + data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != '@'} obj = dp_cls(**data_dict) @@ -93,25 +96,26 @@ def test_variable_SerializerDict_from_dict(dp_kwargs: dict, dp_cls: Type[Descrip if hasattr(obj, k) and hasattr(dec, k): assert getattr(obj, k) == getattr(dec, k) else: - raise AttributeError(f"{k} not found in decoded object") + raise AttributeError(f'{k} not found in decoded object') + def test_group_encode(): - d0 = DescriptorNumber("a", 0) - d1 = DescriptorNumber("b", 1) + d0 = DescriptorNumber('a', 0) + d1 = DescriptorNumber('b', 1) from easyscience.base_classes import CollectionBase - b = CollectionBase("test", d0, d1) + b = CollectionBase('test', d0, d1) d = b.as_dict() - assert isinstance(d["data"], list) + assert isinstance(d['data'], list) def test_group_encode2(): - d0 = DescriptorNumber("a", 0) - d1 = DescriptorNumber("b", 1) + d0 = DescriptorNumber('a', 0) + d1 = DescriptorNumber('b', 1) from easyscience.base_classes import CollectionBase - b = ObjBase("outer", b=CollectionBase("test", d0, d1)) + b = ObjBase('outer', b=CollectionBase('test', d0, d1)) d = b.as_dict() - assert isinstance(d["b"], dict) \ No newline at end of file + assert isinstance(d['b'], dict) diff --git a/tests/unit/legacy/test_dict.py b/tests/unit/legacy/test_dict.py index 70af9d78..c5ac9860 100644 --- a/tests/unit/legacy/test_dict.py +++ b/tests/unit/legacy/test_dict.py @@ -1,3 +1,5 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause # from copy import deepcopy # from typing import Type @@ -153,4 +155,4 @@ # b = BaseObj("outer", b=BaseCollection("test", d0, d1)) # d = b.as_dict() -# assert isinstance(d["b"], dict) \ No newline at end of file +# assert isinstance(d["b"], dict) diff --git a/tests/unit/legacy/test_json.py b/tests/unit/legacy/test_json.py index 651bd950..6a77ddc5 100644 --- a/tests/unit/legacy/test_json.py +++ b/tests/unit/legacy/test_json.py @@ -1,3 +1,5 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause # import json # from copy import deepcopy diff --git a/tests/unit/legacy/test_xml.py b/tests/unit/legacy/test_xml.py index 7094de85..278f1c9b 100644 --- a/tests/unit/legacy/test_xml.py +++ b/tests/unit/legacy/test_xml.py @@ -1,3 +1,5 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause # import sys # import xml.etree.ElementTree as ET diff --git a/tests/unit/models/test_polynomial.py b/tests/unit/models/test_polynomial.py index 2493cd11..f6d5f29a 100644 --- a/tests/unit/models/test_polynomial.py +++ b/tests/unit/models/test_polynomial.py @@ -1,5 +1,6 @@ -# SPDX-FileCopyrightText: 2025 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + # © 2025 Contributors to the EasyScience project @@ -19,18 +20,18 @@ def clear(): poly_test_cases = ( - (1.,), + (1.0,), ( - 1., - 2., + 1.0, + 2.0, ), - (1., 2., 3.), - (-1., -2., -3.), + (1.0, 2.0, 3.0), + (-1.0, -2.0, -3.0), (0.72, 6.48, -0.48), ) -@pytest.mark.parametrize("coo", poly_test_cases) +@pytest.mark.parametrize('coo', poly_test_cases) def test_Polynomial_pars(clear, coo): poly = Polynomial(coefficients=coo) @@ -126,7 +127,7 @@ def test_Polynomial_invalid_coefficients_type(clear): """Test that invalid coefficients argument type raises TypeError.""" # String is iterable, so it will iterate over characters and fail with first error with pytest.raises(TypeError, match='Coefficients must be floats or Parameters'): - Polynomial(coefficients="invalid") + Polynomial(coefficients='invalid') # Integer is not iterable, so it will fail with second error with pytest.raises(TypeError, match='coefficients must be a list or a CollectionBase'): @@ -188,7 +189,7 @@ def test_Polynomial_call_with_args_kwargs(clear): x = np.array([0, 1, 2]) # These additional args/kwargs should be ignored - result = poly(x, "extra_arg", extra_kwarg="value") + result = poly(x, 'extra_arg', extra_kwarg='value') # polyval([1.0, 2.0, 3.0], x) = 1.0*x^2 + 2.0*x + 3.0 expected = np.polyval([1.0, 2.0, 3.0], x) assert np.allclose(result, expected) diff --git a/tests/unit/variable/test_descriptor_any_type.py b/tests/unit/variable/test_descriptor_any_type.py index 70c4cc65..8256deb5 100644 --- a/tests/unit/variable/test_descriptor_any_type.py +++ b/tests/unit/variable/test_descriptor_any_type.py @@ -1,43 +1,48 @@ -import pytest +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + import numpy as np +import pytest -from easyscience.variable import DescriptorAnyType from easyscience import global_object +from easyscience.variable import DescriptorAnyType + class TestDescriptorAnyType: @pytest.fixture def descriptor(self): descriptor = DescriptorAnyType( - name="name", - value="string", - description="description", - url="url", - display_name="display_name", + name='name', + value='string', + description='description', + url='url', + display_name='display_name', parent=None, ) return descriptor - + @pytest.fixture def clear(self): global_object.map._clear() def test_init(self, descriptor: DescriptorAnyType): # When Then Expect - assert descriptor._value == "string" + assert descriptor._value == 'string' # From super - assert descriptor._name == "name" - assert descriptor._description == "description" - assert descriptor._url == "url" - assert descriptor._display_name == "display_name" + assert descriptor._name == 'name' + assert descriptor._description == 'description' + assert descriptor._url == 'url' + assert descriptor._display_name == 'display_name' def test_value(self, descriptor: DescriptorAnyType): # When Then Expect - assert descriptor.value == "string" + assert descriptor.value == 'string' - - @pytest.mark.parametrize("value", [True, "new_string", 1.0, np.array([1, 2, 3]),{"key": "value"}]) - def test_set_value(self, descriptor: DescriptorAnyType,value): + @pytest.mark.parametrize( + 'value', [True, 'new_string', 1.0, np.array([1, 2, 3]), {'key': 'value'}] + ) + def test_set_value(self, descriptor: DescriptorAnyType, value): # When Then descriptor.value = value @@ -48,14 +53,14 @@ def test_set_value(self, descriptor: DescriptorAnyType,value): assert descriptor._value == value @pytest.mark.parametrize( - "value, expected", + 'value, expected', [ - (True, "True"), - ("new_string", "'new_string'"), - (1.0, "1.0"), - (np.array([1, 2, 3]), "array([1, 2, 3])"), - ({"key": "value"}, "{'key': 'value'}") - ] + (True, 'True'), + ('new_string', "'new_string'"), + (1.0, '1.0'), + (np.array([1, 2, 3]), 'array([1, 2, 3])'), + ({'key': 'value'}, "{'key': 'value'}"), + ], ) def test_repr(self, descriptor: DescriptorAnyType, value, expected): # Set the descriptor value @@ -75,4 +80,4 @@ def test_copy(self, descriptor: DescriptorAnyType): # Expect assert type(descriptor_copy) == DescriptorAnyType - assert descriptor_copy._value == descriptor._value \ No newline at end of file + assert descriptor_copy._value == descriptor._value diff --git a/tests/unit/variable/test_descriptor_array.py b/tests/unit/variable/test_descriptor_array.py index 695f5fe2..c0e6872e 100644 --- a/tests/unit/variable/test_descriptor_array.py +++ b/tests/unit/variable/test_descriptor_array.py @@ -1,26 +1,29 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + + +import numpy as np import pytest -from unittest.mock import MagicMock import scipp as sc from scipp import UnitError from scipp.testing import assert_identical -import numpy as np - -from easyscience.variable import DescriptorArray from easyscience import DescriptorNumber from easyscience import global_object +from easyscience.variable import DescriptorArray + class TestDescriptorArray: @pytest.fixture def descriptor(self): descriptor = DescriptorArray( - name="name", - value=[[1., 2.], [3., 4.]], - unit="m", + name='name', + value=[[1.0, 2.0], [3.0, 4.0]], + unit='m', variance=[[0.1, 0.2], [0.3, 0.4]], - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) return descriptor @@ -28,13 +31,13 @@ def descriptor(self): @pytest.fixture def descriptor_dimensionless(self): descriptor = DescriptorArray( - name="name", - value=[[1., 2.], [3., 4.], [5., 6.]], - unit="dimensionless", + name='name', + value=[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]], + unit='dimensionless', variance=[[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]], - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) return descriptor @@ -45,91 +48,91 @@ def clear(self): def test_init(self, descriptor: DescriptorArray): # When Then Expect - assert np.array_equal(descriptor._array.values,np.array([[1., 2.], [3., 4.]])) - assert descriptor._array.unit == "m" + assert np.array_equal(descriptor._array.values, np.array([[1.0, 2.0], [3.0, 4.0]])) + assert descriptor._array.unit == 'm' assert np.array_equal(descriptor._array.variances, np.array([[0.1, 0.2], [0.3, 0.4]])) # From super - assert descriptor._name == "name" - assert descriptor._description == "description" - assert descriptor._url == "url" - assert descriptor._display_name == "display_name" + assert descriptor._name == 'name' + assert descriptor._description == 'description' + assert descriptor._url == 'url' + assert descriptor._display_name == 'display_name' def test_init_sc_unit(self): # When Then descriptor = DescriptorArray( - name="name", - value=[[1., 2.], [3., 4.]], - unit=sc.units.Unit("m"), + name='name', + value=[[1.0, 2.0], [3.0, 4.0]], + unit=sc.units.Unit('m'), variance=[[0.1, 0.2], [0.3, 0.4]], - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) # Expect - assert np.array_equal(descriptor._array.values,np.array([[1., 2.], [3., 4.]])) - assert descriptor._array.unit == "m" + assert np.array_equal(descriptor._array.values, np.array([[1.0, 2.0], [3.0, 4.0]])) + assert descriptor._array.unit == 'm' assert np.array_equal(descriptor._array.variances, np.array([[0.1, 0.2], [0.3, 0.4]])) def test_init_sc_unit_unknown(self): # When Then Expect with pytest.raises(UnitError): DescriptorArray( - name="name", - value=[[1., 2.], [3., 4.]], - unit="unknown", + name='name', + value=[[1.0, 2.0], [3.0, 4.0]], + unit='unknown', variance=[[0.1, 0.2], [0.3, 0.4]], - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) - @pytest.mark.parametrize("value", [True, "string"]) + @pytest.mark.parametrize('value', [True, 'string']) def test_init_value_type_exception(self, value): - # When + # When # Then Expect with pytest.raises(TypeError): DescriptorArray( - name="name", + name='name', value=value, - unit="m", + unit='m', variance=[[0.1, 0.2], [0.3, 0.4]], - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) def test_init_variance_exception(self): - # When - variance=[[-0.1, -0.2], [-0.3, -0.4]] + # When + variance = [[-0.1, -0.2], [-0.3, -0.4]] # Then Expect with pytest.raises(ValueError): DescriptorArray( - name="name", - value=[[1., 2.], [3., 4.]], - unit="m", + name='name', + value=[[1.0, 2.0], [3.0, 4.0]], + unit='m', variance=variance, - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) # test from_scipp def test_from_scipp(self): # When - full_value = sc.array(dims=['row','column'],values=[[1,2],[3,4]], unit='m') + full_value = sc.array(dims=['row', 'column'], values=[[1, 2], [3, 4]], unit='m') # Then - descriptor = DescriptorArray.from_scipp(name="name", full_value=full_value) + descriptor = DescriptorArray.from_scipp(name='name', full_value=full_value) # Expect - assert np.array_equal(descriptor._array.values,[[1,2],[3,4]]) - assert descriptor._array.unit == "m" + assert np.array_equal(descriptor._array.values, [[1, 2], [3, 4]]) + assert descriptor._array.unit == 'm' assert descriptor._array.variances == None # @pytest.mark.parametrize("full_value", [sc.array(values=[1,2], dimensions=["x"]), sc.array(values=[[1], [2]], dims=["x","y"]), object(), 1, "string"], ids=["1D", "2D", "object", "int", "string"]) @@ -140,20 +143,24 @@ def test_from_scipp(self): def test_get_full_value(self, descriptor: DescriptorArray): # When Then Expect - other = sc.array(dims=('dim0','dim1'), - values=[[1.0, 2.0], [3.0, 4.0]], - unit='m', - variances=[[0.1, 0.2], [0.3, 0.4]]) + other = sc.array( + dims=('dim0', 'dim1'), + values=[[1.0, 2.0], [3.0, 4.0]], + unit='m', + variances=[[0.1, 0.2], [0.3, 0.4]], + ) assert_identical(descriptor.full_value, other) - + def test_set_full_value(self, descriptor: DescriptorArray): with pytest.raises(AttributeError): - descriptor.full_value = sc.array(dims=['row','column'],values=[[1,2],[3,4]], unit='s') + descriptor.full_value = sc.array( + dims=['row', 'column'], values=[[1, 2], [3, 4]], unit='s' + ) def test_unit(self, descriptor: DescriptorArray): # When Then Expect assert descriptor.unit == 'm' - + def test_set_unit(self, descriptor: DescriptorArray): with pytest.raises(AttributeError): descriptor.unit = 's' @@ -164,14 +171,13 @@ def test_convert_unit(self, descriptor: DescriptorArray): # Expect assert descriptor._array.unit == 'mm' - assert np.array_equal(descriptor._array.values,[[1000,2000],[3000,4000]]) - assert np.array_equal(descriptor._array.variances,[[100000,200000],[300000,400000]]) + assert np.array_equal(descriptor._array.values, [[1000, 2000], [3000, 4000]]) + assert np.array_equal(descriptor._array.variances, [[100000, 200000], [300000, 400000]]) def test_variance(self, descriptor: DescriptorArray): # When Then Expect assert np.array_equal(descriptor._array.variances, np.array([[0.1, 0.2], [0.3, 0.4]])) - def test_set_variance(self, descriptor: DescriptorArray): # When Then descriptor.variance = [[0.2, 0.3], [0.4, 0.5]] @@ -184,7 +190,6 @@ def test_error(self, descriptor: DescriptorArray): # When Then Expect assert np.array_equal(descriptor.error, np.sqrt(np.array([[0.1, 0.2], [0.3, 0.4]]))) - def test_set_error(self, descriptor: DescriptorArray): # When Then descriptor.error = np.sqrt(np.array([[0.2, 0.3], [0.4, 0.5]])) @@ -192,14 +197,13 @@ def test_set_error(self, descriptor: DescriptorArray): assert np.allclose(descriptor.error, np.sqrt(np.array([[0.2, 0.3], [0.4, 0.5]]))) assert np.allclose(descriptor.variance, np.array([[0.2, 0.3], [0.4, 0.5]])) - def test_value(self, descriptor: DescriptorArray): # When Then Expect assert np.array_equal(descriptor.value, np.array([[1, 2], [3, 4]])) def test_set_value(self, descriptor: DescriptorArray): # When Then - descriptor.value = ([[0.2, 0.3], [0.4, 0.5]]) + descriptor.value = [[0.2, 0.3], [0.4, 0.5]] # Expect assert np.array_equal(descriptor._array.values, np.array([[0.2, 0.3], [0.4, 0.5]])) @@ -208,7 +212,10 @@ def test_repr(self, descriptor: DescriptorArray): repr_str = str(descriptor) # Expect - assert repr_str == "" + assert ( + repr_str + == "" + ) def test_copy(self, descriptor: DescriptorArray): # When Then @@ -218,54 +225,67 @@ def test_copy(self, descriptor: DescriptorArray): assert type(descriptor_copy) == DescriptorArray assert np.array_equal(descriptor_copy._array.values, descriptor._array.values) assert descriptor_copy._array.unit == descriptor._array.unit - - @pytest.mark.parametrize("unit_string, expected", [ - ("1e+9", "dimensionless"), - ("1000", "dimensionless"), - ("10dm^2", "m^2")], - ids=["scientific_notation", "numbers", "unit_prefix"]) + + @pytest.mark.parametrize( + 'unit_string, expected', + [('1e+9', 'dimensionless'), ('1000', 'dimensionless'), ('10dm^2', 'm^2')], + ids=['scientific_notation', 'numbers', 'unit_prefix'], + ) def test_base_unit(self, unit_string, expected): # When - descriptor = DescriptorArray(name="name", value=[[1.0, 2.0], [3.0, 4.0]], unit=unit_string) + descriptor = DescriptorArray(name='name', value=[[1.0, 2.0], [3.0, 4.0]], unit=unit_string) # Then base_unit = descriptor._base_unit() # Expect assert base_unit == expected - - @pytest.mark.parametrize("test, expected, raises_warning", [ - (DescriptorNumber("test", 2, "m", 0.01), - DescriptorArray("test + name", - [[3.0, 4.0], [5.0, 6.0]], - "m", - [[0.11, 0.21], [0.31, 0.41]]), - True), - (DescriptorNumber("test", 1, "cm", 10), - DescriptorArray("test + name", - [[1.01, 2.01], [3.01, 4.01]], - "m", - [[0.1010, 0.2010], [0.3010, 0.4010]]), - True), - (DescriptorArray("test", - [[2.0, 3.0], [4.0, -5.0]], - "cm", - [[1.0, 2.0], [3.0, 4.0]]), - DescriptorArray("test + name", - [[1.02, 2.03], [3.04, 3.95]], - "m", - [[0.1001, 0.2002], [0.3003, 0.4004]]), - False), - (DescriptorArray("test", - [[2, 3], [4, -5]], - "cm"), - DescriptorArray("test + name", - [[1.02, 2.03], [3.04, 3.95]], - "m", - [[0.1, 0.2], [0.3, 0.4]]), - False), + + @pytest.mark.parametrize( + 'test, expected, raises_warning', + [ + ( + DescriptorNumber('test', 2, 'm', 0.01), + DescriptorArray( + 'test + name', [[3.0, 4.0], [5.0, 6.0]], 'm', [[0.11, 0.21], [0.31, 0.41]] + ), + True, + ), + ( + DescriptorNumber('test', 1, 'cm', 10), + DescriptorArray( + 'test + name', + [[1.01, 2.01], [3.01, 4.01]], + 'm', + [[0.1010, 0.2010], [0.3010, 0.4010]], + ), + True, + ), + ( + DescriptorArray('test', [[2.0, 3.0], [4.0, -5.0]], 'cm', [[1.0, 2.0], [3.0, 4.0]]), + DescriptorArray( + 'test + name', + [[1.02, 2.03], [3.04, 3.95]], + 'm', + [[0.1001, 0.2002], [0.3003, 0.4004]], + ), + False, + ), + ( + DescriptorArray('test', [[2, 3], [4, -5]], 'cm'), + DescriptorArray( + 'test + name', [[1.02, 2.03], [3.04, 3.95]], 'm', [[0.1, 0.2], [0.3, 0.4]] + ), + False, + ), + ], + ids=[ + 'descriptor_number_regular', + 'descriptor_number_unit_conversion', + 'array_conversion', + 'array_conversion_integer', ], - ids=["descriptor_number_regular", "descriptor_number_unit_conversion", "array_conversion", "array_conversion_integer"]) + ) def test_addition(self, descriptor: DescriptorArray, test, expected, raises_warning): # When Then if raises_warning: @@ -283,20 +303,33 @@ def test_addition(self, descriptor: DescriptorArray, test, expected, raises_warn assert np.allclose(result.variance, expected.variance) assert descriptor.unit == 'm' - @pytest.mark.parametrize("test, expected", [ - ([[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], - DescriptorArray("test", - [[3.0, 5.0], [7.0, -1.0], [11.0, -2.0]], - "dimensionless", - [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]])), - (1, - DescriptorArray("test", - [[2.0, 3.0], [4.0, 5.0], [6.0, 7.0]], - "dimensionless", - [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]])) + @pytest.mark.parametrize( + 'test, expected', + [ + ( + [[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], + DescriptorArray( + 'test', + [[3.0, 5.0], [7.0, -1.0], [11.0, -2.0]], + 'dimensionless', + [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]], + ), + ), + ( + 1, + DescriptorArray( + 'test', + [[2.0, 3.0], [4.0, 5.0], [6.0, 7.0]], + 'dimensionless', + [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]], + ), + ), ], - ids=["list", "number"]) - def test_addition_dimensionless(self, descriptor_dimensionless: DescriptorArray, test, expected): + ids=['list', 'number'], + ) + def test_addition_dimensionless( + self, descriptor_dimensionless: DescriptorArray, test, expected + ): # When Then result = descriptor_dimensionless + test # Expect @@ -305,38 +338,54 @@ def test_addition_dimensionless(self, descriptor_dimensionless: DescriptorArray, assert np.allclose(result.variance, expected.variance) assert descriptor_dimensionless.unit == 'dimensionless' - @pytest.mark.parametrize("test, expected, raises_warning", [ - (DescriptorNumber("test", 2, "m", 0.01), - DescriptorArray("test + name", - [[3.0, 4.0], [5.0, 6.0]], - "m", - [[0.11, 0.21], [0.31, 0.41]]), - True), - (DescriptorNumber("test", 1, "cm", 10), - DescriptorArray("test + name", - [[101.0, 201.0], [301.0, 401.0]], - "cm", - [[1010.0, 2010.0], [3010.0, 4010.0]]), - True), - (DescriptorArray("test", - [[2.0, 3.0], [4.0, -5.0]], - "cm", - [[1.0, 2.0], [3.0, 4.0]]), - DescriptorArray("test + name", - [[102.0, 203.0], [304.0, 395.0]], - "cm", - [[1001.0, 2002.0], [3003.0, 4004.0]]), - False), - (DescriptorArray("test", - [[2, 3], [4, -5]], - "cm"), - DescriptorArray("test + name", - [[102.0, 203.0], [304.0, 395.0]], - "cm", - [[1000.0, 2000.0], [3000.0, 4000.0]]), - False), + @pytest.mark.parametrize( + 'test, expected, raises_warning', + [ + ( + DescriptorNumber('test', 2, 'm', 0.01), + DescriptorArray( + 'test + name', [[3.0, 4.0], [5.0, 6.0]], 'm', [[0.11, 0.21], [0.31, 0.41]] + ), + True, + ), + ( + DescriptorNumber('test', 1, 'cm', 10), + DescriptorArray( + 'test + name', + [[101.0, 201.0], [301.0, 401.0]], + 'cm', + [[1010.0, 2010.0], [3010.0, 4010.0]], + ), + True, + ), + ( + DescriptorArray('test', [[2.0, 3.0], [4.0, -5.0]], 'cm', [[1.0, 2.0], [3.0, 4.0]]), + DescriptorArray( + 'test + name', + [[102.0, 203.0], [304.0, 395.0]], + 'cm', + [[1001.0, 2002.0], [3003.0, 4004.0]], + ), + False, + ), + ( + DescriptorArray('test', [[2, 3], [4, -5]], 'cm'), + DescriptorArray( + 'test + name', + [[102.0, 203.0], [304.0, 395.0]], + 'cm', + [[1000.0, 2000.0], [3000.0, 4000.0]], + ), + False, + ), + ], + ids=[ + 'descriptor_number_regular', + 'descriptor_number_unit_conversion', + 'array_conversion', + 'array_conversion_integer', ], - ids=["descriptor_number_regular", "descriptor_number_unit_conversion", "array_conversion", "array_conversion_integer"]) + ) def test_reverse_addition(self, descriptor: DescriptorArray, test, expected, raises_warning): # When Then if raises_warning: @@ -354,20 +403,33 @@ def test_reverse_addition(self, descriptor: DescriptorArray, test, expected, rai assert np.allclose(result.variance, expected.variance) assert descriptor.unit == 'm' - @pytest.mark.parametrize("test, expected", [ - ([[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], - DescriptorArray("test", - [[3.0, 5.0], [7.0, -1.0], [11.0, -2.0]], - "dimensionless", - [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]])), - (1, - DescriptorArray("test", - [[2.0, 3.0], [4.0, 5.0], [6.0, 7.0]], - "dimensionless", - [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]])) + @pytest.mark.parametrize( + 'test, expected', + [ + ( + [[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], + DescriptorArray( + 'test', + [[3.0, 5.0], [7.0, -1.0], [11.0, -2.0]], + 'dimensionless', + [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]], + ), + ), + ( + 1, + DescriptorArray( + 'test', + [[2.0, 3.0], [4.0, 5.0], [6.0, 7.0]], + 'dimensionless', + [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]], + ), + ), ], - ids=["list", "number"]) - def test_reverse_addition_dimensionless(self, descriptor_dimensionless: DescriptorArray, test, expected): + ids=['list', 'number'], + ) + def test_reverse_addition_dimensionless( + self, descriptor_dimensionless: DescriptorArray, test, expected + ): # When Then result = test + descriptor_dimensionless # Expect @@ -376,38 +438,54 @@ def test_reverse_addition_dimensionless(self, descriptor_dimensionless: Descript assert np.allclose(result.variance, expected.variance) assert descriptor_dimensionless.unit == 'dimensionless' - @pytest.mark.parametrize("test, expected, raises_warning", [ - (DescriptorNumber("test", 2, "m", 0.01), - DescriptorArray("test + name", - [[-1.0, 0.0], [1.0, 2.0]], - "m", - [[0.11, 0.21], [0.31, 0.41]]), - True), - (DescriptorNumber("test", 1, "cm", 10), - DescriptorArray("test + name", - [[0.99, 1.99], [2.99, 3.99]], - "m", - [[0.1010, 0.2010], [0.3010, 0.4010]]), - True), - (DescriptorArray("test", - [[2.0, 3.0], [4.0, -5.0]], - "cm", - [[1.0, 2.0], [3.0, 4.0]]), - DescriptorArray("test + name", - [[0.98, 1.97], [2.96, 4.05]], - "m", - [[0.1001, 0.2002], [0.3003, 0.4004]]), - False), - (DescriptorArray("test", - [[2, 3], [4, -5]], - "cm"), - DescriptorArray("test + name", - [[0.98, 1.97], [2.96, 4.05]], - "m", - [[0.100, 0.200], [0.300, 0.400]]), - False) + @pytest.mark.parametrize( + 'test, expected, raises_warning', + [ + ( + DescriptorNumber('test', 2, 'm', 0.01), + DescriptorArray( + 'test + name', [[-1.0, 0.0], [1.0, 2.0]], 'm', [[0.11, 0.21], [0.31, 0.41]] + ), + True, + ), + ( + DescriptorNumber('test', 1, 'cm', 10), + DescriptorArray( + 'test + name', + [[0.99, 1.99], [2.99, 3.99]], + 'm', + [[0.1010, 0.2010], [0.3010, 0.4010]], + ), + True, + ), + ( + DescriptorArray('test', [[2.0, 3.0], [4.0, -5.0]], 'cm', [[1.0, 2.0], [3.0, 4.0]]), + DescriptorArray( + 'test + name', + [[0.98, 1.97], [2.96, 4.05]], + 'm', + [[0.1001, 0.2002], [0.3003, 0.4004]], + ), + False, + ), + ( + DescriptorArray('test', [[2, 3], [4, -5]], 'cm'), + DescriptorArray( + 'test + name', + [[0.98, 1.97], [2.96, 4.05]], + 'm', + [[0.100, 0.200], [0.300, 0.400]], + ), + False, + ), ], - ids=["descriptor_number_regular", "descriptor_number_unit_conversion", "array_conversion", "array_conversion_integer"]) + ids=[ + 'descriptor_number_regular', + 'descriptor_number_unit_conversion', + 'array_conversion', + 'array_conversion_integer', + ], + ) def test_subtraction(self, descriptor: DescriptorArray, test, expected, raises_warning): # When Then if raises_warning: @@ -425,20 +503,33 @@ def test_subtraction(self, descriptor: DescriptorArray, test, expected, raises_w assert np.allclose(result.variance, expected.variance) assert descriptor.unit == 'm' - @pytest.mark.parametrize("test, expected", [ - ([[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], - DescriptorArray("test", - [[-1.0, -1.0], [-1.0, 9.0], [-1, 14.0]], - "dimensionless", - [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]])), - (1, - DescriptorArray("test", - [[0.0, 1.0], [2.0, 3.0], [4.0, 5.0]], - "dimensionless", - [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]])) + @pytest.mark.parametrize( + 'test, expected', + [ + ( + [[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], + DescriptorArray( + 'test', + [[-1.0, -1.0], [-1.0, 9.0], [-1, 14.0]], + 'dimensionless', + [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]], + ), + ), + ( + 1, + DescriptorArray( + 'test', + [[0.0, 1.0], [2.0, 3.0], [4.0, 5.0]], + 'dimensionless', + [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]], + ), + ), ], - ids=["list", "number"]) - def test_subtraction_dimensionless(self, descriptor_dimensionless: DescriptorArray, test, expected): + ids=['list', 'number'], + ) + def test_subtraction_dimensionless( + self, descriptor_dimensionless: DescriptorArray, test, expected + ): # When Then result = descriptor_dimensionless - test # Expect @@ -446,40 +537,58 @@ def test_subtraction_dimensionless(self, descriptor_dimensionless: DescriptorArr assert np.array_equal(result.value, expected.value) assert np.allclose(result.variance, expected.variance) assert descriptor_dimensionless.unit == 'dimensionless' - - @pytest.mark.parametrize("test, expected, raises_warning", [ - (DescriptorNumber("test", 2, "m", 0.01), - DescriptorArray("test + name", - [[1.0, 0.0], [-1.0, -2.0]], - "m", - [[0.11, 0.21], [0.31, 0.41]]), - True), - (DescriptorNumber("test", 1, "cm", 10), - DescriptorArray("test + name", - [[-99.0, -199.0], [-299.0, -399.0]], - "cm", - [[1010.0, 2010.0], [3010.0, 4010.0]]), - True), - (DescriptorArray("test", - [[2.0, 3.0], [4.0, -5.0]], - "cm", - [[1.0, 2.0], [3.0, 4.0]]), - DescriptorArray("test + name", - [[-98.0, -197.0], [-296.0, -405.0]], - "cm", - [[1001.0, 2002.0], [3003.0, 4004.0]]), - False), - (DescriptorArray("test", - [[2, 3], [4, -5]], - "cm"), - DescriptorArray("test + name", - [[-98.0, -197.0], [-296.0, -405.0]], - "cm", - [[1000.0, 2000.0], [3000.0, 4000.0]]), - False) + + @pytest.mark.parametrize( + 'test, expected, raises_warning', + [ + ( + DescriptorNumber('test', 2, 'm', 0.01), + DescriptorArray( + 'test + name', [[1.0, 0.0], [-1.0, -2.0]], 'm', [[0.11, 0.21], [0.31, 0.41]] + ), + True, + ), + ( + DescriptorNumber('test', 1, 'cm', 10), + DescriptorArray( + 'test + name', + [[-99.0, -199.0], [-299.0, -399.0]], + 'cm', + [[1010.0, 2010.0], [3010.0, 4010.0]], + ), + True, + ), + ( + DescriptorArray('test', [[2.0, 3.0], [4.0, -5.0]], 'cm', [[1.0, 2.0], [3.0, 4.0]]), + DescriptorArray( + 'test + name', + [[-98.0, -197.0], [-296.0, -405.0]], + 'cm', + [[1001.0, 2002.0], [3003.0, 4004.0]], + ), + False, + ), + ( + DescriptorArray('test', [[2, 3], [4, -5]], 'cm'), + DescriptorArray( + 'test + name', + [[-98.0, -197.0], [-296.0, -405.0]], + 'cm', + [[1000.0, 2000.0], [3000.0, 4000.0]], + ), + False, + ), ], - ids=["descriptor_number_regular", "descriptor_number_unit_conversion", "array_conversion", "array_conversion_integer"]) - def test_reverse_subtraction(self, descriptor: DescriptorArray, test, expected, raises_warning): + ids=[ + 'descriptor_number_regular', + 'descriptor_number_unit_conversion', + 'array_conversion', + 'array_conversion_integer', + ], + ) + def test_reverse_subtraction( + self, descriptor: DescriptorArray, test, expected, raises_warning + ): # When Then if raises_warning: with pytest.warns(UserWarning) as record: @@ -496,20 +605,33 @@ def test_reverse_subtraction(self, descriptor: DescriptorArray, test, expected, assert np.allclose(result.variance, expected.variance) assert descriptor.unit == 'm' - @pytest.mark.parametrize("test, expected", [ - ([[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], - DescriptorArray("test", - [[1.0, 1.0], [1.0, -9.0], [1.0, -14.0]], - "dimensionless", - [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]])), - (1, - DescriptorArray("test", - [[0.0, -1.0], [-2.0, -3.0], [-4.0, -5.0]], - "dimensionless", - [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]])) + @pytest.mark.parametrize( + 'test, expected', + [ + ( + [[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], + DescriptorArray( + 'test', + [[1.0, 1.0], [1.0, -9.0], [1.0, -14.0]], + 'dimensionless', + [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]], + ), + ), + ( + 1, + DescriptorArray( + 'test', + [[0.0, -1.0], [-2.0, -3.0], [-4.0, -5.0]], + 'dimensionless', + [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]], + ), + ), ], - ids=["list", "number"]) - def test_reverse_subtraction_dimensionless(self, descriptor_dimensionless: DescriptorArray, test, expected): + ids=['list', 'number'], + ) + def test_reverse_subtraction_dimensionless( + self, descriptor_dimensionless: DescriptorArray, test, expected + ): # When Then result = test - descriptor_dimensionless # Expect @@ -518,66 +640,87 @@ def test_reverse_subtraction_dimensionless(self, descriptor_dimensionless: Descr assert np.allclose(result.variance, expected.variance) assert descriptor_dimensionless.unit == 'dimensionless' - @pytest.mark.parametrize("test, expected, raises_warning", [ - (DescriptorNumber("test", 2, "m", 0.01), - DescriptorArray("test * name", - [[2.0, 4.0], [6.0, 8.0]], - "m^2", - [[0.41, 0.84], [1.29, 1.76]]), - True), - (DescriptorNumber("test", 1, "cm", 10), - DescriptorArray("test * name", - [[0.01, 0.02], [0.03, 0.04]], - "m^2", - [[0.00101, 0.00402], [0.00903, 0.01604]]), - True), - (DescriptorNumber("test", 1, "kg", 10), - DescriptorArray("test * name", - [[1.0, 2.0], [3.0, 4.0]], - "kg*m", - [[10.1, 40.2], [90.3, 160.4]]), - True), - (DescriptorArray("test", - [[2.0, 3.0], [4.0, -5.0]], - "cm", - [[1.0, 2.0], [3.0, 4.0]]), - DescriptorArray("test * name", - [[0.02, 0.06], [0.12, -0.2]], - "m^2", - [[0.00014, 0.00098], [0.00318, 0.0074]]), - False), - (DescriptorArray("test", - [[2, 3], [4, -5]], - "cm"), - DescriptorArray("test * name", - [[0.02, 0.06], [0.12, -0.2]], - "m^2", - [[0.1 * 2**2 * 1e-4, 0.2 * 3**2 * 1e-4], - [0.3 * 4**2 * 1e-4, 0.4 * 5**2 * 1e-4]]), - False), - ([[2.0, 3.0], [4.0, -5.0]], - DescriptorArray("test * name", - [[2.0, 6.0], [12.0, -20.0]], - "m", - [[0.1 * 2**2, 0.2 * 3**2], - [0.3 * 4**2, 0.4 * 5**2]]), - False), - (2.0, - DescriptorArray("test * name", - [[2.0, 4.0], [6.0, 8.0]], - "m", - [[0.1 * 2**2, 0.2 * 2**2], - [0.3 * 2**2, 0.4 * 2**2]]), - False) - + @pytest.mark.parametrize( + 'test, expected, raises_warning', + [ + ( + DescriptorNumber('test', 2, 'm', 0.01), + DescriptorArray( + 'test * name', [[2.0, 4.0], [6.0, 8.0]], 'm^2', [[0.41, 0.84], [1.29, 1.76]] + ), + True, + ), + ( + DescriptorNumber('test', 1, 'cm', 10), + DescriptorArray( + 'test * name', + [[0.01, 0.02], [0.03, 0.04]], + 'm^2', + [[0.00101, 0.00402], [0.00903, 0.01604]], + ), + True, + ), + ( + DescriptorNumber('test', 1, 'kg', 10), + DescriptorArray( + 'test * name', [[1.0, 2.0], [3.0, 4.0]], 'kg*m', [[10.1, 40.2], [90.3, 160.4]] + ), + True, + ), + ( + DescriptorArray('test', [[2.0, 3.0], [4.0, -5.0]], 'cm', [[1.0, 2.0], [3.0, 4.0]]), + DescriptorArray( + 'test * name', + [[0.02, 0.06], [0.12, -0.2]], + 'm^2', + [[0.00014, 0.00098], [0.00318, 0.0074]], + ), + False, + ), + ( + DescriptorArray('test', [[2, 3], [4, -5]], 'cm'), + DescriptorArray( + 'test * name', + [[0.02, 0.06], [0.12, -0.2]], + 'm^2', + [ + [0.1 * 2**2 * 1e-4, 0.2 * 3**2 * 1e-4], + [0.3 * 4**2 * 1e-4, 0.4 * 5**2 * 1e-4], + ], + ), + False, + ), + ( + [[2.0, 3.0], [4.0, -5.0]], + DescriptorArray( + 'test * name', + [[2.0, 6.0], [12.0, -20.0]], + 'm', + [[0.1 * 2**2, 0.2 * 3**2], [0.3 * 4**2, 0.4 * 5**2]], + ), + False, + ), + ( + 2.0, + DescriptorArray( + 'test * name', + [[2.0, 4.0], [6.0, 8.0]], + 'm', + [[0.1 * 2**2, 0.2 * 2**2], [0.3 * 2**2, 0.4 * 2**2]], + ), + False, + ), ], - ids=["descriptor_number_regular", - "descriptor_number_unit_conversion", - "descriptor_number_different_units", - "array_conversion", - "array_conversion_integer", - "list", - "number"]) + ids=[ + 'descriptor_number_regular', + 'descriptor_number_unit_conversion', + 'descriptor_number_different_units', + 'array_conversion', + 'array_conversion_integer', + 'list', + 'number', + ], + ) def test_multiplication(self, descriptor: DescriptorArray, test, expected, raises_warning): # When Then if raises_warning: @@ -595,20 +738,33 @@ def test_multiplication(self, descriptor: DescriptorArray, test, expected, raise assert np.allclose(result.variance, expected.variance) assert descriptor.unit == 'm' - @pytest.mark.parametrize("test, expected", [ - ([[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], - DescriptorArray("test", - [[2.0, 6.0], [12.0, -20.0], [30.0, -48.0]], - "dimensionless", - [[0.4, 1.8], [4.8, 10.0], [18.0, 38.4]])), - (1.5, - DescriptorArray("test", - [[1.5, 3.0], [4.5, 6.0], [7.5, 9.0]], - "dimensionless", - [[0.225, 0.45], [0.675, 0.9], [1.125, 1.35]])) + @pytest.mark.parametrize( + 'test, expected', + [ + ( + [[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], + DescriptorArray( + 'test', + [[2.0, 6.0], [12.0, -20.0], [30.0, -48.0]], + 'dimensionless', + [[0.4, 1.8], [4.8, 10.0], [18.0, 38.4]], + ), + ), + ( + 1.5, + DescriptorArray( + 'test', + [[1.5, 3.0], [4.5, 6.0], [7.5, 9.0]], + 'dimensionless', + [[0.225, 0.45], [0.675, 0.9], [1.125, 1.35]], + ), + ), ], - ids=["list", "number"]) - def test_multiplication_dimensionless(self, descriptor_dimensionless: DescriptorArray, test, expected): + ids=['list', 'number'], + ) + def test_multiplication_dimensionless( + self, descriptor_dimensionless: DescriptorArray, test, expected + ): # When Then result = descriptor_dimensionless * test # Expect @@ -616,68 +772,88 @@ def test_multiplication_dimensionless(self, descriptor_dimensionless: Descriptor assert np.array_equal(result.value, expected.value) assert np.allclose(result.variance, expected.variance) assert descriptor_dimensionless.unit == 'dimensionless' - - @pytest.mark.parametrize("test, expected, raises_warning", [ - (DescriptorNumber("test", 2, "m", 0.01), - DescriptorArray("test * name", - [[2.0, 4.0], [6.0, 8.0]], - "m^2", - [[0.41, 0.84], [1.29, 1.76]]), - True), - (DescriptorNumber("test", 1, "cm", 10), - DescriptorArray("test * name", - [[100.0, 200.0], [300.0, 400.0]], - "cm^2", - [[101000.0, 402000.0], [903000.0, 1604000.0]]), - True), - (DescriptorNumber("test", 1, "kg", 10), - DescriptorArray("test * name", - [[1.0, 2.0], [3.0, 4.0]], - "kg*m", - [[10.1, 40.2], [90.3, 160.4]]), - True), - (DescriptorArray("test", - [[2.0, 3.0], [4.0, -5.0]], - "cm", - [[1.0, 2.0], [3.0, 4.0]]), - DescriptorArray("test * name", - [[200.0, 600.0], [1200.0, -2000.0]], - "cm^2", - [[14000.0, 98000.0], [318000.0, 740000.0]]), - False), - (DescriptorArray("test", - [[2, 3], [4, -5]], - "cm"), - DescriptorArray("test * name", - [[200.0, 600.0], [1200.0, -2000.0]], - "cm^2", - [[0.1 * 2**2 * 1e4, 0.2 * 3**2 * 1e4], - [0.3 * 4**2 * 1e4, 0.4 * 5**2 * 1e4]]), - False), - ([[2.0, 3.0], [4.0, -5.0]], - DescriptorArray("test * name", - [[2.0, 6.0], [12.0, -20.0]], - "m", - [[0.1 * 2**2, 0.2 * 3**2], - [0.3 * 4**2, 0.4 * 5**2]]), - False), - (2.0, - DescriptorArray("test * name", - [[2.0, 4.0], [6.0, 8.0]], - "m", - [[0.1 * 2**2, 0.2 * 2**2], - [0.3 * 2**2, 0.4 * 2**2]]), - False) + @pytest.mark.parametrize( + 'test, expected, raises_warning', + [ + ( + DescriptorNumber('test', 2, 'm', 0.01), + DescriptorArray( + 'test * name', [[2.0, 4.0], [6.0, 8.0]], 'm^2', [[0.41, 0.84], [1.29, 1.76]] + ), + True, + ), + ( + DescriptorNumber('test', 1, 'cm', 10), + DescriptorArray( + 'test * name', + [[100.0, 200.0], [300.0, 400.0]], + 'cm^2', + [[101000.0, 402000.0], [903000.0, 1604000.0]], + ), + True, + ), + ( + DescriptorNumber('test', 1, 'kg', 10), + DescriptorArray( + 'test * name', [[1.0, 2.0], [3.0, 4.0]], 'kg*m', [[10.1, 40.2], [90.3, 160.4]] + ), + True, + ), + ( + DescriptorArray('test', [[2.0, 3.0], [4.0, -5.0]], 'cm', [[1.0, 2.0], [3.0, 4.0]]), + DescriptorArray( + 'test * name', + [[200.0, 600.0], [1200.0, -2000.0]], + 'cm^2', + [[14000.0, 98000.0], [318000.0, 740000.0]], + ), + False, + ), + ( + DescriptorArray('test', [[2, 3], [4, -5]], 'cm'), + DescriptorArray( + 'test * name', + [[200.0, 600.0], [1200.0, -2000.0]], + 'cm^2', + [[0.1 * 2**2 * 1e4, 0.2 * 3**2 * 1e4], [0.3 * 4**2 * 1e4, 0.4 * 5**2 * 1e4]], + ), + False, + ), + ( + [[2.0, 3.0], [4.0, -5.0]], + DescriptorArray( + 'test * name', + [[2.0, 6.0], [12.0, -20.0]], + 'm', + [[0.1 * 2**2, 0.2 * 3**2], [0.3 * 4**2, 0.4 * 5**2]], + ), + False, + ), + ( + 2.0, + DescriptorArray( + 'test * name', + [[2.0, 4.0], [6.0, 8.0]], + 'm', + [[0.1 * 2**2, 0.2 * 2**2], [0.3 * 2**2, 0.4 * 2**2]], + ), + False, + ), + ], + ids=[ + 'descriptor_number_regular', + 'descriptor_number_unit_conversion', + 'descriptor_number_different_units', + 'array_conversion', + 'array_conversion_integer', + 'list', + 'number', ], - ids=["descriptor_number_regular", - "descriptor_number_unit_conversion", - "descriptor_number_different_units", - "array_conversion", - "array_conversion_integer", - "list", - "number"]) - def test_reverse_multiplication(self, descriptor: DescriptorArray, test, expected, raises_warning): + ) + def test_reverse_multiplication( + self, descriptor: DescriptorArray, test, expected, raises_warning + ): # When Then if raises_warning: with pytest.warns(UserWarning) as record: @@ -694,20 +870,33 @@ def test_reverse_multiplication(self, descriptor: DescriptorArray, test, expecte assert np.allclose(result.variance, expected.variance) assert descriptor.unit == 'm' - @pytest.mark.parametrize("test, expected", [ - ([[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], - DescriptorArray("test", - [[2.0, 6.0], [12.0, -20.0], [30.0, -48.0]], - "dimensionless", - [[0.4, 1.8], [4.8, 10.0], [18.0, 38.4]])), - (1.5, - DescriptorArray("test", - [[1.5, 3.0], [4.5, 6.0], [7.5, 9.0]], - "dimensionless", - [[0.225, 0.45], [0.675, 0.9], [1.125, 1.35]])) + @pytest.mark.parametrize( + 'test, expected', + [ + ( + [[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], + DescriptorArray( + 'test', + [[2.0, 6.0], [12.0, -20.0], [30.0, -48.0]], + 'dimensionless', + [[0.4, 1.8], [4.8, 10.0], [18.0, 38.4]], + ), + ), + ( + 1.5, + DescriptorArray( + 'test', + [[1.5, 3.0], [4.5, 6.0], [7.5, 9.0]], + 'dimensionless', + [[0.225, 0.45], [0.675, 0.9], [1.125, 1.35]], + ), + ), ], - ids=["list", "number"]) - def test_reverse_multiplication_dimensionless(self, descriptor_dimensionless: DescriptorArray, test, expected): + ids=['list', 'number'], + ) + def test_reverse_multiplication_dimensionless( + self, descriptor_dimensionless: DescriptorArray, test, expected + ): # When Then result = test * descriptor_dimensionless # Expect @@ -716,79 +905,131 @@ def test_reverse_multiplication_dimensionless(self, descriptor_dimensionless: De assert np.allclose(result.variance, expected.variance) assert descriptor_dimensionless.unit == 'dimensionless' - @pytest.mark.parametrize("test, expected, raises_warning", [ - (DescriptorNumber("test", 2, "m", 0.01), - DescriptorArray("name / test", - [[1.0/2.0, 2.0/2.0], [3.0/2.0, 4.0/2.0]], - "dimensionless", - [[(0.1 + 0.01 * 1.0**2 / 2.0**2) / 2.0**2, - (0.2 + 0.01 * 2.0**2 / 2.0**2) / 2.0**2], - [(0.3 + 0.01 * 3.0**2 / 2.0**2) / 2.0**2, - (0.4 + 0.01 * 4.0**2 / 2.0**2) / 2.0**2]]), - True), - (DescriptorNumber("test", 1, "cm", 10), - DescriptorArray("name / test", - [[100.0, 200.0], [300.0, 400.0]], - "dimensionless", - [[(0.1 + 10 * 1.0**2 / 1.0**2) / 1.0**2 * 1e4, - (0.2 + 10 * 2.0**2 / 1.0**2) / 1.0**2 * 1e4], - [(0.3 + 10 * 3.0**2 / 1.0**2) / 1.0**2 * 1e4, - (0.4 + 10 * 4.0**2 / 1.0**2) / 1.0**2 * 1e4]]), - True), - (DescriptorNumber("test", 1, "kg", 10), - DescriptorArray("name / test", - [[1.0, 2.0], [3.0, 4.0]], - "m/kg", - [[(0.1 + 10 * 1.0**2 / 1.0**2) / 1.0**2, - (0.2 + 10 * 2.0**2 / 1.0**2) / 1.0**2], - [(0.3 + 10 * 3.0**2 / 1.0**2) / 1.0**2, - (0.4 + 10 * 4.0**2 / 1.0**2) / 1.0**2]]), - True), - (DescriptorArray("test", - [[2.0, 3.0], [4.0, -5.0]], - "cm^2", - [[1.0, 2.0], [3.0, 4.0]]), - DescriptorArray("name / test", - [[1/2 * 1e4, 2/3 * 1e4], [3.0/4.0*1e4, -4.0/5.0 * 1e4]], - "1/m", - [[(0.1 + 1.0 * 1.0**2 / 2.0**2) / 2.0**2 * 1e8, - (0.2 + 2.0 * 2.0**2 / 3.0**2) / 3.0**2 * 1e8], - [(0.3 + 3.0 * 3.0**2 / 4.0**2) / 4.0**2 * 1e8, - (0.4 + 4.0 * 4.0**2 / 5.0**2) / 5.0**2 * 1e8]]), - False), - (DescriptorArray("test", - [[2, 3], [4, -5]], - "cm^2"), - DescriptorArray("name / test", - [[1/2 * 1e4, 2/3 * 1e4], [3.0/4.0*1e4, -4.0/5.0 * 1e4]], - "1/m", - [[(0.1) / 2.0**2 * 1e8, - (0.2) / 3.0**2 * 1e8], - [(0.3) / 4.0**2 * 1e8, - (0.4) / 5.0**2 * 1e8]]), - False), - ([[2.0, 3.0], [4.0, -5.0]], - DescriptorArray("name / name", - [[0.5, 2.0/3.0], [3.0/4.0, -4/5]], - "m", - [[0.1 / 2**2, 0.2 / 3.0**2], - [0.3 / 4**2, 0.4 / 5.0**2]]), - False), - (2.0, - DescriptorArray("name / test", - [[0.5, 1.0], [3.0/2.0, 2.0]], - "m", - [[0.1 / 2.0**2, 0.2 / 2.0**2], - [0.3 / 2.0**2, 0.4 / 2.0**2]]), - False) + @pytest.mark.parametrize( + 'test, expected, raises_warning', + [ + ( + DescriptorNumber('test', 2, 'm', 0.01), + DescriptorArray( + 'name / test', + [[1.0 / 2.0, 2.0 / 2.0], [3.0 / 2.0, 4.0 / 2.0]], + 'dimensionless', + [ + [ + (0.1 + 0.01 * 1.0**2 / 2.0**2) / 2.0**2, + (0.2 + 0.01 * 2.0**2 / 2.0**2) / 2.0**2, + ], + [ + (0.3 + 0.01 * 3.0**2 / 2.0**2) / 2.0**2, + (0.4 + 0.01 * 4.0**2 / 2.0**2) / 2.0**2, + ], + ], + ), + True, + ), + ( + DescriptorNumber('test', 1, 'cm', 10), + DescriptorArray( + 'name / test', + [[100.0, 200.0], [300.0, 400.0]], + 'dimensionless', + [ + [ + (0.1 + 10 * 1.0**2 / 1.0**2) / 1.0**2 * 1e4, + (0.2 + 10 * 2.0**2 / 1.0**2) / 1.0**2 * 1e4, + ], + [ + (0.3 + 10 * 3.0**2 / 1.0**2) / 1.0**2 * 1e4, + (0.4 + 10 * 4.0**2 / 1.0**2) / 1.0**2 * 1e4, + ], + ], + ), + True, + ), + ( + DescriptorNumber('test', 1, 'kg', 10), + DescriptorArray( + 'name / test', + [[1.0, 2.0], [3.0, 4.0]], + 'm/kg', + [ + [ + (0.1 + 10 * 1.0**2 / 1.0**2) / 1.0**2, + (0.2 + 10 * 2.0**2 / 1.0**2) / 1.0**2, + ], + [ + (0.3 + 10 * 3.0**2 / 1.0**2) / 1.0**2, + (0.4 + 10 * 4.0**2 / 1.0**2) / 1.0**2, + ], + ], + ), + True, + ), + ( + DescriptorArray( + 'test', [[2.0, 3.0], [4.0, -5.0]], 'cm^2', [[1.0, 2.0], [3.0, 4.0]] + ), + DescriptorArray( + 'name / test', + [[1 / 2 * 1e4, 2 / 3 * 1e4], [3.0 / 4.0 * 1e4, -4.0 / 5.0 * 1e4]], + '1/m', + [ + [ + (0.1 + 1.0 * 1.0**2 / 2.0**2) / 2.0**2 * 1e8, + (0.2 + 2.0 * 2.0**2 / 3.0**2) / 3.0**2 * 1e8, + ], + [ + (0.3 + 3.0 * 3.0**2 / 4.0**2) / 4.0**2 * 1e8, + (0.4 + 4.0 * 4.0**2 / 5.0**2) / 5.0**2 * 1e8, + ], + ], + ), + False, + ), + ( + DescriptorArray('test', [[2, 3], [4, -5]], 'cm^2'), + DescriptorArray( + 'name / test', + [[1 / 2 * 1e4, 2 / 3 * 1e4], [3.0 / 4.0 * 1e4, -4.0 / 5.0 * 1e4]], + '1/m', + [ + [(0.1) / 2.0**2 * 1e8, (0.2) / 3.0**2 * 1e8], + [(0.3) / 4.0**2 * 1e8, (0.4) / 5.0**2 * 1e8], + ], + ), + False, + ), + ( + [[2.0, 3.0], [4.0, -5.0]], + DescriptorArray( + 'name / name', + [[0.5, 2.0 / 3.0], [3.0 / 4.0, -4 / 5]], + 'm', + [[0.1 / 2**2, 0.2 / 3.0**2], [0.3 / 4**2, 0.4 / 5.0**2]], + ), + False, + ), + ( + 2.0, + DescriptorArray( + 'name / test', + [[0.5, 1.0], [3.0 / 2.0, 2.0]], + 'm', + [[0.1 / 2.0**2, 0.2 / 2.0**2], [0.3 / 2.0**2, 0.4 / 2.0**2]], + ), + False, + ), ], - ids=["descriptor_number_regular", - "descriptor_number_unit_conversion", - "descriptor_number_different_units", - "array_conversion", - "array_conversion_integer", - "list", - "number"]) + ids=[ + 'descriptor_number_regular', + 'descriptor_number_unit_conversion', + 'descriptor_number_different_units', + 'array_conversion', + 'array_conversion_integer', + 'list', + 'number', + ], + ) def test_division(self, descriptor: DescriptorArray, test, expected, raises_warning): # When Then if raises_warning: @@ -805,31 +1046,42 @@ def test_division(self, descriptor: DescriptorArray, test, expected, raises_warn assert result.unit == expected.unit assert np.allclose(result.variance, expected.variance) assert descriptor.unit == 'm' - - @pytest.mark.parametrize("test, expected", [ - ([[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], - DescriptorArray("test", - [[1.0/2.0, 2.0/3.0], [3.0/4.0, -4.0/5.0], [5.0/6.0, -6.0/8.0]], - "dimensionless", - [[0.1 / 2.0**2, - 0.2 / 3.0**2], - [0.3 / 4.0**2, - 0.4 / 5.0**2], - [0.5 / 6.0**2, - 0.6 / 8.0**2]])), - (2, - DescriptorArray("test", - [[1.0/2.0, 2.0/2.0], [3.0/2.0, 4.0/2.0], [5.0/2.0, 6.0/2.0]], - "dimensionless", - [[0.1 / 2.0**2, - 0.2 / 2.0**2], - [0.3 / 2.0**2, - 0.4 / 2.0**2], - [0.5 / 2.0**2, - 0.6 / 2.0**2]])) + + @pytest.mark.parametrize( + 'test, expected', + [ + ( + [[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], + DescriptorArray( + 'test', + [[1.0 / 2.0, 2.0 / 3.0], [3.0 / 4.0, -4.0 / 5.0], [5.0 / 6.0, -6.0 / 8.0]], + 'dimensionless', + [ + [0.1 / 2.0**2, 0.2 / 3.0**2], + [0.3 / 4.0**2, 0.4 / 5.0**2], + [0.5 / 6.0**2, 0.6 / 8.0**2], + ], + ), + ), + ( + 2, + DescriptorArray( + 'test', + [[1.0 / 2.0, 2.0 / 2.0], [3.0 / 2.0, 4.0 / 2.0], [5.0 / 2.0, 6.0 / 2.0]], + 'dimensionless', + [ + [0.1 / 2.0**2, 0.2 / 2.0**2], + [0.3 / 2.0**2, 0.4 / 2.0**2], + [0.5 / 2.0**2, 0.6 / 2.0**2], + ], + ), + ), ], - ids=["list", "number"]) - def test_division_dimensionless(self, descriptor_dimensionless: DescriptorArray, test, expected): + ids=['list', 'number'], + ) + def test_division_dimensionless( + self, descriptor_dimensionless: DescriptorArray, test, expected + ): # When Then result = descriptor_dimensionless / test # Expect @@ -838,73 +1090,128 @@ def test_division_dimensionless(self, descriptor_dimensionless: DescriptorArray, assert np.allclose(result.variance, expected.variance) assert descriptor_dimensionless.unit == 'dimensionless' - @pytest.mark.parametrize("test, expected, raises_warning", [ - (DescriptorNumber("test", 2, "m", 0.01), - DescriptorArray("test / name", - [[2.0, 1.0], [2.0/3.0, 0.5]], - "dimensionless", - [[0.41, 0.0525], - [(0.01 + 0.3 * 2**2 / 3.0**2) / 3.0**2, - (0.01 + 0.4 * 2**2 / 4.0**2) / 4.0**2]]), - True), - (DescriptorNumber("test", 1, "cm", 10), - DescriptorArray("test / name", - [[1.0/100.0, 1.0/200.0], [1.0/300.0, 1.0/400.0]], - "dimensionless", - [[1.01e-3, (1e-3 + 0.2 * 0.01**2/2**2) / 2**2], - [(1e-3 + 0.3 * 0.01**2/3**2) / 3**2,(1e-3 + 0.4 * 0.01**2 / 4**2) / 4**2]]), - True), - (DescriptorNumber("test", 1, "kg", 10), - DescriptorArray("test / name", - [[1.0, 0.5], [1.0/3.0, 0.25]], - "kg/m", - [[10.1, ( 10 + 0.2 * 1/2**2 ) / 2**2], - [( 10 + 0.3 * 1/3**2 ) / 3**2, ( 10 + 0.4 * 1/4**2 ) / 4**2 ]]), - True), - (DescriptorArray("test", - [[2.0, 3.0], [4.0, -5.0]], - "cm^2", - [[1.0, 2.0], [3.0, 4.0]]), - DescriptorArray("test / name", - [[2e-4, 1.5e-4], [4.0/3.0*1e-4, -1.25e-4]], - "m", - [[1.4e-8, 6.125e-9], - [( 3.0e-8 + 0.3 * (0.0004)**2 / 3**2 ) / 3**2, - ( 4.0e-8 + 0.4 * (0.0005)**2 / 4**2 ) / 4**2]]), - False), - (DescriptorArray("test", - [[2, 3], [4, -5]], - "cm^2"), - DescriptorArray("test / name", - [[2e-4, 1.5e-4], [4.0/3.0*1e-4, -1.25e-4]], - "m", - [[(0.1 * 2.0**2 / 1.0**2) / 1.0**2 * 1e-8, - (0.2 * 3.0**2 / 2.0**2) / 2.0**2 * 1e-8], - [(0.3 * 4.0**2 / 3.0**2) / 3.0**2 * 1e-8, - (0.4 * 5.0**2 / 4.0**2) / 4.0**2 * 1e-8]]), - False), - ([[2.0, 3.0], [4.0, -5.0]], - DescriptorArray("test / name", - [[2, 1.5], [4.0/3.0, -1.25]], - "1/m", - [[0.1 * 2**2 / 1**4, 0.2 * 3.0**2 / 2.0**4], - [0.3 * 4**2 / 3**4, 0.4 * 5.0**2 / 4.0**4]]), - False), - (2.0, - DescriptorArray("test / name", - [[2, 1.0], [2.0/3.0, 0.5]], - "1/m", - [[0.1 * 2**2 / 1**4, 0.2 * 2.0**2 / 2.0**4], - [0.3 * 2**2 / 3**4, 0.4 * 2.0**2 / 4.0**4]]), - False) + @pytest.mark.parametrize( + 'test, expected, raises_warning', + [ + ( + DescriptorNumber('test', 2, 'm', 0.01), + DescriptorArray( + 'test / name', + [[2.0, 1.0], [2.0 / 3.0, 0.5]], + 'dimensionless', + [ + [0.41, 0.0525], + [ + (0.01 + 0.3 * 2**2 / 3.0**2) / 3.0**2, + (0.01 + 0.4 * 2**2 / 4.0**2) / 4.0**2, + ], + ], + ), + True, + ), + ( + DescriptorNumber('test', 1, 'cm', 10), + DescriptorArray( + 'test / name', + [[1.0 / 100.0, 1.0 / 200.0], [1.0 / 300.0, 1.0 / 400.0]], + 'dimensionless', + [ + [1.01e-3, (1e-3 + 0.2 * 0.01**2 / 2**2) / 2**2], + [ + (1e-3 + 0.3 * 0.01**2 / 3**2) / 3**2, + (1e-3 + 0.4 * 0.01**2 / 4**2) / 4**2, + ], + ], + ), + True, + ), + ( + DescriptorNumber('test', 1, 'kg', 10), + DescriptorArray( + 'test / name', + [[1.0, 0.5], [1.0 / 3.0, 0.25]], + 'kg/m', + [ + [10.1, (10 + 0.2 * 1 / 2**2) / 2**2], + [(10 + 0.3 * 1 / 3**2) / 3**2, (10 + 0.4 * 1 / 4**2) / 4**2], + ], + ), + True, + ), + ( + DescriptorArray( + 'test', [[2.0, 3.0], [4.0, -5.0]], 'cm^2', [[1.0, 2.0], [3.0, 4.0]] + ), + DescriptorArray( + 'test / name', + [[2e-4, 1.5e-4], [4.0 / 3.0 * 1e-4, -1.25e-4]], + 'm', + [ + [1.4e-8, 6.125e-9], + [ + (3.0e-8 + 0.3 * (0.0004) ** 2 / 3**2) / 3**2, + (4.0e-8 + 0.4 * (0.0005) ** 2 / 4**2) / 4**2, + ], + ], + ), + False, + ), + ( + DescriptorArray('test', [[2, 3], [4, -5]], 'cm^2'), + DescriptorArray( + 'test / name', + [[2e-4, 1.5e-4], [4.0 / 3.0 * 1e-4, -1.25e-4]], + 'm', + [ + [ + (0.1 * 2.0**2 / 1.0**2) / 1.0**2 * 1e-8, + (0.2 * 3.0**2 / 2.0**2) / 2.0**2 * 1e-8, + ], + [ + (0.3 * 4.0**2 / 3.0**2) / 3.0**2 * 1e-8, + (0.4 * 5.0**2 / 4.0**2) / 4.0**2 * 1e-8, + ], + ], + ), + False, + ), + ( + [[2.0, 3.0], [4.0, -5.0]], + DescriptorArray( + 'test / name', + [[2, 1.5], [4.0 / 3.0, -1.25]], + '1/m', + [ + [0.1 * 2**2 / 1**4, 0.2 * 3.0**2 / 2.0**4], + [0.3 * 4**2 / 3**4, 0.4 * 5.0**2 / 4.0**4], + ], + ), + False, + ), + ( + 2.0, + DescriptorArray( + 'test / name', + [[2, 1.0], [2.0 / 3.0, 0.5]], + '1/m', + [ + [0.1 * 2**2 / 1**4, 0.2 * 2.0**2 / 2.0**4], + [0.3 * 2**2 / 3**4, 0.4 * 2.0**2 / 4.0**4], + ], + ), + False, + ), ], - ids=["descriptor_number_regular", - "descriptor_number_unit_conversion", - "descriptor_number_different_units", - "array_conversion", - "array_conversion_integer", - "list", - "number"]) + ids=[ + 'descriptor_number_regular', + 'descriptor_number_unit_conversion', + 'descriptor_number_different_units', + 'array_conversion', + 'array_conversion_integer', + 'list', + 'number', + ], + ) def test_reverse_division(self, descriptor: DescriptorArray, test, expected, raises_warning): # When Then if raises_warning: @@ -922,24 +1229,41 @@ def test_reverse_division(self, descriptor: DescriptorArray, test, expected, rai assert np.allclose(result.variance, expected.variance) assert descriptor.unit == 'm' - @pytest.mark.parametrize("test, expected", [ - ([[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], - DescriptorArray("test", - [[2.0/1.0, 3.0/2.0], [4.0/3.0, -5.0/4.0], [6.0/5.0, -8.0/6.0]], - "dimensionless", - [[0.1 * 2.0**2, 0.2 * 3.0**2 / 2**4], - [0.3 * 4.0**2 / 3.0**4, 0.4 * 5.0**2 / 4**4], - [0.5 * 6.0**2 / 5**4, 0.6 * 8.0**2 / 6**4]])), - (2, - DescriptorArray("test", - [[2.0, 1.0], [2.0/3.0, 0.5], [2.0/5.0, 1.0/3.0]], - "dimensionless", - [[0.1 * 2.0**2, 0.2 / 2**2], - [0.3 * 2**2 / 3**4, 0.4 * 2**2 / 4**4], - [0.5 * 2**2 / 5**4, 0.6 * 2**2 / 6**4]])) + @pytest.mark.parametrize( + 'test, expected', + [ + ( + [[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]], + DescriptorArray( + 'test', + [[2.0 / 1.0, 3.0 / 2.0], [4.0 / 3.0, -5.0 / 4.0], [6.0 / 5.0, -8.0 / 6.0]], + 'dimensionless', + [ + [0.1 * 2.0**2, 0.2 * 3.0**2 / 2**4], + [0.3 * 4.0**2 / 3.0**4, 0.4 * 5.0**2 / 4**4], + [0.5 * 6.0**2 / 5**4, 0.6 * 8.0**2 / 6**4], + ], + ), + ), + ( + 2, + DescriptorArray( + 'test', + [[2.0, 1.0], [2.0 / 3.0, 0.5], [2.0 / 5.0, 1.0 / 3.0]], + 'dimensionless', + [ + [0.1 * 2.0**2, 0.2 / 2**2], + [0.3 * 2**2 / 3**4, 0.4 * 2**2 / 4**4], + [0.5 * 2**2 / 5**4, 0.6 * 2**2 / 6**4], + ], + ), + ), ], - ids=["list", "number"]) - def test_reverse_division_dimensionless(self, descriptor_dimensionless: DescriptorArray, test, expected): + ids=['list', 'number'], + ) + def test_reverse_division_dimensionless( + self, descriptor_dimensionless: DescriptorArray, test, expected + ): # When Then result = test / descriptor_dimensionless # Expect @@ -947,60 +1271,87 @@ def test_reverse_division_dimensionless(self, descriptor_dimensionless: Descript assert np.allclose(result.value, expected.value) assert np.allclose(result.variance, expected.variance) assert descriptor_dimensionless.unit == 'dimensionless' - - @pytest.mark.parametrize("test", [ - [[2.0, 3.0], [4.0, -5.0], [6.0, 0.0]], - 0.0, - DescriptorNumber("test", 0, "cm", 10), - DescriptorArray("test", - [[1.5, 0.0], [4.5, 6.0], [7.5, 9.0]], - "dimensionless", - [[0.225, 0.45], [0.675, 0.9], [1.125, 1.35]])], - ids=["list", "number", "DescriptorNumber", "DescriptorArray"]) + + @pytest.mark.parametrize( + 'test', + [ + [[2.0, 3.0], [4.0, -5.0], [6.0, 0.0]], + 0.0, + DescriptorNumber('test', 0, 'cm', 10), + DescriptorArray( + 'test', + [[1.5, 0.0], [4.5, 6.0], [7.5, 9.0]], + 'dimensionless', + [[0.225, 0.45], [0.675, 0.9], [1.125, 1.35]], + ), + ], + ids=['list', 'number', 'DescriptorNumber', 'DescriptorArray'], + ) def test_division_exception(self, descriptor_dimensionless: DescriptorArray, test): # When Then with pytest.raises(ZeroDivisionError): descriptor_dimensionless / test - + # Also test reverse division where `self` is a DescriptorArray with a zero - zero_descriptor = DescriptorArray("test", - [[1.5, 0.0], [4.5, 6.0], [7.5, 0.0]], - "dimensionless", - [[0.225, 0.45], [0.675, 0.9], [1.125, 1.35]]) + zero_descriptor = DescriptorArray( + 'test', + [[1.5, 0.0], [4.5, 6.0], [7.5, 0.0]], + 'dimensionless', + [[0.225, 0.45], [0.675, 0.9], [1.125, 1.35]], + ) with pytest.raises(ZeroDivisionError): test / zero_descriptor - - @pytest.mark.parametrize("test, expected", [ - (DescriptorNumber("test", 2, "dimensionless"), - DescriptorArray("test ** name", - [[1.0, 4.0], [9.0, 16.0]], - "m^2", - [[4 * 0.1 * 1, 4 * 0.2 * 2**2], - [4 * 0.3 * 3**2, 4 * 0.4 * 4**2]])), - (DescriptorNumber("test", 3, "dimensionless"), - DescriptorArray("test ** name", - [[1.0, 8.0], [27, 64.0]], - "m^3", - [[9 * 0.1, 9 * 0.2 * 2**4], - [9 * 0.3 * 3**4, 9 * 0.4 * 4**4]])), - (DescriptorNumber("test", 0.0, "dimensionless"), - DescriptorArray("test ** name", - [[1.0, 1.0], [1.0, 1.0]], - "dimensionless", - [[0.0, 0.0], [0.0, 0.0]])), - (0.0, - DescriptorArray("test ** name", - [[1.0, 1.0], [1.0, 1.0]], - "dimensionless", - [[0.0, 0.0], [0.0, 0.0]])) - ], - ids=["descriptor_number_squared", - "descriptor_number_cubed", - "descriptor_number_zero", - "number_zero"]) + + @pytest.mark.parametrize( + 'test, expected', + [ + ( + DescriptorNumber('test', 2, 'dimensionless'), + DescriptorArray( + 'test ** name', + [[1.0, 4.0], [9.0, 16.0]], + 'm^2', + [[4 * 0.1 * 1, 4 * 0.2 * 2**2], [4 * 0.3 * 3**2, 4 * 0.4 * 4**2]], + ), + ), + ( + DescriptorNumber('test', 3, 'dimensionless'), + DescriptorArray( + 'test ** name', + [[1.0, 8.0], [27, 64.0]], + 'm^3', + [[9 * 0.1, 9 * 0.2 * 2**4], [9 * 0.3 * 3**4, 9 * 0.4 * 4**4]], + ), + ), + ( + DescriptorNumber('test', 0.0, 'dimensionless'), + DescriptorArray( + 'test ** name', + [[1.0, 1.0], [1.0, 1.0]], + 'dimensionless', + [[0.0, 0.0], [0.0, 0.0]], + ), + ), + ( + 0.0, + DescriptorArray( + 'test ** name', + [[1.0, 1.0], [1.0, 1.0]], + 'dimensionless', + [[0.0, 0.0], [0.0, 0.0]], + ), + ), + ], + ids=[ + 'descriptor_number_squared', + 'descriptor_number_cubed', + 'descriptor_number_zero', + 'number_zero', + ], + ) def test_power(self, descriptor: DescriptorArray, test, expected): # When Then - result = descriptor ** test + result = descriptor**test # Expect assert type(result) == DescriptorArray assert result.name == result.unique_name @@ -1009,24 +1360,37 @@ def test_power(self, descriptor: DescriptorArray, test, expected): assert np.allclose(result.variance, expected.variance) assert descriptor.unit == 'm' - @pytest.mark.parametrize("test, expected", [ - (DescriptorNumber("test", 0.1, "dimensionless"), - DescriptorArray("test ** name", - [[1, 2**0.1], [3**0.1, 4**0.1], [5**0.1, 6**0.1]], - "dimensionless", - [[0.1**2 * 0.1 * 1, 0.1**2 * 0.2 * 2**(-1.8)], - [0.1**2 * 0.3 * 3**(-1.8), 0.1**2 * 0.4 * 4**(-1.8)], - [0.1**2 * 0.5 * 5**(-1.8), 0.1**2 * 0.6 * 6**(-1.8)]])), - (DescriptorNumber("test", 2.0, "dimensionless"), - DescriptorArray("test ** name", - [[1.0, 4.0], [9.0, 16.0], [25.0, 36.0]], - "dimensionless", - [[0.4, 3.2], [10.8, 25.6], [50., 86.4]])), + @pytest.mark.parametrize( + 'test, expected', + [ + ( + DescriptorNumber('test', 0.1, 'dimensionless'), + DescriptorArray( + 'test ** name', + [[1, 2**0.1], [3**0.1, 4**0.1], [5**0.1, 6**0.1]], + 'dimensionless', + [ + [0.1**2 * 0.1 * 1, 0.1**2 * 0.2 * 2 ** (-1.8)], + [0.1**2 * 0.3 * 3 ** (-1.8), 0.1**2 * 0.4 * 4 ** (-1.8)], + [0.1**2 * 0.5 * 5 ** (-1.8), 0.1**2 * 0.6 * 6 ** (-1.8)], + ], + ), + ), + ( + DescriptorNumber('test', 2.0, 'dimensionless'), + DescriptorArray( + 'test ** name', + [[1.0, 4.0], [9.0, 16.0], [25.0, 36.0]], + 'dimensionless', + [[0.4, 3.2], [10.8, 25.6], [50.0, 86.4]], + ), + ), ], - ids=["descriptor_number_fractional", "descriptor_number_integer"]) + ids=['descriptor_number_fractional', 'descriptor_number_integer'], + ) def test_power_dimensionless(self, descriptor_dimensionless: DescriptorArray, test, expected): # When Then - result = descriptor_dimensionless ** test + result = descriptor_dimensionless**test # Expect assert type(result) == DescriptorArray assert result.name == result.unique_name @@ -1034,60 +1398,68 @@ def test_power_dimensionless(self, descriptor_dimensionless: DescriptorArray, te assert result.unit == expected.unit assert np.allclose(result.variance, expected.variance) assert descriptor_dimensionless.unit == 'dimensionless' - - @pytest.mark.parametrize("test, exception", [ - (DescriptorNumber("test", 2, "m"), UnitError), - (DescriptorNumber("test", 2, "dimensionless", 10), ValueError), - (DescriptorNumber("test", np.nan, "dimensionless"), UnitError), - (DescriptorNumber("test", np.nan, "dimensionless"), UnitError), - (DescriptorNumber("test", 1.5, "dimensionless"), UnitError), - (DescriptorNumber("test", 0.5, "dimensionless"), UnitError) # Square roots are not legal + + @pytest.mark.parametrize( + 'test, exception', + [ + (DescriptorNumber('test', 2, 'm'), UnitError), + (DescriptorNumber('test', 2, 'dimensionless', 10), ValueError), + (DescriptorNumber('test', np.nan, 'dimensionless'), UnitError), + (DescriptorNumber('test', np.nan, 'dimensionless'), UnitError), + (DescriptorNumber('test', 1.5, 'dimensionless'), UnitError), + ( + DescriptorNumber('test', 0.5, 'dimensionless'), + UnitError, + ), # Square roots are not legal + ], + ids=[ + 'units', + 'variance', + 'scipp_nan', + 'nan_result', + 'non_integer_exponent_on_units', + 'square_root_on_units', ], - ids=["units", - "variance", - "scipp_nan", - "nan_result", - "non_integer_exponent_on_units", - "square_root_on_units" - ]) + ) def test_power_exception(self, descriptor: DescriptorArray, test, exception): # When Then with pytest.raises(exception): - result = descriptor ** 2 ** test + result = descriptor**2**test with pytest.raises(ValueError): # Exponentiation with an array does not make sense - test ** descriptor + test**descriptor - @pytest.mark.parametrize("test", [ - DescriptorNumber("test", 2, "s"), - DescriptorArray("test", [[1, 2], [3, 4]], "s")], ids=["add_array_to_unit", "incompatible_units"]) + @pytest.mark.parametrize( + 'test', + [DescriptorNumber('test', 2, 's'), DescriptorArray('test', [[1, 2], [3, 4]], 's')], + ids=['add_array_to_unit', 'incompatible_units'], + ) def test_addition_exception(self, descriptor: DescriptorArray, test): # When Then Expect with pytest.raises(UnitError): result = descriptor + test with pytest.raises(UnitError): result_reverse = test + descriptor - - @pytest.mark.parametrize("test", [ - DescriptorNumber("test", 2, "s"), - DescriptorArray("test", [[1, 2], [3, 4]], "s")], ids=["add_array_to_unit", "incompatible_units"]) + + @pytest.mark.parametrize( + 'test', + [DescriptorNumber('test', 2, 's'), DescriptorArray('test', [[1, 2], [3, 4]], 's')], + ids=['add_array_to_unit', 'incompatible_units'], + ) def test_sub_exception(self, descriptor: DescriptorArray, test): # When Then Expect with pytest.raises(UnitError): result = descriptor - test with pytest.raises(UnitError): result_reverse = test - descriptor - - @pytest.mark.parametrize("function", [ - np.sin, - np.cos, - np.exp, - np.add, - np.multiply - ], - ids=["sin", "cos", "exp", "add", "multiply"]) + + @pytest.mark.parametrize( + 'function', + [np.sin, np.cos, np.exp, np.add, np.multiply], + ids=['sin', 'cos', 'exp', 'add', 'multiply'], + ) def test_numpy_ufuncs_exception(self, descriptor_dimensionless, function): - (np.add,np.array([[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]])), + ((np.add, np.array([[2.0, 3.0], [4.0, -5.0], [6.0, -8.0]])),) """ Not implemented ufuncs should return NotImplemented. """ @@ -1095,21 +1467,21 @@ def test_numpy_ufuncs_exception(self, descriptor_dimensionless, function): with pytest.raises(TypeError) as e: function(descriptor_dimensionless, test) assert 'returned NotImplemented from' in str(e) - + def test_negation(self, descriptor): - # When + # When # Then result = -descriptor # Expect expected = DescriptorArray( - name="name", - value=[[-1., -2.], [-3., -4.]], - unit="m", + name='name', + value=[[-1.0, -2.0], [-3.0, -4.0]], + unit='m', variance=[[0.1, 0.2], [0.3, 0.4]], - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) assert type(result) == DescriptorArray @@ -1120,15 +1492,15 @@ def test_negation(self, descriptor): assert descriptor.unit == 'm' def test_abs(self, descriptor): - # When + # When negated = DescriptorArray( - name="name", - value=[[-1., -2.], [-3., -4.]], - unit="m", + name='name', + value=[[-1.0, -2.0], [-3.0, -4.0]], + unit='m', variance=[[0.1, 0.2], [0.3, 0.4]], - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) @@ -1143,25 +1515,49 @@ def test_abs(self, descriptor): assert np.allclose(result.variance, descriptor.variance) assert descriptor.unit == 'm' - @pytest.mark.parametrize("test, expected", [ - (DescriptorArray("test + name", - [[3.0, 4.0], [5.0, 6.0]], - "m", - [[0.11, 0.21], [0.31, 0.41]]), - DescriptorNumber("test", 9, "m", 0.52)), - (DescriptorArray("test + name", - [[101.0, 201.0], [301.0, 401.0]], - "dimensionless", - [[1010.0, 2010.0], [3010.0, 4010.0]]), - DescriptorNumber("test", 502.0, "dimensionless", 5020.0)), - (DescriptorArray("test", np.ones((9, 9)), "dimensionless", np.ones((9, 9))), - DescriptorNumber("test", 9.0, "dimensionless", 9.0)), - (DescriptorArray("test", np.ones((3, 3, 3)), "dimensionless", np.ones((3, 3, 3))), - DescriptorArray("test", [3., 3., 3.], "dimensionless", [3., 3., 3.,], dimensions=['dim2'])), - (DescriptorArray("test", [[2.0]], "dimensionless"), - DescriptorNumber("test", 2.0, "dimensionless")) - ], - ids=["2d_unit", "2d_dimensionless", "2d_large", "3d_dimensionless", "1d_dimensionless"]) + @pytest.mark.parametrize( + 'test, expected', + [ + ( + DescriptorArray( + 'test + name', [[3.0, 4.0], [5.0, 6.0]], 'm', [[0.11, 0.21], [0.31, 0.41]] + ), + DescriptorNumber('test', 9, 'm', 0.52), + ), + ( + DescriptorArray( + 'test + name', + [[101.0, 201.0], [301.0, 401.0]], + 'dimensionless', + [[1010.0, 2010.0], [3010.0, 4010.0]], + ), + DescriptorNumber('test', 502.0, 'dimensionless', 5020.0), + ), + ( + DescriptorArray('test', np.ones((9, 9)), 'dimensionless', np.ones((9, 9))), + DescriptorNumber('test', 9.0, 'dimensionless', 9.0), + ), + ( + DescriptorArray('test', np.ones((3, 3, 3)), 'dimensionless', np.ones((3, 3, 3))), + DescriptorArray( + 'test', + [3.0, 3.0, 3.0], + 'dimensionless', + [ + 3.0, + 3.0, + 3.0, + ], + dimensions=['dim2'], + ), + ), + ( + DescriptorArray('test', [[2.0]], 'dimensionless'), + DescriptorNumber('test', 2.0, 'dimensionless'), + ), + ], + ids=['2d_unit', '2d_dimensionless', '2d_large', '3d_dimensionless', '1d_dimensionless'], + ) def test_trace(self, test: DescriptorArray, expected: DescriptorNumber): result = test.trace() assert type(result) == type(expected) @@ -1172,14 +1568,29 @@ def test_trace(self, test: DescriptorArray, expected: DescriptorNumber): assert np.allclose(result.variance, expected.variance) if isinstance(expected, DescriptorArray): assert np.all(result.full_value.dims == expected.full_value.dims) - - @pytest.mark.parametrize("test, expected, dimensions", [ - (DescriptorArray("test", np.ones((3, 3, 4, 5)), "dimensionless", np.ones((3, 3, 4, 5))), - DescriptorArray("test", 3*np.ones((3, 4)), "dimensionless", 3*np.ones((3, 4)), dimensions=['dim0', 'dim2']), - ('dim1', 'dim3')) - ], - ids=["4d"]) - def test_trace_select_dimensions(self, test: DescriptorArray, expected: DescriptorNumber, dimensions): + + @pytest.mark.parametrize( + 'test, expected, dimensions', + [ + ( + DescriptorArray( + 'test', np.ones((3, 3, 4, 5)), 'dimensionless', np.ones((3, 3, 4, 5)) + ), + DescriptorArray( + 'test', + 3 * np.ones((3, 4)), + 'dimensionless', + 3 * np.ones((3, 4)), + dimensions=['dim0', 'dim2'], + ), + ('dim1', 'dim3'), + ) + ], + ids=['4d'], + ) + def test_trace_select_dimensions( + self, test: DescriptorArray, expected: DescriptorNumber, dimensions + ): result = test.trace(dimension1=dimensions[0], dimension2=dimensions[1]) assert type(result) == type(expected) assert result.name == result.unique_name @@ -1187,27 +1598,33 @@ def test_trace_select_dimensions(self, test: DescriptorArray, expected: Descript assert np.array_equal(result.value, expected.value) assert result.unit == expected.unit assert np.all(result.full_value.dims == expected.full_value.dims) - - @pytest.mark.parametrize("test,dimensions,message", [ - (DescriptorArray("test", np.ones((3, 3, 3)), "dimensionless", np.ones((3, 3, 3))), - ('dim0', None), - "Either both or none" - ), - (DescriptorArray("test", np.ones((3, 3, 3)), "dimensionless", np.ones((3, 3, 3))), - ('dim0', 'dim0'), - "must be different" - ), - (DescriptorArray("test", np.ones((3, 3, 3)), "dimensionless", np.ones((3, 3, 3))), - ('dim0', 'dim1337'), - "does not exist" - ), - ], - ids=["one_defined_dimension", "same_dimension", "invalid_dimension"]) + + @pytest.mark.parametrize( + 'test,dimensions,message', + [ + ( + DescriptorArray('test', np.ones((3, 3, 3)), 'dimensionless', np.ones((3, 3, 3))), + ('dim0', None), + 'Either both or none', + ), + ( + DescriptorArray('test', np.ones((3, 3, 3)), 'dimensionless', np.ones((3, 3, 3))), + ('dim0', 'dim0'), + 'must be different', + ), + ( + DescriptorArray('test', np.ones((3, 3, 3)), 'dimensionless', np.ones((3, 3, 3))), + ('dim0', 'dim1337'), + 'does not exist', + ), + ], + ids=['one_defined_dimension', 'same_dimension', 'invalid_dimension'], + ) def test_trace_exception(self, test: DescriptorArray, dimensions, message): with pytest.raises(ValueError) as e: test.trace(dimension1=dimensions[0], dimension2=dimensions[1]) assert message in str(e) - + def test_slicing(self, descriptor: DescriptorArray): # When first_value = descriptor['dim0', 0] @@ -1222,57 +1639,77 @@ def test_slicing(self, descriptor: DescriptorArray): assert first_value.name != descriptor.unique_name assert last_value.name != descriptor.unique_name assert second_array.name != descriptor.unique_name - - assert np.array_equal(first_value.full_value.values, descriptor.full_value['dim0', 0].values) - assert np.array_equal(last_value.full_value.values, descriptor.full_value['dim0', -1].values) - assert np.array_equal(second_array.full_value.values, descriptor.full_value['dim1', :].values) - - assert np.array_equal(first_value.full_value.variances, descriptor.full_value['dim0', 0].variances) - assert np.array_equal(last_value.full_value.variances, descriptor.full_value['dim0', -1].variances) - assert np.array_equal(second_array.full_value.variances, descriptor.full_value['dim1', :].variances) + + assert np.array_equal( + first_value.full_value.values, descriptor.full_value['dim0', 0].values + ) + assert np.array_equal( + last_value.full_value.values, descriptor.full_value['dim0', -1].values + ) + assert np.array_equal( + second_array.full_value.values, descriptor.full_value['dim1', :].values + ) + + assert np.array_equal( + first_value.full_value.variances, descriptor.full_value['dim0', 0].variances + ) + assert np.array_equal( + last_value.full_value.variances, descriptor.full_value['dim0', -1].variances + ) + assert np.array_equal( + second_array.full_value.variances, descriptor.full_value['dim1', :].variances + ) assert np.array_equal(first_value.full_value.unit, descriptor.unit) assert np.array_equal(last_value.full_value.unit, descriptor.unit) assert np.array_equal(second_array.full_value.unit, descriptor.unit) - + def test_slice_deletion(self, descriptor: DescriptorArray): with pytest.raises(AttributeError) as e: del descriptor['dim0', 0] assert 'has no attribute' in str(e) - - @pytest.mark.parametrize("test", [ - 1.0, - [3.0, 4.0, 5.0] - ], - ids=["number", "list"]) + + @pytest.mark.parametrize('test', [1.0, [3.0, 4.0, 5.0]], ids=['number', 'list']) def test_slice_assignment_exception(self, descriptor_dimensionless: DescriptorArray, test): # When with pytest.raises(AttributeError) as e: descriptor_dimensionless['dim0', :] = test - assert "cannot be edited via slicing" in str(e) - - @pytest.mark.parametrize("test, expected", [ - (DescriptorArray("test + name", - [[3.0, 4.0], [5.0, 6.0]], - "m", - [[0.11, 0.21], [0.31, 0.41]]), - DescriptorNumber("test", 18, "m", 1.04)), - (DescriptorArray("test + name", - [[101.0, 201.0], [301.0, 401.0]], - "cm", - [[1010.0, 2010.0], [3010.0, 4010.0]]), - DescriptorNumber("test", 1004.0, "cm", 10040.)), - (DescriptorArray("test", - [[2.0, 3.0]], - "dimensionless", - [[1.0, 2.0]]), - DescriptorNumber("test", 5.0, "dimensionless", 3.0)), - (DescriptorArray("test", - [[2.0, 3.0]], - "dimensionless"), - DescriptorNumber("test", 5.0, "dimensionless")), - ], - ids=["descriptor_array_m", "d=descriptor_array_cm", "descriptor_array_dimensionless", "descriptor_array_dim_varless"]) + assert 'cannot be edited via slicing' in str(e) + + @pytest.mark.parametrize( + 'test, expected', + [ + ( + DescriptorArray( + 'test + name', [[3.0, 4.0], [5.0, 6.0]], 'm', [[0.11, 0.21], [0.31, 0.41]] + ), + DescriptorNumber('test', 18, 'm', 1.04), + ), + ( + DescriptorArray( + 'test + name', + [[101.0, 201.0], [301.0, 401.0]], + 'cm', + [[1010.0, 2010.0], [3010.0, 4010.0]], + ), + DescriptorNumber('test', 1004.0, 'cm', 10040.0), + ), + ( + DescriptorArray('test', [[2.0, 3.0]], 'dimensionless', [[1.0, 2.0]]), + DescriptorNumber('test', 5.0, 'dimensionless', 3.0), + ), + ( + DescriptorArray('test', [[2.0, 3.0]], 'dimensionless'), + DescriptorNumber('test', 5.0, 'dimensionless'), + ), + ], + ids=[ + 'descriptor_array_m', + 'd=descriptor_array_cm', + 'descriptor_array_dimensionless', + 'descriptor_array_dim_varless', + ], + ) def test_sum(self, test, expected): result = test.sum() assert type(result) == DescriptorNumber @@ -1282,19 +1719,14 @@ def test_sum(self, test, expected): if test.variance is not None: assert np.allclose(result.variance, expected.variance) - @pytest.mark.parametrize("expected, dim", [ - (DescriptorArray("test", - [4.0, 6.0], - "m", - [0.4, 0.6]), - 'dim0'), - (DescriptorArray("test", - [3.0, 7.0], - "m", - [0.3, 0.7]), - 'dim1'), - ], - ids=["descriptor_array_dim0", "descriptor_array_dim1"]) + @pytest.mark.parametrize( + 'expected, dim', + [ + (DescriptorArray('test', [4.0, 6.0], 'm', [0.4, 0.6]), 'dim0'), + (DescriptorArray('test', [3.0, 7.0], 'm', [0.3, 0.7]), 'dim1'), + ], + ids=['descriptor_array_dim0', 'descriptor_array_dim1'], + ) def test_sum_over_subset(self, descriptor, expected, dim): result = descriptor.sum(dim) assert type(result) == type(expected) @@ -1303,24 +1735,44 @@ def test_sum_over_subset(self, descriptor, expected, dim): assert result.unit == expected.unit assert np.allclose(result.variance, expected.variance) - @pytest.mark.parametrize("test, dimensions", [ - (DescriptorArray("test", [1.], "dimensionless", [1.]), ['dim0']), - (DescriptorArray("test", [[1., 1.]], "dimensionless", [[1., 1.]]), ['dim0', 'dim1']), - (DescriptorArray("test", [[1.], [1.]], "dimensionless", [[1.], [1.]]), ['dim0', 'dim1']), - (DescriptorArray("test", [[[1., 1., 1.]]], "dimensionless", [[[1., 1., 1.]]]), ['dim0', 'dim1', 'dim2']), - (DescriptorArray("test", [[[1.]], [[1.]], [[1.]]], "dimensionless", [[[1.]], [[1.]], [[1.]]]), ['dim0', 'dim1', 'dim2']), + @pytest.mark.parametrize( + 'test, dimensions', + [ + (DescriptorArray('test', [1.0], 'dimensionless', [1.0]), ['dim0']), + ( + DescriptorArray('test', [[1.0, 1.0]], 'dimensionless', [[1.0, 1.0]]), + ['dim0', 'dim1'], + ), + ( + DescriptorArray('test', [[1.0], [1.0]], 'dimensionless', [[1.0], [1.0]]), + ['dim0', 'dim1'], + ), + ( + DescriptorArray('test', [[[1.0, 1.0, 1.0]]], 'dimensionless', [[[1.0, 1.0, 1.0]]]), + ['dim0', 'dim1', 'dim2'], + ), + ( + DescriptorArray( + 'test', + [[[1.0]], [[1.0]], [[1.0]]], + 'dimensionless', + [[[1.0]], [[1.0]], [[1.0]]], + ), + ['dim0', 'dim1', 'dim2'], + ), ], - ids=["1x1", "1x2", "2x1", "1x3", "3x1"]) + ids=['1x1', '1x2', '2x1', '1x3', '3x1'], + ) def test_array_generate_dimensions(self, test, dimensions): assert test.dimensions == dimensions def test_array_set_dimensions_exception(self, descriptor): with pytest.raises(ValueError) as e: descriptor.dimensions = ['too_few'] - assert "must have the same shape" + assert 'must have the same shape' with pytest.raises(ValueError) as e: - DescriptorArray("test", [[1.]], "m", [[1.]], dimensions=['dim']) - assert "Length of dimensions" in str(e) + DescriptorArray('test', [[1.0]], 'm', [[1.0]], dimensions=['dim']) + assert 'Length of dimensions' in str(e) def test_array_set_integer_value(self, descriptor): """ @@ -1336,7 +1788,7 @@ def test_array_set_integer_variance(self, descriptor): descriptor.variance = [[1, 2], [3, 4]] # Then Expect assert isinstance(descriptor.variance[0][0], float) - + def test_array_create_with_mixed_integers_and_floats(self): # When value = [[1, 2], [3, 4]] @@ -1345,7 +1797,7 @@ def test_array_create_with_mixed_integers_and_floats(self): descriptor = DescriptorArray('test', value, 'dimensionless', variance) # Should not raise assert isinstance(descriptor.value[0][0], float) assert isinstance(descriptor.variance[0][0], float) - + def test_array_set_dims(self, descriptor): # When descriptor.dimensions = ['x', 'y'] diff --git a/tests/unit/variable/test_descriptor_base.py b/tests/unit/variable/test_descriptor_base.py index aeeb823e..58d08aed 100644 --- a/tests/unit/variable/test_descriptor_base.py +++ b/tests/unit/variable/test_descriptor_base.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + import pytest from easyscience import global_object @@ -9,13 +12,13 @@ class TestDesciptorBase: def descriptor(self): # This avoids the error: TypeError: Can't instantiate abstract class DescriptorBase with abstract methods __init__ DescriptorBase.__abstractmethods__ = set() - DescriptorBase.__repr__ = lambda x: "DescriptorBase" + DescriptorBase.__repr__ = lambda x: 'DescriptorBase' self.objs_before_new_descriptor = len(global_object.map.created_objs) descriptor = DescriptorBase( - name="name", - description="description", - url="url", - display_name="display_name", + name='name', + description='description', + url='url', + display_name='display_name', parent=None, ) return descriptor @@ -24,55 +27,98 @@ def descriptor(self): def clear(self): global_object.map._clear() - @pytest.mark.parametrize("name", [1, True, 1.0, [], {}, (), None, object()], ids=["int", "bool", "float", "list", "dict", "tuple", "None", "object"]) + @pytest.mark.parametrize( + 'name', + [1, True, 1.0, [], {}, (), None, object()], + ids=['int', 'bool', 'float', 'list', 'dict', 'tuple', 'None', 'object'], + ) def test_init_name_type_error(self, name): # When Then with pytest.raises(TypeError): - DescriptorBase(name=name, description="description", url="url", display_name="display_name", parent=None) - - @pytest.mark.parametrize("display_name", [1, True, 1.0, [], {}, (), object()], ids=["int", "bool", "float", "list", "dict", "tuple", "object"]) + DescriptorBase( + name=name, + description='description', + url='url', + display_name='display_name', + parent=None, + ) + + @pytest.mark.parametrize( + 'display_name', + [1, True, 1.0, [], {}, (), object()], + ids=['int', 'bool', 'float', 'list', 'dict', 'tuple', 'object'], + ) def test_init_display_name_type_error(self, display_name): # When Then with pytest.raises(TypeError): - DescriptorBase(name="name", description="description", url="url", display_name=display_name, parent=None) - - @pytest.mark.parametrize("description", [1, True, 1.0, [], {}, (), object()], ids=["int", "bool", "float", "list", "dict", "tuple", "object"]) + DescriptorBase( + name='name', + description='description', + url='url', + display_name=display_name, + parent=None, + ) + + @pytest.mark.parametrize( + 'description', + [1, True, 1.0, [], {}, (), object()], + ids=['int', 'bool', 'float', 'list', 'dict', 'tuple', 'object'], + ) def test_init_description_type_error(self, description): # When Then with pytest.raises(TypeError): - DescriptorBase(name="name", description=description, url="url", display_name="display_name", parent=None) - - @pytest.mark.parametrize("url", [1, True, 1.0, [], {}, (), object()], ids=["int", "bool", "float", "list", "dict", "tuple", "object"]) + DescriptorBase( + name='name', + description=description, + url='url', + display_name='display_name', + parent=None, + ) + + @pytest.mark.parametrize( + 'url', + [1, True, 1.0, [], {}, (), object()], + ids=['int', 'bool', 'float', 'list', 'dict', 'tuple', 'object'], + ) def test_init_url_type_error(self, url): # When Then with pytest.raises(TypeError): - DescriptorBase(name="name", description="description", url=url, display_name="display_name", parent=None) + DescriptorBase( + name='name', + description='description', + url=url, + display_name='display_name', + parent=None, + ) def test_init(self, descriptor: DescriptorBase): - assert descriptor._name == "name" - assert descriptor._description == "description" - assert descriptor._url == "url" - assert descriptor._display_name == "display_name" + assert descriptor._name == 'name' + assert descriptor._description == 'description' + assert descriptor._url == 'url' + assert descriptor._display_name == 'display_name' assert len(global_object.map.created_objs) - self.objs_before_new_descriptor == 1 - def test_display_name(self, descriptor: DescriptorBase): # When Then Expect - assert descriptor.display_name == "display_name" + assert descriptor.display_name == 'display_name' def test_display_name_none(self, descriptor: DescriptorBase): - # When + # When descriptor._display_name = None # Then Expect - assert descriptor.display_name == "name" - + assert descriptor.display_name == 'name' + def test_display_name_setter(self, descriptor: DescriptorBase): # When - descriptor.display_name = "new_display_name" + descriptor.display_name = 'new_display_name' # Then Expect - assert descriptor.display_name == "new_display_name" + assert descriptor.display_name == 'new_display_name' - @pytest.mark.parametrize("display_name", [1, True, 1.0, [], {}, (), object()], ids=["int", "bool", "float", "list", "dict", "tuple", "object"]) + @pytest.mark.parametrize( + 'display_name', + [1, True, 1.0, [], {}, (), object()], + ids=['int', 'bool', 'float', 'list', 'dict', 'tuple', 'object'], + ) def test_display_name_setter_type_error(self, descriptor: DescriptorBase, display_name): # When Then with pytest.raises(TypeError): @@ -80,11 +126,15 @@ def test_display_name_setter_type_error(self, descriptor: DescriptorBase, displa def test_name_setter(self, descriptor: DescriptorBase): # When - descriptor.name = "new_name" + descriptor.name = 'new_name' # Then Expect - assert descriptor.name == "new_name" + assert descriptor.name == 'new_name' - @pytest.mark.parametrize("name", [1, True, 1.0, [], {}, (), object(), None], ids=["int", "bool", "float", "list", "dict", "tuple", "object", "None"]) + @pytest.mark.parametrize( + 'name', + [1, True, 1.0, [], {}, (), object(), None], + ids=['int', 'bool', 'float', 'list', 'dict', 'tuple', 'object', 'None'], + ) def test_name_setter_type_error(self, descriptor: DescriptorBase, name): # When Then with pytest.raises(TypeError): @@ -92,11 +142,15 @@ def test_name_setter_type_error(self, descriptor: DescriptorBase, name): def test_description_setter(self, descriptor: DescriptorBase): # When - descriptor.description = "new_description" + descriptor.description = 'new_description' # Then Expect - assert descriptor.description == "new_description" + assert descriptor.description == 'new_description' - @pytest.mark.parametrize("description", [1, True, 1.0, [], {}, (), object()], ids=["int", "bool", "float", "list", "dict", "tuple", "object"]) + @pytest.mark.parametrize( + 'description', + [1, True, 1.0, [], {}, (), object()], + ids=['int', 'bool', 'float', 'list', 'dict', 'tuple', 'object'], + ) def test_description_setter_type_error(self, descriptor: DescriptorBase, description): # When Then with pytest.raises(TypeError): @@ -104,30 +158,35 @@ def test_description_setter_type_error(self, descriptor: DescriptorBase, descrip def test_url_setter(self, descriptor: DescriptorBase): # When - descriptor.url = "new_url" + descriptor.url = 'new_url' # Then Expect - assert descriptor.url == "new_url" + assert descriptor.url == 'new_url' - @pytest.mark.parametrize("url", [1, True, 1.0, [], {}, (), object()], ids=["int", "bool", "float", "list", "dict", "tuple", "object"]) + @pytest.mark.parametrize( + 'url', + [1, True, 1.0, [], {}, (), object()], + ids=['int', 'bool', 'float', 'list', 'dict', 'tuple', 'object'], + ) def test_url_setter_type_error(self, descriptor: DescriptorBase, url): # When Then with pytest.raises(TypeError): descriptor.url = url - - @pytest.mark.parametrize("stack_enabled,stack_elements", [(False, 0), (True, 1)]) - def test_set_display_name_without_global_object_stack(self, descriptor: DescriptorBase, stack_enabled, stack_elements): + @pytest.mark.parametrize('stack_enabled,stack_elements', [(False, 0), (True, 1)]) + def test_set_display_name_without_global_object_stack( + self, descriptor: DescriptorBase, stack_enabled, stack_elements + ): # When - descriptor.__repr__ = lambda x: "DescriptorBase" + descriptor.__repr__ = lambda x: 'DescriptorBase' global_object.stack.clear() global_object.stack._enabled = stack_enabled - # Then - descriptor.display_name = "new_display_name" + # Then + descriptor.display_name = 'new_display_name' # Expect - assert descriptor.display_name == "new_display_name" - assert len(global_object.stack.history) == stack_elements + assert descriptor.display_name == 'new_display_name' + assert len(global_object.stack.history) == stack_elements def test_copy(self, descriptor: DescriptorBase): # When Then @@ -142,25 +201,25 @@ def test_copy(self, descriptor: DescriptorBase): def test_unique_name_generator(self, clear, descriptor: DescriptorBase): # When - second_descriptor = DescriptorBase(name="test", unique_name="DescriptorBase_2") + second_descriptor = DescriptorBase(name='test', unique_name='DescriptorBase_2') + + # Then + third_descriptor = DescriptorBase(name='test2') + fourth_descriptor = DescriptorBase(name='test3') - # Then - third_descriptor = DescriptorBase(name="test2") - fourth_descriptor = DescriptorBase(name="test3") - # Expect - assert descriptor.unique_name == "DescriptorBase_0" - assert third_descriptor.unique_name == "DescriptorBase_3" - assert fourth_descriptor.unique_name == "DescriptorBase_4" + assert descriptor.unique_name == 'DescriptorBase_0' + assert third_descriptor.unique_name == 'DescriptorBase_3' + assert fourth_descriptor.unique_name == 'DescriptorBase_4' def test_unique_name_change(self, clear, descriptor: DescriptorBase): # When Then - descriptor.unique_name = "test" + descriptor.unique_name = 'test' # Expect - assert descriptor.unique_name == "test" + assert descriptor.unique_name == 'test' - @pytest.mark.parametrize("input", [2, 2.0, [2], {2}, None]) + @pytest.mark.parametrize('input', [2, 2.0, [2], {2}, None]) def test_unique_name_change_exception(self, input, descriptor: DescriptorBase): # When Then Expect with pytest.raises(TypeError): - descriptor.unique_name = input \ No newline at end of file + descriptor.unique_name = input diff --git a/tests/unit/variable/test_descriptor_bool.py b/tests/unit/variable/test_descriptor_bool.py index 4be20657..80d9513b 100644 --- a/tests/unit/variable/test_descriptor_bool.py +++ b/tests/unit/variable/test_descriptor_bool.py @@ -1,21 +1,25 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + import pytest -from easyscience.variable import DescriptorBool from easyscience import global_object +from easyscience.variable import DescriptorBool + class TestDescriptorBool: @pytest.fixture def descriptor(self): descriptor = DescriptorBool( - name="name", + name='name', value=True, - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) return descriptor - + @pytest.fixture def clear(self): global_object.map._clear() @@ -25,22 +29,22 @@ def test_init(self, descriptor: DescriptorBool): assert descriptor._bool_value == True # From super - assert descriptor._name == "name" - assert descriptor._description == "description" - assert descriptor._url == "url" - assert descriptor._display_name == "display_name" + assert descriptor._name == 'name' + assert descriptor._description == 'description' + assert descriptor._url == 'url' + assert descriptor._display_name == 'display_name' - @pytest.mark.parametrize("bool_value", ["string", 0, 1.0]) + @pytest.mark.parametrize('bool_value', ['string', 0, 1.0]) def test_init_bool_value_type_exception(self, bool_value): # When Then Expect with pytest.raises(ValueError): DescriptorBool( - name="name", + name='name', value=bool_value, - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) @@ -55,7 +59,7 @@ def test_set_value(self, descriptor: DescriptorBool): # Expect assert descriptor._bool_value == False - @pytest.mark.parametrize("bool_value", ["string", 0, 0.0]) + @pytest.mark.parametrize('bool_value', ['string', 0, 0.0]) def test_set_value_type_exception(self, descriptor: DescriptorBool, bool_value): # When Then Expect with pytest.raises(TypeError): @@ -74,4 +78,4 @@ def test_copy(self, descriptor: DescriptorBool): # Expect assert type(descriptor_copy) == DescriptorBool - assert descriptor_copy._bool_value == descriptor._bool_value \ No newline at end of file + assert descriptor_copy._bool_value == descriptor._bool_value diff --git a/tests/unit/variable/test_descriptor_number.py b/tests/unit/variable/test_descriptor_number.py index 5dc4e060..0561052d 100644 --- a/tests/unit/variable/test_descriptor_number.py +++ b/tests/unit/variable/test_descriptor_number.py @@ -1,22 +1,26 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + + import pytest -from unittest.mock import MagicMock import scipp as sc from scipp import UnitError from easyscience import DescriptorNumber from easyscience import global_object + class TestDescriptorNumber: @pytest.fixture def descriptor(self): descriptor = DescriptorNumber( - name="name", + name='name', value=1, - unit="m", + unit='m', variance=0.1, - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) return descriptor @@ -28,79 +32,79 @@ def clear(self): def test_init(self, descriptor: DescriptorNumber): # When Then Expect assert descriptor._scalar.value == 1 - assert descriptor._scalar.unit == "m" + assert descriptor._scalar.unit == 'm' assert descriptor._scalar.variance == 0.1 assert descriptor._observers == [] # From super - assert descriptor._name == "name" - assert descriptor._description == "description" - assert descriptor._url == "url" - assert descriptor._display_name == "display_name" + assert descriptor._name == 'name' + assert descriptor._description == 'description' + assert descriptor._url == 'url' + assert descriptor._display_name == 'display_name' def test_init_sc_unit(self): # When Then descriptor = DescriptorNumber( - name="name", + name='name', value=1, - unit=sc.units.Unit("m"), + unit=sc.units.Unit('m'), variance=0.1, - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) # Expect assert descriptor._scalar.value == 1 - assert descriptor._scalar.unit == "m" + assert descriptor._scalar.unit == 'm' assert descriptor._scalar.variance == 0.1 def test_init_sc_unit_unknown(self): # When Then Expect with pytest.raises(UnitError): DescriptorNumber( - name="name", + name='name', value=1, - unit="unknown", + unit='unknown', variance=0.1, - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) - @pytest.mark.parametrize("value", [True, "string"]) + @pytest.mark.parametrize('value', [True, 'string']) def test_init_value_type_exception(self, value): - # When + # When # Then Expect with pytest.raises(TypeError): DescriptorNumber( - name="name", + name='name', value=value, - unit="m", + unit='m', variance=0.1, - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) def test_init_variance_exception(self): - # When + # When variance = -1 # Then Expect with pytest.raises(ValueError): DescriptorNumber( - name="name", + name='name', value=1, - unit="m", + unit='m', variance=variance, - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) @@ -110,23 +114,33 @@ def test_from_scipp(self): full_value = sc.scalar(1, unit='m') # Then - descriptor = DescriptorNumber.from_scipp(name="name", full_value=full_value) + descriptor = DescriptorNumber.from_scipp(name='name', full_value=full_value) # Expect assert descriptor._scalar.value == 1 - assert descriptor._scalar.unit == "m" + assert descriptor._scalar.unit == 'm' assert descriptor._scalar.variance == None - @pytest.mark.parametrize("full_value", [sc.array(values=[1,2], dims=["x"]), sc.array(values=[[1], [2]], dims=["x","y"]), object(), 1, "string"], ids=["1D", "2D", "object", "int", "string"]) + @pytest.mark.parametrize( + 'full_value', + [ + sc.array(values=[1, 2], dims=['x']), + sc.array(values=[[1], [2]], dims=['x', 'y']), + object(), + 1, + 'string', + ], + ids=['1D', '2D', 'object', 'int', 'string'], + ) def test_from_scipp_type_exception(self, full_value): # When Then Expect with pytest.raises(TypeError): - DescriptorNumber.from_scipp(name="name", full_value=full_value) + DescriptorNumber.from_scipp(name='name', full_value=full_value) def test_full_value(self, descriptor: DescriptorNumber): # When Then Expect assert descriptor.full_value == sc.scalar(1, unit='m') - + def test_set_full_value(self, descriptor: DescriptorNumber): with pytest.raises(AttributeError): descriptor.full_value = sc.scalar(2, unit='s') @@ -134,7 +148,7 @@ def test_set_full_value(self, descriptor: DescriptorNumber): def test_unit(self, descriptor: DescriptorNumber): # When Then Expect assert descriptor.unit == 'm' - + def test_set_unit(self, descriptor: DescriptorNumber): with pytest.raises(AttributeError): descriptor.unit = 's' @@ -151,7 +165,7 @@ def test_convert_unit(self, descriptor: DescriptorNumber): def test_variance(self, descriptor: DescriptorNumber): # When Then Expect assert descriptor.variance == 0.1 - + def test_set_variance(self, descriptor: DescriptorNumber): # When Then descriptor.variance = 0.2 @@ -163,7 +177,7 @@ def test_set_variance(self, descriptor: DescriptorNumber): def test_error(self, descriptor: DescriptorNumber): # When Then Expect assert descriptor.error == 0.31622776601683794 - + def test_set_error(self, descriptor: DescriptorNumber): # When Then descriptor.error = 0.31622776601683794 @@ -172,7 +186,6 @@ def test_set_error(self, descriptor: DescriptorNumber): assert descriptor.error == 0.31622776601683794 assert descriptor.variance == 0.1 - def test_value(self, descriptor: DescriptorNumber): # When Then Expect assert descriptor.value == 1 @@ -189,7 +202,7 @@ def test_repr(self, descriptor: DescriptorNumber): repr_str = str(descriptor) # Expect - assert repr_str == "" + assert repr_str == "" def test_copy(self, descriptor: DescriptorNumber): # When Then @@ -200,14 +213,14 @@ def test_copy(self, descriptor: DescriptorNumber): assert descriptor_copy._scalar.value == descriptor._scalar.value assert descriptor_copy._scalar.unit == descriptor._scalar.unit - @pytest.mark.parametrize("unit_string, expected", [ - ("1e+9", "dimensionless"), - ("1000", "dimensionless"), - ("10dm^2", "m^2")], - ids=["scientific_notation", "numbers", "unit_prefix"]) + @pytest.mark.parametrize( + 'unit_string, expected', + [('1e+9', 'dimensionless'), ('1000', 'dimensionless'), ('10dm^2', 'm^2')], + ids=['scientific_notation', 'numbers', 'unit_prefix'], + ) def test_base_unit(self, unit_string, expected): # When - descriptor = DescriptorNumber(name="name", value=1, unit=unit_string) + descriptor = DescriptorNumber(name='name', value=1, unit=unit_string) # Then base_unit = descriptor._base_unit() @@ -215,10 +228,25 @@ def test_base_unit(self, unit_string, expected): # Expect assert base_unit == expected - @pytest.mark.parametrize("test, expected", [ - (DescriptorNumber("test", 2, "m", 0.01,), DescriptorNumber("test + name", 3, "m", 0.11)), - (DescriptorNumber("test", 2, "cm", 0.01), DescriptorNumber("test + name", 102, "cm", 1000.01))], - ids=["regular", "unit_conversion"]) + @pytest.mark.parametrize( + 'test, expected', + [ + ( + DescriptorNumber( + 'test', + 2, + 'm', + 0.01, + ), + DescriptorNumber('test + name', 3, 'm', 0.11), + ), + ( + DescriptorNumber('test', 2, 'cm', 0.01), + DescriptorNumber('test + name', 102, 'cm', 1000.01), + ), + ], + ids=['regular', 'unit_conversion'], + ) def test_addition(self, descriptor: DescriptorNumber, test, expected): # When Then result = test + descriptor @@ -229,12 +257,12 @@ def test_addition(self, descriptor: DescriptorNumber, test, expected): assert result.value == expected.value assert result.unit == expected.unit assert result.variance == expected.variance - + assert descriptor.unit == 'm' def test_addition_with_scalar(self): - # When - descriptor = DescriptorNumber(name="name", value=1, variance=0.1) + # When + descriptor = DescriptorNumber(name='name', value=1, variance=0.1) # Then result = descriptor + 1.0 @@ -244,27 +272,53 @@ def test_addition_with_scalar(self): assert type(result) == DescriptorNumber assert result.name == result.unique_name assert result.value == 2.0 - assert result.unit == "dimensionless" + assert result.unit == 'dimensionless' assert result.variance == 0.1 assert type(result_reverse) == DescriptorNumber assert result_reverse.name == result_reverse.unique_name assert result_reverse.value == 2.0 - assert result_reverse.unit == "dimensionless" + assert result_reverse.unit == 'dimensionless' assert result_reverse.variance == 0.1 - @pytest.mark.parametrize("test", [1.0, DescriptorNumber("test", 2, "s",)], ids=["add_scalar_to_unit", "incompatible_units"]) + @pytest.mark.parametrize( + 'test', + [ + 1.0, + DescriptorNumber( + 'test', + 2, + 's', + ), + ], + ids=['add_scalar_to_unit', 'incompatible_units'], + ) def test_addition_exception(self, descriptor: DescriptorNumber, test): # When Then Expect with pytest.raises(UnitError): result = descriptor + test with pytest.raises(UnitError): result_reverse = test + descriptor - - @pytest.mark.parametrize("test, expected", [ - (DescriptorNumber("test", 2, "m", 0.01,), DescriptorNumber("test - name", 1, "m", 0.11)), - (DescriptorNumber("test", 2, "cm", 0.01), DescriptorNumber("test - name", -98, "cm", 1000.01))], - ids=["regular", "unit_conversion"]) + + @pytest.mark.parametrize( + 'test, expected', + [ + ( + DescriptorNumber( + 'test', + 2, + 'm', + 0.01, + ), + DescriptorNumber('test - name', 1, 'm', 0.11), + ), + ( + DescriptorNumber('test', 2, 'cm', 0.01), + DescriptorNumber('test - name', -98, 'cm', 1000.01), + ), + ], + ids=['regular', 'unit_conversion'], + ) def test_subtraction(self, descriptor: DescriptorNumber, test, expected): # When Then result = test - descriptor @@ -279,8 +333,8 @@ def test_subtraction(self, descriptor: DescriptorNumber, test, expected): assert descriptor.unit == 'm' def test_subtraction_with_scalar(self): - # When - descriptor = DescriptorNumber(name="name", value=2, variance=0.1) + # When + descriptor = DescriptorNumber(name='name', value=2, variance=0.1) # Then result = descriptor - 1.0 @@ -290,16 +344,27 @@ def test_subtraction_with_scalar(self): assert type(result) == DescriptorNumber assert result.name == result.unique_name assert result.value == 1.0 - assert result.unit == "dimensionless" + assert result.unit == 'dimensionless' assert result.variance == 0.1 assert type(result_reverse) == DescriptorNumber assert result_reverse.name == result_reverse.unique_name assert result_reverse.value == -1.0 - assert result_reverse.unit == "dimensionless" + assert result_reverse.unit == 'dimensionless' assert result_reverse.variance == 0.1 - @pytest.mark.parametrize("test", [1.0, DescriptorNumber("test", 2, "s",)], ids=["sub_scalar_to_unit", "incompatible_units"]) + @pytest.mark.parametrize( + 'test', + [ + 1.0, + DescriptorNumber( + 'test', + 2, + 's', + ), + ], + ids=['sub_scalar_to_unit', 'incompatible_units'], + ) def test_subtraction_exception(self, descriptor: DescriptorNumber, test): # When Then Expect with pytest.raises(UnitError): @@ -307,10 +372,25 @@ def test_subtraction_exception(self, descriptor: DescriptorNumber, test): with pytest.raises(UnitError): result_reverse = descriptor - test - @pytest.mark.parametrize("test, expected", [ - (DescriptorNumber("test", 2, "m", 0.01,), DescriptorNumber("test * name", 2, "m^2", 0.41)), - (DescriptorNumber("test", 2, "dm", 0.01), DescriptorNumber("test * name", 0.2, "m^2", 0.0041))], - ids=["regular", "base_unit_conversion"]) + @pytest.mark.parametrize( + 'test, expected', + [ + ( + DescriptorNumber( + 'test', + 2, + 'm', + 0.01, + ), + DescriptorNumber('test * name', 2, 'm^2', 0.41), + ), + ( + DescriptorNumber('test', 2, 'dm', 0.01), + DescriptorNumber('test * name', 0.2, 'm^2', 0.0041), + ), + ], + ids=['regular', 'base_unit_conversion'], + ) def test_multiplication(self, descriptor: DescriptorNumber, test, expected): # When Then result = test * descriptor @@ -331,19 +411,36 @@ def test_multiplication_with_scalar(self, descriptor: DescriptorNumber): assert type(result) == DescriptorNumber assert result.name == result.unique_name assert result.value == 2.0 - assert result.unit == "m" + assert result.unit == 'm' assert result.variance == 0.4 assert type(result_reverse) == DescriptorNumber assert result_reverse.name == result_reverse.unique_name assert result_reverse.value == 2.0 - assert result_reverse.unit == "m" + assert result_reverse.unit == 'm' assert result_reverse.variance == 0.4 - @pytest.mark.parametrize("test, expected, expected_reverse", [ - (DescriptorNumber("test", 2, "m^2", 0.01,), DescriptorNumber("name / test", 0.5, "1/m", 0.025625), DescriptorNumber("test / name", 2, "m", 0.41)), - (2, DescriptorNumber("name / 2", 0.5, "m", 0.025), DescriptorNumber("2 / name", 2, "1/m", 0.4))], - ids=["descriptorNumber", "scalar"]) + @pytest.mark.parametrize( + 'test, expected, expected_reverse', + [ + ( + DescriptorNumber( + 'test', + 2, + 'm^2', + 0.01, + ), + DescriptorNumber('name / test', 0.5, '1/m', 0.025625), + DescriptorNumber('test / name', 2, 'm', 0.41), + ), + ( + 2, + DescriptorNumber('name / 2', 0.5, 'm', 0.025), + DescriptorNumber('2 / name', 2, '1/m', 0.4), + ), + ], + ids=['descriptorNumber', 'scalar'], + ) def test_division(self, descriptor: DescriptorNumber, test, expected, expected_reverse): # When Then result = descriptor / test @@ -362,31 +459,40 @@ def test_division(self, descriptor: DescriptorNumber, test, expected, expected_r assert result_reverse.unit == expected_reverse.unit assert result_reverse.variance == pytest.approx(expected_reverse.variance) - @pytest.mark.parametrize("test", [0, DescriptorNumber("test", 0, "m", 0.01)], ids=["zero", "zero_descriptor"]) + @pytest.mark.parametrize( + 'test', [0, DescriptorNumber('test', 0, 'm', 0.01)], ids=['zero', 'zero_descriptor'] + ) def test_division_exception(self, descriptor: DescriptorNumber, test): # When Then Expect with pytest.raises(ZeroDivisionError): result = descriptor / test def test_division_exception_reverse(self): - # When - descriptor = DescriptorNumber(name="name", value=0, variance=0.1) + # When + descriptor = DescriptorNumber(name='name', value=0, variance=0.1) # Then Expect with pytest.raises(ZeroDivisionError): result = 2 / descriptor - @pytest.mark.parametrize("test, expected", [ - (DescriptorNumber("test", 2), DescriptorNumber("name ** test", 4, unit="m^2", variance=1.6)), - (2, DescriptorNumber("name ** 2", 4, unit="m^2", variance=1.6)), - (-2, DescriptorNumber("name ** -2", 0.25, unit="1/m^2", variance=0.00625))], - ids=["descriptorNumber", "scalar", "negative_scalar"]) + @pytest.mark.parametrize( + 'test, expected', + [ + ( + DescriptorNumber('test', 2), + DescriptorNumber('name ** test', 4, unit='m^2', variance=1.6), + ), + (2, DescriptorNumber('name ** 2', 4, unit='m^2', variance=1.6)), + (-2, DescriptorNumber('name ** -2', 0.25, unit='1/m^2', variance=0.00625)), + ], + ids=['descriptorNumber', 'scalar', 'negative_scalar'], + ) def test_power_of_descriptor(self, test, expected): - # When - descriptor = DescriptorNumber(name="name", value=2, unit="m", variance=0.1) + # When + descriptor = DescriptorNumber(name='name', value=2, unit='m', variance=0.1) # Then - result = descriptor ** test + result = descriptor**test # Expect assert type(result) == DescriptorNumber @@ -396,53 +502,65 @@ def test_power_of_descriptor(self, test, expected): assert result.variance == expected.variance def test_power_of_dimensionless_descriptor(self): - # When - descriptor = DescriptorNumber(name="name", value=2, unit="dimensionless", variance=0.1) + # When + descriptor = DescriptorNumber(name='name', value=2, unit='dimensionless', variance=0.1) # Then - result = descriptor ** 0.5 + result = descriptor**0.5 # Expect assert type(result) == DescriptorNumber assert result.name == result.unique_name assert result.value == 1.4142135623730951 - assert result.unit == "dimensionless" + assert result.unit == 'dimensionless' assert result.variance == pytest.approx(0.0125) - @pytest.mark.parametrize("descriptor, exponent, exception", [ - (DescriptorNumber("name", 2), DescriptorNumber("test", 2, unit="m"), UnitError), - (DescriptorNumber("name", 2), DescriptorNumber("test", 2, variance=0.1), ValueError), - (DescriptorNumber("name", 2, unit="m"), 0.5, UnitError), - (DescriptorNumber("name", -2), 0.5, ValueError)], - ids=["descriptor_unit", "descriptor_variance", "fractional_of_unit", "fractonal_of_negative"]) + @pytest.mark.parametrize( + 'descriptor, exponent, exception', + [ + (DescriptorNumber('name', 2), DescriptorNumber('test', 2, unit='m'), UnitError), + (DescriptorNumber('name', 2), DescriptorNumber('test', 2, variance=0.1), ValueError), + (DescriptorNumber('name', 2, unit='m'), 0.5, UnitError), + (DescriptorNumber('name', -2), 0.5, ValueError), + ], + ids=[ + 'descriptor_unit', + 'descriptor_variance', + 'fractional_of_unit', + 'fractonal_of_negative', + ], + ) def test_power_of_descriptor_exceptions(self, descriptor, exponent, exception): # When Then Expect with pytest.raises(exception): - result = descriptor ** exponent - + result = descriptor**exponent def test_descriptor_as_exponentiation(self): - # When - descriptor = DescriptorNumber(name="name", value=2) + # When + descriptor = DescriptorNumber(name='name', value=2) # Then - result = 2 ** descriptor + result = 2**descriptor # Expect assert result == 4 - @pytest.mark.parametrize("exponent, exception", [ - (DescriptorNumber("test", 2, unit="m"), UnitError), - (DescriptorNumber("test", 2, variance=0.1), ValueError)], - ids=["descriptor_unit", "descriptor_variance"]) + @pytest.mark.parametrize( + 'exponent, exception', + [ + (DescriptorNumber('test', 2, unit='m'), UnitError), + (DescriptorNumber('test', 2, variance=0.1), ValueError), + ], + ids=['descriptor_unit', 'descriptor_variance'], + ) def test_descriptor_as_exponentiation_exception(self, exponent, exception): # When Then Expect with pytest.raises(exception): - result = 2 ** exponent + result = 2**exponent def test_negation(self): - # When - descriptor = DescriptorNumber(name="name", unit="m", value=2, variance=0.1) + # When + descriptor = DescriptorNumber(name='name', unit='m', value=2, variance=0.1) # Then result = -descriptor @@ -451,12 +569,12 @@ def test_negation(self): assert type(result) == DescriptorNumber assert result.name == result.unique_name assert result.value == -2 - assert result.unit == "m" + assert result.unit == 'm' assert result.variance == 0.1 def test_abs(self): - # When - descriptor = DescriptorNumber(name="name", unit="m", value=-2, variance=0.1) + # When + descriptor = DescriptorNumber(name='name', unit='m', value=-2, variance=0.1) # Then result = abs(descriptor) @@ -465,5 +583,5 @@ def test_abs(self): assert type(result) == DescriptorNumber assert result.name == result.unique_name assert result.value == 2 - assert result.unit == "m" - assert result.variance == 0.1 \ No newline at end of file + assert result.unit == 'm' + assert result.variance == 0.1 diff --git a/tests/unit/variable/test_descriptor_str.py b/tests/unit/variable/test_descriptor_str.py index aa593ed9..e07608d7 100644 --- a/tests/unit/variable/test_descriptor_str.py +++ b/tests/unit/variable/test_descriptor_str.py @@ -1,60 +1,64 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + import pytest -from easyscience.variable import DescriptorStr from easyscience import global_object +from easyscience.variable import DescriptorStr + class TestDescriptorStr: @pytest.fixture def descriptor(self): descriptor = DescriptorStr( - name="name", - value="string", - description="description", - url="url", - display_name="display_name", + name='name', + value='string', + description='description', + url='url', + display_name='display_name', parent=None, ) return descriptor - + @pytest.fixture def clear(self): global_object.map._clear() def test_init(self, descriptor: DescriptorStr): # When Then Expect - assert descriptor._string == "string" + assert descriptor._string == 'string' # From super - assert descriptor._name == "name" - assert descriptor._description == "description" - assert descriptor._url == "url" - assert descriptor._display_name == "display_name" + assert descriptor._name == 'name' + assert descriptor._description == 'description' + assert descriptor._url == 'url' + assert descriptor._display_name == 'display_name' - @pytest.mark.parametrize("string", [True, 0, 1.0]) + @pytest.mark.parametrize('string', [True, 0, 1.0]) def test_init_string_type_exception(self, string): # When Then Expect with pytest.raises(ValueError): DescriptorStr( - name="name", + name='name', value=string, - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', parent=None, ) def test_value(self, descriptor: DescriptorStr): # When Then Expect - assert descriptor.value == "string" + assert descriptor.value == 'string' def test_set_value(self, descriptor: DescriptorStr): # When Then - descriptor.value = "new_string" + descriptor.value = 'new_string' # Expect - assert descriptor._string == "new_string" + assert descriptor._string == 'new_string' - @pytest.mark.parametrize("string", [True, 0, 1.0]) + @pytest.mark.parametrize('string', [True, 0, 1.0]) def test_set_value_type_exception(self, descriptor: DescriptorStr, string): # When Then Expect with pytest.raises(ValueError): @@ -73,4 +77,4 @@ def test_copy(self, descriptor: DescriptorStr): # Expect assert type(descriptor_copy) == DescriptorStr - assert descriptor_copy._string == descriptor._string \ No newline at end of file + assert descriptor_copy._string == descriptor._string diff --git a/tests/unit/variable/test_parameter.py b/tests/unit/variable/test_parameter.py index f2b756eb..e4d5480f 100644 --- a/tests/unit/variable/test_parameter.py +++ b/tests/unit/variable/test_parameter.py @@ -1,14 +1,17 @@ -import pytest +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from unittest.mock import MagicMock -import scipp as sc -import numpy as np +import numpy as np +import pytest +import scipp as sc from scipp import UnitError -from easyscience import Parameter from easyscience import DescriptorNumber -from easyscience import global_object from easyscience import ObjBase +from easyscience import Parameter +from easyscience import global_object class TestParameter: @@ -16,15 +19,15 @@ class TestParameter: def parameter(self) -> Parameter: self.mock_callback = MagicMock() parameter = Parameter( - name="name", + name='name', value=1, - unit="m", + unit='m', variance=0.01, min=0, max=10, - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', callback=self.mock_callback, parent=None, ) @@ -33,9 +36,9 @@ def parameter(self) -> Parameter: @pytest.fixture def normal_parameter(self) -> Parameter: parameter = Parameter( - name="name", + name='name', value=1, - unit="m", + unit='m', variance=0.01, min=0, max=10, @@ -58,20 +61,20 @@ def compare_parameters(self, parameter1: Parameter, parameter2: Parameter): def test_init(self, parameter: Parameter): # When Then Expect assert parameter._min.value == 0 - assert parameter._min.unit == "m" + assert parameter._min.unit == 'm' assert parameter._max.value == 10 - assert parameter._max.unit == "m" + assert parameter._max.unit == 'm' assert parameter._callback == self.mock_callback assert parameter._independent == True # From super assert parameter._scalar.value == 1 - assert parameter._scalar.unit == "m" + assert parameter._scalar.unit == 'm' assert parameter._scalar.variance == 0.01 - assert parameter._name == "name" - assert parameter._description == "description" - assert parameter._url == "url" - assert parameter._display_name == "display_name" + assert parameter._name == 'name' + assert parameter._description == 'description' + assert parameter._url == 'url' + assert parameter._display_name == 'display_name' assert parameter._fixed == False assert parameter._observers == [] @@ -83,15 +86,15 @@ def test_init_value_min_exception(self): # Then Expect with pytest.raises(ValueError): Parameter( - name="name", + name='name', value=value, - unit="m", + unit='m', variance=0.01, min=0, max=10, - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', callback=mock_callback, parent=None, ) @@ -104,15 +107,15 @@ def test_init_value_max_exception(self): # Then Expect with pytest.raises(ValueError): Parameter( - name="name", + name='name', value=value, - unit="m", + unit='m', variance=0.01, min=0, max=10, - description="description", - url="url", - display_name="display_name", + description='description', + url='url', + display_name='display_name', callback=mock_callback, parent=None, ) @@ -120,18 +123,18 @@ def test_init_value_max_exception(self): def test_make_dependent_on(self, normal_parameter: Parameter): # When independent_parameter = Parameter( - name="independent", value=1, unit="m", variance=0.01, min=0, max=10 + name='independent', value=1, unit='m', variance=0.01, min=0, max=10 ) # Then normal_parameter.make_dependent_on( - dependency_expression="2*a", dependency_map={"a": independent_parameter} + dependency_expression='2*a', dependency_map={'a': independent_parameter} ) # Expect assert normal_parameter._independent == False - assert normal_parameter.dependency_expression == "2*a" - assert normal_parameter.dependency_map == {"a": independent_parameter} + assert normal_parameter.dependency_expression == '2*a' + assert normal_parameter.dependency_map == {'a': independent_parameter} self.compare_parameters(normal_parameter, 2 * independent_parameter) # Then @@ -146,95 +149,95 @@ def test_dependent_parameter_make_dependent_on_with_desired_unit( ): # When independent_parameter = Parameter( - name="independent", value=1, unit="m", variance=0.01, min=0, max=10 + name='independent', value=1, unit='m', variance=0.01, min=0, max=10 ) # Then normal_parameter.make_dependent_on( - dependency_expression="2*a", - dependency_map={"a": independent_parameter}, - desired_unit="cm", + dependency_expression='2*a', + dependency_map={'a': independent_parameter}, + desired_unit='cm', ) # Expect assert normal_parameter._independent == False - assert normal_parameter.dependency_expression == "2*a" - assert normal_parameter.dependency_map == {"a": independent_parameter} + assert normal_parameter.dependency_expression == '2*a' + assert normal_parameter.dependency_map == {'a': independent_parameter} assert normal_parameter.value == 200 * independent_parameter.value - assert normal_parameter.unit == "cm" + assert normal_parameter.unit == 'cm' assert ( normal_parameter.variance == independent_parameter.variance * 4 * 10000 ) # unit conversion from m to cm squared assert normal_parameter.min == 200 * independent_parameter.min assert normal_parameter.max == 200 * independent_parameter.max - assert normal_parameter._min.unit == "cm" - assert normal_parameter._max.unit == "cm" + assert normal_parameter._min.unit == 'cm' + assert normal_parameter._max.unit == 'cm' # Then independent_parameter.value = 2 # Expect assert normal_parameter.value == 200 * independent_parameter.value - assert normal_parameter.unit == "cm" + assert normal_parameter.unit == 'cm' assert ( normal_parameter.variance == independent_parameter.variance * 4 * 10000 ) # unit conversion from m to cm squared assert normal_parameter.min == 200 * independent_parameter.min assert normal_parameter.max == 200 * independent_parameter.max - assert normal_parameter._min.unit == "cm" - assert normal_parameter._max.unit == "cm" + assert normal_parameter._min.unit == 'cm' + assert normal_parameter._max.unit == 'cm' # Then # Change the dependency expression and unit again normal_parameter.make_dependent_on( - dependency_expression="3*a", - dependency_map={"a": independent_parameter}, - desired_unit="mm", + dependency_expression='3*a', + dependency_map={'a': independent_parameter}, + desired_unit='mm', ) # Expect assert normal_parameter._independent == False - assert normal_parameter.dependency_expression == "3*a" - assert normal_parameter.dependency_map == {"a": independent_parameter} + assert normal_parameter.dependency_expression == '3*a' + assert normal_parameter.dependency_map == {'a': independent_parameter} assert normal_parameter.value == 3000 * independent_parameter.value - assert normal_parameter.unit == "mm" + assert normal_parameter.unit == 'mm' assert ( normal_parameter.variance == independent_parameter.variance * 9 * 1000000 ) # unit conversion from m to mm squared assert normal_parameter.min == 3000 * independent_parameter.min assert normal_parameter.max == 3000 * independent_parameter.max - assert normal_parameter._min.unit == "mm" - assert normal_parameter._max.unit == "mm" + assert normal_parameter._min.unit == 'mm' + assert normal_parameter._max.unit == 'mm' # Then independent_parameter.value = 2 # Expect assert normal_parameter.value == 3000 * independent_parameter.value - assert normal_parameter.unit == "mm" + assert normal_parameter.unit == 'mm' assert ( normal_parameter.variance == independent_parameter.variance * 9 * 1000000 ) # unit conversion from m to mm squared assert normal_parameter.min == 3000 * independent_parameter.min assert normal_parameter.max == 3000 * independent_parameter.max - assert normal_parameter._min.unit == "mm" - assert normal_parameter._max.unit == "mm" + assert normal_parameter._min.unit == 'mm' + assert normal_parameter._max.unit == 'mm' def test_dependent_parameter_make_dependent_on_with_desired_unit_incompatible_unit_raises( self, normal_parameter: Parameter ): # When independent_parameter = Parameter( - name="independent", value=1, unit="m", variance=0.01, min=0, max=10 + name='independent', value=1, unit='m', variance=0.01, min=0, max=10 ) # Then Expect - with pytest.raises(UnitError, match="Failed to convert unit from m to s."): + with pytest.raises(UnitError, match='Failed to convert unit from m to s.'): normal_parameter.make_dependent_on( - dependency_expression="2*a", - dependency_map={"a": independent_parameter}, - desired_unit="s", + dependency_expression='2*a', + dependency_map={'a': independent_parameter}, + desired_unit='s', ) def test_dependent_parameter_make_dependent_on_with_incorrect_unit_raises( @@ -242,34 +245,34 @@ def test_dependent_parameter_make_dependent_on_with_incorrect_unit_raises( ): # When independent_parameter = Parameter( - name="independent", value=1, unit="m", variance=0.01, min=0, max=10 + name='independent', value=1, unit='m', variance=0.01, min=0, max=10 ) # Then Expect with pytest.raises( - TypeError, match="`desired_unit` must be a string representing a valid unit" + TypeError, match='`desired_unit` must be a string representing a valid unit' ): normal_parameter.make_dependent_on( - dependency_expression="2*a", - dependency_map={"a": independent_parameter}, + dependency_expression='2*a', + dependency_map={'a': independent_parameter}, desired_unit=123, ) def test_parameter_from_dependency(self, normal_parameter: Parameter): # When Then dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, - display_name="display_name", + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, + display_name='display_name', ) # Expect assert dependent_parameter._independent == False - assert dependent_parameter.dependency_expression == "2*a" - assert dependent_parameter.dependency_map == {"a": normal_parameter} - assert dependent_parameter.name == "dependent" - assert dependent_parameter.display_name == "display_name" + assert dependent_parameter.dependency_expression == '2*a' + assert dependent_parameter.dependency_map == {'a': normal_parameter} + assert dependent_parameter.name == 'dependent' + assert dependent_parameter.display_name == 'display_name' self.compare_parameters(dependent_parameter, 2 * normal_parameter) # Then @@ -278,48 +281,46 @@ def test_parameter_from_dependency(self, normal_parameter: Parameter): # Expect self.compare_parameters(dependent_parameter, 2 * normal_parameter) - def test_parameter_from_dependency_with_desired_unit( - self, normal_parameter: Parameter - ): + def test_parameter_from_dependency_with_desired_unit(self, normal_parameter: Parameter): # When Then dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, - display_name="display_name", - desired_unit="cm", + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, + display_name='display_name', + desired_unit='cm', ) # Expect assert dependent_parameter._independent == False - assert dependent_parameter.dependency_expression == "2*a" - assert dependent_parameter.dependency_map == {"a": normal_parameter} - assert dependent_parameter.name == "dependent" - assert dependent_parameter.display_name == "display_name" + assert dependent_parameter.dependency_expression == '2*a' + assert dependent_parameter.dependency_map == {'a': normal_parameter} + assert dependent_parameter.name == 'dependent' + assert dependent_parameter.display_name == 'display_name' assert dependent_parameter.value == 200 * normal_parameter.value - assert dependent_parameter.unit == "cm" + assert dependent_parameter.unit == 'cm' assert ( dependent_parameter.variance == normal_parameter.variance * 4 * 10000 ) # unit conversion from m to cm squared assert dependent_parameter.min == 200 * normal_parameter.min assert dependent_parameter.max == 200 * normal_parameter.max - assert dependent_parameter._min.unit == "cm" - assert dependent_parameter._max.unit == "cm" + assert dependent_parameter._min.unit == 'cm' + assert dependent_parameter._max.unit == 'cm' # Then normal_parameter.value = 2 # Expect assert dependent_parameter.value == 200 * normal_parameter.value - assert dependent_parameter.unit == "cm" + assert dependent_parameter.unit == 'cm' assert ( dependent_parameter.variance == normal_parameter.variance * 4 * 10000 ) # unit conversion from m to cm squared assert dependent_parameter.min == 200 * normal_parameter.min assert dependent_parameter.max == 200 * normal_parameter.max - assert dependent_parameter._min.unit == "cm" - assert dependent_parameter._max.unit == "cm" + assert dependent_parameter._min.unit == 'cm' + assert dependent_parameter._max.unit == 'cm' def test_parameter_from_dependency_with_desired_unit_incompatible_unit_raises( self, normal_parameter: Parameter @@ -327,27 +328,23 @@ def test_parameter_from_dependency_with_desired_unit_incompatible_unit_raises( # When Then Expect with pytest.raises(UnitError): dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, - display_name="display_name", - desired_unit="s", + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, + display_name='display_name', + desired_unit='s', ) - def test_dependent_parameter_with_unique_name( - self, clear, normal_parameter: Parameter - ): + def test_dependent_parameter_with_unique_name(self, clear, normal_parameter: Parameter): # When Then dependent_parameter = Parameter.from_dependency( - name="dependent", + name='dependent', dependency_expression='2*"Parameter_0"', ) # Expect assert dependent_parameter.dependency_expression == '2*"Parameter_0"' - assert dependent_parameter.dependency_map == { - "__Parameter_0__": normal_parameter - } + assert dependent_parameter.dependency_map == {'__Parameter_0__': normal_parameter} self.compare_parameters(dependent_parameter, 2 * normal_parameter) # Then @@ -361,48 +358,44 @@ def test_process_dependency_unique_names_double_quotes( ): # When independent_parameter = Parameter( - name="independent", + name='independent', value=1, - unit="m", + unit='m', variance=0.01, min=0, max=10, - unique_name="Special_name", + unique_name='Special_name', ) normal_parameter._dependency_map = {} # Then - normal_parameter._process_dependency_unique_names( - dependency_expression='2*"Special_name"' - ) + normal_parameter._process_dependency_unique_names(dependency_expression='2*"Special_name"') # Expect - assert normal_parameter._dependency_map == { - "__Special_name__": independent_parameter - } - assert normal_parameter._clean_dependency_string == "2*__Special_name__" + assert normal_parameter._dependency_map == {'__Special_name__': independent_parameter} + assert normal_parameter._clean_dependency_string == '2*__Special_name__' def test_process_dependency_unique_names_single_quotes( self, clear, normal_parameter: Parameter ): # When independent_parameter = Parameter( - name="independent", + name='independent', value=1, - unit="m", + unit='m', variance=0.01, min=0, max=10, - unique_name="Special_name", + unique_name='Special_name', ) independent_parameter_2 = Parameter( - name="independent_2", + name='independent_2', value=1, - unit="m", + unit='m', variance=0.01, min=0, max=10, - unique_name="Special_name_2", + unique_name='Special_name_2', ) normal_parameter._dependency_map = {} @@ -413,13 +406,10 @@ def test_process_dependency_unique_names_single_quotes( # Expect assert normal_parameter._dependency_map == { - "__Special_name__": independent_parameter, - "__Special_name_2__": independent_parameter_2, + '__Special_name__': independent_parameter, + '__Special_name_2__': independent_parameter_2, } - assert ( - normal_parameter._clean_dependency_string - == "__Special_name__ + __Special_name_2__" - ) + assert normal_parameter._clean_dependency_string == '__Special_name__ + __Special_name_2__' def test_process_dependency_unique_names_exception_unique_name_does_not_exist( self, clear, normal_parameter: Parameter @@ -430,7 +420,7 @@ def test_process_dependency_unique_names_exception_unique_name_does_not_exist( # Then Expect with pytest.raises( ValueError, - match="A Parameter with unique_name Special_name does not exist. Please check your dependency expression.", + match='A Parameter with unique_name Special_name does not exist. Please check your dependency expression.', ): normal_parameter._process_dependency_unique_names( dependency_expression='2*"Special_name"' @@ -441,30 +431,28 @@ def test_process_dependency_unique_names_exception_not_a_descriptorNumber( ): # When normal_parameter._dependency_map = {} - base_obj = ObjBase(name="ObjBase", unique_name="base_obj") + base_obj = ObjBase(name='ObjBase', unique_name='base_obj') # Then Expect with pytest.raises( ValueError, - match="The object with unique_name base_obj is not a Parameter or DescriptorNumber. Please check your dependency expression.", + match='The object with unique_name base_obj is not a Parameter or DescriptorNumber. Please check your dependency expression.', ): - normal_parameter._process_dependency_unique_names( - dependency_expression='2*"base_obj"' - ) + normal_parameter._process_dependency_unique_names(dependency_expression='2*"base_obj"') @pytest.mark.parametrize( - "dependency_expression, dependency_map", + 'dependency_expression, dependency_map', [ - (2, {"a": Parameter(name="a", value=1)}), - ("2*a", ["a", Parameter(name="a", value=1)]), - ("2*a", {4: Parameter(name="a", value=1)}), - ("2*a", {"a": ObjBase(name="a")}), + (2, {'a': Parameter(name='a', value=1)}), + ('2*a', ['a', Parameter(name='a', value=1)]), + ('2*a', {4: Parameter(name='a', value=1)}), + ('2*a', {'a': ObjBase(name='a')}), ], ids=[ - "dependency_expression_not_a_string", - "dependency_map_not_a_dict", - "dependency_map_keys_not_strings", - "dependency_map_values_not_descriptor_number", + 'dependency_expression_not_a_string', + 'dependency_map_not_a_dict', + 'dependency_map_keys_not_strings', + 'dependency_map_values_not_descriptor_number', ], ) def test_parameter_from_dependency_input_exceptions( @@ -473,50 +461,48 @@ def test_parameter_from_dependency_input_exceptions( # When Then Expect with pytest.raises(TypeError): Parameter.from_dependency( - name="dependent", + name='dependent', dependency_expression=dependency_expression, dependency_map=dependency_map, ) @pytest.mark.parametrize( - "dependency_expression, error", + 'dependency_expression, error', [ - ("2*a + b", NameError), - ("2*a + 3*", SyntaxError), - ("2 + 2", TypeError), + ('2*a + b', NameError), + ('2*a + 3*', SyntaxError), + ('2 + 2', TypeError), ('2*"special_name"', ValueError), ], ids=[ - "parameter_not_in_map", - "invalid_dependency_expression", - "result_not_a_descriptor_number", - "unique_name_does_not_exist", + 'parameter_not_in_map', + 'invalid_dependency_expression', + 'result_not_a_descriptor_number', + 'unique_name_does_not_exist', ], ) def test_parameter_make_dependent_on_exceptions_cleanup_previously_dependent( self, normal_parameter, dependency_expression, error ): # When - independent_parameter = Parameter( - name="independent", value=10, unit="s", variance=0.02 - ) + independent_parameter = Parameter(name='independent', value=10, unit='s', variance=0.02) dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="best", - dependency_map={"best": independent_parameter}, + name='dependent', + dependency_expression='best', + dependency_map={'best': independent_parameter}, ) # Then Expect # Check that the correct error is raised with pytest.raises(error): dependent_parameter.make_dependent_on( dependency_expression=dependency_expression, - dependency_map={"a": normal_parameter}, + dependency_map={'a': normal_parameter}, ) # Check that everything is properly cleaned up assert normal_parameter._observers == [] assert dependent_parameter.independent == False - assert dependent_parameter.dependency_expression == "best" - assert dependent_parameter.dependency_map == {"best": independent_parameter} + assert dependent_parameter.dependency_expression == 'best' + assert dependent_parameter.dependency_map == {'best': independent_parameter} independent_parameter.value = 50 self.compare_parameters(dependent_parameter, independent_parameter) @@ -524,15 +510,13 @@ def test_parameter_make_dependent_on_exceptions_cleanup_previously_independent( self, normal_parameter ): # When - independent_parameter = Parameter( - name="independent", value=10, unit="s", variance=0.02 - ) + independent_parameter = Parameter(name='independent', value=10, unit='s', variance=0.02) # Then Expect # Check that the correct error is raised with pytest.raises(NameError): independent_parameter.make_dependent_on( - dependency_expression="2*a + b", - dependency_map={"a": normal_parameter}, + dependency_expression='2*a + b', + dependency_map={'a': normal_parameter}, ) # Check that everything is properly cleaned up assert normal_parameter._observers == [] @@ -543,9 +527,9 @@ def test_parameter_make_dependent_on_exceptions_cleanup_previously_independent( def test_dependent_parameter_updates(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, ) # Then Expect @@ -558,7 +542,7 @@ def test_dependent_parameter_updates(self, normal_parameter: Parameter): normal_parameter.error = 0.2 self.compare_parameters(dependent_parameter, 2 * normal_parameter) - normal_parameter.convert_unit("cm") + normal_parameter.convert_unit('cm') self.compare_parameters(dependent_parameter, 2 * normal_parameter) normal_parameter.min = 1 @@ -570,19 +554,19 @@ def test_dependent_parameter_updates(self, normal_parameter: Parameter): def test_dependent_parameter_indirect_updates(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, ) dependent_parameter_2 = Parameter.from_dependency( - name="dependent_2", - dependency_expression="10*a", - dependency_map={"a": normal_parameter}, + name='dependent_2', + dependency_expression='10*a', + dependency_map={'a': normal_parameter}, ) dependent_parameter_3 = Parameter.from_dependency( - name="dependent_3", - dependency_expression="b+c", - dependency_map={"b": dependent_parameter, "c": dependent_parameter_2}, + name='dependent_3', + dependency_expression='b+c', + dependency_map={'b': dependent_parameter, 'c': dependent_parameter_2}, ) # Then normal_parameter.value = 2 @@ -597,20 +581,20 @@ def test_dependent_parameter_indirect_updates(self, normal_parameter: Parameter) def test_dependent_parameter_cyclic_dependencies(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, ) dependent_parameter_2 = Parameter.from_dependency( - name="dependent_2", - dependency_expression="2*b", - dependency_map={"b": dependent_parameter}, + name='dependent_2', + dependency_expression='2*b', + dependency_map={'b': dependent_parameter}, ) # Then Expect with pytest.raises(RuntimeError): normal_parameter.make_dependent_on( - dependency_expression="2*c", dependency_map={"c": dependent_parameter_2} + dependency_expression='2*c', dependency_map={'c': dependent_parameter_2} ) # Check that everything is properly cleaned up assert dependent_parameter_2._observers == [] @@ -622,9 +606,9 @@ def test_dependent_parameter_cyclic_dependencies(self, normal_parameter: Paramet def test_dependent_parameter_logical_dependency(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="a if a.value > 0 else -a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='a if a.value > 0 else -a', + dependency_map={'a': normal_parameter}, ) self.compare_parameters(dependent_parameter, normal_parameter) @@ -636,15 +620,13 @@ def test_dependent_parameter_logical_dependency(self, normal_parameter: Paramete def test_dependent_parameter_return_is_descriptor_number(self): # When - descriptor_number = DescriptorNumber( - name="descriptor", value=1, unit="m", variance=0.01 - ) + descriptor_number = DescriptorNumber(name='descriptor', value=1, unit='m', variance=0.01) # Then dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*descriptor", - dependency_map={"descriptor": descriptor_number}, + name='dependent', + dependency_expression='2*descriptor', + dependency_map={'descriptor': descriptor_number}, ) # Expect @@ -662,18 +644,18 @@ def test_dependent_parameter_division_expression_order(self): would work correctly. """ # When - angstrom = DescriptorNumber("angstrom", 1e-10, unit="m") + angstrom = DescriptorNumber('angstrom', 1e-10, unit='m') jump_length = Parameter( - name="jump_length", + name='jump_length', value=float(1.0), fixed=False, - unit="angstrom", + unit='angstrom', ) - expression = "jump_length / angstrom" + expression = 'jump_length / angstrom' dependency_map = { - "jump_length": jump_length, - "angstrom": angstrom, + 'jump_length': jump_length, + 'angstrom': angstrom, } # Calculate the expected result from direct division @@ -691,7 +673,7 @@ def test_dependent_parameter_division_expression_order(self): assert dependent_param.value == pytest.approx(expected_value) # Also test the alternative expression that previously worked - expression_alt = "1/angstrom * jump_length" + expression_alt = '1/angstrom * jump_length' dependent_param_alt = Parameter(name='b', value=1.0) dependent_param_alt.make_dependent_on( dependency_expression=expression_alt, @@ -702,33 +684,33 @@ def test_dependent_parameter_division_expression_order(self): def test_dependent_parameter_overwrite_dependency(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, ) self.compare_parameters(dependent_parameter, 2 * normal_parameter) # Then normal_parameter_2 = Parameter( - name="a2", value=-2, unit="m", variance=0.01, min=-10, max=0 + name='a2', value=-2, unit='m', variance=0.01, min=-10, max=0 ) dependent_parameter.make_dependent_on( - dependency_expression="3*a2", dependency_map={"a2": normal_parameter_2} + dependency_expression='3*a2', dependency_map={'a2': normal_parameter_2} ) normal_parameter.value = 3 # Expect self.compare_parameters(dependent_parameter, 3 * normal_parameter_2) - assert dependent_parameter.dependency_expression == "3*a2" - assert dependent_parameter.dependency_map == {"a2": normal_parameter_2} + assert dependent_parameter.dependency_expression == '3*a2' + assert dependent_parameter.dependency_map == {'a2': normal_parameter_2} assert normal_parameter._observers == [] def test_make_independent(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, ) assert dependent_parameter.independent == False self.compare_parameters(dependent_parameter, 2 * normal_parameter) @@ -752,45 +734,39 @@ def test_independent_setter(self, normal_parameter: Parameter): with pytest.raises(AttributeError): normal_parameter.independent = False - def test_independent_parameter_dependency_expression( - self, normal_parameter: Parameter - ): + def test_independent_parameter_dependency_expression(self, normal_parameter: Parameter): # When Then Expect with pytest.raises(AttributeError): normal_parameter.dependency_expression - def test_dependent_parameter_dependency_expression_setter( - self, normal_parameter: Parameter - ): + def test_dependent_parameter_dependency_expression_setter(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, ) # Then Expect with pytest.raises(AttributeError): - dependent_parameter.dependency_expression = "3*a" + dependent_parameter.dependency_expression = '3*a' def test_independent_parameter_dependency_map(self, normal_parameter: Parameter): # When Then Expect with pytest.raises(AttributeError): normal_parameter.dependency_map - def test_dependent_parameter_dependency_map_setter( - self, normal_parameter: Parameter - ): + def test_dependent_parameter_dependency_map_setter(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, ) # Then Expect with pytest.raises(AttributeError): - dependent_parameter.dependency_map = {"a": normal_parameter} + dependent_parameter.dependency_map = {'a': normal_parameter} def test_min(self, parameter: Parameter): # When Then Expect @@ -808,9 +784,9 @@ def test_set_min(self, parameter: Parameter): def test_set_min_dependent_parameter(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, ) # Then Expect @@ -832,9 +808,9 @@ def test_set_max(self, parameter: Parameter): def test_set_max_dependent_parameter(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, ) # Then Expect @@ -848,113 +824,107 @@ def test_set_max_exception(self, parameter: Parameter): def test_convert_unit(self, parameter: Parameter): # When Then - parameter.convert_unit("mm") + parameter.convert_unit('mm') # Expect assert parameter._min.value == 0 - assert parameter._min.unit == "mm" + assert parameter._min.unit == 'mm' assert parameter._max.value == 10000 - assert parameter._max.unit == "mm" + assert parameter._max.unit == 'mm' def test_set_desired_unit(self, normal_parameter: Parameter): # When Then dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, - display_name="display_name", + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, + display_name='display_name', ) # Then - dependent_parameter.set_desired_unit("cm") + dependent_parameter.set_desired_unit('cm') # Expect assert dependent_parameter.value == 200 * normal_parameter.value - assert dependent_parameter.unit == "cm" + assert dependent_parameter.unit == 'cm' assert ( dependent_parameter.variance == normal_parameter.variance * 4 * 10000 ) # unit conversion from m to cm squared assert dependent_parameter.min == 200 * normal_parameter.min assert dependent_parameter.max == 200 * normal_parameter.max - assert dependent_parameter._min.unit == "cm" - assert dependent_parameter._max.unit == "cm" + assert dependent_parameter._min.unit == 'cm' + assert dependent_parameter._max.unit == 'cm' # Then normal_parameter.value = 2 # Expect assert dependent_parameter.value == 200 * normal_parameter.value - assert dependent_parameter.unit == "cm" + assert dependent_parameter.unit == 'cm' assert ( dependent_parameter.variance == normal_parameter.variance * 4 * 10000 ) # unit conversion from m to cm squared assert dependent_parameter.min == 200 * normal_parameter.min assert dependent_parameter.max == 200 * normal_parameter.max - assert dependent_parameter._min.unit == "cm" - assert dependent_parameter._max.unit == "cm" + assert dependent_parameter._min.unit == 'cm' + assert dependent_parameter._max.unit == 'cm' - def test_set_desired_unit_incompatible_units_raises( - self, normal_parameter: Parameter - ): + def test_set_desired_unit_incompatible_units_raises(self, normal_parameter: Parameter): # When Then dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, - display_name="display_name", + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, + display_name='display_name', ) # Then Expect with pytest.raises( UnitError, - match="Failed to convert unit from m to s.", + match='Failed to convert unit from m to s.', ): - dependent_parameter.set_desired_unit("s") + dependent_parameter.set_desired_unit('s') def test_set_desired_unit_None(self, normal_parameter: Parameter): # When Then dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, - display_name="display_name", - desired_unit="cm", + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, + display_name='display_name', + desired_unit='cm', ) # EXPECT - assert dependent_parameter.unit == "cm" + assert dependent_parameter.unit == 'cm' # Then dependent_parameter.set_desired_unit(None) # EXPECT assert dependent_parameter.value == 2 * normal_parameter.value - assert dependent_parameter.unit == "m" + assert dependent_parameter.unit == 'm' - def test_set_desired_unit_independent_parameter_raises( - self, normal_parameter: Parameter - ): + def test_set_desired_unit_independent_parameter_raises(self, normal_parameter: Parameter): # When Then Expect with pytest.raises( AttributeError, - match="This is an independent parameter, desired unit can only be set for dependent parameters.", + match='This is an independent parameter, desired unit can only be set for dependent parameters.', ): - normal_parameter.set_desired_unit("cm") + normal_parameter.set_desired_unit('cm') - def test_set_desired_unit_incorrect_unit_type_raises( - self, normal_parameter: Parameter - ): + def test_set_desired_unit_incorrect_unit_type_raises(self, normal_parameter: Parameter): # When Then dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, - display_name="display_name", + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, + display_name='display_name', ) # Then Expect - with pytest.raises(TypeError, match="must be a string"): + with pytest.raises(TypeError, match='must be a string'): dependent_parameter.set_desired_unit(5) def test_set_fixed(self, parameter: Parameter): @@ -967,16 +937,16 @@ def test_set_fixed(self, parameter: Parameter): def test_set_fixed_dependent_parameter(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, ) # Then Expect with pytest.raises(AttributeError): dependent_parameter.fixed = True - @pytest.mark.parametrize("fixed", ["True", 1]) + @pytest.mark.parametrize('fixed', ['True', 1]) def test_set_fixed_exception(self, parameter: Parameter, fixed): # When Then Expect with pytest.raises(ValueError): @@ -1006,10 +976,7 @@ def test_set_error_exception(self, parameter: Parameter): def test_repr(self, parameter: Parameter): # When Then Expect - assert ( - repr(parameter) - == "" - ) + assert repr(parameter) == "" def test_repr_fixed(self, parameter: Parameter): # When @@ -1017,8 +984,7 @@ def test_repr_fixed(self, parameter: Parameter): # Then Expect assert ( - repr(parameter) - == "" + repr(parameter) == "" ) def test_value_match_callback(self, parameter: Parameter): @@ -1049,14 +1015,14 @@ def test_set_value(self, parameter: Parameter): # Expect parameter._callback.fset.assert_called_with(2) assert parameter._callback.fset.call_count == 1 - assert parameter._scalar == sc.scalar(2, unit="m") + assert parameter._scalar == sc.scalar(2, unit='m') def test_set_value_dependent_parameter(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, ) # Then Expect @@ -1066,14 +1032,14 @@ def test_set_value_dependent_parameter(self, normal_parameter: Parameter): def test_set_full_value(self, parameter: Parameter): # When Then Expect with pytest.raises(AttributeError): - parameter.full_value = sc.scalar(2, unit="s") + parameter.full_value = sc.scalar(2, unit='s') def test_set_variance_dependent_parameter(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, ) # Then Expect @@ -1083,9 +1049,9 @@ def test_set_variance_dependent_parameter(self, normal_parameter: Parameter): def test_set_error_dependent_parameter(self, normal_parameter: Parameter): # When dependent_parameter = Parameter.from_dependency( - name="dependent", - dependency_expression="2*a", - dependency_map={"a": normal_parameter}, + name='dependent', + dependency_expression='2*a', + dependency_map={'a': normal_parameter}, ) # Then Expect @@ -1113,25 +1079,25 @@ def test_copy(self, parameter: Parameter): assert parameter_copy._independent == parameter._independent @pytest.mark.parametrize( - "test, expected, expected_reverse", + 'test, expected, expected_reverse', [ ( - Parameter("test", 2, "m", 0.01, -10, 20), - Parameter("name + test", 3, "m", 0.02, -10, 30), - Parameter("test + name", 3, "m", 0.02, -10, 30), + Parameter('test', 2, 'm', 0.01, -10, 20), + Parameter('name + test', 3, 'm', 0.02, -10, 30), + Parameter('test + name', 3, 'm', 0.02, -10, 30), ), ( - Parameter("test", 2, "m", 0.01), - Parameter("name + test", 3, "m", 0.02, min=-np.inf, max=np.inf), - Parameter("test + name", 3, "m", 0.02, min=-np.inf, max=np.inf), + Parameter('test', 2, 'm', 0.01), + Parameter('name + test', 3, 'm', 0.02, min=-np.inf, max=np.inf), + Parameter('test + name', 3, 'm', 0.02, min=-np.inf, max=np.inf), ), ( - Parameter("test", 2, "cm", 0.01, -10, 10), - Parameter("name + test", 1.02, "m", 0.010001, -0.1, 10.1), - Parameter("test + name", 102, "cm", 100.01, -10, 1010), + Parameter('test', 2, 'cm', 0.01, -10, 10), + Parameter('name + test', 1.02, 'm', 0.010001, -0.1, 10.1), + Parameter('test + name', 102, 'cm', 100.01, -10, 1010), ), ], - ids=["regular", "no_bounds", "unit_conversion"], + ids=['regular', 'no_bounds', 'unit_conversion'], ) def test_addition_with_parameter( self, @@ -1162,11 +1128,11 @@ def test_addition_with_parameter( assert result_reverse.min == expected_reverse.min assert result_reverse.max == expected_reverse.max - assert parameter.unit == "m" + assert parameter.unit == 'm' def test_addition_with_scalar(self): # When - parameter = Parameter(name="name", value=1, variance=0.01, min=0, max=10) + parameter = Parameter(name='name', value=1, variance=0.01, min=0, max=10) # Then result = parameter + 1.0 @@ -1175,14 +1141,14 @@ def test_addition_with_scalar(self): # Expect assert result.name == result.unique_name assert result.value == 2.0 - assert result.unit == "dimensionless" + assert result.unit == 'dimensionless' assert result.variance == 0.01 assert result.min == 1.0 assert result.max == 11.0 assert result_reverse.name == result_reverse.unique_name assert result_reverse.value == 2.0 - assert result_reverse.unit == "dimensionless" + assert result_reverse.unit == 'dimensionless' assert result_reverse.variance == 0.01 assert result_reverse.min == 1.0 assert result_reverse.max == 11.0 @@ -1190,9 +1156,7 @@ def test_addition_with_scalar(self): def test_addition_with_descriptor_number(self, parameter: Parameter): # When parameter._callback = property() - descriptor_number = DescriptorNumber( - name="test", value=1, variance=0.1, unit="cm" - ) + descriptor_number = DescriptorNumber(name='test', value=1, variance=0.1, unit='cm') # Then result = parameter + descriptor_number @@ -1202,7 +1166,7 @@ def test_addition_with_descriptor_number(self, parameter: Parameter): assert type(result) == Parameter assert result.name == result.unique_name assert result.value == 1.01 - assert result.unit == "m" + assert result.unit == 'm' assert result.variance == 0.01001 assert result.min == 0.01 assert result.max == 10.01 @@ -1210,25 +1174,25 @@ def test_addition_with_descriptor_number(self, parameter: Parameter): assert type(result_reverse) == Parameter assert result_reverse.name == result_reverse.unique_name assert result_reverse.value == 101.0 - assert result_reverse.unit == "cm" + assert result_reverse.unit == 'cm' assert result_reverse.variance == 100.1 assert result_reverse.min == 1 assert result_reverse.max == 1001 - assert parameter.unit == "m" - assert descriptor_number.unit == "cm" + assert parameter.unit == 'm' + assert descriptor_number.unit == 'cm' @pytest.mark.parametrize( - "test", + 'test', [ 1.0, Parameter( - "test", + 'test', 2, - "s", + 's', ), ], - ids=["add_scalar_to_unit", "incompatible_units"], + ids=['add_scalar_to_unit', 'incompatible_units'], ) def test_addition_exception(self, parameter: Parameter, test): # When Then Expect @@ -1238,25 +1202,25 @@ def test_addition_exception(self, parameter: Parameter, test): result_reverse = test + parameter @pytest.mark.parametrize( - "test, expected, expected_reverse", + 'test, expected, expected_reverse', [ ( - Parameter("test", 2, "m", 0.01, -20, 20), - Parameter("name - test", -1, "m", 0.02, -20, 30), - Parameter("test - name", 1, "m", 0.02, -30, 20), + Parameter('test', 2, 'm', 0.01, -20, 20), + Parameter('name - test', -1, 'm', 0.02, -20, 30), + Parameter('test - name', 1, 'm', 0.02, -30, 20), ), ( - Parameter("test", 2, "m", 0.01), - Parameter("name - test", -1, "m", 0.02, min=-np.inf, max=np.inf), - Parameter("test - name", 1, "m", 0.02, min=-np.inf, max=np.inf), + Parameter('test', 2, 'm', 0.01), + Parameter('name - test', -1, 'm', 0.02, min=-np.inf, max=np.inf), + Parameter('test - name', 1, 'm', 0.02, min=-np.inf, max=np.inf), ), ( - Parameter("test", 2, "cm", 0.01, -10, 10), - Parameter("name - test", 0.98, "m", 0.010001, -0.1, 10.1), - Parameter("test - name", -98, "cm", 100.01, -1010, 10), + Parameter('test', 2, 'cm', 0.01, -10, 10), + Parameter('name - test', 0.98, 'm', 0.010001, -0.1, 10.1), + Parameter('test - name', -98, 'cm', 100.01, -1010, 10), ), ], - ids=["regular", "no_bounds", "unit_conversion"], + ids=['regular', 'no_bounds', 'unit_conversion'], ) def test_subtraction_with_parameter( self, @@ -1287,14 +1251,12 @@ def test_subtraction_with_parameter( assert result_reverse.min == expected_reverse.min assert result_reverse.max == expected_reverse.max - assert parameter.unit == "m" + assert parameter.unit == 'm' def test_subtraction_with_parameter_nan_cases(self): # When - parameter = Parameter( - name="name", value=1, variance=0.01, min=-np.inf, max=np.inf - ) - test = Parameter(name="test", value=2, variance=0.01, min=-np.inf, max=np.inf) + parameter = Parameter(name='name', value=1, variance=0.01, min=-np.inf, max=np.inf) + test = Parameter(name='test', value=2, variance=0.01, min=-np.inf, max=np.inf) # Then result = parameter - test @@ -1303,21 +1265,21 @@ def test_subtraction_with_parameter_nan_cases(self): # Expect assert result.name == result.unique_name assert result.value == -1.0 - assert result.unit == "dimensionless" + assert result.unit == 'dimensionless' assert result.variance == 0.02 assert result.min == -np.inf assert result.max == np.inf assert result_reverse.name == result_reverse.unique_name assert result_reverse.value == 1.0 - assert result_reverse.unit == "dimensionless" + assert result_reverse.unit == 'dimensionless' assert result_reverse.variance == 0.02 assert result_reverse.min == -np.inf assert result_reverse.max == np.inf def test_subtraction_with_scalar(self): # When - parameter = Parameter(name="name", value=2, variance=0.01, min=0, max=10) + parameter = Parameter(name='name', value=2, variance=0.01, min=0, max=10) # Then result = parameter - 1.0 @@ -1326,14 +1288,14 @@ def test_subtraction_with_scalar(self): # Expect assert result.name == result.unique_name assert result.value == 1.0 - assert result.unit == "dimensionless" + assert result.unit == 'dimensionless' assert result.variance == 0.01 assert result.min == -1.0 assert result.max == 9.0 assert result_reverse.name == result_reverse.unique_name assert result_reverse.value == -1.0 - assert result_reverse.unit == "dimensionless" + assert result_reverse.unit == 'dimensionless' assert result_reverse.variance == 0.01 assert result_reverse.min == -9.0 assert result_reverse.max == 1.0 @@ -1341,9 +1303,7 @@ def test_subtraction_with_scalar(self): def test_subtraction_with_descriptor_number(self, parameter: Parameter): # When parameter._callback = property() - descriptor_number = DescriptorNumber( - name="test", value=1, variance=0.1, unit="cm" - ) + descriptor_number = DescriptorNumber(name='test', value=1, variance=0.1, unit='cm') # Then result = parameter - descriptor_number @@ -1353,7 +1313,7 @@ def test_subtraction_with_descriptor_number(self, parameter: Parameter): assert type(result) == Parameter assert result.name == result.unique_name assert result.value == 0.99 - assert result.unit == "m" + assert result.unit == 'm' assert result.variance == 0.01001 assert result.min == -0.01 assert result.max == 9.99 @@ -1361,25 +1321,25 @@ def test_subtraction_with_descriptor_number(self, parameter: Parameter): assert type(result_reverse) == Parameter assert result_reverse.name == result_reverse.unique_name assert result_reverse.value == -99.0 - assert result_reverse.unit == "cm" + assert result_reverse.unit == 'cm' assert result_reverse.variance == 100.1 assert result_reverse.min == -999 assert result_reverse.max == 1 - assert parameter.unit == "m" - assert descriptor_number.unit == "cm" + assert parameter.unit == 'm' + assert descriptor_number.unit == 'cm' @pytest.mark.parametrize( - "test", + 'test', [ 1.0, Parameter( - "test", + 'test', 2, - "s", + 's', ), ], - ids=["sub_scalar_to_unit", "incompatible_units"], + ids=['sub_scalar_to_unit', 'incompatible_units'], ) def test_subtraction_exception(self, parameter: Parameter, test): # When Then Expect @@ -1389,25 +1349,25 @@ def test_subtraction_exception(self, parameter: Parameter, test): result_reverse = test - parameter @pytest.mark.parametrize( - "test, expected, expected_reverse", + 'test, expected, expected_reverse', [ ( - Parameter("test", 2, "m", 0.01, -10, 20), - Parameter("name * test", 2, "m^2", 0.05, -100, 200), - Parameter("test * name", 2, "m^2", 0.05, -100, 200), + Parameter('test', 2, 'm', 0.01, -10, 20), + Parameter('name * test', 2, 'm^2', 0.05, -100, 200), + Parameter('test * name', 2, 'm^2', 0.05, -100, 200), ), ( - Parameter("test", 2, "m", 0.01), - Parameter("name * test", 2, "m^2", 0.05, min=-np.inf, max=np.inf), - Parameter("test * name", 2, "m^2", 0.05, min=-np.inf, max=np.inf), + Parameter('test', 2, 'm', 0.01), + Parameter('name * test', 2, 'm^2', 0.05, min=-np.inf, max=np.inf), + Parameter('test * name', 2, 'm^2', 0.05, min=-np.inf, max=np.inf), ), ( - Parameter("test", 2, "dm", 0.01, -10, 20), - Parameter("name * test", 0.2, "m^2", 0.0005, -10, 20), - Parameter("test * name", 0.2, "m^2", 0.0005, -10, 20), + Parameter('test', 2, 'dm', 0.01, -10, 20), + Parameter('name * test', 0.2, 'm^2', 0.0005, -10, 20), + Parameter('test * name', 0.2, 'm^2', 0.0005, -10, 20), ), ], - ids=["regular", "no_bounds", "base_unit_conversion"], + ids=['regular', 'no_bounds', 'base_unit_conversion'], ) def test_multiplication_with_parameter( self, @@ -1439,26 +1399,24 @@ def test_multiplication_with_parameter( assert result_reverse.max == expected_reverse.max @pytest.mark.parametrize( - "test, expected, expected_reverse", + 'test, expected, expected_reverse', [ ( - Parameter("test", 0, "", 0.01, -10, 0), - Parameter("name * test", 0.0, "dimensionless", 0.01, -np.inf, 0), - Parameter("test * name", 0, "dimensionless", 0.01, -np.inf, 0), + Parameter('test', 0, '', 0.01, -10, 0), + Parameter('name * test', 0.0, 'dimensionless', 0.01, -np.inf, 0), + Parameter('test * name', 0, 'dimensionless', 0.01, -np.inf, 0), ), ( - Parameter("test", 0, "", 0.01, 0, 10), - Parameter("name * test", 0.0, "dimensionless", 0.01, 0, np.inf), - Parameter("test * name", 0, "dimensionless", 0.01, 0, np.inf), + Parameter('test', 0, '', 0.01, 0, 10), + Parameter('name * test', 0.0, 'dimensionless', 0.01, 0, np.inf), + Parameter('test * name', 0, 'dimensionless', 0.01, 0, np.inf), ), ], - ids=["zero_min", "zero_max"], + ids=['zero_min', 'zero_max'], ) - def test_multiplication_with_parameter_nan_cases( - self, test, expected, expected_reverse - ): + def test_multiplication_with_parameter_nan_cases(self, test, expected, expected_reverse): # When - parameter = Parameter(name="name", value=1, variance=0.01, min=1, max=np.inf) + parameter = Parameter(name='name', value=1, variance=0.01, min=1, max=np.inf) # Then result = parameter * test @@ -1480,20 +1438,20 @@ def test_multiplication_with_parameter_nan_cases( assert result_reverse.max == expected_reverse.max @pytest.mark.parametrize( - "test, expected, expected_reverse", + 'test, expected, expected_reverse', [ ( - DescriptorNumber(name="test", value=2, variance=0.1, unit="cm"), - Parameter("name * test", 2, "dm^2", 0.14, 0, 20), - Parameter("test * name", 2, "dm^2", 0.14, 0, 20), + DescriptorNumber(name='test', value=2, variance=0.1, unit='cm'), + Parameter('name * test', 2, 'dm^2', 0.14, 0, 20), + Parameter('test * name', 2, 'dm^2', 0.14, 0, 20), ), ( - DescriptorNumber(name="test", value=0, variance=0.1, unit="cm"), - DescriptorNumber("name * test", 0, "dm^2", 0.1), - DescriptorNumber("test * name", 0, "dm^2", 0.1), + DescriptorNumber(name='test', value=0, variance=0.1, unit='cm'), + DescriptorNumber('name * test', 0, 'dm^2', 0.1), + DescriptorNumber('test * name', 0, 'dm^2', 0.1), ), ], - ids=["regular", "zero_value"], + ids=['regular', 'zero_value'], ) def test_multiplication_with_descriptor_number( self, parameter: Parameter, test, expected, expected_reverse @@ -1525,20 +1483,20 @@ def test_multiplication_with_descriptor_number( assert result_reverse.max == expected_reverse.max @pytest.mark.parametrize( - "test, expected, expected_reverse", + 'test, expected, expected_reverse', [ ( 2, - Parameter("name * 2", 2, "m", 0.04, 0, 20), - Parameter("2 * name", 2, "m", 0.04, 0, 20), + Parameter('name * 2', 2, 'm', 0.04, 0, 20), + Parameter('2 * name', 2, 'm', 0.04, 0, 20), ), ( 0, - DescriptorNumber("name * 0", 0, "m", 0), - DescriptorNumber("0 * name", 0, "m", 0), + DescriptorNumber('name * 0', 0, 'm', 0), + DescriptorNumber('0 * name', 0, 'm', 0), ), ], - ids=["regular", "zero_value"], + ids=['regular', 'zero_value'], ) def test_multiplication_with_scalar( self, parameter: Parameter, test, expected, expected_reverse @@ -1569,29 +1527,27 @@ def test_multiplication_with_scalar( assert result_reverse.max == expected_reverse.max @pytest.mark.parametrize( - "test, expected, expected_reverse", + 'test, expected, expected_reverse', [ ( - Parameter("test", 2, "s", 0.01, -10, 20), - Parameter("name / test", 0.5, "m/s", 0.003125, -np.inf, np.inf), - Parameter("test / name", 2, "s/m", 0.05, -np.inf, np.inf), + Parameter('test', 2, 's', 0.01, -10, 20), + Parameter('name / test', 0.5, 'm/s', 0.003125, -np.inf, np.inf), + Parameter('test / name', 2, 's/m', 0.05, -np.inf, np.inf), ), ( - Parameter("test", 2, "s", 0.01, 0, 20), - Parameter("name / test", 0.5, "m/s", 0.003125, 0.0, np.inf), - Parameter("test / name", 2, "s/m", 0.05, 0.0, np.inf), + Parameter('test', 2, 's', 0.01, 0, 20), + Parameter('name / test', 0.5, 'm/s', 0.003125, 0.0, np.inf), + Parameter('test / name', 2, 's/m', 0.05, 0.0, np.inf), ), ( - Parameter("test", -2, "s", 0.01, -10, 0), - Parameter("name / test", -0.5, "m/s", 0.003125, -np.inf, 0.0), - Parameter("test / name", -2, "s/m", 0.05, -np.inf, 0.0), + Parameter('test', -2, 's', 0.01, -10, 0), + Parameter('name / test', -0.5, 'm/s', 0.003125, -np.inf, 0.0), + Parameter('test / name', -2, 's/m', 0.05, -np.inf, 0.0), ), ], - ids=["crossing_zero", "only_positive", "only_negative"], + ids=['crossing_zero', 'only_positive', 'only_negative'], ) - def test_division_with_parameter( - self, parameter: Parameter, test, expected, expected_reverse - ): + def test_division_with_parameter(self, parameter: Parameter, test, expected, expected_reverse): # When parameter._callback = property() @@ -1617,28 +1573,28 @@ def test_division_with_parameter( assert result_reverse.max == expected_reverse.max @pytest.mark.parametrize( - "first, second, expected", + 'first, second, expected', [ ( - Parameter("name", 1, "m", 0.01, -10, 20), - Parameter("test", -2, "s", 0.01, -10, 0), - Parameter("name / test", -0.5, "m/s", 0.003125, -np.inf, np.inf), + Parameter('name', 1, 'm', 0.01, -10, 20), + Parameter('test', -2, 's', 0.01, -10, 0), + Parameter('name / test', -0.5, 'm/s', 0.003125, -np.inf, np.inf), ), ( - Parameter("name", -10, "m", 0.01, -20, -10), - Parameter("test", -2, "s", 0.01, -10, 0), - Parameter("name / test", 5.0, "m/s", 0.065, 1, np.inf), + Parameter('name', -10, 'm', 0.01, -20, -10), + Parameter('test', -2, 's', 0.01, -10, 0), + Parameter('name / test', 5.0, 'm/s', 0.065, 1, np.inf), ), ( - Parameter("name", 10, "m", 0.01, 10, 20), - Parameter("test", -20, "s", 0.01, -20, -10), - Parameter("name / test", -0.5, "m/s", 3.125e-5, -2, -0.5), + Parameter('name', 10, 'm', 0.01, 10, 20), + Parameter('test', -20, 's', 0.01, -20, -10), + Parameter('name / test', -0.5, 'm/s', 3.125e-5, -2, -0.5), ), ], ids=[ - "first_crossing_zero_second_negative_0", - "both_negative_second_negative_0", - "finite_limits", + 'first_crossing_zero_second_negative_0', + 'both_negative_second_negative_0', + 'finite_limits', ], ) def test_division_with_parameter_remaining_cases(self, first, second, expected): @@ -1654,20 +1610,20 @@ def test_division_with_parameter_remaining_cases(self, first, second, expected): assert result.max == expected.max @pytest.mark.parametrize( - "test, expected, expected_reverse", + 'test, expected, expected_reverse', [ ( - DescriptorNumber(name="test", value=2, variance=0.1, unit="s"), - Parameter("name / test", 0.5, "m/s", 0.00875, 0, 5), - Parameter("test / name", 2, "s/m", 0.14, 0.2, np.inf), + DescriptorNumber(name='test', value=2, variance=0.1, unit='s'), + Parameter('name / test', 0.5, 'm/s', 0.00875, 0, 5), + Parameter('test / name', 2, 's/m', 0.14, 0.2, np.inf), ), ( 2, - Parameter("name / 2", 0.5, "m", 0.0025, 0, 5), - Parameter("2 / name", 2, "m**-1", 0.04, 0.2, np.inf), + Parameter('name / 2', 0.5, 'm', 0.0025, 0, 5), + Parameter('2 / name', 2, 'm**-1', 0.04, 0.2, np.inf), ), ], - ids=["descriptor_number", "number"], + ids=['descriptor_number', 'number'], ) def test_division_with_descriptor_number_and_number( self, parameter: Parameter, test, expected, expected_reverse @@ -1697,19 +1653,17 @@ def test_division_with_descriptor_number_and_number( assert result_reverse.max == expected_reverse.max @pytest.mark.parametrize( - "test, expected", + 'test, expected', [ ( - DescriptorNumber(name="test", value=0, variance=0.1, unit="s"), - DescriptorNumber("test / name", 0.0, "s/m", 0.1), + DescriptorNumber(name='test', value=0, variance=0.1, unit='s'), + DescriptorNumber('test / name', 0.0, 's/m', 0.1), ), - (0, DescriptorNumber("0 / name", 0.0, "1/m", 0.0)), + (0, DescriptorNumber('0 / name', 0.0, '1/m', 0.0)), ], - ids=["descriptor_number", "number"], + ids=['descriptor_number', 'number'], ) - def test_zero_value_divided_by_parameter( - self, parameter: Parameter, test, expected - ): + def test_zero_value_divided_by_parameter(self, parameter: Parameter, test, expected): # When parameter._callback = property() @@ -1724,45 +1678,43 @@ def test_zero_value_divided_by_parameter( assert result.variance == expected.variance @pytest.mark.parametrize( - "first, second, expected", + 'first, second, expected', [ ( - DescriptorNumber("name", 1, "m", 0.01), - Parameter("test", 2, "s", 0.1, -10, 10), - Parameter("name / test", 0.5, "m/s", 0.00875, -np.inf, np.inf), + DescriptorNumber('name', 1, 'm', 0.01), + Parameter('test', 2, 's', 0.1, -10, 10), + Parameter('name / test', 0.5, 'm/s', 0.00875, -np.inf, np.inf), ), ( - DescriptorNumber("name", -1, "m", 0.01), - Parameter("test", 2, "s", 0.1, 0, 10), - Parameter("name / test", -0.5, "m/s", 0.00875, -np.inf, -0.1), + DescriptorNumber('name', -1, 'm', 0.01), + Parameter('test', 2, 's', 0.1, 0, 10), + Parameter('name / test', -0.5, 'm/s', 0.00875, -np.inf, -0.1), ), ( - DescriptorNumber("name", 1, "m", 0.01), - Parameter("test", -2, "s", 0.1, -10, 0), - Parameter("name / test", -0.5, "m/s", 0.00875, -np.inf, -0.1), + DescriptorNumber('name', 1, 'm', 0.01), + Parameter('test', -2, 's', 0.1, -10, 0), + Parameter('name / test', -0.5, 'm/s', 0.00875, -np.inf, -0.1), ), ( - DescriptorNumber("name", -1, "m", 0.01), - Parameter("test", -2, "s", 0.1, -10, 0), - Parameter("name / test", 0.5, "m/s", 0.00875, 0.1, np.inf), + DescriptorNumber('name', -1, 'm', 0.01), + Parameter('test', -2, 's', 0.1, -10, 0), + Parameter('name / test', 0.5, 'm/s', 0.00875, 0.1, np.inf), ), ( - DescriptorNumber("name", 1, "m", 0.01), - Parameter("test", 2, "s", 0.1, 1, 10), - Parameter("name / test", 0.5, "m/s", 0.00875, 0.1, 1), + DescriptorNumber('name', 1, 'm', 0.01), + Parameter('test', 2, 's', 0.1, 1, 10), + Parameter('name / test', 0.5, 'm/s', 0.00875, 0.1, 1), ), ], ids=[ - "crossing_zero", - "positive_0_with_negative", - "negative_0_with_positive", - "negative_0_with_negative", - "finite_limits", + 'crossing_zero', + 'positive_0_with_negative', + 'negative_0_with_positive', + 'negative_0_with_negative', + 'finite_limits', ], ) - def test_division_with_descriptor_number_missing_cases( - self, first, second, expected - ): + def test_division_with_descriptor_number_missing_cases(self, first, second, expected): # When Then result = first / second @@ -1775,9 +1727,9 @@ def test_division_with_descriptor_number_missing_cases( assert result.max == expected.max @pytest.mark.parametrize( - "test", - [0, DescriptorNumber("test", 0, "s", 0.1)], - ids=["number", "descriptor_number"], + 'test', + [0, DescriptorNumber('test', 0, 's', 0.1)], + ids=['number', 'descriptor_number'], ) def test_divide_parameter_by_zero(self, parameter: Parameter, test): # When @@ -1789,38 +1741,38 @@ def test_divide_parameter_by_zero(self, parameter: Parameter, test): def test_divide_by_zero_value_parameter(self): # When - descriptor = DescriptorNumber("test", 1, "s", 0.1) - parameter = Parameter("name", 0, "m", 0.01) + descriptor = DescriptorNumber('test', 1, 's', 0.1) + parameter = Parameter('name', 0, 'm', 0.01) # Then Expect with pytest.raises(ZeroDivisionError): result = descriptor / parameter @pytest.mark.parametrize( - "test, expected", + 'test, expected', [ - (3, Parameter("name ** 3", 125, "m^3", 281.25, -125, 1000)), - (2, Parameter("name ** 2", 25, "m^2", 5.0, 0, 100)), - (-1, Parameter("name ** -1", 0.2, "1/m", 8e-5, -np.inf, np.inf)), - (-2, Parameter("name ** -2", 0.04, "1/m^2", 1.28e-5, 0, np.inf)), - (0, DescriptorNumber("name ** 0", 1, "dimensionless", 0)), + (3, Parameter('name ** 3', 125, 'm^3', 281.25, -125, 1000)), + (2, Parameter('name ** 2', 25, 'm^2', 5.0, 0, 100)), + (-1, Parameter('name ** -1', 0.2, '1/m', 8e-5, -np.inf, np.inf)), + (-2, Parameter('name ** -2', 0.04, '1/m^2', 1.28e-5, 0, np.inf)), + (0, DescriptorNumber('name ** 0', 1, 'dimensionless', 0)), ( - DescriptorNumber("test", 2), - Parameter("name ** test", 25, "m^2", 5.0, 0, 100), + DescriptorNumber('test', 2), + Parameter('name ** test', 25, 'm^2', 5.0, 0, 100), ), ], ids=[ - "power_3", - "power_2", - "power_-1", - "power_-2", - "power_0", - "power_descriptor_number", + 'power_3', + 'power_2', + 'power_-1', + 'power_-2', + 'power_0', + 'power_descriptor_number', ], ) def test_power_of_parameter(self, test, expected): # When - parameter = Parameter("name", 5, "m", 0.05, -5, 10) + parameter = Parameter('name', 5, 'm', 0.05, -5, 10) # Then result = parameter**test @@ -1836,59 +1788,59 @@ def test_power_of_parameter(self, test, expected): assert result.max == expected.max @pytest.mark.parametrize( - "test, exponent, expected", + 'test, exponent, expected', [ ( - Parameter("name", 5, "m", 0.05, 0, 10), + Parameter('name', 5, 'm', 0.05, 0, 10), -1, - Parameter("name ** -1", 0.2, "1/m", 8e-5, 0.1, np.inf), + Parameter('name ** -1', 0.2, '1/m', 8e-5, 0.1, np.inf), ), ( - Parameter("name", -5, "m", 0.05, -5, 0), + Parameter('name', -5, 'm', 0.05, -5, 0), -1, - Parameter("name ** -1", -0.2, "1/m", 8e-5, -np.inf, -0.2), + Parameter('name ** -1', -0.2, '1/m', 8e-5, -np.inf, -0.2), ), ( - Parameter("name", 5, "m", 0.05, 5, 10), + Parameter('name', 5, 'm', 0.05, 5, 10), -1, - Parameter("name ** -1", 0.2, "1/m", 8e-5, 0.1, 0.2), + Parameter('name ** -1', 0.2, '1/m', 8e-5, 0.1, 0.2), ), ( - Parameter("name", -5, "m", 0.05, -10, -5), + Parameter('name', -5, 'm', 0.05, -10, -5), -1, - Parameter("name ** -1", -0.2, "1/m", 8e-5, -0.2, -0.1), + Parameter('name ** -1', -0.2, '1/m', 8e-5, -0.2, -0.1), ), ( - Parameter("name", -5, "m", 0.05, -10, -5), + Parameter('name', -5, 'm', 0.05, -10, -5), -2, - Parameter("name ** -2", 0.04, "1/m^2", 1.28e-5, 0.01, 0.04), + Parameter('name ** -2', 0.04, '1/m^2', 1.28e-5, 0.01, 0.04), ), ( - Parameter("name", 5, "", 0.1, 1, 10), + Parameter('name', 5, '', 0.1, 1, 10), 0.3, Parameter( - "name ** 0.3", + 'name ** 0.3', 1.6206565966927624, - "", + '', 0.0009455500095853564, 1, 1.9952623149688795, ), ), ( - Parameter("name", 5, "", 0.1), + Parameter('name', 5, '', 0.1), 0.5, - Parameter("name ** 0.5", 2.23606797749979, "", 0.005, 0, np.inf), + Parameter('name ** 0.5', 2.23606797749979, '', 0.005, 0, np.inf), ), ], ids=[ - "0_positive", - "negative_0", - "both_positive", - "both_negative_invert", - "both_negative_invert_square", - "fractional", - "fractional_negative_limit", + '0_positive', + 'negative_0', + 'both_positive', + 'both_negative_invert', + 'both_negative_invert_square', + 'fractional', + 'fractional_negative_limit', ], ) def test_power_of_diffent_parameters(self, test, exponent, expected): @@ -1904,26 +1856,26 @@ def test_power_of_diffent_parameters(self, test, exponent, expected): assert result.max == expected.max @pytest.mark.parametrize( - "parameter, exponent, expected", + 'parameter, exponent, expected', [ ( - Parameter("name", 5, "m"), - DescriptorNumber("test", 2, unit="s"), + Parameter('name', 5, 'm'), + DescriptorNumber('test', 2, unit='s'), UnitError, ), ( - Parameter("name", 5, "m"), - DescriptorNumber("test", 2, variance=0.01), + Parameter('name', 5, 'm'), + DescriptorNumber('test', 2, variance=0.01), ValueError, ), - (Parameter("name", 5, "m"), 0.5, UnitError), - (Parameter("name", -5, ""), 0.5, ValueError), + (Parameter('name', 5, 'm'), 0.5, UnitError), + (Parameter('name', -5, ''), 0.5, ValueError), ], ids=[ - "exponent_unit", - "exponent_variance", - "exponent_fractional", - "negative_base_fractional", + 'exponent_unit', + 'exponent_variance', + 'exponent_fractional', + 'negative_base_fractional', ], ) def test_power_exceptions(self, parameter, exponent, expected): @@ -1933,7 +1885,7 @@ def test_power_exceptions(self, parameter, exponent, expected): def test_negation(self): # When - parameter = Parameter("name", 5, "m", 0.05, -5, 10) + parameter = Parameter('name', 5, 'm', 0.05, -5, 10) # Then result = -parameter @@ -1941,24 +1893,24 @@ def test_negation(self): # Expect assert result.name == result.unique_name assert result.value == -5 - assert result.unit == "m" + assert result.unit == 'm' assert result.variance == 0.05 assert result.min == -10 assert result.max == 5 @pytest.mark.parametrize( - "test, expected", + 'test, expected', [ ( - Parameter("name", -5, "m", 0.05, -10, -5), - Parameter("abs(name)", 5, "m", 0.05, 5, 10), + Parameter('name', -5, 'm', 0.05, -10, -5), + Parameter('abs(name)', 5, 'm', 0.05, 5, 10), ), ( - Parameter("name", 5, "m", 0.05, -10, 10), - Parameter("abs(name)", 5, "m", 0.05, 0, 10), + Parameter('name', 5, 'm', 0.05, -10, 10), + Parameter('abs(name)', 5, 'm', 0.05, 0, 10), ), ], - ids=["pure_negative", "crossing_zero"], + ids=['pure_negative', 'crossing_zero'], ) def test_abs(self, test, expected): # When Then diff --git a/tests/unit/variable/test_parameter_dependency_serialization.py b/tests/unit/variable/test_parameter_dependency_serialization.py index 574e2497..d4a9337b 100644 --- a/tests/unit/variable/test_parameter_dependency_serialization.py +++ b/tests/unit/variable/test_parameter_dependency_serialization.py @@ -1,22 +1,20 @@ -import pytest +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + import json -from copy import deepcopy -from unittest.mock import Mock -from easyscience import Parameter, global_object -from easyscience.variable.parameter_dependency_resolver import ( - resolve_all_parameter_dependencies, -) +import pytest + +from easyscience import Parameter +from easyscience import global_object +from easyscience.variable.parameter_dependency_resolver import deserialize_and_resolve_parameters from easyscience.variable.parameter_dependency_resolver import ( get_parameters_with_pending_dependencies, ) -from easyscience.variable.parameter_dependency_resolver import ( - deserialize_and_resolve_parameters, -) +from easyscience.variable.parameter_dependency_resolver import resolve_all_parameter_dependencies class TestParameterDependencySerialization: - @pytest.fixture def clear_global_map(self): """This fixture pattern: @@ -39,15 +37,15 @@ def clear_global_map(self): def test_independent_parameter_serialization(self, clear_global_map): """Test that independent parameters serialize normally without dependency info.""" - param = Parameter(name="test", value=5.0, unit="m", min=0, max=10) + param = Parameter(name='test', value=5.0, unit='m', min=0, max=10) # Serialize serialized = param.as_dict() # Should not contain dependency fields - assert "_dependency_string" not in serialized - assert "_dependency_map_serializer_ids" not in serialized - assert "_independent" not in serialized + assert '_dependency_string' not in serialized + assert '_dependency_map_serializer_ids' not in serialized + assert '_independent' not in serialized # Deserialize global_object.map._clear() @@ -62,55 +60,53 @@ def test_independent_parameter_serialization(self, clear_global_map): def test_dependent_parameter_serialization(self, clear_global_map): """Test serialization of parameters with dependencies.""" # Create independent parameter - a = Parameter(name="a", value=2.0, unit="m", min=0, max=10) + a = Parameter(name='a', value=2.0, unit='m', min=0, max=10) # Create dependent parameter b = Parameter.from_dependency( - name="b", dependency_expression="2 * a", dependency_map={"a": a}, unit="m" + name='b', dependency_expression='2 * a', dependency_map={'a': a}, unit='m' ) # Serialize dependent parameter serialized = b.as_dict() # Should contain dependency information - assert serialized["_dependency_string"] == "2 * a" - assert serialized["_dependency_map_serializer_ids"] == { - "a": a._DescriptorNumber__serializer_id + assert serialized['_dependency_string'] == '2 * a' + assert serialized['_dependency_map_serializer_ids'] == { + 'a': a._DescriptorNumber__serializer_id } - assert serialized["_independent"] is False + assert serialized['_independent'] is False # Deserialize global_object.map._clear() new_b = Parameter.from_dict(serialized) # Should have pending dependency info - assert hasattr(new_b, "_pending_dependency_string") - assert new_b._pending_dependency_string == "2 * a" + assert hasattr(new_b, '_pending_dependency_string') + assert new_b._pending_dependency_string == '2 * a' assert new_b._pending_dependency_map_serializer_ids == { - "a": a._DescriptorNumber__serializer_id + 'a': a._DescriptorNumber__serializer_id } - assert ( - new_b.independent is True - ) # Initially independent until dependencies resolved + assert new_b.independent is True # Initially independent until dependencies resolved def test_dependency_resolution_after_deserialization(self, clear_global_map): """Test that dependencies are properly resolved after deserialization.""" # Create test parameters with dependencies - a = Parameter(name="a", value=2.0, unit="m", min=0, max=10) - b = Parameter(name="b", value=3.0, unit="m", min=0, max=10) + a = Parameter(name='a', value=2.0, unit='m', min=0, max=10) + b = Parameter(name='b', value=3.0, unit='m', min=0, max=10) c = Parameter.from_dependency( - name="c", - dependency_expression="a + b", - dependency_map={"a": a, "b": b}, - unit="m", + name='c', + dependency_expression='a + b', + dependency_map={'a': a, 'b': b}, + unit='m', ) # Verify original dependency works assert c.value == 5.0 # 2 + 3 # Serialize all parameters - params_data = {"a": a.as_dict(), "b": b.as_dict(), "c": c.as_dict()} + params_data = {'a': a.as_dict(), 'b': b.as_dict(), 'c': c.as_dict()} # Clear and deserialize (manual approach) global_object.map._clear() @@ -119,8 +115,8 @@ def test_dependency_resolution_after_deserialization(self, clear_global_map): new_params[name] = Parameter.from_dict(data) # Before resolution, c should be independent with pending dependency - assert new_params["c"].independent is True - assert hasattr(new_params["c"], "_pending_dependency_string") + assert new_params['c'].independent is True + assert hasattr(new_params['c'], '_pending_dependency_string') # Resolve dependencies resolve_all_parameter_dependencies(new_params) @@ -130,34 +126,32 @@ def test_dependency_resolution_after_deserialization(self, clear_global_map): # new_params = deserialize_and_resolve_parameters(params_data) # After resolution, c should be dependent and functional - assert new_params["c"].independent is False - assert new_params["c"].value == 5.0 # Still 2 + 3 + assert new_params['c'].independent is False + assert new_params['c'].value == 5.0 # Still 2 + 3 # Test that dependency still works - new_params["a"].value = 10.0 - assert new_params["c"].value == 13.0 # 10 + 3 + new_params['a'].value = 10.0 + assert new_params['c'].value == 13.0 # 10 + 3 - def test_dependency_resolution_after_deserialization_desired_unit( - self, clear_global_map - ): + def test_dependency_resolution_after_deserialization_desired_unit(self, clear_global_map): """Test that dependencies are properly resolved after deserialization.""" # Create test parameters with dependencies - a = Parameter(name="a", value=2.0, unit="m", min=0, max=10) - b = Parameter(name="b", value=3.0, unit="m", min=0, max=10) + a = Parameter(name='a', value=2.0, unit='m', min=0, max=10) + b = Parameter(name='b', value=3.0, unit='m', min=0, max=10) c = Parameter.from_dependency( - name="c", - dependency_expression="a + b", - dependency_map={"a": a, "b": b}, - desired_unit="cm", + name='c', + dependency_expression='a + b', + dependency_map={'a': a, 'b': b}, + desired_unit='cm', ) # Verify original dependency works assert c.value == 5.0 * 100 # 2 + 3 - assert c.unit == "cm" + assert c.unit == 'cm' # Serialize all parameters - params_data = {"a": a.as_dict(), "b": b.as_dict(), "c": c.as_dict()} + params_data = {'a': a.as_dict(), 'b': b.as_dict(), 'c': c.as_dict()} # Clear and deserialize (manual approach) global_object.map._clear() @@ -166,8 +160,8 @@ def test_dependency_resolution_after_deserialization_desired_unit( new_params[name] = Parameter.from_dict(data) # Before resolution, c should be independent with pending dependency - assert new_params["c"].independent is True - assert hasattr(new_params["c"], "_pending_dependency_string") + assert new_params['c'].independent is True + assert hasattr(new_params['c'], '_pending_dependency_string') # Resolve dependencies resolve_all_parameter_dependencies(new_params) @@ -177,24 +171,24 @@ def test_dependency_resolution_after_deserialization_desired_unit( # new_params = deserialize_and_resolve_parameters(params_data) # After resolution, c should be dependent and functional - assert new_params["c"].independent is False - assert new_params["c"]._desired_unit == "cm" # Desired unit should be preserved - assert new_params["c"].value == 5.0 * 100 # Still 2 + 3, converted to cm + assert new_params['c'].independent is False + assert new_params['c']._desired_unit == 'cm' # Desired unit should be preserved + assert new_params['c'].value == 5.0 * 100 # Still 2 + 3, converted to cm # Test that dependency still works - new_params["a"].value = 10.0 - assert new_params["c"].value == 13.0 * 100 # 10 + 3 - assert new_params["c"].unit == "cm" + new_params['a'].value = 10.0 + assert new_params['c'].value == 13.0 * 100 # 10 + 3 + assert new_params['c'].unit == 'cm' def test_unique_name_dependency_serialization(self, clear_global_map): """Test serialization of dependencies using unique names.""" - a = Parameter(name="a", value=3.0, unit="m", min=0, max=10) + a = Parameter(name='a', value=3.0, unit='m', min=0, max=10) # Create dependent parameter using unique name b = Parameter.from_dependency( - name="b", + name='b', dependency_expression='2 * "Parameter_0"', # Using unique name - unit="m", + unit='m', ) # Serialize both parameters @@ -202,26 +196,26 @@ def test_unique_name_dependency_serialization(self, clear_global_map): b_serialized = b.as_dict() # Should contain unique name mapping - assert b_serialized["_dependency_string"] == "2 * __Parameter_0__" - assert "__Parameter_0__" in b_serialized["_dependency_map_serializer_ids"] + assert b_serialized['_dependency_string'] == '2 * __Parameter_0__' + assert '__Parameter_0__' in b_serialized['_dependency_map_serializer_ids'] assert ( - b_serialized["_dependency_map_serializer_ids"]["__Parameter_0__"] + b_serialized['_dependency_map_serializer_ids']['__Parameter_0__'] == a._DescriptorNumber__serializer_id ) # Deserialize both and resolve global_object.map._clear() c = Parameter( - name="c", value=0.0 + name='c', value=0.0 ) # Dummy to occupy unique name, to force new unique_names # Remove unique_name from serialized data to force generation of new unique names - a_serialized.pop("unique_name", None) - b_serialized.pop("unique_name", None) + a_serialized.pop('unique_name', None) + b_serialized.pop('unique_name', None) new_b = Parameter.from_dict(b_serialized) new_a = Parameter.from_dict(a_serialized) - resolve_all_parameter_dependencies({"a": new_a, "b": new_b}) + resolve_all_parameter_dependencies({'a': new_a, 'b': new_b}) # Should work correctly assert new_b.independent is False @@ -231,21 +225,21 @@ def test_unique_name_dependency_serialization(self, clear_global_map): def test_json_serialization_roundtrip(self, clear_global_map): """Test that parameter dependencies survive JSON serialization.""" # Create parameters with dependencies - length = Parameter(name="length", value=10.0, unit="m", min=0, max=100) - width = Parameter(name="width", value=5.0, unit="m", min=0, max=50) + length = Parameter(name='length', value=10.0, unit='m', min=0, max=100) + width = Parameter(name='width', value=5.0, unit='m', min=0, max=50) area = Parameter.from_dependency( - name="area", - dependency_expression="length * width", - dependency_map={"length": length, "width": width}, - unit="m^2", + name='area', + dependency_expression='length * width', + dependency_map={'length': length, 'width': width}, + unit='m^2', ) # Serialize to JSON params_data = { - "length": length.as_dict(), - "width": width.as_dict(), - "area": area.as_dict(), + 'length': length.as_dict(), + 'width': width.as_dict(), + 'area': area.as_dict(), } json_str = json.dumps(params_data, default=str) @@ -260,26 +254,26 @@ def test_json_serialization_roundtrip(self, clear_global_map): resolve_all_parameter_dependencies(new_params) # Test functionality - assert new_params["area"].value == 50.0 # 10 * 5 + assert new_params['area'].value == 50.0 # 10 * 5 # Test dependency updates - new_params["length"].value = 20.0 - assert new_params["area"].value == 100.0 # 20 * 5 + new_params['length'].value = 20.0 + assert new_params['area'].value == 100.0 # 20 * 5 def test_multiple_dependent_parameters(self, clear_global_map): """Test serialization with multiple dependent parameters.""" # Create a chain of dependencies - x = Parameter(name="x", value=2.0, unit="m", min=0, max=10) + x = Parameter(name='x', value=2.0, unit='m', min=0, max=10) y = Parameter.from_dependency( - name="y", dependency_expression="2 * x", dependency_map={"x": x}, unit="m" + name='y', dependency_expression='2 * x', dependency_map={'x': x}, unit='m' ) z = Parameter.from_dependency( - name="z", - dependency_expression="y + x", - dependency_map={"y": y, "x": x}, - unit="m", + name='z', + dependency_expression='y + x', + dependency_map={'y': y, 'x': x}, + unit='m', ) # Verify original chain works @@ -287,7 +281,7 @@ def test_multiple_dependent_parameters(self, clear_global_map): assert z.value == 6.0 # 4 + 2 # Serialize all - params_data = {"x": x.as_dict(), "y": y.as_dict(), "z": z.as_dict()} + params_data = {'x': x.as_dict(), 'y': y.as_dict(), 'z': z.as_dict()} # Deserialize and resolve global_object.map._clear() @@ -298,13 +292,13 @@ def test_multiple_dependent_parameters(self, clear_global_map): resolve_all_parameter_dependencies(new_params) # Test chain still works - assert new_params["y"].value == 4.0 - assert new_params["z"].value == 6.0 + assert new_params['y'].value == 4.0 + assert new_params['z'].value == 6.0 # Test cascade updates - new_params["x"].value = 5.0 - assert new_params["y"].value == 10.0 # 2 * 5 - assert new_params["z"].value == 15.0 # 10 + 5 + new_params['x'].value = 5.0 + assert new_params['y'].value == 10.0 # 2 * 5 + assert new_params['z'].value == 15.0 # 10 + 5 def test_dependency_with_descriptor_number(self, clear_global_map): """Test that dependencies involving DescriptorNumber serialize correctly.""" @@ -312,12 +306,12 @@ def test_dependency_with_descriptor_number(self, clear_global_map): # When - x = DescriptorNumber(name="x", value=3.0, unit="m") - y = Parameter(name="y", value=4.0, unit="m") + x = DescriptorNumber(name='x', value=3.0, unit='m') + y = Parameter(name='y', value=4.0, unit='m') z = Parameter.from_dependency( - name="z", - dependency_expression="x + y", - dependency_map={"x": x, "y": y}, + name='z', + dependency_expression='x + y', + dependency_map={'x': x, 'y': y}, ) # Verify original functionality @@ -325,12 +319,12 @@ def test_dependency_with_descriptor_number(self, clear_global_map): # Then # Serialize all - params_data = {"x": x.as_dict(), "y": y.as_dict(), "z": z.as_dict()} + params_data = {'x': x.as_dict(), 'y': y.as_dict(), 'z': z.as_dict()} # Deserialize and resolve global_object.map._clear() new_params = {} for name, data in params_data.items(): - if name == "x": + if name == 'x': new_params[name] = DescriptorNumber.from_dict(data) else: new_params[name] = Parameter.from_dict(data) @@ -339,24 +333,24 @@ def test_dependency_with_descriptor_number(self, clear_global_map): # Expect # Test that functionality still works - assert new_params["z"].value == 7.0 # 3 + 4 - new_x = new_params["x"] - new_y = new_params["y"] + assert new_params['z'].value == 7.0 # 3 + 4 + new_x = new_params['x'] + new_y = new_params['y'] new_x.value = 4.0 - assert new_params["z"].value == 8.0 # 4 + 4 + assert new_params['z'].value == 8.0 # 4 + 4 new_y.value = 6.0 - assert new_params["z"].value == 10.0 # 4 + 6 + assert new_params['z'].value == 10.0 # 4 + 6 def test_get_parameters_with_pending_dependencies(self, clear_global_map): """Test utility function for finding parameters with pending dependencies.""" # Create parameters - a = Parameter(name="a", value=1.0, unit="m") + a = Parameter(name='a', value=1.0, unit='m') b = Parameter.from_dependency( - name="b", dependency_expression="2 * a", dependency_map={"a": a}, unit="m" + name='b', dependency_expression='2 * a', dependency_map={'a': a}, unit='m' ) # Serialize and deserialize - params_data = {"a": a.as_dict(), "b": b.as_dict()} + params_data = {'a': a.as_dict(), 'b': b.as_dict()} global_object.map._clear() new_params = {} for name, data in params_data.items(): @@ -366,8 +360,8 @@ def test_get_parameters_with_pending_dependencies(self, clear_global_map): pending = get_parameters_with_pending_dependencies(new_params) assert len(pending) == 1 - assert pending[0].name == "b" - assert hasattr(pending[0], "_pending_dependency_string") + assert pending[0].name == 'b' + assert hasattr(pending[0], '_pending_dependency_string') # After resolution, should be empty resolve_all_parameter_dependencies(new_params) @@ -376,9 +370,9 @@ def test_get_parameters_with_pending_dependencies(self, clear_global_map): def test_error_handling_missing_dependency(self, clear_global_map): """Test error handling when dependency cannot be resolved.""" - a = Parameter(name="a", value=1.0, unit="m") + a = Parameter(name='a', value=1.0, unit='m') b = Parameter.from_dependency( - name="b", dependency_expression="2 * a", dependency_map={"a": a}, unit="m" + name='b', dependency_expression='2 * a', dependency_map={'a': a}, unit='m' ) # Serialize b but not a @@ -389,9 +383,7 @@ def test_error_handling_missing_dependency(self, clear_global_map): new_b = Parameter.from_dict(b_data) # Should raise error when trying to resolve - with pytest.raises( - ValueError, match="Cannot find parameter with serializer_id" - ): + with pytest.raises(ValueError, match='Cannot find parameter with serializer_id'): new_b.resolve_pending_dependencies() def test_backward_compatibility_base_deserializer(self, clear_global_map): @@ -399,9 +391,9 @@ def test_backward_compatibility_base_deserializer(self, clear_global_map): from easyscience.io.serializer_dict import SerializerDict # Create dependent parameter - a = Parameter(name="a", value=2.0, unit="m") + a = Parameter(name='a', value=2.0, unit='m') b = Parameter.from_dependency( - name="b", dependency_expression="3 * a", dependency_map={"a": a}, unit="m" + name='b', dependency_expression='3 * a', dependency_map={'a': a}, unit='m' ) # Use base serializer path (SerializerDict.decode) @@ -413,31 +405,31 @@ def test_backward_compatibility_base_deserializer(self, clear_global_map): # Should be a valid Parameter (but without dependency resolution) assert isinstance(deserialized, Parameter) - assert deserialized.name == "b" + assert deserialized.name == 'b' assert deserialized.independent is True # Base path doesn't handle dependencies @pytest.mark.parametrize( - "order", - [["x", "y", "z"], ["z", "x", "y"], ["y", "z", "x"], ["z", "y", "x"]], + 'order', + [['x', 'y', 'z'], ['z', 'x', 'y'], ['y', 'z', 'x'], ['z', 'y', 'x']], ids=[ - "normal_order", - "dependent_first", - "mixed_order", - "dependent_first_reverse", + 'normal_order', + 'dependent_first', + 'mixed_order', + 'dependent_first_reverse', ], ) def test_serializer_id_system_order_independence(self, clear_global_map, order): """Test that dependency IDs allow parameters to be loaded in any order.""" # WHEN # Create parameters with dependencies - x = Parameter(name="x", value=5.0, unit="m", min=0, max=20) - y = Parameter(name="y", value=10.0, unit="m", min=0, max=30) + x = Parameter(name='x', value=5.0, unit='m', min=0, max=20) + y = Parameter(name='y', value=10.0, unit='m', min=0, max=30) z = Parameter.from_dependency( - name="z", - dependency_expression="x * y", - dependency_map={"x": x, "y": y}, - unit="m^2", + name='z', + dependency_expression='x * y', + dependency_map={'x': x, 'y': y}, + unit='m^2', ) # Verify original functionality @@ -448,13 +440,13 @@ def test_serializer_id_system_order_independence(self, clear_global_map, order): y_dep_id = y._DescriptorNumber__serializer_id # Serialize all parameters - params_data = {"x": x.as_dict(), "y": y.as_dict(), "z": z.as_dict()} + params_data = {'x': x.as_dict(), 'y': y.as_dict(), 'z': z.as_dict()} # Verify dependency IDs are in serialized data - assert params_data["x"]["__serializer_id"] == x_dep_id - assert params_data["y"]["__serializer_id"] == y_dep_id - assert "__serializer_id" not in params_data["z"] - assert "_dependency_map_serializer_ids" in params_data["z"] + assert params_data['x']['__serializer_id'] == x_dep_id + assert params_data['y']['__serializer_id'] == y_dep_id + assert '__serializer_id' not in params_data['z'] + assert '_dependency_map_serializer_ids' in params_data['z'] # THEN global_object.map._clear() @@ -466,41 +458,41 @@ def test_serializer_id_system_order_independence(self, clear_global_map, order): # EXPECT # Verify dependency IDs are preserved - assert new_params["x"]._DescriptorNumber__serializer_id == x_dep_id - assert new_params["y"]._DescriptorNumber__serializer_id == y_dep_id + assert new_params['x']._DescriptorNumber__serializer_id == x_dep_id + assert new_params['y']._DescriptorNumber__serializer_id == y_dep_id # Resolve dependencies resolve_all_parameter_dependencies(new_params) # Verify functionality regardless of loading order - assert new_params["z"].independent is False - assert new_params["z"].value == 50.0 + assert new_params['z'].independent is False + assert new_params['z'].value == 50.0 # Test dependency updates still work - new_params["x"].value = 6.0 - assert new_params["z"].value == 60.0 # 6 * 10 + new_params['x'].value = 6.0 + assert new_params['z'].value == 60.0 # 6 * 10 - new_params["y"].value = 8.0 - assert new_params["z"].value == 48.0 # 6 * 8 + new_params['y'].value = 8.0 + assert new_params['z'].value == 48.0 # 6 * 8 def test_deserialize_and_resolve_parameters_helper(self, clear_global_map): """Test the convenience helper function for deserialization and dependency resolution.""" # Create test parameters with dependencies - a = Parameter(name="a", value=2.0, unit="m", min=0, max=10) - b = Parameter(name="b", value=3.0, unit="m", min=0, max=10) + a = Parameter(name='a', value=2.0, unit='m', min=0, max=10) + b = Parameter(name='b', value=3.0, unit='m', min=0, max=10) c = Parameter.from_dependency( - name="c", - dependency_expression="a + b", - dependency_map={"a": a, "b": b}, - unit="m", + name='c', + dependency_expression='a + b', + dependency_map={'a': a, 'b': b}, + unit='m', ) # Verify original dependency works assert c.value == 5.0 # 2 + 3 # Serialize all parameters - params_data = {"a": a.as_dict(), "b": b.as_dict(), "c": c.as_dict()} + params_data = {'a': a.as_dict(), 'b': b.as_dict(), 'c': c.as_dict()} # Clear global map global_object.map._clear() @@ -510,27 +502,27 @@ def test_deserialize_and_resolve_parameters_helper(self, clear_global_map): # Verify all parameters are correctly deserialized and dependencies resolved assert len(new_params) == 3 - assert "a" in new_params - assert "b" in new_params - assert "c" in new_params + assert 'a' in new_params + assert 'b' in new_params + assert 'c' in new_params # Check that independent parameters work - assert new_params["a"].name == "a" - assert new_params["a"].value == 2.0 - assert new_params["a"].independent is True + assert new_params['a'].name == 'a' + assert new_params['a'].value == 2.0 + assert new_params['a'].independent is True - assert new_params["b"].name == "b" - assert new_params["b"].value == 3.0 - assert new_params["b"].independent is True + assert new_params['b'].name == 'b' + assert new_params['b'].value == 3.0 + assert new_params['b'].independent is True # Check that dependent parameter is properly resolved - assert new_params["c"].name == "c" - assert new_params["c"].value == 5.0 # 2 + 3 - assert new_params["c"].independent is False + assert new_params['c'].name == 'c' + assert new_params['c'].value == 5.0 # 2 + 3 + assert new_params['c'].independent is False # Verify dependency still works after helper function - new_params["a"].value = 10.0 - assert new_params["c"].value == 13.0 # 10 + 3 + new_params['a'].value = 10.0 + assert new_params['c'].value == 13.0 # 10 + 3 # Verify no pending dependencies remain pending = get_parameters_with_pending_dependencies(new_params) From f37375b5a369abc294aa4a6579678f8de5fae9b4 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 11:09:53 +0100 Subject: [PATCH 03/35] Move old examples to legacy/ --- {Examples => legacy/Examples}/README.rst | 0 {Examples => legacy/Examples}/base/README.rst | 0 {Examples => legacy/Examples}/base/plot_baseclass1.py | 0 {Examples => legacy/Examples}/fitting/README.rst | 0 .../PARAMETER_DEPENDENCY_SERIALIZATION.md | 0 {examples_old => legacy/examples_old}/dataset_examples.ipynb | 0 {examples_old => legacy/examples_old}/dimer_example.ipynb | 0 {examples_old => legacy/examples_old}/example1.py | 0 {examples_old => legacy/examples_old}/example1_dream.py | 0 {examples_old => legacy/examples_old}/example2.py | 0 {examples_old => legacy/examples_old}/example3.py | 0 {examples_old => legacy/examples_old}/example4.py | 0 {examples_old => legacy/examples_old}/example5_broken.py | 0 {examples_old => legacy/examples_old}/example6_broken.py | 0 {examples_old => legacy/examples_old}/example_dataset.py | 0 {examples_old => legacy/examples_old}/example_dataset2.py | 0 {examples_old => legacy/examples_old}/example_dataset2pt2.py | 0 .../examples_old}/example_dataset2pt2_broken.py | 0 {examples_old => legacy/examples_old}/example_dataset3.py | 0 {examples_old => legacy/examples_old}/example_dataset3pt2.py | 0 {examples_old => legacy/examples_old}/example_dataset4.py | 0 {examples_old => legacy/examples_old}/example_dataset4_2.py | 0 22 files changed, 0 insertions(+), 0 deletions(-) rename {Examples => legacy/Examples}/README.rst (100%) rename {Examples => legacy/Examples}/base/README.rst (100%) rename {Examples => legacy/Examples}/base/plot_baseclass1.py (100%) rename {Examples => legacy/Examples}/fitting/README.rst (100%) rename PARAMETER_DEPENDENCY_SERIALIZATION.md => legacy/PARAMETER_DEPENDENCY_SERIALIZATION.md (100%) rename {examples_old => legacy/examples_old}/dataset_examples.ipynb (100%) rename {examples_old => legacy/examples_old}/dimer_example.ipynb (100%) rename {examples_old => legacy/examples_old}/example1.py (100%) rename {examples_old => legacy/examples_old}/example1_dream.py (100%) rename {examples_old => legacy/examples_old}/example2.py (100%) rename {examples_old => legacy/examples_old}/example3.py (100%) rename {examples_old => legacy/examples_old}/example4.py (100%) rename {examples_old => legacy/examples_old}/example5_broken.py (100%) rename {examples_old => legacy/examples_old}/example6_broken.py (100%) rename {examples_old => legacy/examples_old}/example_dataset.py (100%) rename {examples_old => legacy/examples_old}/example_dataset2.py (100%) rename {examples_old => legacy/examples_old}/example_dataset2pt2.py (100%) rename {examples_old => legacy/examples_old}/example_dataset2pt2_broken.py (100%) rename {examples_old => legacy/examples_old}/example_dataset3.py (100%) rename {examples_old => legacy/examples_old}/example_dataset3pt2.py (100%) rename {examples_old => legacy/examples_old}/example_dataset4.py (100%) rename {examples_old => legacy/examples_old}/example_dataset4_2.py (100%) diff --git a/Examples/README.rst b/legacy/Examples/README.rst similarity index 100% rename from Examples/README.rst rename to legacy/Examples/README.rst diff --git a/Examples/base/README.rst b/legacy/Examples/base/README.rst similarity index 100% rename from Examples/base/README.rst rename to legacy/Examples/base/README.rst diff --git a/Examples/base/plot_baseclass1.py b/legacy/Examples/base/plot_baseclass1.py similarity index 100% rename from Examples/base/plot_baseclass1.py rename to legacy/Examples/base/plot_baseclass1.py diff --git a/Examples/fitting/README.rst b/legacy/Examples/fitting/README.rst similarity index 100% rename from Examples/fitting/README.rst rename to legacy/Examples/fitting/README.rst diff --git a/PARAMETER_DEPENDENCY_SERIALIZATION.md b/legacy/PARAMETER_DEPENDENCY_SERIALIZATION.md similarity index 100% rename from PARAMETER_DEPENDENCY_SERIALIZATION.md rename to legacy/PARAMETER_DEPENDENCY_SERIALIZATION.md diff --git a/examples_old/dataset_examples.ipynb b/legacy/examples_old/dataset_examples.ipynb similarity index 100% rename from examples_old/dataset_examples.ipynb rename to legacy/examples_old/dataset_examples.ipynb diff --git a/examples_old/dimer_example.ipynb b/legacy/examples_old/dimer_example.ipynb similarity index 100% rename from examples_old/dimer_example.ipynb rename to legacy/examples_old/dimer_example.ipynb diff --git a/examples_old/example1.py b/legacy/examples_old/example1.py similarity index 100% rename from examples_old/example1.py rename to legacy/examples_old/example1.py diff --git a/examples_old/example1_dream.py b/legacy/examples_old/example1_dream.py similarity index 100% rename from examples_old/example1_dream.py rename to legacy/examples_old/example1_dream.py diff --git a/examples_old/example2.py b/legacy/examples_old/example2.py similarity index 100% rename from examples_old/example2.py rename to legacy/examples_old/example2.py diff --git a/examples_old/example3.py b/legacy/examples_old/example3.py similarity index 100% rename from examples_old/example3.py rename to legacy/examples_old/example3.py diff --git a/examples_old/example4.py b/legacy/examples_old/example4.py similarity index 100% rename from examples_old/example4.py rename to legacy/examples_old/example4.py diff --git a/examples_old/example5_broken.py b/legacy/examples_old/example5_broken.py similarity index 100% rename from examples_old/example5_broken.py rename to legacy/examples_old/example5_broken.py diff --git a/examples_old/example6_broken.py b/legacy/examples_old/example6_broken.py similarity index 100% rename from examples_old/example6_broken.py rename to legacy/examples_old/example6_broken.py diff --git a/examples_old/example_dataset.py b/legacy/examples_old/example_dataset.py similarity index 100% rename from examples_old/example_dataset.py rename to legacy/examples_old/example_dataset.py diff --git a/examples_old/example_dataset2.py b/legacy/examples_old/example_dataset2.py similarity index 100% rename from examples_old/example_dataset2.py rename to legacy/examples_old/example_dataset2.py diff --git a/examples_old/example_dataset2pt2.py b/legacy/examples_old/example_dataset2pt2.py similarity index 100% rename from examples_old/example_dataset2pt2.py rename to legacy/examples_old/example_dataset2pt2.py diff --git a/examples_old/example_dataset2pt2_broken.py b/legacy/examples_old/example_dataset2pt2_broken.py similarity index 100% rename from examples_old/example_dataset2pt2_broken.py rename to legacy/examples_old/example_dataset2pt2_broken.py diff --git a/examples_old/example_dataset3.py b/legacy/examples_old/example_dataset3.py similarity index 100% rename from examples_old/example_dataset3.py rename to legacy/examples_old/example_dataset3.py diff --git a/examples_old/example_dataset3pt2.py b/legacy/examples_old/example_dataset3pt2.py similarity index 100% rename from examples_old/example_dataset3pt2.py rename to legacy/examples_old/example_dataset3pt2.py diff --git a/examples_old/example_dataset4.py b/legacy/examples_old/example_dataset4.py similarity index 100% rename from examples_old/example_dataset4.py rename to legacy/examples_old/example_dataset4.py diff --git a/examples_old/example_dataset4_2.py b/legacy/examples_old/example_dataset4_2.py similarity index 100% rename from examples_old/example_dataset4_2.py rename to legacy/examples_old/example_dataset4_2.py From f3d335003b0e9b81ac6b9c32b893243a9ededc23 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 11:35:49 +0100 Subject: [PATCH 04/35] Add back package init. Switch to importlib version --- src/easyscience/__init__.py | 31 +++++++++++++++++++--- tests/unit/base_classes/__init__.py | 2 ++ tests/unit/fitting/__init__.py | 2 ++ tests/unit/fitting/calculators/__init__.py | 2 ++ tests/unit/fitting/minimizers/__init__.py | 2 ++ tests/unit/global_object/__init__.py | 2 ++ tests/unit/io/__init__.py | 2 ++ tests/unit/legacy/__init__.py | 2 ++ tests/unit/models/__init__.py | 2 ++ tests/unit/variable/__init__.py | 2 ++ 10 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 tests/unit/base_classes/__init__.py create mode 100644 tests/unit/fitting/__init__.py create mode 100644 tests/unit/fitting/calculators/__init__.py create mode 100644 tests/unit/fitting/minimizers/__init__.py create mode 100644 tests/unit/global_object/__init__.py create mode 100644 tests/unit/io/__init__.py create mode 100644 tests/unit/legacy/__init__.py create mode 100644 tests/unit/models/__init__.py create mode 100644 tests/unit/variable/__init__.py diff --git a/src/easyscience/__init__.py b/src/easyscience/__init__.py index 38011c18..b1ca8a18 100644 --- a/src/easyscience/__init__.py +++ b/src/easyscience/__init__.py @@ -1,3 +1,28 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause -"""EasyScience library.""" +from importlib.metadata import version + +from .global_object import GlobalObject + +# Must be executed before any other imports +global_object = GlobalObject() +global_object.instantiate_stack() +global_object.stack.enabled = False + + +from .base_classes import ObjBase # noqa: E402 +from .fitting import AvailableMinimizers # noqa: E402 +from .fitting import Fitter # noqa: E402 +from .variable import DescriptorNumber # noqa: E402 +from .variable import Parameter # noqa: E402 + + +__version__ = version('easyscience') + +__all__ = [ + __version__, + global_object, + ObjBase, + AvailableMinimizers, + Fitter, + DescriptorNumber, + Parameter, +] diff --git a/tests/unit/base_classes/__init__.py b/tests/unit/base_classes/__init__.py new file mode 100644 index 00000000..8a2c8a73 --- /dev/null +++ b/tests/unit/base_classes/__init__.py @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause diff --git a/tests/unit/fitting/__init__.py b/tests/unit/fitting/__init__.py new file mode 100644 index 00000000..8a2c8a73 --- /dev/null +++ b/tests/unit/fitting/__init__.py @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause diff --git a/tests/unit/fitting/calculators/__init__.py b/tests/unit/fitting/calculators/__init__.py new file mode 100644 index 00000000..8a2c8a73 --- /dev/null +++ b/tests/unit/fitting/calculators/__init__.py @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause diff --git a/tests/unit/fitting/minimizers/__init__.py b/tests/unit/fitting/minimizers/__init__.py new file mode 100644 index 00000000..8a2c8a73 --- /dev/null +++ b/tests/unit/fitting/minimizers/__init__.py @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause diff --git a/tests/unit/global_object/__init__.py b/tests/unit/global_object/__init__.py new file mode 100644 index 00000000..8a2c8a73 --- /dev/null +++ b/tests/unit/global_object/__init__.py @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause diff --git a/tests/unit/io/__init__.py b/tests/unit/io/__init__.py new file mode 100644 index 00000000..8a2c8a73 --- /dev/null +++ b/tests/unit/io/__init__.py @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause diff --git a/tests/unit/legacy/__init__.py b/tests/unit/legacy/__init__.py new file mode 100644 index 00000000..8a2c8a73 --- /dev/null +++ b/tests/unit/legacy/__init__.py @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause diff --git a/tests/unit/models/__init__.py b/tests/unit/models/__init__.py new file mode 100644 index 00000000..8a2c8a73 --- /dev/null +++ b/tests/unit/models/__init__.py @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause diff --git a/tests/unit/variable/__init__.py b/tests/unit/variable/__init__.py new file mode 100644 index 00000000..8a2c8a73 --- /dev/null +++ b/tests/unit/variable/__init__.py @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause From 0ee0facbb72fd3389712500fb9d1795f1ee8b9bb Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 11:40:31 +0100 Subject: [PATCH 05/35] Remove io package initializer (fixes 'visualization' is not defined) --- tests/unit/io/__init__.py | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 tests/unit/io/__init__.py diff --git a/tests/unit/io/__init__.py b/tests/unit/io/__init__.py deleted file mode 100644 index 8a2c8a73..00000000 --- a/tests/unit/io/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause From 0da0120c17b07e0ca291cb01ef00311e01875e74 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 11:42:06 +0100 Subject: [PATCH 06/35] Fix spdx header --- src/easyscience/__init__.py | 3 +++ src/easyscience/base_classes/based_base.py | 2 +- src/easyscience/base_classes/collection_base.py | 2 -- src/easyscience/base_classes/easy_list.py | 2 -- src/easyscience/base_classes/model_base.py | 2 +- src/easyscience/base_classes/new_base.py | 2 +- src/easyscience/base_classes/obj_base.py | 2 +- src/easyscience/fitting/calculators/__init__.py | 2 -- src/easyscience/fitting/calculators/interface_factory.py | 2 +- src/easyscience/fitting/fitter.py | 1 - src/easyscience/fitting/minimizers/__init__.py | 2 -- src/easyscience/fitting/minimizers/minimizer_base.py | 2 -- src/easyscience/fitting/minimizers/minimizer_bumps.py | 2 -- src/easyscience/fitting/minimizers/minimizer_dfo.py | 2 -- src/easyscience/fitting/minimizers/minimizer_lmfit.py | 3 --- src/easyscience/fitting/multi_fitter.py | 1 - src/easyscience/global_object/global_object.py | 2 -- src/easyscience/global_object/hugger/__init__.py | 1 - src/easyscience/global_object/hugger/hugger.py | 2 -- src/easyscience/global_object/hugger/property.py | 2 -- src/easyscience/global_object/logger.py | 2 -- src/easyscience/global_object/map.py | 2 -- src/easyscience/global_object/undo_redo.py | 2 -- src/easyscience/io/__init__.py | 1 - src/easyscience/io/serializer_base.py | 2 -- src/easyscience/io/serializer_component.py | 2 -- src/easyscience/io/serializer_dict.py | 1 - src/easyscience/job/__init__.py | 2 -- src/easyscience/job/analysis.py | 1 - src/easyscience/job/experiment.py | 3 --- src/easyscience/job/job.py | 2 -- src/easyscience/job/theoreticalmodel.py | 3 --- src/easyscience/legacy/dict.py | 1 - src/easyscience/legacy/json.py | 2 -- src/easyscience/legacy/legacy_core.py | 2 -- src/easyscience/legacy/xml.py | 2 -- src/easyscience/models/__init__.py | 2 -- src/easyscience/models/polynomial.py | 3 --- src/easyscience/utils/__init__.py | 1 - src/easyscience/utils/classTools.py | 2 -- src/easyscience/utils/classUtils.py | 2 -- src/easyscience/utils/decorators.py | 2 -- src/easyscience/utils/string.py | 2 -- src/easyscience/variable/descriptor_base.py | 2 -- src/easyscience/variable/parameter.py | 2 -- src/easyscience/variable/parameter_dependency_resolver.py | 2 -- tests/integration/fitting/test_fitter.py | 2 -- tests/integration/fitting/test_multi_fitter.py | 2 -- tests/unit/base_classes/__init__.py | 1 + tests/unit/base_classes/test_collection_base.py | 2 -- tests/unit/base_classes/test_easy_list.py | 2 -- tests/unit/base_classes/test_model_base.py | 2 -- tests/unit/base_classes/test_new_base.py | 2 -- tests/unit/base_classes/test_obj_base.py | 2 -- tests/unit/fitting/__init__.py | 1 + tests/unit/fitting/calculators/__init__.py | 1 + tests/unit/fitting/calculators/test_interface_factory.py | 2 -- tests/unit/fitting/minimizers/__init__.py | 1 + tests/unit/global_object/__init__.py | 1 + tests/unit/global_object/test_entry_list_comprehensive.py | 2 -- tests/unit/global_object/test_global_object.py | 1 - tests/unit/global_object/test_integration_comprehensive.py | 2 -- tests/unit/global_object/test_map.py | 2 -- tests/unit/global_object/test_undo_redo.py | 2 -- tests/unit/global_object/test_undo_redo_comprehensive.py | 2 -- tests/unit/io/test_serializer_base.py | 1 - tests/unit/legacy/__init__.py | 1 + tests/unit/models/__init__.py | 1 + tests/unit/variable/__init__.py | 1 + tests/unit/variable/test_descriptor_array.py | 1 - tests/unit/variable/test_descriptor_number.py | 1 - 71 files changed, 16 insertions(+), 111 deletions(-) diff --git a/src/easyscience/__init__.py b/src/easyscience/__init__.py index b1ca8a18..8d4a3cbe 100644 --- a/src/easyscience/__init__.py +++ b/src/easyscience/__init__.py @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-License-Identifier: BSD-3-Clause + from importlib.metadata import version from .global_object import GlobalObject diff --git a/src/easyscience/base_classes/based_base.py b/src/easyscience/base_classes/based_base.py index 44cbcdf7..74a277e1 100644 --- a/src/easyscience/base_classes/based_base.py +++ b/src/easyscience/base_classes/based_base.py @@ -3,7 +3,7 @@ from __future__ import annotations -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/base_classes/test_collection_base.py b/tests/unit/base_classes/test_collection_base.py index c2895e44..bc96e4ca 100644 --- a/tests/unit/base_classes/test_collection_base.py +++ b/tests/unit/base_classes/test_collection_base.py @@ -1,8 +1,6 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/fitting/calculators/__init__.py b/tests/unit/fitting/calculators/__init__.py index 8a2c8a73..bd0ee891 100644 --- a/tests/unit/fitting/calculators/__init__.py +++ b/tests/unit/fitting/calculators/__init__.py @@ -1,2 +1,3 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/fitting/calculators/test_interface_factory.py b/tests/unit/fitting/calculators/test_interface_factory.py index cffd7cbf..37d93091 100644 --- a/tests/unit/fitting/calculators/test_interface_factory.py +++ b/tests/unit/fitting/calculators/test_interface_factory.py @@ -1,8 +1,6 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/global_object/__init__.py b/tests/unit/global_object/__init__.py index 8a2c8a73..bd0ee891 100644 --- a/tests/unit/global_object/__init__.py +++ b/tests/unit/global_object/__init__.py @@ -1,2 +1,3 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/global_object/test_entry_list_comprehensive.py b/tests/unit/global_object/test_entry_list_comprehensive.py index a8bc4e55..54b8f49c 100644 --- a/tests/unit/global_object/test_entry_list_comprehensive.py +++ b/tests/unit/global_object/test_entry_list_comprehensive.py @@ -1,8 +1,6 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause - import pytest from easyscience import Parameter diff --git a/tests/unit/global_object/test_integration_comprehensive.py b/tests/unit/global_object/test_integration_comprehensive.py index 186fb51d..d2c3d57d 100644 --- a/tests/unit/global_object/test_integration_comprehensive.py +++ b/tests/unit/global_object/test_integration_comprehensive.py @@ -1,8 +1,6 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyScience project # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/models/__init__.py b/tests/unit/models/__init__.py index 8a2c8a73..bd0ee891 100644 --- a/tests/unit/models/__init__.py +++ b/tests/unit/models/__init__.py @@ -1,2 +1,3 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/variable/__init__.py b/tests/unit/variable/__init__.py index 8a2c8a73..bd0ee891 100644 --- a/tests/unit/variable/__init__.py +++ b/tests/unit/variable/__init__.py @@ -1,2 +1,3 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/variable/test_descriptor_array.py b/tests/unit/variable/test_descriptor_array.py index c0e6872e..1426a6ba 100644 --- a/tests/unit/variable/test_descriptor_array.py +++ b/tests/unit/variable/test_descriptor_array.py @@ -1,7 +1,6 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause - import numpy as np import pytest import scipp as sc diff --git a/tests/unit/variable/test_descriptor_number.py b/tests/unit/variable/test_descriptor_number.py index 0561052d..c7085774 100644 --- a/tests/unit/variable/test_descriptor_number.py +++ b/tests/unit/variable/test_descriptor_number.py @@ -1,7 +1,6 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause - import pytest import scipp as sc from scipp import UnitError From 5a2d2dc7eefa3c161af8586a9c37840de7aa7940 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 11:47:54 +0100 Subject: [PATCH 07/35] Mark fitting tests as fast --- tests/integration/fitting/test_fitter.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/integration/fitting/test_fitter.py b/tests/integration/fitting/test_fitter.py index 6baf9086..6556017c 100644 --- a/tests/integration/fitting/test_fitter.py +++ b/tests/integration/fitting/test_fitter.py @@ -99,6 +99,7 @@ def check_fit_results(result, sp_sin, ref_sin, x, **kwargs): assert result.residual == pytest.approx(sp_sin(x) - y_calc_ref, abs=1e-2) +@pytest.mark.fast @pytest.mark.parametrize( 'fit_engine', [ @@ -136,6 +137,7 @@ def test_basic_fit(fit_engine: AvailableMinimizers): assert sp_sin.offset.value == pytest.approx(ref_sin.offset.value, rel=1e-3) +@pytest.mark.fast @pytest.mark.parametrize( 'fit_engine', [ @@ -177,6 +179,7 @@ def test_fit_result(fit_engine): check_fit_results(result, sp_sin, ref_sin, x, sp_ref1=sp_ref1, sp_ref2=sp_ref2) +@pytest.mark.fast @pytest.mark.parametrize( 'fit_engine', [ @@ -214,6 +217,7 @@ def test_basic_max_evaluations(fit_engine): assert 'Objective has been called MAXFUN times' in str(e) +@pytest.mark.fast @pytest.mark.parametrize( 'fit_engine,tolerance', [ @@ -247,6 +251,7 @@ def test_basic_tolerance(fit_engine, tolerance): assert sp_sin.offset.value != pytest.approx(ref_sin.offset.value, rel=1e-3) +@pytest.mark.fast @pytest.mark.parametrize('fit_method', ['leastsq', 'powell', 'cobyla']) def test_lmfit_methods(fit_method): ref_sin = AbsSin(0.2, np.pi) @@ -266,6 +271,7 @@ def test_lmfit_methods(fit_method): # @pytest.mark.xfail(reason="known bumps issue") +@pytest.mark.fast @pytest.mark.parametrize('fit_method', ['newton', 'lm']) def test_bumps_methods(fit_method): ref_sin = AbsSin(0.2, np.pi) @@ -285,6 +291,7 @@ def test_bumps_methods(fit_method): check_fit_results(result, sp_sin, ref_sin, x) +@pytest.mark.fast @pytest.mark.parametrize( 'fit_engine', [AvailableMinimizers.LMFit, AvailableMinimizers.Bumps, AvailableMinimizers.DFO], @@ -313,6 +320,7 @@ def test_dependent_parameter(fit_engine): check_fit_results(result, sp_sin, ref_sin, x) +@pytest.mark.fast @pytest.mark.parametrize( 'fit_engine', [ @@ -351,6 +359,7 @@ def test_2D_vectorized(fit_engine): assert result.residual == pytest.approx(mm(XY) - y_calc_ref, abs=1e-2) +@pytest.mark.fast @pytest.mark.parametrize( 'fit_engine', [ @@ -389,6 +398,7 @@ def test_2D_non_vectorized(fit_engine): assert result.residual == pytest.approx(mm(XY.reshape(-1, 2)) - y_calc_ref, abs=1e-2) +@pytest.mark.fast @pytest.mark.parametrize( 'fit_engine', [ @@ -430,6 +440,7 @@ def test_fixed_parameter_does_not_change(fit_engine): assert sp_sin.phase.value != pytest.approx(ref_sin.phase.value, rel=1e-3) +@pytest.mark.fast def test_fitter_new_model_base_integration(): # WHEN ground_truth = StraightLine(slope=2.0, intercept=1.0) @@ -450,6 +461,7 @@ def test_fitter_new_model_base_integration(): assert model.intercept.value == pytest.approx(ground_truth.intercept.value, rel=1e-3) +@pytest.mark.fast @pytest.mark.parametrize( 'fit_engine', [ From 44fc4925ee5de87fb9ce607441b040262a1b2f29 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 11:53:26 +0100 Subject: [PATCH 08/35] Enable some Ruff checks --- pixi.lock | 4 ++-- pyproject.toml | 14 +++++++------- src/easyscience/__init__.py | 1 - src/easyscience/base_classes/based_base.py | 1 - src/easyscience/base_classes/model_base.py | 1 - src/easyscience/base_classes/new_base.py | 1 - src/easyscience/base_classes/obj_base.py | 1 - .../fitting/calculators/interface_factory.py | 1 - src/easyscience/global_object/hugger/__init__.py | 1 - src/easyscience/utils/__init__.py | 1 - tests/unit/base_classes/__init__.py | 1 - tests/unit/fitting/__init__.py | 1 - tests/unit/fitting/calculators/__init__.py | 1 - tests/unit/fitting/minimizers/__init__.py | 1 - tests/unit/global_object/__init__.py | 1 - tests/unit/legacy/__init__.py | 1 - tests/unit/models/__init__.py | 1 - tests/unit/variable/__init__.py | 1 - 18 files changed, 9 insertions(+), 25 deletions(-) diff --git a/pixi.lock b/pixi.lock index d1d1877c..8d08ba90 100644 --- a/pixi.lock +++ b/pixi.lock @@ -4187,8 +4187,8 @@ packages: requires_python: '>=3.5' - pypi: ./ name: easyscience - version: 1.0.1+devdirty55 - sha256: e117561462f02ec76e0399569208776341c74680885a2e490922065589875515 + version: 1.0.1+devdirty62 + sha256: b1829fb54935f9a88d2e129d11680b3a52a3543d470ffd755ef4530656e8bcc7 requires_dist: - asteval - bumps diff --git a/pyproject.toml b/pyproject.toml index d0b2989d..9dc20703 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -177,10 +177,10 @@ testpaths = ['tests'] # https://docs.astral.sh/ruff/rules/ [tool.ruff] -exclude = ['tmp'] +exclude = ['legacy', 'tests'] indent-width = 4 line-length = 99 -preview = true # Enable new rules that are not yet stable, like DOC +preview = true # Enable new rules that are not yet stable, like DOC [tool.ruff.format] docstring-code-format = true # Whether to format code snippets in docstrings @@ -193,12 +193,12 @@ quote-style = 'single' # But double quotes in docstrings (PEP 8, PEP 25 [tool.ruff.lint] select = [ # 'E', # General PEP 8 style errors - # 'E9', # Runtime errors (e.g., syntax errors, undefined names) + 'E9', # Runtime errors (e.g., syntax errors, undefined names) # 'F', # Pyflakes-specific checks (e.g., unused variables, imports) - # 'F63', # Issues related to invalid escape sequences in strings - # 'F7', # Type-related errors (e.g., mismatched argument types, unsupported operations) - # 'F82', # Import-related errors (e.g., unresolved imports, reimported modules) - # 'I', # Import sorting issues (e.g., unsorted imports) + 'F63', # Issues related to invalid escape sequences in strings + 'F7', # Type-related errors (e.g., mismatched argument types, unsupported operations) + 'F82', # Import-related errors (e.g., unresolved imports, reimported modules) + 'I', # Import sorting issues (e.g., unsorted imports) # 'S', # Security-related issues (e.g., use of insecure functions or libraries) # 'W', # General PEP 8 warnings (e.g., lines too long, trailing whitespace) ] diff --git a/src/easyscience/__init__.py b/src/easyscience/__init__.py index 8d4a3cbe..29cf8b5e 100644 --- a/src/easyscience/__init__.py +++ b/src/easyscience/__init__.py @@ -17,7 +17,6 @@ from .variable import DescriptorNumber # noqa: E402 from .variable import Parameter # noqa: E402 - __version__ = version('easyscience') __all__ = [ diff --git a/src/easyscience/base_classes/based_base.py b/src/easyscience/base_classes/based_base.py index 74a277e1..64ec92b1 100644 --- a/src/easyscience/base_classes/based_base.py +++ b/src/easyscience/base_classes/based_base.py @@ -3,7 +3,6 @@ from __future__ import annotations - from inspect import signature from typing import TYPE_CHECKING from typing import Any diff --git a/src/easyscience/base_classes/model_base.py b/src/easyscience/base_classes/model_base.py index c518b6fe..701f4a68 100644 --- a/src/easyscience/base_classes/model_base.py +++ b/src/easyscience/base_classes/model_base.py @@ -3,7 +3,6 @@ from __future__ import annotations - from typing import TYPE_CHECKING from easyscience.variable.descriptor_number import DescriptorNumber diff --git a/src/easyscience/base_classes/new_base.py b/src/easyscience/base_classes/new_base.py index 9b379630..5ed69a9d 100644 --- a/src/easyscience/base_classes/new_base.py +++ b/src/easyscience/base_classes/new_base.py @@ -3,7 +3,6 @@ from __future__ import annotations - from inspect import signature from typing import TYPE_CHECKING diff --git a/src/easyscience/base_classes/obj_base.py b/src/easyscience/base_classes/obj_base.py index 51e0ca4f..31cfed99 100644 --- a/src/easyscience/base_classes/obj_base.py +++ b/src/easyscience/base_classes/obj_base.py @@ -3,7 +3,6 @@ from __future__ import annotations - from typing import TYPE_CHECKING from typing import Callable from typing import Optional diff --git a/src/easyscience/fitting/calculators/interface_factory.py b/src/easyscience/fitting/calculators/interface_factory.py index 2d4bebba..88f935bd 100644 --- a/src/easyscience/fitting/calculators/interface_factory.py +++ b/src/easyscience/fitting/calculators/interface_factory.py @@ -3,7 +3,6 @@ from __future__ import annotations - from typing import TYPE_CHECKING from typing import Callable from typing import List diff --git a/src/easyscience/global_object/hugger/__init__.py b/src/easyscience/global_object/hugger/__init__.py index bd0ee891..8a2c8a73 100644 --- a/src/easyscience/global_object/hugger/__init__.py +++ b/src/easyscience/global_object/hugger/__init__.py @@ -1,3 +1,2 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause - diff --git a/src/easyscience/utils/__init__.py b/src/easyscience/utils/__init__.py index bd0ee891..8a2c8a73 100644 --- a/src/easyscience/utils/__init__.py +++ b/src/easyscience/utils/__init__.py @@ -1,3 +1,2 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause - diff --git a/tests/unit/base_classes/__init__.py b/tests/unit/base_classes/__init__.py index bd0ee891..8a2c8a73 100644 --- a/tests/unit/base_classes/__init__.py +++ b/tests/unit/base_classes/__init__.py @@ -1,3 +1,2 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause - diff --git a/tests/unit/fitting/__init__.py b/tests/unit/fitting/__init__.py index bd0ee891..8a2c8a73 100644 --- a/tests/unit/fitting/__init__.py +++ b/tests/unit/fitting/__init__.py @@ -1,3 +1,2 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause - diff --git a/tests/unit/fitting/calculators/__init__.py b/tests/unit/fitting/calculators/__init__.py index bd0ee891..8a2c8a73 100644 --- a/tests/unit/fitting/calculators/__init__.py +++ b/tests/unit/fitting/calculators/__init__.py @@ -1,3 +1,2 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause - diff --git a/tests/unit/fitting/minimizers/__init__.py b/tests/unit/fitting/minimizers/__init__.py index bd0ee891..8a2c8a73 100644 --- a/tests/unit/fitting/minimizers/__init__.py +++ b/tests/unit/fitting/minimizers/__init__.py @@ -1,3 +1,2 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause - diff --git a/tests/unit/global_object/__init__.py b/tests/unit/global_object/__init__.py index bd0ee891..8a2c8a73 100644 --- a/tests/unit/global_object/__init__.py +++ b/tests/unit/global_object/__init__.py @@ -1,3 +1,2 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause - diff --git a/tests/unit/legacy/__init__.py b/tests/unit/legacy/__init__.py index bd0ee891..8a2c8a73 100644 --- a/tests/unit/legacy/__init__.py +++ b/tests/unit/legacy/__init__.py @@ -1,3 +1,2 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause - diff --git a/tests/unit/models/__init__.py b/tests/unit/models/__init__.py index bd0ee891..8a2c8a73 100644 --- a/tests/unit/models/__init__.py +++ b/tests/unit/models/__init__.py @@ -1,3 +1,2 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause - diff --git a/tests/unit/variable/__init__.py b/tests/unit/variable/__init__.py index bd0ee891..8a2c8a73 100644 --- a/tests/unit/variable/__init__.py +++ b/tests/unit/variable/__init__.py @@ -1,3 +1,2 @@ # SPDX-FileCopyrightText: 2021-2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause - From 2aff2b536d46648045e03fd139e1e1cd9d8b6bcf Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 12:22:00 +0100 Subject: [PATCH 09/35] Update API reference docs section --- docs/docs/api-reference/base_classes.md | 1 + docs/docs/api-reference/fitting.md | 1 + docs/docs/api-reference/global_object.md | 1 + docs/docs/api-reference/io.md | 1 + docs/docs/api-reference/job.md | 1 + docs/docs/api-reference/models.md | 1 + docs/docs/api-reference/utils.md | 1 + docs/docs/api-reference/variable.md | 1 + docs/mkdocs.yml | 8 ++++++++ 9 files changed, 16 insertions(+) create mode 100644 docs/docs/api-reference/base_classes.md create mode 100644 docs/docs/api-reference/fitting.md create mode 100644 docs/docs/api-reference/global_object.md create mode 100644 docs/docs/api-reference/io.md create mode 100644 docs/docs/api-reference/job.md create mode 100644 docs/docs/api-reference/models.md create mode 100644 docs/docs/api-reference/utils.md create mode 100644 docs/docs/api-reference/variable.md diff --git a/docs/docs/api-reference/base_classes.md b/docs/docs/api-reference/base_classes.md new file mode 100644 index 00000000..687749a2 --- /dev/null +++ b/docs/docs/api-reference/base_classes.md @@ -0,0 +1 @@ +::: easyscience.base_classes diff --git a/docs/docs/api-reference/fitting.md b/docs/docs/api-reference/fitting.md new file mode 100644 index 00000000..ca21c5e6 --- /dev/null +++ b/docs/docs/api-reference/fitting.md @@ -0,0 +1 @@ +::: easyscience.fitting diff --git a/docs/docs/api-reference/global_object.md b/docs/docs/api-reference/global_object.md new file mode 100644 index 00000000..6e6987a8 --- /dev/null +++ b/docs/docs/api-reference/global_object.md @@ -0,0 +1 @@ +::: easyscience.global_object diff --git a/docs/docs/api-reference/io.md b/docs/docs/api-reference/io.md new file mode 100644 index 00000000..f06a9356 --- /dev/null +++ b/docs/docs/api-reference/io.md @@ -0,0 +1 @@ +::: easyscience.io diff --git a/docs/docs/api-reference/job.md b/docs/docs/api-reference/job.md new file mode 100644 index 00000000..c743ba62 --- /dev/null +++ b/docs/docs/api-reference/job.md @@ -0,0 +1 @@ +::: easyscience.job diff --git a/docs/docs/api-reference/models.md b/docs/docs/api-reference/models.md new file mode 100644 index 00000000..2471f604 --- /dev/null +++ b/docs/docs/api-reference/models.md @@ -0,0 +1 @@ +::: easyscience.models diff --git a/docs/docs/api-reference/utils.md b/docs/docs/api-reference/utils.md new file mode 100644 index 00000000..d703ac5f --- /dev/null +++ b/docs/docs/api-reference/utils.md @@ -0,0 +1 @@ +::: easyscience.utils diff --git a/docs/docs/api-reference/variable.md b/docs/docs/api-reference/variable.md new file mode 100644 index 00000000..e55a4ee0 --- /dev/null +++ b/docs/docs/api-reference/variable.md @@ -0,0 +1 @@ +::: easyscience.variable diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 45e25538..bdb3f7a7 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -172,3 +172,11 @@ nav: - Dummy tutorial: tutorials/tutorial.ipynb - API Reference: - API Reference: api-reference/index.md + - base_classes: api-reference/base_classes.md + - fitting: api-reference/fitting.md + - global_object: api-reference/global_object.md + - io: api-reference/io.md + - job: api-reference/job.md + - models: api-reference/models.md + - utils: api-reference/utils.md + - variable: api-reference/variable.md From 0633a69b65d084491400708eb49687e075393e4a Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 12:35:22 +0100 Subject: [PATCH 10/35] Expand API reference index --- docs/docs/api-reference/index.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/docs/api-reference/index.md b/docs/docs/api-reference/index.md index 27b862ac..4bd6f561 100644 --- a/docs/docs/api-reference/index.md +++ b/docs/docs/api-reference/index.md @@ -6,3 +6,21 @@ icon: material/code-braces-box This section contains the reference detailing the functions and modules available in EasyScience. + +- [base_classes](base_classes.md) – Core abstract and helper base + classes used to build EasyScience objects (e.g. `ObjBase`, + `ModelBase`). +- [fitting](fitting.md) – Fitting utilities and interfaces, including + `Fitter` and available minimizers. +- [global_object](global_object.md) – Global singleton providing shared + services (logger, map, undo/redo stack, script manager). +- [io](io.md) – Serialization and deserialization framework for + persisting EasyScience objects (serializers and components). +- [job](job.md) – Job and experiment abstractions for running and + organizing analyses. +- [models](models.md) – Predefined model implementations (e.g. + polynomial models) used in fitting workflows. +- [utils](utils.md) – Miscellaneous utility functions and helpers (class + tools, decorators, type helpers). +- [variable](variable.md) – Descriptor types and variable abstractions + (e.g. `DescriptorNumber`, `Parameter`, `DescriptorArray`). From 8d12864d0a5451d91a64942ba1d7316e6d00e0bc Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 17:37:29 +0100 Subject: [PATCH 11/35] Update Copier answers to corelib metadata --- .copier-answers.yml | 8 ++++---- pixi.toml | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index f223f786..91b63f30 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,21 +1,21 @@ # WARNING: Do not edit this file manually. # Any changes will be overwritten by Copier. -_commit: v0.7.0-3-g390cc8d +_commit: v0.7.0-4-g9affb8e _src_path: gh:easyscience/templates lib_docs_url: https://easyscience.github.io/core lib_doi: 10.5281/zenodo.18163581 lib_package_name: easyscience lib_python_max: '3.13' lib_python_min: '3.11' -lib_repo_name: core +lib_repo_name: corelib project_contact_email: support@easyscience.org project_copyright_years: 2021-2026 project_extended_description: The foundation of the framework, providing reusable building blocks for scientific libraries and applications aimed at making data analysis easier -project_homepage_url: https://easyscience.github.io/core +project_homepage_url: https://easyscience.github.io/corelib project_name: EasyScience -project_repo_name: core +project_repo_name: corelib project_short_description: Core building blocks for EasyScience project_shortcut: ES project_type: lib diff --git a/pixi.toml b/pixi.toml index fa418417..870e5e4e 100644 --- a/pixi.toml +++ b/pixi.toml @@ -182,9 +182,9 @@ docs-update-assets = 'python tools/update_docs_assets.py' # 📦 Template Management Tasks ############################## -copier-copy = "copier copy gh:easyscience/templates . --data-file ../core/.copier-answers.yml --data template_type=lib" -copier-recopy = "copier recopy --data-file ../core/.copier-answers.yml --data template_type=lib" -copier-update = "copier update --data-file ../core/.copier-answers.yml --data template_type=lib" +copier-copy = "copier copy gh:easyscience/templates . --data-file ../corelib/.copier-answers.yml --data template_type=lib" +copier-recopy = "copier recopy --data-file ../corelib/.copier-answers.yml --data template_type=lib" +copier-update = "copier update --data-file ../corelib/.copier-answers.yml --data template_type=lib" ##################### # 🪝 Pre-commit Hooks From 978a6df1926946439678940c698a85bc2b245982 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 18:36:30 +0100 Subject: [PATCH 12/35] Apply updated templates --- .copier-answers.yml | 2 +- .github/workflows/lint-format.yml | 120 + .github/workflows/pypi-publish.yml | 2 +- .gitignore | 1 + CONTRIBUTING.md | 10 +- README.md | 20 +- docs/docs/installation-and-setup/index.md | 4 +- docs/docs/introduction/index.md | 13 +- docs/mkdocs.yml | 8 +- pixi.lock | 3019 ++------------------- pixi.toml | 20 +- pyproject.toml | 10 +- 12 files changed, 416 insertions(+), 2813 deletions(-) create mode 100644 .github/workflows/lint-format.yml diff --git a/.copier-answers.yml b/.copier-answers.yml index 91b63f30..c3a61ed4 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -2,7 +2,7 @@ # Any changes will be overwritten by Copier. _commit: v0.7.0-4-g9affb8e _src_path: gh:easyscience/templates -lib_docs_url: https://easyscience.github.io/core +lib_docs_url: https://easyscience.github.io/corelib lib_doi: 10.5281/zenodo.18163581 lib_package_name: easyscience lib_python_max: '3.13' diff --git a/.github/workflows/lint-format.yml b/.github/workflows/lint-format.yml new file mode 100644 index 00000000..eb819912 --- /dev/null +++ b/.github/workflows/lint-format.yml @@ -0,0 +1,120 @@ +# The workflow is divided into several steps: +# - Check the validity of pyproject.toml +# - Check code linting +# - Check code formatting +# - Check formatting of docstrings in the code +# - Check formatting of Markdown, YAML, TOML, etc. files + +name: Lint & Format checks + +on: + # Trigger the workflow on push + push: + branches-ignore: [master, main] # Already verified in PR + # Do not run this workflow on creating a new tag starting with + # 'v', e.g. 'v1.0.3' (see publish-pypi.yml) + tags-ignore: ['v*'] + # Trigger the workflow on pull request + pull_request: + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Allow only one concurrent workflow, skipping runs queued between the run +# in-progress and latest queued. And cancel in-progress runs. +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +# Set the environment variables to be used in all jobs defined in this workflow +env: + CI_BRANCH: ${{ github.head_ref || github.ref_name }} + +jobs: + lint-format: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Set up pixi + uses: ./.github/actions/setup-pixi + + - name: Run post-install developer steps + run: pixi run post-install + + # Check the validity of pyproject.toml + - name: Check validity of pyproject.toml + id: check_pyproject + continue-on-error: true + shell: bash + run: pixi run pyproject-check + + # Check code linting with Ruff in the project root + - name: Check code linting + id: check_code_linting + continue-on-error: true + shell: bash + run: pixi run py-lint-check + + # Check code formatting with Ruff in the project root + - name: Check code formatting + id: check_code_formatting + continue-on-error: true + shell: bash + run: pixi run py-format-check + + # Check formatting of docstrings in the code with docformatter + - name: Check formatting of docstrings in the code + id: check_docs_formatting + continue-on-error: true + shell: bash + run: pixi run docs-format-check + + # Check formatting of MD, YAML, TOML, etc. files with Prettier in + # the project root + - name: Check formatting of MD, YAML, TOML, etc. files + id: check_others_formatting + continue-on-error: true + shell: bash + run: pixi run nonpy-format-check + + # Check formatting of Jupyter Notebooks in the tutorials folder + - name: Prepare notebooks and check formatting + id: check_notebooks_formatting + continue-on-error: true + shell: bash + run: pixi run notebook-format-check + + # Add summary + - name: Add quality checks summary + if: always() + shell: bash + run: | + { + echo "## 🧪 Code Quality Checks Summary" + echo "" + echo "| Check | Status |" + echo "|-------|--------|" + echo "| pyproject.toml | ${{ steps.check_pyproject.outcome == 'success' && '✅' || '❌' }} |" + echo "| py lint | ${{ steps.check_code_linting.outcome == 'success' && '✅' || '❌' }} |" + echo "| py format | ${{ steps.check_code_formatting.outcome == 'success' && '✅' || '❌' }} |" + echo "| docstring format | ${{ steps.check_docs_formatting.outcome == 'success' && '✅' || '❌' }} |" + echo "| nonpy format | ${{ steps.check_others_formatting.outcome == 'success' && '✅' || '❌' }} |" + echo "| notebooks format | ${{ steps.check_notebooks_formatting.outcome == 'success' && '✅' || '❌' }} |" + } >> "$GITHUB_STEP_SUMMARY" + + # Fail job if any check failed + - name: Fail job if any check failed + if: | + steps.check_pyproject.outcome == 'failure' + || steps.check_code_linting.outcome == 'failure' + || steps.check_code_formatting.outcome == 'failure' + || steps.check_docs_formatting.outcome == 'failure' + || steps.check_others_formatting.outcome == 'failure' + || steps.check_notebooks_formatting.outcome == 'failure' + shell: bash + run: exit 1 diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/pypi-publish.yml index 95a3b394..db25546f 100644 --- a/.github/workflows/pypi-publish.yml +++ b/.github/workflows/pypi-publish.yml @@ -38,7 +38,7 @@ jobs: # https://pypi.org/manage/project/easyscience/settings/publishing/ # Use the following data: # Owner: easyscience - # Repository name: core + # Repository name: corelib # Workflow name: pypi-publish.yml - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.gitignore b/.gitignore index f7ce4ac2..6201275a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ __pycache__/ .venv/ .coverage +.pyc # PyInstaller dist/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fa245c37..42f8472b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,7 +45,7 @@ If you are not planning to modify the code, you may want to: - 🛡 Report a security issue — see [Security Issues](#12-security-issues) - 💬 Ask a question or start a discussion at - [Project Discussions](https://github.com/easyscience/core/discussions) + [Project Discussions](https://github.com/easyscience/corelib/discussions) If you plan to contribute code or documentation, continue below. @@ -83,7 +83,7 @@ strategy. If you are not a core maintainer of this repository, follow these steps. -1. Open the repository page: `https://github.com/easyscience/core` +1. Open the repository page: `https://github.com/easyscience/corelib` 2. Click the **Fork** button (top-right corner). This creates your own copy of the repository. @@ -91,14 +91,14 @@ If you are not a core maintainer of this repository, follow these steps. 3. Clone your fork locally: ```bash - git clone https://github.com//core.git - cd core + git clone https://github.com//corelib.git + cd corelib ``` 4. Add the original repository as `upstream`: ```bash - git remote add upstream https://github.com/easyscience/core.git + git remote add upstream https://github.com/easyscience/corelib.git ``` 5. Switch to the `develop` branch and update it: diff --git a/README.md b/README.md index 270f97a3..e360e0fa 100644 --- a/README.md +++ b/README.md @@ -21,26 +21,26 @@ making data analysis easier. ### 📚 For Users -- 📖 [Documentation](https://easyscience.github.io/core/latest) +- 📖 [Documentation](https://easyscience.github.io/corelib/latest) - 🚀 - [Getting Started](https://easyscience.github.io/core/latest/introduction) -- 🧪 [Tutorials](https://easyscience.github.io/core/latest/tutorials) + [Getting Started](https://easyscience.github.io/corelib/latest/introduction) +- 🧪 [Tutorials](https://easyscience.github.io/corelib/latest/tutorials) - 💬 - [Get in Touch](https://easyscience.github.io/core/latest/introduction/#get-in-touch) + [Get in Touch](https://easyscience.github.io/corelib/latest/introduction/#get-in-touch) - 🧾 - [Citation](https://easyscience.github.io/core/latest/introduction/#citation) + [Citation](https://easyscience.github.io/corelib/latest/introduction/#citation) ### 🤝 For Contributors - 🤝 - [Contributing Guide](https://github.com/easyscience/core/blob/master/CONTRIBUTING.md) + [Contributing Guide](https://github.com/easyscience/corelib/blob/master/CONTRIBUTING.md) - 🛡 [Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md) -- 🐞 [Issue Tracker](https://github.com/easyscience/core/issues) -- 💡 [Discussions](https://github.com/easyscience/core/discussions) -- 🧑‍💻 [Source Code](https://github.com/easyscience/core) +- 🐞 [Issue Tracker](https://github.com/easyscience/corelib/issues) +- 💡 [Discussions](https://github.com/easyscience/corelib/discussions) +- 🧑‍💻 [Source Code](https://github.com/easyscience/corelib) ### ⚖️ Project Information - ⚖️ - [License](https://raw.githubusercontent.com/easyscience/core/refs/heads/master/LICENSE) + [License](https://raw.githubusercontent.com/easyscience/corelib/refs/heads/master/LICENSE) diff --git a/docs/docs/installation-and-setup/index.md b/docs/docs/installation-and-setup/index.md index 64064d08..b6628fed 100644 --- a/docs/docs/installation-and-setup/index.md +++ b/docs/docs/installation-and-setup/index.md @@ -200,13 +200,13 @@ useful for testing. To install EasyScience from the `develop` branch of GitHub, for example: ```txt -pip install git+https://github.com/easyscience/core@develop +pip install git+https://github.com/easyscience/corelib@develop ``` To include extra dependencies (e.g., dev): ```txt -pip install 'easyscience[dev] @ git+https://github.com/easyscience/core@develop' +pip install 'easyscience[dev] @ git+https://github.com/easyscience/corelib@develop' ``` ## How to Run Tutorials diff --git a/docs/docs/introduction/index.md b/docs/docs/introduction/index.md index b95b6de3..b7ae6ac2 100644 --- a/docs/docs/introduction/index.md +++ b/docs/docs/introduction/index.md @@ -20,16 +20,16 @@ making data analysis easier. ## License **EasyScience** library is released under the -[BSD 3-Clause License](https://raw.githubusercontent.com/easyscience/core/master/LICENSE). +[BSD 3-Clause License](https://raw.githubusercontent.com/easyscience/corelib/master/LICENSE). ## Releases The latest version of the **EasyScience** library is -[{{ vars.release_version }}](https://github.com/easyscience/core/releases/latest). +[{{ vars.release_version }}](https://github.com/easyscience/corelib/releases/latest). For a complete list of new features, bug fixes, and improvements, see the -[GitHub Releases page](https://github.com/easyscience/core/releases). +[GitHub Releases page](https://github.com/easyscience/corelib/releases). ## Citation @@ -54,11 +54,12 @@ The project is maintained by the [European Spallation Source (ESS)](https://ess.eu). If you would like to report a bug or request a new feature, please use -the [GitHub Issue Tracker](https://github.com/easyscience/core/issues) -(A free GitHub account is required.) +the +[GitHub Issue Tracker](https://github.com/easyscience/corelib/issues) (A +free GitHub account is required.) To contribute code, documentation, or tests, please see our -[:material-account-plus: Contributing Guidelines](https://github.com/easyscience/core/blob/master/CONTRIBUTING.md) +[:material-account-plus: Contributing Guidelines](https://github.com/easyscience/corelib/blob/master/CONTRIBUTING.md) for detailed development instructions. ## Get in Touch diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index bdb3f7a7..31e1502f 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -1,9 +1,9 @@ # Project information site_name: EasyScience Library -site_url: https://easyscience.github.io/core +site_url: https://easyscience.github.io/corelib # Repository -repo_url: https://github.com/easyscience/core +repo_url: https://github.com/easyscience/corelib edit_uri: edit/develop/docs/ # Copyright @@ -62,10 +62,10 @@ extra: link: https://easyscience.org name: EasyScience Framework Webpage - icon: easyscience # File: overrides/.icons/easyscience.svg - link: https://easyscience.github.io/core + link: https://easyscience.github.io/corelib name: EasyScience Main Webpage - icon: fontawesome/brands/github # Name as in Font Awesome - link: https://github.com/easyscience/core + link: https://github.com/easyscience/corelib name: EasyScience Library Source Code on GitHub # Set custom variables to be used in Markdown and HTML files vars: diff --git a/pixi.lock b/pixi.lock index 8d08ba90..95844baf 100644 --- a/pixi.lock +++ b/pixi.lock @@ -9,55 +9,48 @@ environments: pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-hbf7d49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-bootstrap_ha15bf96_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-25.7.0-he4ff34a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/da/875925db2ed80dc7b919b2817da555848b608620be9662c5f835670d5d8d/asteval-1.0.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl @@ -68,7 +61,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -85,8 +78,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl @@ -94,7 +87,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2d/8b/371ab3cec97ee3fe1126b3406b7abd60c8fec8975fd79a3c75cdea0c3d83/fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl @@ -139,7 +132,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -159,8 +152,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/28/83/36557b04cfdc317ed8a525c4993b23e43a8fbcddaddd78619112ca07138c/msgspec-0.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl @@ -170,19 +163,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f2/85/ab6d04733a7d6ff32bfc8382bf1b07078228f5d6ebec5266b91bfc5c4ff7/pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -200,17 +192,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl @@ -224,10 +215,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/77/34/1956aed61c4abb91926f9513330afac4654cc2a711ecb73085dc4e2e5c1d/scipp-25.11.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/94/98/aa2d4b9d28969cc7f62409f9f9fc5b5a853af651255eba03e9bee8546dd9/scipp-25.12.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl @@ -239,10 +230,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl @@ -257,48 +248,39 @@ environments: - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-64: - - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gsl-2.8-hc707ee6_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.0-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.0-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.7.0-hf6efa0e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.12-h894a449_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -306,7 +288,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/da/875925db2ed80dc7b919b2817da555848b608620be9662c5f835670d5d8d/asteval-1.0.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl @@ -317,7 +299,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl @@ -334,8 +316,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl @@ -343,7 +325,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d6/8a/de9cc0540f542963ba5e8f3a1f6ad48fa211badc3177783b9d5cadf79b5d/fonttools-4.60.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl @@ -388,7 +370,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -408,8 +390,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8a/d1/b902d38b6e5ba3bdddbec469bba388d647f960aeed7b5b3623a8debe8a76/msgspec-0.20.0-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl @@ -419,19 +401,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -449,17 +430,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl @@ -473,10 +453,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/71/f2/18d5be10ac890ce7490451eb55d41bf9d96e481751362a30ed1a8bc176fa/scipp-25.11.0-cp313-cp313-macosx_11_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e5/22/75e119e0a200914f88f121cd956e1eb7f72c8ace4b63171f52ba0334d142/scipp-25.12.0-cp313-cp313-macosx_11_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl @@ -488,10 +468,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl @@ -506,48 +486,39 @@ environments: - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.8-h8d0574d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.7.0-hbfc8e16_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -555,7 +526,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/da/875925db2ed80dc7b919b2817da555848b608620be9662c5f835670d5d8d/asteval-1.0.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl @@ -566,7 +537,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl @@ -583,8 +554,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl @@ -592,7 +563,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7c/5b/cdd2c612277b7ac7ec8c0c9bc41812c43dc7b2d5f2b0897e15fdf5a1f915/fonttools-4.60.1-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl @@ -637,7 +608,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -657,8 +628,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/57/b6/eff0305961a1d9447ec2b02f8c73c8946f22564d302a504185b730c9a761/msgspec-0.20.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl @@ -668,19 +639,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a8/14/5990826f779f79148ae9d3a2c39593dc04d61d5d90541e71b5749f35af95/pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -698,17 +668,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl @@ -722,10 +691,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/64/7c/d8a343b0a622987335a1ac848084079c47c21e44fcc450f9c145b11a56f6/scipp-25.11.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/18/5c/bc0ca94bff65fe0d206a369b54625f8ec7852dfd1d835174692026f34df9/scipp-25.12.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl @@ -737,10 +706,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl @@ -755,49 +724,37 @@ environments: - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ win-64: - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gsl-2.8-h5b8d9c4_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.7.0-h80d1838_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.12-h09917c8_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/da/875925db2ed80dc7b919b2817da555848b608620be9662c5f835670d5d8d/asteval-1.0.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/13/5c/af990f019b8dd11c5492a6371fe74a5b0276357370030b67254a87329944/async_lru-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl @@ -808,7 +765,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl @@ -825,8 +782,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/10/2c7edbf230e5c507d38367af498fa94258ed97205d9b4b6f63a921fe9c49/dunamai-1.26.0-py3-none-any.whl @@ -834,7 +791,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/75/4d/b022c1577807ce8b31ffe055306ec13a866f2337ecee96e75b24b9b753ea/fonttools-4.60.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl @@ -879,7 +836,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -899,8 +856,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/f1/25/5e8080fe0117f799b1b68008dc29a65862077296b92550632de015128579/msgspec-0.20.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl @@ -910,18 +867,17 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d6/7d/216a1588b65a7aa5f4535570418a599d943c85afb1d95b0876fc00aa1468/pandas-3.0.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -938,17 +894,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl @@ -964,10 +919,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/f6/f3/9d1bb423a2dc0bbebfc98191095dd410a1268397b9c692d76a3ea971c790/scipp-25.11.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/eb/d1/b3cd2733a96a36c54c36889b2cfdd0331c1e5b57fa1757485a22d0ec3142/scipp-25.12.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl @@ -979,10 +934,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl @@ -997,7 +952,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ py-311-env: @@ -1013,27 +968,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-hbf7d49c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda @@ -1179,7 +1128,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl @@ -1223,7 +1171,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/3c/96/565e32544b31d46707370ba9153c98e3d6e2ade120130f0c7c22dfc9d48a/scipp-26.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4e/b6/ffe0bb67cec66cd450acff599bb07507bbf5ffda1a3a15dd2d8dbe7a6da7/scipp-25.12.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl @@ -1260,32 +1208,23 @@ environments: - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-64: - - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gsl-2.8-hc707ee6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.0-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_18.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.0-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.7.0-hf6efa0e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda @@ -1426,7 +1365,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl @@ -1470,7 +1408,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/46/25/23eea063a85cc565c9e67ca0ac36b9b979c9d76215d62096746cdd8770e2/scipp-26.2.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/12/0d/3f98a936a30bff4a460b51b9f85c4d994f94249930b2d8bedeb8111a359e/scipp-25.12.0-cp311-cp311-macosx_11_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl @@ -1507,32 +1445,23 @@ environments: - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.8-h8d0574d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.7.0-hbfc8e16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda @@ -1673,7 +1602,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl @@ -1717,7 +1645,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/46/25/23eea063a85cc565c9e67ca0ac36b9b979c9d76215d62096746cdd8770e2/scipp-26.2.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/6a/3a/ab0eb61593569d5a0d080002e4b8c0998cb1116d8710781b7225c304b880/scipp-25.12.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl @@ -1756,26 +1684,14 @@ environments: win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gsl-2.8-h5b8d9c4_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.7.0-h80d1838_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.14-h0159041_3_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda @@ -1912,7 +1828,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl @@ -1957,7 +1872,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/26/d5/0b0ca89849806a23da4e56182a72f510bdcf911511b3a0098f8252896941/scipp-26.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/75/6a3786de6645ac2ccd94fbf83c59cc6b929bfa3a89cb62c8cb3be4de0606/scipp-25.12.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl @@ -2006,27 +1921,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-hbf7d49c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda @@ -2171,7 +2080,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl @@ -2215,7 +2123,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e4/d9/e76ce201285d50d536573047ddba5840718443436e7733439ed42f65ebe4/scipp-26.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/94/98/aa2d4b9d28969cc7f62409f9f9fc5b5a853af651255eba03e9bee8546dd9/scipp-25.12.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl @@ -2252,33 +2160,24 @@ environments: - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-64: - - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gsl-2.8-hc707ee6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.0-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_18.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.0-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.7.0-hf6efa0e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda @@ -2419,7 +2318,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl @@ -2463,7 +2361,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/46/25/23eea063a85cc565c9e67ca0ac36b9b979c9d76215d62096746cdd8770e2/scipp-26.2.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/e5/22/75e119e0a200914f88f121cd956e1eb7f72c8ace4b63171f52ba0334d142/scipp-25.12.0-cp313-cp313-macosx_11_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl @@ -2500,33 +2398,24 @@ environments: - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.8-h8d0574d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.7.0-hbfc8e16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda @@ -2667,7 +2556,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl @@ -2711,7 +2599,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/46/25/23eea063a85cc565c9e67ca0ac36b9b979c9d76215d62096746cdd8770e2/scipp-26.2.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/18/5c/bc0ca94bff65fe0d206a369b54625f8ec7852dfd1d835174692026f34df9/scipp-25.12.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl @@ -2750,28 +2638,16 @@ environments: win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gsl-2.8-h5b8d9c4_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.7.0-h80d1838_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.12-h09917c8_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda @@ -2907,7 +2783,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl @@ -2952,7 +2827,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/d1/d2/166bce0c7420a30af57b17df2211eb53b33b8126a17e4ba6cd32099b85e7/scipp-26.2.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/eb/d1/b3cd2733a96a36c54c36889b2cfdd0331c1e5b57fa1757485a22d0ec3142/scipp-25.12.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl @@ -2989,13 +2864,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ packages: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 - md5: d7c89558ba9fa0495403155b64376d81 - license: None - purls: [] - size: 2562 - timestamp: 1578324546067 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 @@ -3010,119 +2878,11 @@ packages: purls: [] size: 28948 timestamp: 1770939786096 -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - build_number: 16 - sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 - md5: 73aaf86a425cc6e73fcf236a5a46396d - depends: - - _libgcc_mutex 0.1 conda_forge - - libgomp >=7.5.0 - constrains: - - openmp_impl 9999 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 23621 - timestamp: 1650670423406 -- conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - build_number: 7 - sha256: 30006902a9274de8abdad5a9f02ef7c8bb3d69a503486af0c1faee30b023e5b7 - md5: eaac87c21aff3ed21ad9656697bb8326 - depends: - - llvm-openmp >=9.0.1 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 8328 - timestamp: 1764092562779 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - build_number: 7 - sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd - md5: a44032f282e7d2acdeb1c240308052dd - depends: - - llvm-openmp >=9.0.1 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 8325 - timestamp: 1764092507920 - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl name: aiohappyeyeballs version: 2.6.1 sha256: f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl - name: aiohttp - version: 3.13.2 - sha256: a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a - requires_dist: - - aiohappyeyeballs>=2.5.0 - - aiosignal>=1.4.0 - - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' - - attrs>=17.3.0 - - frozenlist>=1.1.1 - - multidict>=4.5,<7.0 - - propcache>=0.2.0 - - yarl>=1.17.0,<2.0 - - aiodns>=3.3.0 ; extra == 'speedups' - - brotli ; platform_python_implementation == 'CPython' and extra == 'speedups' - - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'speedups' - - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl - name: aiohttp - version: 3.13.2 - sha256: 5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293 - requires_dist: - - aiohappyeyeballs>=2.5.0 - - aiosignal>=1.4.0 - - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' - - attrs>=17.3.0 - - frozenlist>=1.1.1 - - multidict>=4.5,<7.0 - - propcache>=0.2.0 - - yarl>=1.17.0,<2.0 - - aiodns>=3.3.0 ; extra == 'speedups' - - brotli ; platform_python_implementation == 'CPython' and extra == 'speedups' - - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'speedups' - - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl - name: aiohttp - version: 3.13.2 - sha256: 088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742 - requires_dist: - - aiohappyeyeballs>=2.5.0 - - aiosignal>=1.4.0 - - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' - - attrs>=17.3.0 - - frozenlist>=1.1.1 - - multidict>=4.5,<7.0 - - propcache>=0.2.0 - - yarl>=1.17.0,<2.0 - - aiodns>=3.3.0 ; extra == 'speedups' - - brotli ; platform_python_implementation == 'CPython' and extra == 'speedups' - - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'speedups' - - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: aiohttp - version: 3.13.2 - sha256: ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e - requires_dist: - - aiohappyeyeballs>=2.5.0 - - aiosignal>=1.4.0 - - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' - - attrs>=17.3.0 - - frozenlist>=1.1.1 - - multidict>=4.5,<7.0 - - propcache>=0.2.0 - - yarl>=1.17.0,<2.0 - - aiodns>=3.3.0 ; extra == 'speedups' - - brotli ; platform_python_implementation == 'CPython' and extra == 'speedups' - - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'speedups' - - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/0e/c9/741f8ac91e14b1d2e7100690425a5b2b919a87a5075406582991fb7de920/aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl name: aiohttp version: 3.13.3 @@ -3358,19 +3118,6 @@ packages: - pytz==2025.2 ; extra == 'test' - simplejson==3.* ; extra == 'test' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b7/da/875925db2ed80dc7b919b2817da555848b608620be9662c5f835670d5d8d/asteval-1.0.7-py3-none-any.whl - name: asteval - version: 1.0.7 - sha256: d78df08681dfff59031ca624ba7030f9dc576a7a16e2f7a5137c6e7ef3ee60c4 - requires_dist: - - build ; extra == 'dev' - - twine ; extra == 'dev' - - sphinx ; extra == 'doc' - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - - coverage ; extra == 'test' - - asteval[dev,doc,test] ; extra == 'all' - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl name: asteval version: 1.0.8 @@ -3475,21 +3222,6 @@ packages: version: 1.9.0 sha256: ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl - name: build - version: 1.3.0 - sha256: 7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4 - requires_dist: - - packaging>=19.1 - - pyproject-hooks - - colorama ; os_name == 'nt' - - importlib-metadata>=4.6 ; python_full_version < '3.10.2' - - tomli>=1.1.0 ; python_full_version < '3.11' - - uv>=0.1.18 ; extra == 'uv' - - virtualenv>=20.11 ; python_full_version < '3.10' and extra == 'virtualenv' - - virtualenv>=20.17 ; python_full_version >= '3.10' and python_full_version < '3.14' and extra == 'virtualenv' - - virtualenv>=20.31 ; python_full_version >= '3.14' and extra == 'virtualenv' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl name: build version: 1.4.0 @@ -3533,17 +3265,6 @@ packages: - sphinx ; extra == 'dev' - versioningit ; extra == 'dev' requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 - md5: 51a19bba1b8ebfb60df25cde030b7ebc - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 260341 - timestamp: 1757437258798 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 md5: d2ffd7602c02f2b316fd921d39876885 @@ -3555,16 +3276,6 @@ packages: purls: [] size: 260182 timestamp: 1771350215188 -- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - sha256: 8f50b58efb29c710f3cecf2027a8d7325ba769ab10c746eff75cea3ac050b10c - md5: 97c4b3bd8a90722104798175a1bdddbf - depends: - - __osx >=10.13 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 132607 - timestamp: 1757437730085 - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda sha256: 9f242f13537ef1ce195f93f0cc162965d6cc79da578568d6d8e50f70dd025c42 md5: 4173ac3b19ec0a4f400b4f782910368b @@ -3575,16 +3286,6 @@ packages: purls: [] size: 133427 timestamp: 1771350680709 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 - md5: 58fd217444c2a5701a44244faf518206 - depends: - - __osx >=11.0 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 125061 - timestamp: 1757437486465 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df md5: 620b85a3f45526a8bc4d23fd78fc22f0 @@ -3595,18 +3296,6 @@ packages: purls: [] size: 124834 timestamp: 1771350416561 -- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - sha256: d882712855624641f48aa9dc3f5feea2ed6b4e6004585d3616386a18186fe692 - md5: 1077e9333c41ff0be8edd1a5ec0ddace - depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 55977 - timestamp: 1757437738856 - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda sha256: 76dfb71df5e8d1c4eded2dbb5ba15bb8fb2e2b0fe42d94145d5eed4c75c35902 md5: 4cb8e6b48f67de0b018719cdf1136306 @@ -3650,27 +3339,9 @@ packages: purls: [] size: 180327 timestamp: 1765215064054 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - sha256: 686a13bd2d4024fc99a22c1e0e68a7356af3ed3304a8d3ff6bb56249ad4e82f0 - md5: f98fb7db808b94bc1ec5b0e62f9f1069 - depends: - - __win - license: ISC - purls: [] - size: 152827 - timestamp: 1762967310929 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - sha256: b986ba796d42c9d3265602bc038f6f5264095702dd546c14bc684e60c385e773 - md5: f0991f0f84902f6b6009b4d2350a83aa - depends: - - __unix - license: ISC - purls: [] - size: 152432 - timestamp: 1762967197890 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - sha256: 37950019c59b99585cee5d30dbc2cc9696ed4e11f5742606a4db1621ed8f94d6 - md5: f001e6e220355b7f87403a4d0e5bf1ca +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + sha256: 37950019c59b99585cee5d30dbc2cc9696ed4e11f5742606a4db1621ed8f94d6 + md5: f001e6e220355b7f87403a4d0e5bf1ca depends: - __win license: ISC @@ -4120,20 +3791,6 @@ packages: version: 0.7.1 sha256: a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*' -- pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - name: dfo-ls - version: '1.6' - sha256: 416edce5537237fa417bd27aef5ba91201e856f3daae52ffd44cfacb10f5b771 - requires_dist: - - setuptools - - numpy - - scipy>=1.11 - - pandas - - pytest ; extra == 'dev' - - sphinx ; extra == 'dev' - - sphinx-rtd-theme ; extra == 'dev' - - trustregion>=1.1 ; extra == 'trustregion' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl name: dfo-ls version: 1.6.2 @@ -4148,14 +3805,6 @@ packages: - sphinx-rtd-theme ; extra == 'dev' - trustregion>=1.1 ; extra == 'trustregion' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl - name: dill - version: 0.4.0 - sha256: 44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 - requires_dist: - - objgraph>=1.7.2 ; extra == 'graph' - - gprof2dot>=2022.7.29 ; extra == 'profile' - requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl name: dill version: 0.4.1 @@ -4187,8 +3836,8 @@ packages: requires_python: '>=3.5' - pypi: ./ name: easyscience - version: 1.0.1+devdirty62 - sha256: b1829fb54935f9a88d2e129d11680b3a52a3543d470ffd755ef4530656e8bcc7 + version: 1.0.1+dev66 + sha256: ca8e408e5343cbd1e224f0d41e28783f2104c5fca6911c9cbdb47ee95286f178 requires_dist: - asteval - bumps @@ -4198,7 +3847,7 @@ packages: - numpy - pixi-kernel - pooch - - scipp + - scipp<26.1.0 - uncertainties - build ; extra == 'dev' - copier ; extra == 'dev' @@ -4269,142 +3918,6 @@ packages: version: 3.25.0 sha256: 5ccf8069f7948f494968fc0713c10e5c182a9c9d9eef3a636307a20c2490f047 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/2d/8b/371ab3cec97ee3fe1126b3406b7abd60c8fec8975fd79a3c75cdea0c3d83/fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl - name: fonttools - version: 4.60.1 - sha256: b33a7884fabd72bdf5f910d0cf46be50dce86a0362a65cfc746a4168c67eb96c - requires_dist: - - lxml>=4.0 ; extra == 'lxml' - - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - - zopfli>=0.1.4 ; extra == 'woff' - - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - - lz4>=1.7.4.2 ; extra == 'graphite' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' - - pycairo ; extra == 'interpolatable' - - matplotlib ; extra == 'plot' - - sympy ; extra == 'symfont' - - xattr ; sys_platform == 'darwin' and extra == 'type1' - - skia-pathops>=0.5.0 ; extra == 'pathops' - - uharfbuzz>=0.23.0 ; extra == 'repacker' - - lxml>=4.0 ; extra == 'all' - - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' - - zopfli>=0.1.4 ; extra == 'all' - - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - - lz4>=1.7.4.2 ; extra == 'all' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - pycairo ; extra == 'all' - - matplotlib ; extra == 'all' - - sympy ; extra == 'all' - - xattr ; sys_platform == 'darwin' and extra == 'all' - - skia-pathops>=0.5.0 ; extra == 'all' - - uharfbuzz>=0.23.0 ; extra == 'all' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/75/4d/b022c1577807ce8b31ffe055306ec13a866f2337ecee96e75b24b9b753ea/fonttools-4.60.1-cp313-cp313-win_amd64.whl - name: fonttools - version: 4.60.1 - sha256: a3db56f153bd4c5c2b619ab02c5db5192e222150ce5a1bc10f16164714bc39ac - requires_dist: - - lxml>=4.0 ; extra == 'lxml' - - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - - zopfli>=0.1.4 ; extra == 'woff' - - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - - lz4>=1.7.4.2 ; extra == 'graphite' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' - - pycairo ; extra == 'interpolatable' - - matplotlib ; extra == 'plot' - - sympy ; extra == 'symfont' - - xattr ; sys_platform == 'darwin' and extra == 'type1' - - skia-pathops>=0.5.0 ; extra == 'pathops' - - uharfbuzz>=0.23.0 ; extra == 'repacker' - - lxml>=4.0 ; extra == 'all' - - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' - - zopfli>=0.1.4 ; extra == 'all' - - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - - lz4>=1.7.4.2 ; extra == 'all' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - pycairo ; extra == 'all' - - matplotlib ; extra == 'all' - - sympy ; extra == 'all' - - xattr ; sys_platform == 'darwin' and extra == 'all' - - skia-pathops>=0.5.0 ; extra == 'all' - - uharfbuzz>=0.23.0 ; extra == 'all' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/7c/5b/cdd2c612277b7ac7ec8c0c9bc41812c43dc7b2d5f2b0897e15fdf5a1f915/fonttools-4.60.1-cp313-cp313-macosx_10_13_universal2.whl - name: fonttools - version: 4.60.1 - sha256: 6f68576bb4bbf6060c7ab047b1574a1ebe5c50a17de62830079967b211059ebb - requires_dist: - - lxml>=4.0 ; extra == 'lxml' - - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - - zopfli>=0.1.4 ; extra == 'woff' - - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - - lz4>=1.7.4.2 ; extra == 'graphite' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' - - pycairo ; extra == 'interpolatable' - - matplotlib ; extra == 'plot' - - sympy ; extra == 'symfont' - - xattr ; sys_platform == 'darwin' and extra == 'type1' - - skia-pathops>=0.5.0 ; extra == 'pathops' - - uharfbuzz>=0.23.0 ; extra == 'repacker' - - lxml>=4.0 ; extra == 'all' - - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' - - zopfli>=0.1.4 ; extra == 'all' - - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - - lz4>=1.7.4.2 ; extra == 'all' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - pycairo ; extra == 'all' - - matplotlib ; extra == 'all' - - sympy ; extra == 'all' - - xattr ; sys_platform == 'darwin' and extra == 'all' - - skia-pathops>=0.5.0 ; extra == 'all' - - uharfbuzz>=0.23.0 ; extra == 'all' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/d6/8a/de9cc0540f542963ba5e8f3a1f6ad48fa211badc3177783b9d5cadf79b5d/fonttools-4.60.1-cp313-cp313-macosx_10_13_x86_64.whl - name: fonttools - version: 4.60.1 - sha256: eedacb5c5d22b7097482fa834bda0dafa3d914a4e829ec83cdea2a01f8c813c4 - requires_dist: - - lxml>=4.0 ; extra == 'lxml' - - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - - zopfli>=0.1.4 ; extra == 'woff' - - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - - lz4>=1.7.4.2 ; extra == 'graphite' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' - - pycairo ; extra == 'interpolatable' - - matplotlib ; extra == 'plot' - - sympy ; extra == 'symfont' - - xattr ; sys_platform == 'darwin' and extra == 'type1' - - skia-pathops>=0.5.0 ; extra == 'pathops' - - uharfbuzz>=0.23.0 ; extra == 'repacker' - - lxml>=4.0 ; extra == 'all' - - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' - - zopfli>=0.1.4 ; extra == 'all' - - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - - lz4>=1.7.4.2 ; extra == 'all' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - pycairo ; extra == 'all' - - matplotlib ; extra == 'all' - - sympy ; extra == 'all' - - xattr ; sys_platform == 'darwin' and extra == 'all' - - skia-pathops>=0.5.0 ; extra == 'all' - - uharfbuzz>=0.23.0 ; extra == 'all' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl name: fonttools version: 4.61.1 @@ -4747,57 +4260,6 @@ packages: - platformdirs>=4.2 ; extra == 'pypi' - wheel>=0.42 ; extra == 'pypi' requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-hbf7d49c_1.conda - sha256: f923af07c3a3db746d3be8efebdaa9c819a6007ee3cc12445cee059641611e05 - md5: 04e128d2adafe3c844cde58f103c481b - depends: - - __glibc >=2.17,<3.0.a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=13 - license: GPL-3.0-or-later - license_family: GPL - purls: [] - size: 2486744 - timestamp: 1737621160295 -- conda: https://conda.anaconda.org/conda-forge/osx-64/gsl-2.8-hc707ee6_1.conda - sha256: 1d729f940f28dd5476b847123883abce119dff7af1abc236452d54ad4682b702 - md5: 382c8abc7d56f9236090a76fc6e51a97 - depends: - - __osx >=10.13 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - license: GPL-3.0-or-later - license_family: GPL - purls: [] - size: 2300171 - timestamp: 1737621445693 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.8-h8d0574d_1.conda - sha256: f11d8f2007f6591022afa958d8fe15afbe4211198d1603c0eb886bc21a9eb19e - md5: cc261442bead590d89ca9f96884a344f - depends: - - __osx >=11.0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - license: GPL-3.0-or-later - license_family: GPL - purls: [] - size: 1862134 - timestamp: 1737621413640 -- conda: https://conda.anaconda.org/conda-forge/win-64/gsl-2.8-h5b8d9c4_1.conda - sha256: 87a3468e09cc1ee0268e8639debad6a5b440090ef8cb1d2ee5eed66c86085528 - md5: a47cf810b7c03955139a150b228b93ca - depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: GPL-3.0-or-later - license_family: GPL - purls: [] - size: 1528970 - timestamp: 1737622367981 - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl name: h11 version: 0.16.0 @@ -4921,18 +4383,6 @@ packages: purls: [] size: 12389400 timestamp: 1772209104304 -- conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda - sha256: 5a41fb28971342e293769fc968b3414253a2f8d9e30ed7c31517a15b4887246a - md5: 0ee3bb487600d5e71ab7d28951b2016a - depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: MIT - license_family: MIT - purls: [] - size: 13222158 - timestamp: 1767970128854 - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl name: identify version: 2.6.17 @@ -5623,17 +5073,6 @@ packages: - atomicwrites ; extra == 'atomic-cache' - interegular>=0.3.1,<0.4.0 ; extra == 'interegular' requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-bootstrap_ha15bf96_3.conda - sha256: 7dfdf5500318521827c590fbda0fce5d6bda1d15dfee11b677d420580d18ccc0 - md5: 3036ca5b895b7f5146c5a25486234a68 - depends: - - __glibc >=2.17,<3.0.a0 - constrains: - - binutils_impl_linux-64 2.45 - license: GPL-3.0-only - purls: [] - size: 729222 - timestamp: 1763768158810 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda sha256: 565941ac1f8b0d2f2e8f02827cbca648f4d18cd461afc31f15604cd291b5c5f3 md5: 12bd9a3f089ee6c9266a37dab82afabd @@ -5690,76 +5129,6 @@ packages: purls: [] size: 1229639 timestamp: 1770863511331 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - build_number: 5 - sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c - md5: c160954f7418d7b6e87eaf05a8913fa9 - depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 - constrains: - - mkl <2026 - - liblapack 3.11.0 5*_openblas - - libcblas 3.11.0 5*_openblas - - blas 2.305 openblas - - liblapacke 3.11.0 5*_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 18213 - timestamp: 1765818813880 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - build_number: 5 - sha256: 4754de83feafa6c0b41385f8dab1b13f13476232e16f524564a340871a9fc3bc - md5: 36d2e68a156692cbae776b75d6ca6eae - depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 - constrains: - - liblapack 3.11.0 5*_openblas - - blas 2.305 openblas - - libcblas 3.11.0 5*_openblas - - mkl <2026 - - liblapacke 3.11.0 5*_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 18476 - timestamp: 1765819054657 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - build_number: 5 - sha256: 620a6278f194dcabc7962277da6835b1e968e46ad0c8e757736255f5ddbfca8d - md5: bcc025e2bbaf8a92982d20863fe1fb69 - depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 - constrains: - - libcblas 3.11.0 5*_openblas - - liblapack 3.11.0 5*_openblas - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas - - mkl <2026 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 18546 - timestamp: 1765819094137 -- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - build_number: 5 - sha256: f0cb7b2697461a306341f7ff32d5b361bb84f3e94478464c1e27ee01fc8f276b - md5: f9decf88743af85c9c9e05556a4c47c0 - depends: - - mkl >=2025.3.0,<2026.0a0 - constrains: - - liblapack 3.11.0 5*_mkl - - libcblas 3.11.0 5*_mkl - - blas 2.305 mkl - - liblapacke 3.11.0 5*_mkl - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 67438 - timestamp: 1765819100043 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda sha256: 318f36bd49ca8ad85e6478bd8506c88d82454cc008c1ac1c6bf00a3c42fa610e md5: 72c8fd1af66bd67bf580645b426513ed @@ -5859,66 +5228,6 @@ packages: purls: [] size: 290754 timestamp: 1764018009077 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - build_number: 5 - sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8 - md5: 6636a2b6f1a87572df2970d3ebc87cc0 - depends: - - libblas 3.11.0 5_h4a7cf45_openblas - constrains: - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas - - liblapack 3.11.0 5*_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 18194 - timestamp: 1765818837135 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - build_number: 5 - sha256: 8077c29ea720bd152be6e6859a3765228cde51301fe62a3b3f505b377c2cb48c - md5: b31d771cbccff686e01a687708a7ca41 - depends: - - libblas 3.11.0 5_he492b99_openblas - constrains: - - liblapack 3.11.0 5*_openblas - - blas 2.305 openblas - - liblapacke 3.11.0 5*_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 18484 - timestamp: 1765819073006 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - build_number: 5 - sha256: 38809c361bbd165ecf83f7f05fae9b791e1baa11e4447367f38ae1327f402fc0 - md5: efd8bd15ca56e9d01748a3beab8404eb - depends: - - libblas 3.11.0 5_h51639a9_openblas - constrains: - - liblapacke 3.11.0 5*_openblas - - liblapack 3.11.0 5*_openblas - - blas 2.305 openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 18548 - timestamp: 1765819108956 -- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - build_number: 5 - sha256: 49dc59d8e58360920314b8d276dd80da7866a1484a9abae4ee2760bc68f3e68d - md5: b3fa8e8b55310ba8ef0060103afb02b5 - depends: - - libblas 3.11.0 5_hf2e6a31_mkl - constrains: - - liblapack 3.11.0 5*_mkl - - liblapacke 3.11.0 5*_mkl - - blas 2.305 mkl - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 68079 - timestamp: 1765819124349 - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.0-h19cb2f5_1.conda sha256: fa002b43752fe5860e588435525195324fe250287105ebd472ac138e97de45e6 md5: 836389b6b9ae58f3fbcf7cafebd5c7f2 @@ -5965,19 +5274,6 @@ packages: purls: [] size: 107458 timestamp: 1702146414478 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - sha256: 1e1b08f6211629cbc2efe7a5bca5953f8f6b3cae0eeb04ca4dacee1bd4e2db2f - md5: 8b09ae86839581147ef2e5c5e229d164 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - constrains: - - expat 2.7.3.* - license: MIT - license_family: MIT - purls: [] - size: 76643 - timestamp: 1763549731408 - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 @@ -5991,18 +5287,6 @@ packages: purls: [] size: 76798 timestamp: 1771259418166 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - sha256: d11b3a6ce5b2e832f430fd112084533a01220597221bee16d6c7dc3947dffba6 - md5: 222e0732a1d0780a622926265bee14ef - depends: - - __osx >=10.13 - constrains: - - expat 2.7.3.* - license: MIT - license_family: MIT - purls: [] - size: 74058 - timestamp: 1763549886493 - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda sha256: 8d9d79b2de7d6f335692391f5281607221bf5d040e6724dad4c4d77cd603ce43 md5: a684eb8a19b2aa68fde0267df172a1e3 @@ -6015,18 +5299,6 @@ packages: purls: [] size: 74578 timestamp: 1771260142624 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - sha256: fce22610ecc95e6d149e42a42fbc3cc9d9179bd4eb6232639a60f06e080eec98 - md5: b79875dbb5b1db9a4a22a4520f918e1a - depends: - - __osx >=11.0 - constrains: - - expat 2.7.3.* - license: MIT - license_family: MIT - purls: [] - size: 67800 - timestamp: 1763549994166 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda sha256: 03887d8080d6a8fe02d75b80929271b39697ecca7628f0657d7afaea87761edf md5: a92e310ae8dfc206ff449f362fc4217f @@ -6039,20 +5311,6 @@ packages: purls: [] size: 68199 timestamp: 1771260020767 -- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - sha256: 844ab708594bdfbd7b35e1a67c379861bcd180d6efe57b654f482ae2f7f5c21e - md5: 8c9e4f1a0e688eef2e95711178061a0f - depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - constrains: - - expat 2.7.3.* - license: MIT - license_family: MIT - purls: [] - size: 70137 - timestamp: 1763550049107 - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda sha256: b31f6fb629c4e17885aaf2082fb30384156d16b48b264e454de4a06a313b533d md5: 1c1ced969021592407f16ada4573586d @@ -6078,27 +5336,6 @@ packages: purls: [] size: 58592 timestamp: 1769456073053 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 - md5: 35f29eec58405aaf55e01cb470d8c26a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - size: 57821 - timestamp: 1760295480630 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - sha256: 277dc89950f5d97f1683f26e362d6dca3c2efa16cb2f6fdb73d109effa1cd3d0 - md5: d214916b24c625bcc459b245d509f22e - depends: - - __osx >=10.13 - license: MIT - license_family: MIT - purls: [] - size: 52573 - timestamp: 1760295626449 - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda sha256: 951958d1792238006fdc6fce7f71f1b559534743b26cc1333497d46e5903a2d6 md5: 66a0dc7464927d0853b590b6f53ba3ea @@ -6119,16 +5356,6 @@ packages: purls: [] size: 40979 timestamp: 1769456747661 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - sha256: 9b8acdf42df61b7bfe8bdc545c016c29e61985e79748c64ad66df47dbc2e295f - md5: 411ff7cd5d1472bba0f55c0faf04453b - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - size: 40251 - timestamp: 1760295839166 - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda sha256: 59d01f2dfa8b77491b5888a5ab88ff4e1574c9359f7e229da254cdfe27ddc190 md5: 720b39f5ec0610457b725eb3f396219a @@ -6141,35 +5368,9 @@ packages: purls: [] size: 45831 timestamp: 1769456418774 -- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - sha256: ddff25aaa4f0aa535413f5d831b04073789522890a4d8626366e43ecde1534a3 - md5: ba4ad812d2afc22b9a34ce8327a0930f - depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: MIT - license_family: MIT - purls: [] - size: 44866 - timestamp: 1760295760649 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda - sha256: 08f9b87578ab981c7713e4e6a7d935e40766e10691732bba376d4964562bcb45 - md5: c0374badb3a5d4b1372db28d19462c53 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - constrains: - - libgomp 15.2.0 h767d61c_7 - - libgcc-ng ==15.2.0=*_7 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 822552 - timestamp: 1759968052178 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 - md5: 0aa00f03f9e39fb9876085dee11a85d4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 + md5: 0aa00f03f9e39fb9876085dee11a85d4 depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 @@ -6181,32 +5382,6 @@ packages: purls: [] size: 1041788 timestamp: 1771378212382 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_18.conda - sha256: 83366f11615ab234aa1e0797393f9e07b78124b5a24c4a9f8af0113d02df818e - md5: 9a5cb96e43f5c2296690186e15b3296f - depends: - - _openmp_mutex - constrains: - - libgcc-ng ==15.2.0=*_18 - - libgomp 15.2.0 18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 423025 - timestamp: 1771378225170 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda - sha256: 1d9c4f35586adb71bcd23e31b68b7f3e4c4ab89914c26bed5f2859290be5560e - md5: 92df6107310b1fff92c4cc84f0de247b - depends: - - _openmp_mutex - constrains: - - libgcc-ng ==15.2.0=*_18 - - libgomp 15.2.0 18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 401974 - timestamp: 1771378877463 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 md5: d5e96b1ed75ca01906b3d2469b4ce493 @@ -6217,99 +5392,6 @@ packages: purls: [] size: 27526 timestamp: 1771378224552 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda - sha256: 2045066dd8e6e58aaf5ae2b722fb6dfdbb57c862b5f34ac7bfb58c40ef39b6ad - md5: 280ea6eee9e2ddefde25ff799c4f0363 - depends: - - libgcc 15.2.0 h767d61c_7 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 29313 - timestamp: 1759968065504 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee - md5: 9063115da5bc35fdc3e1002e69b9ef6e - depends: - - libgfortran5 15.2.0 h68bc16d_18 - constrains: - - libgfortran-ng ==15.2.0=*_18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 27523 - timestamp: 1771378269450 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_18.conda - sha256: fb06c2a2ef06716a0f2a6550f5d13cdd1d89365993068512b7ae3c34e6e665d9 - md5: 34a9f67498721abcfef00178bcf4b190 - depends: - - libgfortran5 15.2.0 hd16e46c_18 - constrains: - - libgfortran-ng ==15.2.0=*_18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 139761 - timestamp: 1771378423828 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - sha256: 63f89087c3f0c8621c5c89ecceec1e56e5e1c84f65fc9c5feca33a07c570a836 - md5: 26981599908ed2205366e8fc91b37fc6 - depends: - - libgfortran5 15.2.0 hdae7583_18 - constrains: - - libgfortran-ng ==15.2.0=*_18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 138973 - timestamp: 1771379054939 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - sha256: 539b57cf50ec85509a94ba9949b7e30717839e4d694bc94f30d41c9d34de2d12 - md5: 646855f357199a12f02a87382d429b75 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15.2.0 - constrains: - - libgfortran 15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 2482475 - timestamp: 1771378241063 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_18.conda - sha256: ddaf9dcf008c031b10987991aa78643e03c24a534ad420925cbd5851b31faa11 - md5: ca52daf58cea766656266c8771d8be81 - depends: - - libgcc >=15.2.0 - constrains: - - libgfortran 15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 1062274 - timestamp: 1771378232014 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda - sha256: 91033978ba25e6a60fb86843cf7e1f7dc8ad513f9689f991c9ddabfaf0361e7e - md5: c4a6f7989cffb0544bfd9207b6789971 - depends: - - libgcc >=15.2.0 - constrains: - - libgfortran 15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 598634 - timestamp: 1771378886363 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda - sha256: e9fb1c258c8e66ee278397b5822692527c5f5786d372fe7a869b900853f3f5ca - md5: f7b4d76975aac7e5d9e6ad13845f92fe - depends: - - __glibc >=2.17,<3.0.a0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 447919 - timestamp: 1759967942498 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 md5: 239c5e9546c38a1e884d69effcf4c882 @@ -6320,44 +5402,6 @@ packages: purls: [] size: 603262 timestamp: 1771378117851 -- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - sha256: 8cdf11333a81085468d9aa536ebb155abd74adc293576f6013fc0c85a7a90da3 - md5: 3b576f6860f838f950c570f4433b086e - depends: - - libwinpthread >=12.0.0.r4.gg4f2fc60ca - - libxml2 - - libxml2-16 >=2.14.6 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 2411241 - timestamp: 1765104337762 -- 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/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/linux-64/liblzma-5.8.2-hb03c661_0.conda sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb md5: c7c83eecbb72d88b940c249af56c8b17 @@ -6370,17 +5414,6 @@ packages: purls: [] size: 113207 timestamp: 1768752626120 -- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - sha256: 7e22fd1bdb8bf4c2be93de2d4e718db5c548aa082af47a7430eb23192de6bb36 - md5: 8468beea04b9065b9807fc8b9cdc5894 - depends: - - __osx >=10.13 - constrains: - - xz 5.8.1.* - license: 0BSD - purls: [] - size: 104826 - timestamp: 1749230155443 - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda sha256: 7ab3c98abd3b5d5ec72faa8d9f5d4b50dcee4970ed05339bc381861199dabb41 md5: 688a0c3d57fa118b9c97bf7e471ab46c @@ -6392,17 +5425,6 @@ packages: purls: [] size: 105482 timestamp: 1768753411348 -- 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/osx-arm64/liblzma-5.8.2-h8088a28_0.conda sha256: 7bfc7ffb2d6a9629357a70d4eadeadb6f88fa26ebc28f606b1c1e5e5ed99dc7e md5: 009f0d956d7bfb00de86901d16e486c7 @@ -6414,19 +5436,6 @@ packages: purls: [] size: 92242 timestamp: 1768752982486 -- 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/win-64/liblzma-5.8.2-hfd05255_0.conda sha256: f25bf293f550c8ed2e0c7145eb404324611cfccff37660869d97abf526eb957c md5: ba0bfd4c3cf73f299ffe46ff0eaeb8e3 @@ -6451,27 +5460,6 @@ packages: purls: [] size: 92400 timestamp: 1769482286018 -- 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-64/libmpdec-4.0.0-h6e16a3a_0.conda - sha256: 98299c73c7a93cd4f5ff8bb7f43cd80389f08b5a27a296d806bdef7841cc9b9e - md5: 18b81186a6adb43f000ad19ed7b70381 - depends: - - __osx >=10.13 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 77667 - timestamp: 1748393757154 - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda sha256: 1096c740109386607938ab9f09a7e9bca06d86770a284777586d6c378b8fb3fd md5: ec88ba8a245855935b871a7324373105 @@ -6482,16 +5470,6 @@ packages: purls: [] size: 79899 timestamp: 1769482558610 -- 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/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 md5: 57c4be259f5e0b99a5983799a228ae55 @@ -6502,18 +5480,6 @@ packages: purls: [] size: 73690 timestamp: 1769482560514 -- 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/win-64/libmpdec-4.0.0-hfd05255_1.conda sha256: 40dcd0b9522a6e0af72a9db0ced619176e7cfdb114855c7a64f278e73f8a7514 md5: e4a9fc2bba3b022dad998c78856afe47 @@ -6586,51 +5552,6 @@ packages: purls: [] size: 33731 timestamp: 1750274110928 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5 - md5: be43915efc66345cccb3c310b6ed0374 - 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: 5927939 - timestamp: 1763114673331 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda - sha256: ba642353f7f41ab2d2eb6410fbe522238f0f4483bcd07df30b3222b4454ee7cd - md5: 9241a65e6e9605e4581a2a8005d7f789 - depends: - - __osx >=10.13 - - 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: 6268795 - timestamp: 1763117623665 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda - sha256: ebbbc089b70bcde87c4121a083c724330f02a690fb9d7c6cd18c30f1b12504fa - md5: a6f6d3a31bb29e48d37ce65de54e2df0 - 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: 4284132 - timestamp: 1768547079205 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda sha256: 04596fcee262a870e4b7c9807224680ff48d4d0cc0dac076a602503d3dc6d217 md5: da5be73701eecd0e8454423fd6ffcf30 @@ -6664,17 +5585,6 @@ packages: purls: [] size: 909777 timestamp: 1768148320535 -- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda - sha256: 2373bd7450693bd0f624966e1bee2f49b0bf0ffbc114275ed0a43cf35aec5b21 - md5: d2c9300ebd2848862929b18c264d1b1e - depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: blessing - purls: [] - size: 1292710 - timestamp: 1762299749044 - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda sha256: 756478128e3e104bd7e7c3ce6c1b0efad7e08c7320c69fdc726e039323c63fbb md5: 903979414b47d777d548e5f0165e6cd8 @@ -6686,19 +5596,6 @@ packages: purls: [] size: 1291616 timestamp: 1768148278261 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda - sha256: 1b981647d9775e1cdeb2fab0a4dd9cd75a6b0de2963f6c3953dbd712f78334b3 - md5: 5b767048b1b3ee9a954b06f4084f93dc - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc 15.2.0 h767d61c_7 - constrains: - - libstdcxx-ng ==15.2.0=*_7 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 3898269 - timestamp: 1759968103436 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e md5: 1b08cd684f34175e4514474793d44bcb @@ -6712,17 +5609,6 @@ packages: purls: [] size: 5852330 timestamp: 1771378262446 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - sha256: e5ec6d2ad7eef538ddcb9ea62ad4346fde70a4736342c4ad87bd713641eb9808 - md5: 80c07c68d2f6870250959dcc95b209d1 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 37135 - timestamp: 1758626800002 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee md5: db409b7c1720428638e7c0d509d3e1b5 @@ -6765,18 +5651,6 @@ packages: purls: [] size: 421195 timestamp: 1753948426421 -- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0 - md5: 8a86073cf3b343b87d03f41790d8b4e5 - depends: - - ucrt - constrains: - - pthreads-win32 <0.0a0 - - msys2-conda-epoch <0.0a0 - license: MIT AND BSD-3-Clause-Clear - purls: [] - size: 36621 - timestamp: 1759768399557 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c md5: 5aa797f8787fe7a17d1b0821485b5adc @@ -6786,41 +5660,6 @@ packages: purls: [] size: 100393 timestamp: 1702724383534 -- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda - sha256: 8b47d5fb00a6ccc0f495d16787ab5f37a434d51965584d6000966252efecf56d - md5: 68dc154b8d415176c07b6995bd3a65d9 - depends: - - icu >=78.1,<79.0a0 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libxml2-16 2.15.1 h3cfd58e_1 - - 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: 43387 - timestamp: 1766327259710 -- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda - sha256: a857e941156b7f462063e34e086d212c6ccbc1521ebdf75b9ed66bd90add57dc - md5: 07d73826fde28e7dbaec52a3297d7d26 - depends: - - icu >=78.1,<79.0a0 - - libiconv >=1.18,<2.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 - constrains: - - libxml2 2.15.1 - license: MIT - license_family: MIT - purls: [] - size: 518964 - timestamp: 1766327232819 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 md5: edb0dca6bc32e4f4789199455a1dbeb8 @@ -6872,47 +5711,6 @@ packages: purls: [] size: 55476 timestamp: 1727963768015 -- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.0-h0d3cbff_0.conda - sha256: b63df4e592b3362e7d13e3d1cf8e55ce932ff4f17611c8514b5d36368ec2094c - md5: 3921780bab286f2439ba483c22b90345 - depends: - - __osx >=11.0 - constrains: - - openmp 22.1.0|22.1.0.* - - intel-openmp <0.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - purls: [] - size: 311938 - timestamp: 1772024731611 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda - sha256: 0daeedb3872ad0fdd6f0d7e7165c63488e8a315d7057907434145fba0c1e7b3d - md5: ff0820b5588b20be3b858552ecf8ffae - depends: - - __osx >=11.0 - constrains: - - openmp 22.1.0|22.1.0.* - - intel-openmp <0.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - purls: [] - size: 285558 - timestamp: 1772028716784 -- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda - sha256: bb55a3736380759d338f87aac68df4fd7d845ae090b94400525f5d21a55eea31 - md5: e5505e0b7d6ef5c19d5c0c1884a2f494 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - constrains: - - openmp 22.1.0|22.1.0.* - - intel-openmp <0.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - purls: [] - size: 347404 - timestamp: 1772025050288 - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl name: lmfit version: 1.3.4 @@ -7045,82 +5843,6 @@ packages: version: 3.0.3 sha256: 4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl - name: matplotlib - version: 3.10.7 - sha256: 1d9d3713a237970569156cfb4de7533b7c4eacdd61789726f444f96a0d28f57f - requires_dist: - - contourpy>=1.0.1 - - cycler>=0.10 - - fonttools>=4.22.0 - - kiwisolver>=1.3.1 - - numpy>=1.23 - - packaging>=20.0 - - pillow>=8 - - pyparsing>=3 - - python-dateutil>=2.7 - - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' - - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' - - setuptools-scm>=7 ; extra == 'dev' - - setuptools>=64 ; extra == 'dev' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: matplotlib - version: 3.10.7 - sha256: b3c4ea4948d93c9c29dc01c0c23eef66f2101bf75158c291b88de6525c55c3d1 - requires_dist: - - contourpy>=1.0.1 - - cycler>=0.10 - - fonttools>=4.22.0 - - kiwisolver>=1.3.1 - - numpy>=1.23 - - packaging>=20.0 - - pillow>=8 - - pyparsing>=3 - - python-dateutil>=2.7 - - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' - - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' - - setuptools-scm>=7 ; extra == 'dev' - - setuptools>=64 ; extra == 'dev' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl - name: matplotlib - version: 3.10.7 - sha256: 37a1fea41153dd6ee061d21ab69c9cf2cf543160b1b85d89cd3d2e2a7902ca4c - requires_dist: - - contourpy>=1.0.1 - - cycler>=0.10 - - fonttools>=4.22.0 - - kiwisolver>=1.3.1 - - numpy>=1.23 - - packaging>=20.0 - - pillow>=8 - - pyparsing>=3 - - python-dateutil>=2.7 - - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' - - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' - - setuptools-scm>=7 ; extra == 'dev' - - setuptools>=64 ; extra == 'dev' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl - name: matplotlib - version: 3.10.7 - sha256: 744991e0cc863dd669c8dc9136ca4e6e0082be2070b9d793cbd64bec872a6815 - requires_dist: - - contourpy>=1.0.1 - - cycler>=0.10 - - fonttools>=4.22.0 - - kiwisolver>=1.3.1 - - numpy>=1.23 - - packaging>=20.0 - - pillow>=8 - - pyparsing>=3 - - python-dateutil>=2.7 - - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' - - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' - - setuptools-scm>=7 ; extra == 'dev' - - setuptools>=64 ; extra == 'dev' - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl name: matplotlib version: 3.10.8 @@ -7473,20 +6195,6 @@ packages: - griffelib>=2.0 - typing-extensions>=4.0 ; python_full_version < '3.11' requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda - sha256: b2b4c84b95210760e4d12319416c60ab66e03674ccdcbd14aeb59f82ebb1318d - md5: fd05d1e894497b012d05a804232254ed - depends: - - llvm-openmp >=21.1.8 - - tbb >=2022.3.0 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: LicenseRef-IntelSimplifiedSoftwareOct2022 - license_family: Proprietary - purls: [] - size: 100224829 - timestamp: 1767634557029 - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl name: mpld3 version: 0.5.12 @@ -7606,34 +6314,6 @@ packages: - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl - name: multidict - version: 6.7.0 - sha256: 30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390 - requires_dist: - - typing-extensions>=4.1.0 ; python_full_version < '3.11' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl - name: multidict - version: 6.7.0 - sha256: 7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159 - requires_dist: - - typing-extensions>=4.1.0 ; python_full_version < '3.11' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: multidict - version: 6.7.0 - sha256: 9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32 - requires_dist: - - typing-extensions>=4.1.0 ; python_full_version < '3.11' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl - name: multidict - version: 6.7.0 - sha256: 9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca - requires_dist: - - typing-extensions>=4.1.0 ; python_full_version < '3.11' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: multidict version: 6.7.1 @@ -7690,26 +6370,6 @@ packages: requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl - name: narwhals - version: 2.12.0 - sha256: baeba5d448a30b04c299a696bd9ee5ff73e4742143e06c49ca316b46539a7cbb - requires_dist: - - cudf>=24.10.0 ; extra == 'cudf' - - dask[dataframe]>=2024.8 ; extra == 'dask' - - duckdb>=1.1 ; extra == 'duckdb' - - ibis-framework>=6.0.0 ; extra == 'ibis' - - packaging ; extra == 'ibis' - - pyarrow-hotfix ; extra == 'ibis' - - rich ; extra == 'ibis' - - modin ; extra == 'modin' - - pandas>=1.1.3 ; extra == 'pandas' - - polars>=0.20.4 ; extra == 'polars' - - pyarrow>=13.0.0 ; extra == 'pyarrow' - - pyspark>=3.5.0 ; extra == 'pyspark' - - pyspark[connect]>=3.5.0 ; extra == 'pyspark-connect' - - sqlframe>=3.22.0,!=3.39.3 ; extra == 'sqlframe' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl name: narwhals version: 2.17.0 @@ -8002,31 +6662,11 @@ packages: sha256: 411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef requires_dist: - jupyter-server>=1.8,<3 - - pytest ; extra == 'test' - - pytest-console-scripts ; extra == 'test' - - pytest-jupyter ; extra == 'test' - - pytest-tornasync ; extra == 'test' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl - name: numpy - version: 2.3.5 - sha256: 00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl - name: numpy - version: 2.3.5 - sha256: aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188 - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl - name: numpy - version: 2.3.5 - sha256: d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - name: numpy - version: 2.3.5 - sha256: 11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017 - requires_python: '>=3.11' + - pytest ; extra == 'test' + - pytest-console-scripts ; extra == 'test' + - pytest-jupyter ; extra == 'test' + - pytest-tornasync ; extra == 'test' + requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: numpy version: 2.4.2 @@ -8067,18 +6707,6 @@ packages: version: 2.4.2 sha256: e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825 requires_python: '>=3.11' -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d - md5: 9ee58d5c534af06558933af3c845a780 - depends: - - __glibc >=2.17,<3.0.a0 - - ca-certificates - - libgcc >=14 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 3165399 - timestamp: 1762839186699 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c md5: f61eb8cd60ff9057122a3d338b99c00f @@ -8091,17 +6719,6 @@ packages: purls: [] size: 3164551 timestamp: 1769555830639 -- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - sha256: 36fe9fb316be22fcfb46d5fa3e2e85eec5ef84f908b7745f68f768917235b2d5 - md5: 3f50cdf9a97d0280655758b735781096 - depends: - - __osx >=10.13 - - ca-certificates - license: Apache-2.0 - license_family: Apache - purls: [] - size: 2778996 - timestamp: 1762840724922 - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda sha256: e02e5639b0e4d6d4fcf0f3b082642844fb5a37316f5b0a1126c6271347462e90 md5: 30bb8d08b99b9a7600d39efb3559fff0 @@ -8113,17 +6730,6 @@ packages: purls: [] size: 2777136 timestamp: 1769557662405 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - sha256: ebe93dafcc09e099782fe3907485d4e1671296bc14f8c383cb6f3dfebb773988 - md5: b34dc4172653c13dcf453862f251af2b - depends: - - __osx >=11.0 - - ca-certificates - license: Apache-2.0 - license_family: Apache - purls: [] - size: 3108371 - timestamp: 1762839712322 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda sha256: 361f5c5e60052abc12bdd1b50d7a1a43e6a6653aab99a2263bf2288d709dcf67 md5: f4f6ad63f98f64191c3e77c5f5f29d76 @@ -8135,19 +6741,6 @@ packages: purls: [] size: 3104268 timestamp: 1769556384749 -- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - sha256: 6d72d6f766293d4f2aa60c28c244c8efed6946c430814175f959ffe8cab899b3 - md5: 84f8fb4afd1157f59098f618cd2437e4 - 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: 9440812 - timestamp: 1762841722179 - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda sha256: 53a5ad2e5553b8157a91bb8aa375f78c5958f77cb80e9d2ce59471ea8e5c0bd6 md5: eb585509b815415bc964b2c7e11c7eb3 @@ -8181,370 +6774,6 @@ packages: - pytest ; extra == 'dev' - tox ; extra == 'dev' - black ; extra == 'lint' -- pypi: https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - name: pandas - version: 2.3.3 - sha256: 318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac - requires_dist: - - numpy>=1.22.4 ; python_full_version < '3.11' - - numpy>=1.23.2 ; python_full_version == '3.11.*' - - numpy>=1.26.0 ; python_full_version >= '3.12' - - python-dateutil>=2.8.2 - - pytz>=2020.1 - - tzdata>=2022.7 - - hypothesis>=6.46.1 ; extra == 'test' - - pytest>=7.3.2 ; extra == 'test' - - pytest-xdist>=2.2.0 ; extra == 'test' - - pyarrow>=10.0.1 ; extra == 'pyarrow' - - bottleneck>=1.3.6 ; extra == 'performance' - - numba>=0.56.4 ; extra == 'performance' - - numexpr>=2.8.4 ; extra == 'performance' - - scipy>=1.10.0 ; extra == 'computation' - - xarray>=2022.12.0 ; extra == 'computation' - - fsspec>=2022.11.0 ; extra == 'fss' - - s3fs>=2022.11.0 ; extra == 'aws' - - gcsfs>=2022.11.0 ; extra == 'gcp' - - pandas-gbq>=0.19.0 ; extra == 'gcp' - - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.1.0 ; extra == 'excel' - - python-calamine>=0.1.7 ; extra == 'excel' - - pyxlsb>=1.0.10 ; extra == 'excel' - - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=3.0.5 ; extra == 'excel' - - pyarrow>=10.0.1 ; extra == 'parquet' - - pyarrow>=10.0.1 ; extra == 'feather' - - tables>=3.8.0 ; extra == 'hdf5' - - pyreadstat>=1.2.0 ; extra == 'spss' - - sqlalchemy>=2.0.0 ; extra == 'postgresql' - - psycopg2>=2.9.6 ; extra == 'postgresql' - - adbc-driver-postgresql>=0.8.0 ; extra == 'postgresql' - - sqlalchemy>=2.0.0 ; extra == 'mysql' - - pymysql>=1.0.2 ; extra == 'mysql' - - sqlalchemy>=2.0.0 ; extra == 'sql-other' - - adbc-driver-postgresql>=0.8.0 ; extra == 'sql-other' - - adbc-driver-sqlite>=0.8.0 ; extra == 'sql-other' - - beautifulsoup4>=4.11.2 ; extra == 'html' - - html5lib>=1.1 ; extra == 'html' - - lxml>=4.9.2 ; extra == 'html' - - lxml>=4.9.2 ; extra == 'xml' - - matplotlib>=3.6.3 ; extra == 'plot' - - jinja2>=3.1.2 ; extra == 'output-formatting' - - tabulate>=0.9.0 ; extra == 'output-formatting' - - pyqt5>=5.15.9 ; extra == 'clipboard' - - qtpy>=2.3.0 ; extra == 'clipboard' - - zstandard>=0.19.0 ; extra == 'compression' - - dataframe-api-compat>=0.1.7 ; extra == 'consortium-standard' - - adbc-driver-postgresql>=0.8.0 ; extra == 'all' - - adbc-driver-sqlite>=0.8.0 ; extra == 'all' - - beautifulsoup4>=4.11.2 ; extra == 'all' - - bottleneck>=1.3.6 ; extra == 'all' - - dataframe-api-compat>=0.1.7 ; extra == 'all' - - fastparquet>=2022.12.0 ; extra == 'all' - - fsspec>=2022.11.0 ; extra == 'all' - - gcsfs>=2022.11.0 ; extra == 'all' - - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.46.1 ; extra == 'all' - - jinja2>=3.1.2 ; extra == 'all' - - lxml>=4.9.2 ; extra == 'all' - - matplotlib>=3.6.3 ; extra == 'all' - - numba>=0.56.4 ; extra == 'all' - - numexpr>=2.8.4 ; extra == 'all' - - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.1.0 ; extra == 'all' - - pandas-gbq>=0.19.0 ; extra == 'all' - - psycopg2>=2.9.6 ; extra == 'all' - - pyarrow>=10.0.1 ; extra == 'all' - - pymysql>=1.0.2 ; extra == 'all' - - pyqt5>=5.15.9 ; extra == 'all' - - pyreadstat>=1.2.0 ; extra == 'all' - - pytest>=7.3.2 ; extra == 'all' - - pytest-xdist>=2.2.0 ; extra == 'all' - - python-calamine>=0.1.7 ; extra == 'all' - - pyxlsb>=1.0.10 ; extra == 'all' - - qtpy>=2.3.0 ; extra == 'all' - - scipy>=1.10.0 ; extra == 'all' - - s3fs>=2022.11.0 ; extra == 'all' - - sqlalchemy>=2.0.0 ; extra == 'all' - - tables>=3.8.0 ; extra == 'all' - - tabulate>=0.9.0 ; extra == 'all' - - xarray>=2022.12.0 ; extra == 'all' - - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=3.0.5 ; extra == 'all' - - zstandard>=0.19.0 ; extra == 'all' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl - name: pandas - version: 2.3.3 - sha256: bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8 - requires_dist: - - numpy>=1.22.4 ; python_full_version < '3.11' - - numpy>=1.23.2 ; python_full_version == '3.11.*' - - numpy>=1.26.0 ; python_full_version >= '3.12' - - python-dateutil>=2.8.2 - - pytz>=2020.1 - - tzdata>=2022.7 - - hypothesis>=6.46.1 ; extra == 'test' - - pytest>=7.3.2 ; extra == 'test' - - pytest-xdist>=2.2.0 ; extra == 'test' - - pyarrow>=10.0.1 ; extra == 'pyarrow' - - bottleneck>=1.3.6 ; extra == 'performance' - - numba>=0.56.4 ; extra == 'performance' - - numexpr>=2.8.4 ; extra == 'performance' - - scipy>=1.10.0 ; extra == 'computation' - - xarray>=2022.12.0 ; extra == 'computation' - - fsspec>=2022.11.0 ; extra == 'fss' - - s3fs>=2022.11.0 ; extra == 'aws' - - gcsfs>=2022.11.0 ; extra == 'gcp' - - pandas-gbq>=0.19.0 ; extra == 'gcp' - - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.1.0 ; extra == 'excel' - - python-calamine>=0.1.7 ; extra == 'excel' - - pyxlsb>=1.0.10 ; extra == 'excel' - - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=3.0.5 ; extra == 'excel' - - pyarrow>=10.0.1 ; extra == 'parquet' - - pyarrow>=10.0.1 ; extra == 'feather' - - tables>=3.8.0 ; extra == 'hdf5' - - pyreadstat>=1.2.0 ; extra == 'spss' - - sqlalchemy>=2.0.0 ; extra == 'postgresql' - - psycopg2>=2.9.6 ; extra == 'postgresql' - - adbc-driver-postgresql>=0.8.0 ; extra == 'postgresql' - - sqlalchemy>=2.0.0 ; extra == 'mysql' - - pymysql>=1.0.2 ; extra == 'mysql' - - sqlalchemy>=2.0.0 ; extra == 'sql-other' - - adbc-driver-postgresql>=0.8.0 ; extra == 'sql-other' - - adbc-driver-sqlite>=0.8.0 ; extra == 'sql-other' - - beautifulsoup4>=4.11.2 ; extra == 'html' - - html5lib>=1.1 ; extra == 'html' - - lxml>=4.9.2 ; extra == 'html' - - lxml>=4.9.2 ; extra == 'xml' - - matplotlib>=3.6.3 ; extra == 'plot' - - jinja2>=3.1.2 ; extra == 'output-formatting' - - tabulate>=0.9.0 ; extra == 'output-formatting' - - pyqt5>=5.15.9 ; extra == 'clipboard' - - qtpy>=2.3.0 ; extra == 'clipboard' - - zstandard>=0.19.0 ; extra == 'compression' - - dataframe-api-compat>=0.1.7 ; extra == 'consortium-standard' - - adbc-driver-postgresql>=0.8.0 ; extra == 'all' - - adbc-driver-sqlite>=0.8.0 ; extra == 'all' - - beautifulsoup4>=4.11.2 ; extra == 'all' - - bottleneck>=1.3.6 ; extra == 'all' - - dataframe-api-compat>=0.1.7 ; extra == 'all' - - fastparquet>=2022.12.0 ; extra == 'all' - - fsspec>=2022.11.0 ; extra == 'all' - - gcsfs>=2022.11.0 ; extra == 'all' - - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.46.1 ; extra == 'all' - - jinja2>=3.1.2 ; extra == 'all' - - lxml>=4.9.2 ; extra == 'all' - - matplotlib>=3.6.3 ; extra == 'all' - - numba>=0.56.4 ; extra == 'all' - - numexpr>=2.8.4 ; extra == 'all' - - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.1.0 ; extra == 'all' - - pandas-gbq>=0.19.0 ; extra == 'all' - - psycopg2>=2.9.6 ; extra == 'all' - - pyarrow>=10.0.1 ; extra == 'all' - - pymysql>=1.0.2 ; extra == 'all' - - pyqt5>=5.15.9 ; extra == 'all' - - pyreadstat>=1.2.0 ; extra == 'all' - - pytest>=7.3.2 ; extra == 'all' - - pytest-xdist>=2.2.0 ; extra == 'all' - - python-calamine>=0.1.7 ; extra == 'all' - - pyxlsb>=1.0.10 ; extra == 'all' - - qtpy>=2.3.0 ; extra == 'all' - - scipy>=1.10.0 ; extra == 'all' - - s3fs>=2022.11.0 ; extra == 'all' - - sqlalchemy>=2.0.0 ; extra == 'all' - - tables>=3.8.0 ; extra == 'all' - - tabulate>=0.9.0 ; extra == 'all' - - xarray>=2022.12.0 ; extra == 'all' - - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=3.0.5 ; extra == 'all' - - zstandard>=0.19.0 ; extra == 'all' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl - name: pandas - version: 2.3.3 - sha256: f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee - requires_dist: - - numpy>=1.22.4 ; python_full_version < '3.11' - - numpy>=1.23.2 ; python_full_version == '3.11.*' - - numpy>=1.26.0 ; python_full_version >= '3.12' - - python-dateutil>=2.8.2 - - pytz>=2020.1 - - tzdata>=2022.7 - - hypothesis>=6.46.1 ; extra == 'test' - - pytest>=7.3.2 ; extra == 'test' - - pytest-xdist>=2.2.0 ; extra == 'test' - - pyarrow>=10.0.1 ; extra == 'pyarrow' - - bottleneck>=1.3.6 ; extra == 'performance' - - numba>=0.56.4 ; extra == 'performance' - - numexpr>=2.8.4 ; extra == 'performance' - - scipy>=1.10.0 ; extra == 'computation' - - xarray>=2022.12.0 ; extra == 'computation' - - fsspec>=2022.11.0 ; extra == 'fss' - - s3fs>=2022.11.0 ; extra == 'aws' - - gcsfs>=2022.11.0 ; extra == 'gcp' - - pandas-gbq>=0.19.0 ; extra == 'gcp' - - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.1.0 ; extra == 'excel' - - python-calamine>=0.1.7 ; extra == 'excel' - - pyxlsb>=1.0.10 ; extra == 'excel' - - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=3.0.5 ; extra == 'excel' - - pyarrow>=10.0.1 ; extra == 'parquet' - - pyarrow>=10.0.1 ; extra == 'feather' - - tables>=3.8.0 ; extra == 'hdf5' - - pyreadstat>=1.2.0 ; extra == 'spss' - - sqlalchemy>=2.0.0 ; extra == 'postgresql' - - psycopg2>=2.9.6 ; extra == 'postgresql' - - adbc-driver-postgresql>=0.8.0 ; extra == 'postgresql' - - sqlalchemy>=2.0.0 ; extra == 'mysql' - - pymysql>=1.0.2 ; extra == 'mysql' - - sqlalchemy>=2.0.0 ; extra == 'sql-other' - - adbc-driver-postgresql>=0.8.0 ; extra == 'sql-other' - - adbc-driver-sqlite>=0.8.0 ; extra == 'sql-other' - - beautifulsoup4>=4.11.2 ; extra == 'html' - - html5lib>=1.1 ; extra == 'html' - - lxml>=4.9.2 ; extra == 'html' - - lxml>=4.9.2 ; extra == 'xml' - - matplotlib>=3.6.3 ; extra == 'plot' - - jinja2>=3.1.2 ; extra == 'output-formatting' - - tabulate>=0.9.0 ; extra == 'output-formatting' - - pyqt5>=5.15.9 ; extra == 'clipboard' - - qtpy>=2.3.0 ; extra == 'clipboard' - - zstandard>=0.19.0 ; extra == 'compression' - - dataframe-api-compat>=0.1.7 ; extra == 'consortium-standard' - - adbc-driver-postgresql>=0.8.0 ; extra == 'all' - - adbc-driver-sqlite>=0.8.0 ; extra == 'all' - - beautifulsoup4>=4.11.2 ; extra == 'all' - - bottleneck>=1.3.6 ; extra == 'all' - - dataframe-api-compat>=0.1.7 ; extra == 'all' - - fastparquet>=2022.12.0 ; extra == 'all' - - fsspec>=2022.11.0 ; extra == 'all' - - gcsfs>=2022.11.0 ; extra == 'all' - - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.46.1 ; extra == 'all' - - jinja2>=3.1.2 ; extra == 'all' - - lxml>=4.9.2 ; extra == 'all' - - matplotlib>=3.6.3 ; extra == 'all' - - numba>=0.56.4 ; extra == 'all' - - numexpr>=2.8.4 ; extra == 'all' - - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.1.0 ; extra == 'all' - - pandas-gbq>=0.19.0 ; extra == 'all' - - psycopg2>=2.9.6 ; extra == 'all' - - pyarrow>=10.0.1 ; extra == 'all' - - pymysql>=1.0.2 ; extra == 'all' - - pyqt5>=5.15.9 ; extra == 'all' - - pyreadstat>=1.2.0 ; extra == 'all' - - pytest>=7.3.2 ; extra == 'all' - - pytest-xdist>=2.2.0 ; extra == 'all' - - python-calamine>=0.1.7 ; extra == 'all' - - pyxlsb>=1.0.10 ; extra == 'all' - - qtpy>=2.3.0 ; extra == 'all' - - scipy>=1.10.0 ; extra == 'all' - - s3fs>=2022.11.0 ; extra == 'all' - - sqlalchemy>=2.0.0 ; extra == 'all' - - tables>=3.8.0 ; extra == 'all' - - tabulate>=0.9.0 ; extra == 'all' - - xarray>=2022.12.0 ; extra == 'all' - - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=3.0.5 ; extra == 'all' - - zstandard>=0.19.0 ; extra == 'all' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl - name: pandas - version: 2.3.3 - sha256: 56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713 - requires_dist: - - numpy>=1.22.4 ; python_full_version < '3.11' - - numpy>=1.23.2 ; python_full_version == '3.11.*' - - numpy>=1.26.0 ; python_full_version >= '3.12' - - python-dateutil>=2.8.2 - - pytz>=2020.1 - - tzdata>=2022.7 - - hypothesis>=6.46.1 ; extra == 'test' - - pytest>=7.3.2 ; extra == 'test' - - pytest-xdist>=2.2.0 ; extra == 'test' - - pyarrow>=10.0.1 ; extra == 'pyarrow' - - bottleneck>=1.3.6 ; extra == 'performance' - - numba>=0.56.4 ; extra == 'performance' - - numexpr>=2.8.4 ; extra == 'performance' - - scipy>=1.10.0 ; extra == 'computation' - - xarray>=2022.12.0 ; extra == 'computation' - - fsspec>=2022.11.0 ; extra == 'fss' - - s3fs>=2022.11.0 ; extra == 'aws' - - gcsfs>=2022.11.0 ; extra == 'gcp' - - pandas-gbq>=0.19.0 ; extra == 'gcp' - - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.1.0 ; extra == 'excel' - - python-calamine>=0.1.7 ; extra == 'excel' - - pyxlsb>=1.0.10 ; extra == 'excel' - - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=3.0.5 ; extra == 'excel' - - pyarrow>=10.0.1 ; extra == 'parquet' - - pyarrow>=10.0.1 ; extra == 'feather' - - tables>=3.8.0 ; extra == 'hdf5' - - pyreadstat>=1.2.0 ; extra == 'spss' - - sqlalchemy>=2.0.0 ; extra == 'postgresql' - - psycopg2>=2.9.6 ; extra == 'postgresql' - - adbc-driver-postgresql>=0.8.0 ; extra == 'postgresql' - - sqlalchemy>=2.0.0 ; extra == 'mysql' - - pymysql>=1.0.2 ; extra == 'mysql' - - sqlalchemy>=2.0.0 ; extra == 'sql-other' - - adbc-driver-postgresql>=0.8.0 ; extra == 'sql-other' - - adbc-driver-sqlite>=0.8.0 ; extra == 'sql-other' - - beautifulsoup4>=4.11.2 ; extra == 'html' - - html5lib>=1.1 ; extra == 'html' - - lxml>=4.9.2 ; extra == 'html' - - lxml>=4.9.2 ; extra == 'xml' - - matplotlib>=3.6.3 ; extra == 'plot' - - jinja2>=3.1.2 ; extra == 'output-formatting' - - tabulate>=0.9.0 ; extra == 'output-formatting' - - pyqt5>=5.15.9 ; extra == 'clipboard' - - qtpy>=2.3.0 ; extra == 'clipboard' - - zstandard>=0.19.0 ; extra == 'compression' - - dataframe-api-compat>=0.1.7 ; extra == 'consortium-standard' - - adbc-driver-postgresql>=0.8.0 ; extra == 'all' - - adbc-driver-sqlite>=0.8.0 ; extra == 'all' - - beautifulsoup4>=4.11.2 ; extra == 'all' - - bottleneck>=1.3.6 ; extra == 'all' - - dataframe-api-compat>=0.1.7 ; extra == 'all' - - fastparquet>=2022.12.0 ; extra == 'all' - - fsspec>=2022.11.0 ; extra == 'all' - - gcsfs>=2022.11.0 ; extra == 'all' - - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.46.1 ; extra == 'all' - - jinja2>=3.1.2 ; extra == 'all' - - lxml>=4.9.2 ; extra == 'all' - - matplotlib>=3.6.3 ; extra == 'all' - - numba>=0.56.4 ; extra == 'all' - - numexpr>=2.8.4 ; extra == 'all' - - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.1.0 ; extra == 'all' - - pandas-gbq>=0.19.0 ; extra == 'all' - - psycopg2>=2.9.6 ; extra == 'all' - - pyarrow>=10.0.1 ; extra == 'all' - - pymysql>=1.0.2 ; extra == 'all' - - pyqt5>=5.15.9 ; extra == 'all' - - pyreadstat>=1.2.0 ; extra == 'all' - - pytest>=7.3.2 ; extra == 'all' - - pytest-xdist>=2.2.0 ; extra == 'all' - - python-calamine>=0.1.7 ; extra == 'all' - - pyxlsb>=1.0.10 ; extra == 'all' - - qtpy>=2.3.0 ; extra == 'all' - - scipy>=1.10.0 ; extra == 'all' - - s3fs>=2022.11.0 ; extra == 'all' - - sqlalchemy>=2.0.0 ; extra == 'all' - - tables>=3.8.0 ; extra == 'all' - - tabulate>=0.9.0 ; extra == 'all' - - xarray>=2022.12.0 ; extra == 'all' - - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=3.0.5 ; extra == 'all' - - zstandard>=0.19.0 ; extra == 'all' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl name: pandas version: 3.0.1 @@ -9298,134 +7527,6 @@ packages: sha256: 7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 requires_dist: - ptyprocess>=0.5 -- pypi: https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - name: pillow - version: 12.0.0 - sha256: f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344 - requires_dist: - - furo ; extra == 'docs' - - olefile ; extra == 'docs' - - sphinx>=8.2 ; extra == 'docs' - - sphinx-autobuild ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - sphinx-inline-tabs ; extra == 'docs' - - sphinxext-opengraph ; extra == 'docs' - - olefile ; extra == 'fpx' - - olefile ; extra == 'mic' - - arro3-compute ; extra == 'test-arrow' - - arro3-core ; extra == 'test-arrow' - - nanoarrow ; extra == 'test-arrow' - - pyarrow ; extra == 'test-arrow' - - check-manifest ; extra == 'tests' - - coverage>=7.4.2 ; extra == 'tests' - - defusedxml ; extra == 'tests' - - markdown2 ; extra == 'tests' - - olefile ; extra == 'tests' - - packaging ; extra == 'tests' - - pyroma>=5 ; extra == 'tests' - - pytest ; extra == 'tests' - - pytest-cov ; extra == 'tests' - - pytest-timeout ; extra == 'tests' - - pytest-xdist ; extra == 'tests' - - trove-classifiers>=2024.10.12 ; extra == 'tests' - - defusedxml ; extra == 'xmp' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl - name: pillow - version: 12.0.0 - sha256: 4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905 - requires_dist: - - furo ; extra == 'docs' - - olefile ; extra == 'docs' - - sphinx>=8.2 ; extra == 'docs' - - sphinx-autobuild ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - sphinx-inline-tabs ; extra == 'docs' - - sphinxext-opengraph ; extra == 'docs' - - olefile ; extra == 'fpx' - - olefile ; extra == 'mic' - - arro3-compute ; extra == 'test-arrow' - - arro3-core ; extra == 'test-arrow' - - nanoarrow ; extra == 'test-arrow' - - pyarrow ; extra == 'test-arrow' - - check-manifest ; extra == 'tests' - - coverage>=7.4.2 ; extra == 'tests' - - defusedxml ; extra == 'tests' - - markdown2 ; extra == 'tests' - - olefile ; extra == 'tests' - - packaging ; extra == 'tests' - - pyroma>=5 ; extra == 'tests' - - pytest ; extra == 'tests' - - pytest-cov ; extra == 'tests' - - pytest-timeout ; extra == 'tests' - - pytest-xdist ; extra == 'tests' - - trove-classifiers>=2024.10.12 ; extra == 'tests' - - defusedxml ; extra == 'xmp' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl - name: pillow - version: 12.0.0 - sha256: 5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b - requires_dist: - - furo ; extra == 'docs' - - olefile ; extra == 'docs' - - sphinx>=8.2 ; extra == 'docs' - - sphinx-autobuild ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - sphinx-inline-tabs ; extra == 'docs' - - sphinxext-opengraph ; extra == 'docs' - - olefile ; extra == 'fpx' - - olefile ; extra == 'mic' - - arro3-compute ; extra == 'test-arrow' - - arro3-core ; extra == 'test-arrow' - - nanoarrow ; extra == 'test-arrow' - - pyarrow ; extra == 'test-arrow' - - check-manifest ; extra == 'tests' - - coverage>=7.4.2 ; extra == 'tests' - - defusedxml ; extra == 'tests' - - markdown2 ; extra == 'tests' - - olefile ; extra == 'tests' - - packaging ; extra == 'tests' - - pyroma>=5 ; extra == 'tests' - - pytest ; extra == 'tests' - - pytest-cov ; extra == 'tests' - - pytest-timeout ; extra == 'tests' - - pytest-xdist ; extra == 'tests' - - trove-classifiers>=2024.10.12 ; extra == 'tests' - - defusedxml ; extra == 'xmp' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl - name: pillow - version: 12.0.0 - sha256: c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5 - requires_dist: - - furo ; extra == 'docs' - - olefile ; extra == 'docs' - - sphinx>=8.2 ; extra == 'docs' - - sphinx-autobuild ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - sphinx-inline-tabs ; extra == 'docs' - - sphinxext-opengraph ; extra == 'docs' - - olefile ; extra == 'fpx' - - olefile ; extra == 'mic' - - arro3-compute ; extra == 'test-arrow' - - arro3-core ; extra == 'test-arrow' - - nanoarrow ; extra == 'test-arrow' - - pyarrow ; extra == 'test-arrow' - - check-manifest ; extra == 'tests' - - coverage>=7.4.2 ; extra == 'tests' - - defusedxml ; extra == 'tests' - - markdown2 ; extra == 'tests' - - olefile ; extra == 'tests' - - packaging ; extra == 'tests' - - pyroma>=5 ; extra == 'tests' - - pytest ; extra == 'tests' - - pytest-cov ; extra == 'tests' - - pytest-timeout ; extra == 'tests' - - pytest-xdist ; extra == 'tests' - - trove-classifiers>=2024.10.12 ; extra == 'tests' - - defusedxml ; extra == 'xmp' - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl name: pillow version: 12.1.1 @@ -9682,11 +7783,6 @@ packages: - trove-classifiers>=2024.10.12 ; extra == 'tests' - defusedxml ; extra == 'xmp' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl - name: pip - version: 26.0.1 - sha256: bdb1b08f4274833d62c1aa29e20907365a2ceb950410df15fc9521bad440122b - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl name: pixi-kernel version: 0.7.1 @@ -9698,52 +7794,12 @@ packages: - msgspec>=0.18 - returns>=0.23 - tomli>=2 ; python_full_version < '3.11' - requires_python: '>=3.10,<4.0' -- pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - name: platformdirs - version: 4.9.2 - sha256: 9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl - name: plotly - version: 6.5.0 - sha256: 5ac851e100367735250206788a2b1325412aa4a4917a4fe3e6f0bc5aa6f3d90a - requires_dist: - - narwhals>=1.15.1 - - packaging - - numpy ; extra == 'express' - - kaleido>=1.1.0 ; extra == 'kaleido' - - pytest ; extra == 'dev-core' - - requests ; extra == 'dev-core' - - ruff==0.11.12 ; extra == 'dev-core' - - plotly[dev-core] ; extra == 'dev-build' - - build ; extra == 'dev-build' - - jupyter ; extra == 'dev-build' - - plotly[dev-build] ; extra == 'dev-optional' - - plotly[kaleido] ; extra == 'dev-optional' - - anywidget ; extra == 'dev-optional' - - colorcet ; extra == 'dev-optional' - - fiona<=1.9.6 ; python_full_version < '3.9' and extra == 'dev-optional' - - geopandas ; extra == 'dev-optional' - - inflect ; extra == 'dev-optional' - - numpy ; extra == 'dev-optional' - - orjson ; extra == 'dev-optional' - - pandas ; extra == 'dev-optional' - - pdfrw ; extra == 'dev-optional' - - pillow ; extra == 'dev-optional' - - plotly-geo ; extra == 'dev-optional' - - polars[timezone] ; extra == 'dev-optional' - - pyarrow ; extra == 'dev-optional' - - pyshp ; extra == 'dev-optional' - - pytz ; extra == 'dev-optional' - - scikit-image ; extra == 'dev-optional' - - scipy ; extra == 'dev-optional' - - shapely ; extra == 'dev-optional' - - statsmodels ; extra == 'dev-optional' - - vaex ; python_full_version < '3.10' and extra == 'dev-optional' - - xarray ; extra == 'dev-optional' - - plotly[dev-optional] ; extra == 'dev' - requires_python: '>=3.8' + requires_python: '>=3.10,<4.0' +- pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl + name: platformdirs + version: 4.9.2 + sha256: 9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl name: plotly version: 6.5.2 @@ -10169,14 +8225,6 @@ packages: - pyyaml - pygments>=2.19.1 ; extra == 'extra' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - name: pyparsing - version: 3.2.5 - sha256: e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e - requires_dist: - - railroad-diagrams ; extra == 'diagrams' - - jinja2 ; extra == 'diagrams' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl name: pyparsing version: 3.3.2 @@ -10288,33 +8336,6 @@ packages: size: 37364553 timestamp: 1770272309861 python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - build_number: 101 - sha256: e89da062abd0d3e76c8d3b35d3cafc5f0d05914339dcb238f9e3675f2a58d883 - md5: 4780fe896e961722d0623fa91d0d3378 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libuuid >=2.41.2,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<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: 37174029 - timestamp: 1761178179147 - python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.14-h74c2667_3_cpython.conda build_number: 3 sha256: 327d6c5eb61657d4b76e1024da9c790d3e7aacee84487403e9eef1b730982e63 @@ -10362,30 +8383,6 @@ packages: size: 17570178 timestamp: 1770272361922 python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.9-h17c18a5_101_cp313.conda - build_number: 101 - sha256: b56484229cf83f6c84e8b138dc53f7f2fa9ee850f42bf1f6d6fa1c03c044c2d3 - md5: fb1e51574ce30d2a4d5e4facb9b2cbd5 - depends: - - __osx >=10.13 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<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: 17521522 - timestamp: 1761177097697 - python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.14-h18782d2_3_cpython.conda build_number: 3 sha256: f862d544a455bedfa5d77305f0a42c8e3392956e364f8f92d6ca1c844fb3fbd1 @@ -10433,30 +8430,6 @@ packages: size: 12770674 timestamp: 1770272314517 python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - build_number: 101 - sha256: 516229f780b98783a5ef4112a5a4b5e5647d4f0177c4621e98aa60bb9bc32f98 - md5: a4241bce59eecc74d4d2396e108c93b8 - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<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: 11915380 - timestamp: 1761176793936 - python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.14-h0159041_3_cpython.conda build_number: 3 sha256: 5676dadd9d4fba1bce51bd7e5cf8fcf76f85b88b7baa15bd10ca00557e67f10e @@ -10504,30 +8477,6 @@ packages: size: 16535316 timestamp: 1770270322707 python_site_packages_path: Lib/site-packages -- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - build_number: 101 - sha256: bc855b513197637c2083988d5cbdcc407a23151cdecff381bd677df33d516a01 - md5: 89d992b9d4b9e88ed54346c9c4a24c1c - depends: - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: Python-2.0 - purls: [] - size: 16613183 - timestamp: 1761175050438 - 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 @@ -10552,17 +8501,6 @@ packages: - pytest>=8.3.5 ; extra == 'testing' - setuptools>=75.1 ; extra == 'testing' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/d8/f0/c5aa0a69fd9326f013110653543f36ece4913c17921f3e1dbd78e1b423ee/python_engineio-4.12.3-py3-none-any.whl - name: python-engineio - version: 4.12.3 - sha256: 7c099abb2a27ea7ab429c04da86ab2d82698cdd6c52406cb73766fe454feb7e1 - requires_dist: - - simple-websocket>=0.10.0 - - requests>=2.21.0 ; extra == 'client' - - websocket-client>=0.54.0 ; extra == 'client' - - aiohttp>=3.4 ; extra == 'asyncio-client' - - sphinx ; extra == 'docs' - requires_python: '>=3.6' - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl name: python-engineio version: 4.13.1 @@ -10602,19 +8540,6 @@ packages: - mkdocs-literate-nav ; extra == 'dev' - mike ; extra == 'dev' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - name: python-socketio - version: 5.15.0 - sha256: e93363102f4da6d8e7a8872bf4908b866c40f070e716aa27132891e643e2687c - requires_dist: - - bidict>=0.21.0 - - python-engineio>=4.11.0 - - requests>=2.21.0 ; extra == 'client' - - websocket-client>=0.54.0 ; extra == 'client' - - aiohttp>=3.4 ; extra == 'asyncio-client' - - tox ; extra == 'dev' - - sphinx ; extra == 'docs' - requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl name: python-socketio version: 5.16.1 @@ -10640,10 +8565,6 @@ packages: purls: [] size: 7002 timestamp: 1752805902938 -- pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - name: pytz - version: '2025.2' - sha256: 5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 - pypi: https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl name: pywin32 version: '311' @@ -10767,17 +8688,6 @@ packages: - colorama==0.4.1 ; python_full_version < '3.5' - colorama>=0.4.1 ; python_full_version >= '3.5' - tomli>=2.0.1 ; extra == 'toml' -- 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/linux-64/readline-8.3-h853b02a_0.conda sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 md5: d7d95fc8287ea7bf33e0e7116d2b95ec @@ -10790,16 +8700,6 @@ packages: purls: [] size: 345073 timestamp: 1765813471974 -- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - sha256: 53017e80453c4c1d97aaf78369040418dea14cf8f46a2fa999f31bd70b36c877 - md5: 342570f8e02f2f022147a7f841475784 - depends: - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 256712 - timestamp: 1740379577668 - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda sha256: 4614af680aa0920e82b953fece85a03007e0719c3399f13d7de64176874b80d5 md5: eefd65452dfe7cce476a519bece46704 @@ -10811,16 +8711,6 @@ packages: purls: [] size: 317819 timestamp: 1765813692798 -- 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/osx-arm64/readline-8.3-h46df422_0.conda sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 md5: f8381319127120ce51e081dce4865cf4 @@ -10943,90 +8833,12 @@ packages: version: 0.15.4 sha256: 451a2e224151729b3b6c9ffb36aed9091b2996fe4bdbd11f47e27d8f2e8888ec requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/64/7c/d8a343b0a622987335a1ac848084079c47c21e44fcc450f9c145b11a56f6/scipp-25.11.0-cp313-cp313-macosx_11_0_arm64.whl - name: scipp - version: 25.11.0 - sha256: 9b082fc7fd29919b4fee007f63db265176becb06c669a4b709feb741b76c612a - requires_dist: - - numpy>=1.20 - - pytest ; extra == 'test' - - matplotlib ; extra == 'test' - - beautifulsoup4 ; extra == 'test' - - ipython ; extra == 'test' - - h5py ; extra == 'extra' - - scipy>=1.7.0 ; extra == 'extra' - - graphviz ; extra == 'extra' - - pooch ; extra == 'extra' - - plopp ; extra == 'extra' - - matplotlib ; extra == 'extra' - - scipp[extra] ; extra == 'all' - - ipympl ; extra == 'all' - - ipython ; extra == 'all' - - ipywidgets ; extra == 'all' - - jupyterlab ; extra == 'all' - - jupyterlab-widgets ; extra == 'all' - - jupyter-nbextensions-configurator ; extra == 'all' - - nodejs ; extra == 'all' - - pythreejs ; extra == 'all' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/71/f2/18d5be10ac890ce7490451eb55d41bf9d96e481751362a30ed1a8bc176fa/scipp-25.11.0-cp313-cp313-macosx_11_0_x86_64.whl - name: scipp - version: 25.11.0 - sha256: fd7788e3ea3dd5334ed7fb53a249413469edc5d836ca5d68b1f271691cf11269 - requires_dist: - - numpy>=1.20 - - pytest ; extra == 'test' - - matplotlib ; extra == 'test' - - beautifulsoup4 ; extra == 'test' - - ipython ; extra == 'test' - - h5py ; extra == 'extra' - - scipy>=1.7.0 ; extra == 'extra' - - graphviz ; extra == 'extra' - - pooch ; extra == 'extra' - - plopp ; extra == 'extra' - - matplotlib ; extra == 'extra' - - scipp[extra] ; extra == 'all' - - ipympl ; extra == 'all' - - ipython ; extra == 'all' - - ipywidgets ; extra == 'all' - - jupyterlab ; extra == 'all' - - jupyterlab-widgets ; extra == 'all' - - jupyter-nbextensions-configurator ; extra == 'all' - - nodejs ; extra == 'all' - - pythreejs ; extra == 'all' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/77/34/1956aed61c4abb91926f9513330afac4654cc2a711ecb73085dc4e2e5c1d/scipp-25.11.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - name: scipp - version: 25.11.0 - sha256: 3e91c8093dc83d433a2e53708561228a06a7e34d8775a20118d391f5b891a6e6 - requires_dist: - - numpy>=1.20 - - pytest ; extra == 'test' - - matplotlib ; extra == 'test' - - beautifulsoup4 ; extra == 'test' - - ipython ; extra == 'test' - - h5py ; extra == 'extra' - - scipy>=1.7.0 ; extra == 'extra' - - graphviz ; extra == 'extra' - - pooch ; extra == 'extra' - - plopp ; extra == 'extra' - - matplotlib ; extra == 'extra' - - scipp[extra] ; extra == 'all' - - ipympl ; extra == 'all' - - ipython ; extra == 'all' - - ipywidgets ; extra == 'all' - - jupyterlab ; extra == 'all' - - jupyterlab-widgets ; extra == 'all' - - jupyter-nbextensions-configurator ; extra == 'all' - - nodejs ; extra == 'all' - - pythreejs ; extra == 'all' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/f6/f3/9d1bb423a2dc0bbebfc98191095dd410a1268397b9c692d76a3ea971c790/scipp-25.11.0-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/12/0d/3f98a936a30bff4a460b51b9f85c4d994f94249930b2d8bedeb8111a359e/scipp-25.12.0-cp311-cp311-macosx_11_0_x86_64.whl name: scipp - version: 25.11.0 - sha256: d44d2aa3f6634ac750a126e50a740c487aa8a2181fcb03764b29ddceeea611cf + version: 25.12.0 + sha256: 6391dc46739006e1e4eb7f2fcbcdbdd40f11a3cbae53e93b63b5ba32909bd792 requires_dist: - - numpy>=1.20 + - numpy>=2 - pytest ; extra == 'test' - matplotlib ; extra == 'test' - beautifulsoup4 ; extra == 'test' @@ -11047,10 +8859,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/26/d5/0b0ca89849806a23da4e56182a72f510bdcf911511b3a0098f8252896941/scipp-26.2.0-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/18/5c/bc0ca94bff65fe0d206a369b54625f8ec7852dfd1d835174692026f34df9/scipp-25.12.0-cp313-cp313-macosx_11_0_arm64.whl name: scipp - version: 26.2.0 - sha256: ec717202c2b7d476ca1c6555171f2da0d7fee7f403858e3421f36cf0243b0799 + version: 25.12.0 + sha256: 0285c91b202dea9aeb18f29d73ff135208a19b2068cd30e17ee81fc435b1943c requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -11073,10 +8885,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/3c/96/565e32544b31d46707370ba9153c98e3d6e2ade120130f0c7c22dfc9d48a/scipp-26.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/4e/b6/ffe0bb67cec66cd450acff599bb07507bbf5ffda1a3a15dd2d8dbe7a6da7/scipp-25.12.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scipp - version: 26.2.0 - sha256: ae686b9466226d831f46b4ce7e643d57066e0bc7d6e8dad9685f82adc9454453 + version: 25.12.0 + sha256: 9ec0200eeb660965056b27f5f05505a961d8921b78d0a92c04743d1c22ce7203 requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -11099,10 +8911,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/46/25/23eea063a85cc565c9e67ca0ac36b9b979c9d76215d62096746cdd8770e2/scipp-26.2.0.tar.gz +- pypi: https://files.pythonhosted.org/packages/6a/3a/ab0eb61593569d5a0d080002e4b8c0998cb1116d8710781b7225c304b880/scipp-25.12.0-cp311-cp311-macosx_11_0_arm64.whl name: scipp - version: 26.2.0 - sha256: 6bd899c9047f709d1759e01b4ffe5c3767e45ffb35822f59cafac0ecfc7a6812 + version: 25.12.0 + sha256: e27082f5bd3655f15479ce87be495235b9bcd9b5db654a7219261be0c6117b31 requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -11125,10 +8937,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/d1/d2/166bce0c7420a30af57b17df2211eb53b33b8126a17e4ba6cd32099b85e7/scipp-26.2.0-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/94/98/aa2d4b9d28969cc7f62409f9f9fc5b5a853af651255eba03e9bee8546dd9/scipp-25.12.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scipp - version: 26.2.0 - sha256: 9f536c423a40734887e7eb6ec44f56b9e81d55cc8d72a92d000d7875748ef410 + version: 25.12.0 + sha256: e5694bef45299c4813ee2fe863fab600c3b0f5e13e2735072dbbb5cf1804d0e0 requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -11151,10 +8963,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/e4/d9/e76ce201285d50d536573047ddba5840718443436e7733439ed42f65ebe4/scipp-26.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/bd/75/6a3786de6645ac2ccd94fbf83c59cc6b929bfa3a89cb62c8cb3be4de0606/scipp-25.12.0-cp311-cp311-win_amd64.whl name: scipp - version: 26.2.0 - sha256: c461709582061daf5fc6381e780669cdd041515c601fbbca86193a6a0cd8e49c + version: 25.12.0 + sha256: aee5f585232e2a7a664f57bb9695164715271b74896704e7ee8a669dd7b06008 requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -11163,195 +8975,71 @@ packages: - ipython ; extra == 'test' - h5py ; extra == 'extra' - scipy>=1.7.0 ; extra == 'extra' - - graphviz ; extra == 'extra' - - pooch ; extra == 'extra' - - plopp ; extra == 'extra' - - matplotlib ; extra == 'extra' - - scipp[extra] ; extra == 'all' - - ipympl ; extra == 'all' - - ipython ; extra == 'all' - - ipywidgets ; extra == 'all' - - jupyterlab ; extra == 'all' - - jupyterlab-widgets ; extra == 'all' - - jupyter-nbextensions-configurator ; extra == 'all' - - nodejs ; extra == 'all' - - pythreejs ; extra == 'all' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: scipy - version: 1.16.3 - sha256: 7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88 - requires_dist: - - numpy>=1.25.2,<2.6 - - 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' - - mypy==1.10.0 ; extra == 'dev' - - typing-extensions ; extra == 'dev' - - types-psutil ; extra == 'dev' - - pycodestyle ; extra == 'dev' - - ruff>=0.0.292 ; extra == 'dev' - - cython-lint>=0.12.2 ; extra == 'dev' - - rich-click ; extra == 'dev' - - doit>=0.36.0 ; extra == 'dev' - - pydevtool ; extra == 'dev' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl - name: scipy - version: 1.16.3 - sha256: 16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d - requires_dist: - - numpy>=1.25.2,<2.6 - - 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' - - mypy==1.10.0 ; extra == 'dev' - - typing-extensions ; extra == 'dev' - - types-psutil ; extra == 'dev' - - pycodestyle ; extra == 'dev' - - ruff>=0.0.292 ; extra == 'dev' - - cython-lint>=0.12.2 ; extra == 'dev' - - rich-click ; extra == 'dev' - - doit>=0.36.0 ; extra == 'dev' - - pydevtool ; extra == 'dev' + - graphviz ; extra == 'extra' + - pooch ; extra == 'extra' + - plopp ; extra == 'extra' + - matplotlib ; extra == 'extra' + - scipp[extra] ; extra == 'all' + - ipympl ; extra == 'all' + - ipython ; extra == 'all' + - ipywidgets ; extra == 'all' + - jupyterlab ; extra == 'all' + - jupyterlab-widgets ; extra == 'all' + - jupyter-nbextensions-configurator ; extra == 'all' + - nodejs ; extra == 'all' + - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl - name: scipy - version: 1.16.3 - sha256: d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c +- pypi: https://files.pythonhosted.org/packages/e5/22/75e119e0a200914f88f121cd956e1eb7f72c8ace4b63171f52ba0334d142/scipp-25.12.0-cp313-cp313-macosx_11_0_x86_64.whl + name: scipp + version: 25.12.0 + sha256: 27ebc37f3b7e20c9dca9cf1a0ac53c4ffaea31c02dfc8ba2b5aa008a252cbcba requires_dist: - - numpy>=1.25.2,<2.6 - - 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' - - mypy==1.10.0 ; extra == 'dev' - - typing-extensions ; extra == 'dev' - - types-psutil ; extra == 'dev' - - pycodestyle ; extra == 'dev' - - ruff>=0.0.292 ; extra == 'dev' - - cython-lint>=0.12.2 ; extra == 'dev' - - rich-click ; extra == 'dev' - - doit>=0.36.0 ; extra == 'dev' - - pydevtool ; extra == 'dev' + - numpy>=2 + - pytest ; extra == 'test' + - matplotlib ; extra == 'test' + - beautifulsoup4 ; extra == 'test' + - ipython ; extra == 'test' + - h5py ; extra == 'extra' + - scipy>=1.7.0 ; extra == 'extra' + - graphviz ; extra == 'extra' + - pooch ; extra == 'extra' + - plopp ; extra == 'extra' + - matplotlib ; extra == 'extra' + - scipp[extra] ; extra == 'all' + - ipympl ; extra == 'all' + - ipython ; extra == 'all' + - ipywidgets ; extra == 'all' + - jupyterlab ; extra == 'all' + - jupyterlab-widgets ; extra == 'all' + - jupyter-nbextensions-configurator ; extra == 'all' + - nodejs ; extra == 'all' + - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl - name: scipy - version: 1.16.3 - sha256: 062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304 +- pypi: https://files.pythonhosted.org/packages/eb/d1/b3cd2733a96a36c54c36889b2cfdd0331c1e5b57fa1757485a22d0ec3142/scipp-25.12.0-cp313-cp313-win_amd64.whl + name: scipp + version: 25.12.0 + sha256: 015db5035749750cf026db56fe537af10f159dc3cd0f51f0ea9f4ecc3a7a5da8 requires_dist: - - numpy>=1.25.2,<2.6 - - 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' - - mypy==1.10.0 ; extra == 'dev' - - typing-extensions ; extra == 'dev' - - types-psutil ; extra == 'dev' - - pycodestyle ; extra == 'dev' - - ruff>=0.0.292 ; extra == 'dev' - - cython-lint>=0.12.2 ; extra == 'dev' - - rich-click ; extra == 'dev' - - doit>=0.36.0 ; extra == 'dev' - - pydevtool ; extra == 'dev' + - numpy>=2 + - pytest ; extra == 'test' + - matplotlib ; extra == 'test' + - beautifulsoup4 ; extra == 'test' + - ipython ; extra == 'test' + - h5py ; extra == 'extra' + - scipy>=1.7.0 ; extra == 'extra' + - graphviz ; extra == 'extra' + - pooch ; extra == 'extra' + - plopp ; extra == 'extra' + - matplotlib ; extra == 'extra' + - scipp[extra] ; extra == 'all' + - ipympl ; extra == 'all' + - ipython ; extra == 'all' + - ipywidgets ; extra == 'all' + - jupyterlab ; extra == 'all' + - jupyterlab-widgets ; extra == 'all' + - jupyter-nbextensions-configurator ; extra == 'all' + - nodejs ; extra == 'all' + - pythreejs ; extra == 'all' requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scipy @@ -11714,63 +9402,6 @@ packages: - pywin32>=305 ; sys_platform == 'win32' and extra == 'nativelib' - pyobjc>=9.0 ; sys_platform == 'darwin' and extra == 'nativelib' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl - name: setuptools - version: 80.9.0 - sha256: 062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922 - requires_dist: - - pytest>=6,!=8.1.* ; extra == 'test' - - virtualenv>=13.0.0 ; extra == 'test' - - wheel>=0.44.0 ; extra == 'test' - - pip>=19.1 ; extra == 'test' - - packaging>=24.2 ; extra == 'test' - - jaraco-envs>=2.2 ; extra == 'test' - - pytest-xdist>=3 ; extra == 'test' - - jaraco-path>=3.7.2 ; extra == 'test' - - build[virtualenv]>=1.0.3 ; extra == 'test' - - filelock>=3.4.0 ; extra == 'test' - - ini2toml[lite]>=0.14 ; extra == 'test' - - tomli-w>=1.0.0 ; extra == 'test' - - pytest-timeout ; extra == 'test' - - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' - - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' - - pytest-home>=0.5 ; extra == 'test' - - pytest-subprocess ; extra == 'test' - - pyproject-hooks!=1.1 ; extra == 'test' - - jaraco-test>=5.5 ; extra == 'test' - - sphinx>=3.5 ; extra == 'doc' - - jaraco-packaging>=9.3 ; extra == 'doc' - - rst-linker>=1.9 ; extra == 'doc' - - furo ; extra == 'doc' - - sphinx-lint ; extra == 'doc' - - jaraco-tidelift>=1.4 ; extra == 'doc' - - pygments-github-lexers==0.0.5 ; extra == 'doc' - - sphinx-favicon ; extra == 'doc' - - sphinx-inline-tabs ; extra == 'doc' - - sphinx-reredirects ; extra == 'doc' - - sphinxcontrib-towncrier ; extra == 'doc' - - sphinx-notfound-page>=1,<2 ; extra == 'doc' - - pyproject-hooks!=1.1 ; extra == 'doc' - - towncrier<24.7 ; extra == 'doc' - - packaging>=24.2 ; extra == 'core' - - more-itertools>=8.8 ; extra == 'core' - - jaraco-text>=3.7 ; extra == 'core' - - importlib-metadata>=6 ; python_full_version < '3.10' and extra == 'core' - - tomli>=2.0.1 ; python_full_version < '3.11' and extra == 'core' - - wheel>=0.43.0 ; extra == 'core' - - platformdirs>=4.2.2 ; extra == 'core' - - jaraco-functools>=4 ; extra == 'core' - - more-itertools ; extra == 'core' - - pytest-checkdocs>=2.4 ; extra == 'check' - - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' - - ruff>=0.8.0 ; sys_platform != 'cygwin' and extra == 'check' - - pytest-cov ; extra == 'cover' - - pytest-enabler>=2.2 ; extra == 'enabler' - - pytest-mypy ; extra == 'type' - - mypy==1.14.* ; extra == 'type' - - importlib-metadata>=7.0.2 ; python_full_version < '3.10' and extra == 'type' - - jaraco-develop>=7.21 ; sys_platform != 'cygwin' and extra == 'type' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl name: setuptools version: 82.0.0 @@ -11870,19 +9501,6 @@ packages: requires_dist: - wcwidth ; extra == 'widechars' requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda - sha256: abd9a489f059fba85c8ffa1abdaa4d515d6de6a3325238b8e81203b913cf65a9 - md5: 0f9817ffbe25f9e69ceba5ea70c52606 - depends: - - libhwloc >=2.12.2,<2.12.3.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: Apache-2.0 - license_family: APACHE - purls: [] - size: 155869 - timestamp: 1767886839029 - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl name: terminado version: 0.18.1 @@ -11925,20 +9543,6 @@ packages: purls: [] size: 3301196 timestamp: 1769460227866 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64 - md5: 86bc20552bf46075e3d92b67f089172d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - constrains: - - xorg-libx11 >=1.8.12,<2.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3284905 - timestamp: 1763054914403 - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda sha256: 7f0d9c320288532873e2d8486c331ec6d87919c9028208d3f6ac91dc8f99a67b md5: 6e6efb7463f8cef69dbcb4c2205bf60e @@ -11950,17 +9554,6 @@ packages: purls: [] size: 3282953 timestamp: 1769460532442 -- conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - sha256: 0d0b6cef83fec41bc0eb4f3b761c4621b7adfb14378051a8177bd9bb73d26779 - md5: bd9f1de651dbd80b51281c694827f78f - depends: - - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3262702 - timestamp: 1763055085507 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3 md5: a9d86bc62f39b94c4661716624eb21b0 @@ -11972,29 +9565,6 @@ packages: purls: [] size: 3127137 timestamp: 1769460817696 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - sha256: ad0c67cb03c163a109820dc9ecf77faf6ec7150e942d1e8bb13e5d39dc058ab7 - md5: a73d54a5abba6543cb2f0af1bfbd6851 - depends: - - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3125484 - timestamp: 1763055028377 -- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - sha256: 4581f4ffb432fefa1ac4f85c5682cc27014bcd66e7beaa0ee330e927a7858790 - md5: 7cb36e506a7dba4817970f8adb6396f9 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: TCL - license_family: BSD - purls: [] - size: 3472313 - timestamp: 1763055164278 - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda sha256: 0e79810fae28f3b69fe7391b0d43f5474d6bd91d451d5f2bde02f55ae481d5e3 md5: 0481bfd9814bf525bd4b3ee4b51494c4 @@ -12087,10 +9657,6 @@ packages: - pytest-mypy-testing ; extra == 'test' - pytest>=7.0,<8.2 ; extra == 'test' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - name: trove-classifiers - version: 2025.11.14.15 - sha256: d1dac259c1e908939862e3331177931c6df0a37af2c1a8debcc603d9115fcdd9 - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl name: trove-classifiers version: 2026.1.14.14 @@ -12107,23 +9673,11 @@ packages: requires_dist: - typing-extensions>=4.12.0 requires_python: '>=3.9' -- 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' - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl name: tzdata version: '2025.3' sha256: 06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 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/noarch/tzdata-2025c-hc9c84f9_1.conda sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c md5: ad659d0a2b3e47e38d829aa8cad2d610 @@ -12208,18 +9762,6 @@ packages: - tomli>=1.2.1 ; python_full_version < '3.11' and extra == 'all' - validate-pyproject-schema-store ; extra == 'store' requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - sha256: 82250af59af9ff3c6a635dd4c4764c631d854feb334d6747d356d949af44d7cf - md5: ef02bbe151253a72b8eda264a935db66 - depends: - - vc14_runtime >=14.42.34433 - track_features: - - vc14 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 18861 - timestamp: 1760418772353 - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda sha256: 9dc40c2610a6e6727d635c62cced5ef30b7b30123f5ef67d6139e23d21744b3a md5: 1e610f2416b6acdd231c5f573d754a0f @@ -12232,19 +9774,6 @@ packages: purls: [] size: 19356 timestamp: 1767320221521 -- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - sha256: e3a3656b70d1202e0d042811ceb743bd0d9f7e00e2acdf824d231b044ef6c0fd - md5: 378d5dcec45eaea8d303da6f00447ac0 - depends: - - ucrt >=10.0.20348.0 - - vcomp14 14.44.35208 h818238b_32 - constrains: - - vs2015_runtime 14.44.35208.* *_32 - license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime - license_family: Proprietary - purls: [] - size: 682706 - timestamp: 1760418629729 - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda sha256: 02732f953292cce179de9b633e74928037fa3741eb5ef91c3f8bae4f761d32a5 md5: 37eb311485d2d8b2c419449582046a42 @@ -12258,18 +9787,6 @@ packages: purls: [] size: 683233 timestamp: 1767320219644 -- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - sha256: f3790c88fbbdc55874f41de81a4237b1b91eab75e05d0e58661518ff04d2a8a1 - md5: 58f67b437acbf2764317ba273d731f1d - depends: - - ucrt >=10.0.20348.0 - constrains: - - vs2015_runtime 14.44.35208.* *_32 - license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime - license_family: Proprietary - purls: [] - size: 114846 - timestamp: 1760418593847 - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda sha256: 878d5d10318b119bd98ed3ed874bd467acbe21996e1d81597a1dbf8030ea0ce6 md5: 242d9f25d2ae60c76b38a5e42858e51d @@ -12390,42 +9907,6 @@ packages: requires_dist: - h11>=0.16.0,<1 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl - name: yarl - version: 1.22.0 - sha256: 01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a - requires_dist: - - idna>=2.0 - - multidict>=4.0 - - propcache>=0.2.1 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: yarl - version: 1.22.0 - sha256: bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b - requires_dist: - - idna>=2.0 - - multidict>=4.0 - - propcache>=0.2.1 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl - name: yarl - version: 1.22.0 - sha256: 22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c - requires_dist: - - idna>=2.0 - - multidict>=4.0 - - propcache>=0.2.1 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl - name: yarl - version: 1.22.0 - sha256: 47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d - requires_dist: - - idna>=2.0 - - multidict>=4.0 - - propcache>=0.2.1 - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/24/84/e237607faf4e099dbb8a4f511cfd5efcb5f75918baad200ff7380635631b/yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl name: yarl version: 1.23.0 diff --git a/pixi.toml b/pixi.toml index 870e5e4e..b92d7175 100644 --- a/pixi.toml +++ b/pixi.toml @@ -42,10 +42,10 @@ channels = ['conda-forge'] [dependencies] nodejs = '*' # Required for Prettier (non-Python formatting) -gsl = '*' # GNU Scientific Library; required for pdffit2. +#gsl = '*' # GNU Scientific Library; required for pdffit2. [pypi-dependencies] # == [feature.default.pypi-dependencies] -pip = '*' # Native package installer +#pip = '*' # Native package installer easyscience = { path = ".", editable = true, extras = ['dev'] } # Specific features: Set specific Python versions @@ -203,10 +203,10 @@ pre-commit-setup = { depends-on = [ # 🐙️ GitHub Tasks ################# -repo-wiki = 'gh api -X PATCH repos/easyscience/core -f has_wiki=false' -repo-discussions = 'gh api -X PATCH repos/easyscience/core -f has_discussions=true' -repo-description = "gh api -X PATCH repos/easyscience/core -f description='Core building blocks for EasyScience'" -repo-homepage = "gh api -X PATCH repos/easyscience/core -f homepage='https://easyscience.github.io/core'" +repo-wiki = 'gh api -X PATCH repos/easyscience/corelib -f has_wiki=false' +repo-discussions = 'gh api -X PATCH repos/easyscience/corelib -f has_discussions=true' +repo-description = "gh api -X PATCH repos/easyscience/corelib -f description='Core building blocks for EasyScience'" +repo-homepage = "gh api -X PATCH repos/easyscience/corelib -f homepage='https://easyscience.github.io/corelib'" repo-config = { depends-on = [ 'repo-wiki', 'repo-discussions', @@ -214,16 +214,16 @@ repo-config = { depends-on = [ 'repo-homepage', ] } -master-protection = 'gh api -X POST repos/easyscience/core/rulesets --input .github/configs/rulesets-master.json' -develop-protection = 'gh api -X POST repos/easyscience/core/rulesets --input .github/configs/rulesets-develop.json' -gh-pages-protection = 'gh api -X POST repos/easyscience/core/rulesets --input .github/configs/rulesets-gh-pages.json' +master-protection = 'gh api -X POST repos/easyscience/corelib/rulesets --input .github/configs/rulesets-master.json' +develop-protection = 'gh api -X POST repos/easyscience/corelib/rulesets --input .github/configs/rulesets-develop.json' +gh-pages-protection = 'gh api -X POST repos/easyscience/corelib/rulesets --input .github/configs/rulesets-gh-pages.json' branch-protection = { depends-on = [ 'master-protection', 'develop-protection', 'gh-pages-protection', ] } -pages-deployment = 'gh api -X POST repos/easyscience/core/pages --input .github/configs/pages-deployment.json' +pages-deployment = 'gh api -X POST repos/easyscience/corelib/pages --input .github/configs/pages-deployment.json' github-labels = 'python tools/update_github_labels.py' diff --git a/pyproject.toml b/pyproject.toml index 9dc20703..efae7072 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ dependencies = [ 'dfo-ls', # Derivative-free optimization 'uncertainties', # Propagation of uncertainties in calculations 'numpy', # Numerical computing - 'scipp', # Handling and analysis of scientific data + 'scipp<26.1.0', # Handling and analysis of scientific data 'pooch', # Data downloader 'jupyterlab', # Jupyter notebooks 'pixi-kernel', # Pixi Jupyter kernel @@ -66,10 +66,10 @@ dev = [ ] [project.urls] -homepage = 'https://easyscience.github.io/core' -documentation = 'https://easyscience.github.io/core' -source = 'https://github.com/easyscience/core' -tracker = 'https://github.com/easyscience/core/issues' +homepage = 'https://easyscience.github.io/corelib' +documentation = 'https://easyscience.github.io/corelib' +source = 'https://github.com/easyscience/corelib' +tracker = 'https://github.com/easyscience/corelib/issues' ############################ # Build system configuration From da4387085d47ff939066c130670346f930fc4435 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 21:17:17 +0100 Subject: [PATCH 13/35] Remove legacy workflow --- .github/workflows/quality.yml | 121 ---------------------------------- 1 file changed, 121 deletions(-) delete mode 100644 .github/workflows/quality.yml diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml deleted file mode 100644 index 1fe7ecbd..00000000 --- a/.github/workflows/quality.yml +++ /dev/null @@ -1,121 +0,0 @@ -# The workflow is divided into several steps to ensure code quality: -# - Check the validity of pyproject.toml -# - Check code linting -# - Check code formatting -# - Check formatting of docstrings in the code -# - Check formatting of Markdown, YAML, TOML, etc. files - -name: Code quality checks - -on: - # Trigger the workflow on push - push: - branches-ignore: [master, main] # Already verified in PR - # Do not run this workflow on creating a new tag starting with - # 'v', e.g. 'v1.0.3' (see publish-pypi.yml) - tags-ignore: ['v*'] - # Trigger the workflow on pull request - pull_request: - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Allow only one concurrent workflow, skipping runs queued between the run -# in-progress and latest queued. And cancel in-progress runs. -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -permissions: - contents: read - -# Set the environment variables to be used in all jobs defined in this workflow -env: - CI_BRANCH: ${{ github.head_ref || github.ref_name }} - -jobs: - code-quality: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v5 - - - name: Set up pixi - uses: ./.github/actions/setup-pixi - - - name: Run post-install developer steps - run: pixi run post-install - - # Check the validity of pyproject.toml - - name: Check validity of pyproject.toml - id: check_pyproject - continue-on-error: true - shell: bash - run: pixi run pyproject-check - - # Check code linting with Ruff in the project root - - name: Check code linting - id: check_code_linting - continue-on-error: true - shell: bash - run: pixi run py-lint-check - - # Check code formatting with Ruff in the project root - - name: Check code formatting - id: check_code_formatting - continue-on-error: true - shell: bash - run: pixi run py-format-check - - # Check formatting of docstrings in the code with docformatter - - name: Check formatting of docstrings in the code - id: check_docs_formatting - continue-on-error: true - shell: bash - run: pixi run docs-format-check - - # Check formatting of MD, YAML, TOML, etc. files with Prettier in - # the project root - - name: Check formatting of MD, YAML, TOML, etc. files - id: check_others_formatting - continue-on-error: true - shell: bash - run: pixi run nonpy-format-check - # Check formatting of Jupyter Notebooks in the tutorials folder - - name: Prepare notebooks and check formatting - id: check_notebooks_formatting - continue-on-error: true - shell: bash - run: | - pixi run notebook-prepare - pixi run notebook-format-check - - # Add summary - - name: Add quality checks summary - if: always() - shell: bash - run: | - { - echo "## 🧪 Code Quality Checks Summary" - echo "" - echo "| Check | Status |" - echo "|-------|--------|" - echo "| pyproject.toml | ${{ steps.check_pyproject.outcome == 'success' && '✅' || '❌' }} |" - echo "| py lint | ${{ steps.check_code_linting.outcome == 'success' && '✅' || '❌' }} |" - echo "| py format | ${{ steps.check_code_formatting.outcome == 'success' && '✅' || '❌' }} |" - echo "| docstring format | ${{ steps.check_docs_formatting.outcome == 'success' && '✅' || '❌' }} |" - echo "| nonpy format | ${{ steps.check_others_formatting.outcome == 'success' && '✅' || '❌' }} |" - echo "| notebooks format | ${{ steps.check_notebooks_formatting.outcome == 'success' && '✅' || '❌' }} |" - } >> "$GITHUB_STEP_SUMMARY" - - # Fail job if any check failed - - name: Fail job if any check failed - if: | - steps.check_pyproject.outcome == 'failure' - || steps.check_code_linting.outcome == 'failure' - || steps.check_code_formatting.outcome == 'failure' - || steps.check_docs_formatting.outcome == 'failure' - || steps.check_others_formatting.outcome == 'failure' - || steps.check_notebooks_formatting.outcome == 'failure' - shell: bash - run: exit 1 From d1591478d174bd5995cbb8ec3501f879a885ff1b Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 21:19:05 +0100 Subject: [PATCH 14/35] Apply new templates --- .copier-answers.yml | 2 +- pixi.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index c3a61ed4..e66c1069 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,6 +1,6 @@ # WARNING: Do not edit this file manually. # Any changes will be overwritten by Copier. -_commit: v0.7.0-4-g9affb8e +_commit: v0.7.0-5-g73c914e _src_path: gh:easyscience/templates lib_docs_url: https://easyscience.github.io/corelib lib_doi: 10.5281/zenodo.18163581 diff --git a/pixi.toml b/pixi.toml index b92d7175..302ce684 100644 --- a/pixi.toml +++ b/pixi.toml @@ -42,7 +42,7 @@ channels = ['conda-forge'] [dependencies] nodejs = '*' # Required for Prettier (non-Python formatting) -#gsl = '*' # GNU Scientific Library; required for pdffit2. +#gsl = '*' # GNU Scientific Library; required for pdffit2 [pypi-dependencies] # == [feature.default.pypi-dependencies] #pip = '*' # Native package installer From 949de4f49e594a904ccbc630b3982ffa752285e1 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 2 Mar 2026 23:59:20 +0100 Subject: [PATCH 15/35] Apply new templates and fix copier paths --- .copier-answers.yml | 4 +--- .github/workflows/lint-format.yml | 2 +- pixi.toml | 6 +++--- pyproject.toml | 1 - 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index e66c1069..4386c013 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,6 +1,6 @@ # WARNING: Do not edit this file manually. # Any changes will be overwritten by Copier. -_commit: v0.7.0-5-g73c914e +_commit: v0.7.0-9-g01d70bc _src_path: gh:easyscience/templates lib_docs_url: https://easyscience.github.io/corelib lib_doi: 10.5281/zenodo.18163581 @@ -13,9 +13,7 @@ project_copyright_years: 2021-2026 project_extended_description: The foundation of the framework, providing reusable building blocks for scientific libraries and applications aimed at making data analysis easier -project_homepage_url: https://easyscience.github.io/corelib project_name: EasyScience -project_repo_name: corelib project_short_description: Core building blocks for EasyScience project_shortcut: ES project_type: lib diff --git a/.github/workflows/lint-format.yml b/.github/workflows/lint-format.yml index eb819912..fadf1634 100644 --- a/.github/workflows/lint-format.yml +++ b/.github/workflows/lint-format.yml @@ -5,7 +5,7 @@ # - Check formatting of docstrings in the code # - Check formatting of Markdown, YAML, TOML, etc. files -name: Lint & Format checks +name: Lint and format checks on: # Trigger the workflow on push diff --git a/pixi.toml b/pixi.toml index 302ce684..24c0854c 100644 --- a/pixi.toml +++ b/pixi.toml @@ -182,9 +182,9 @@ docs-update-assets = 'python tools/update_docs_assets.py' # 📦 Template Management Tasks ############################## -copier-copy = "copier copy gh:easyscience/templates . --data-file ../corelib/.copier-answers.yml --data template_type=lib" -copier-recopy = "copier recopy --data-file ../corelib/.copier-answers.yml --data template_type=lib" -copier-update = "copier update --data-file ../corelib/.copier-answers.yml --data template_type=lib" +copier-copy = "copier copy gh:easyscience/templates . --data-file .copier-answers.yml --data template_type=lib" +copier-recopy = "copier recopy --data-file .copier-answers.yml --data template_type=lib" +copier-update = "copier update --data-file .copier-answers.yml --data template_type=lib" ##################### # 🪝 Pre-commit Hooks diff --git a/pyproject.toml b/pyproject.toml index efae7072..b260f0c9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,7 +66,6 @@ dev = [ ] [project.urls] -homepage = 'https://easyscience.github.io/corelib' documentation = 'https://easyscience.github.io/corelib' source = 'https://github.com/easyscience/corelib' tracker = 'https://github.com/easyscience/corelib/issues' From a1bb3ea9f933e754f3c45105790cf621626c7514 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 3 Mar 2026 00:01:46 +0100 Subject: [PATCH 16/35] Update pixi lock --- pixi.lock | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/pixi.lock b/pixi.lock index 95844baf..05539bfe 100644 --- a/pixi.lock +++ b/pixi.lock @@ -174,7 +174,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -412,7 +412,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -650,7 +650,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -877,7 +877,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -1130,7 +1130,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -1367,7 +1367,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -1604,7 +1604,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -1830,7 +1830,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -2082,7 +2082,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -2320,7 +2320,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -2558,7 +2558,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -2785,7 +2785,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl @@ -3836,8 +3836,8 @@ packages: requires_python: '>=3.5' - pypi: ./ name: easyscience - version: 1.0.1+dev66 - sha256: ca8e408e5343cbd1e224f0d41e28783f2104c5fca6911c9cbdb47ee95286f178 + version: 1.0.1+devdirty69 + sha256: fb649e8fd2953408f53c19f20011c65061804995c1c2328ef0e7704afe90c254 requires_dist: - asteval - bumps @@ -7800,10 +7800,10 @@ packages: version: 4.9.2 sha256: 9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl name: plotly - version: 6.5.2 - sha256: 91757653bd9c550eeea2fa2404dba6b85d1e366d54804c340b2c874e5a7eb4a4 + version: 6.6.0 + sha256: 8d6daf0f87412e0c0bfe72e809d615217ab57cc715899a1e5145135a7800d1d0 requires_dist: - narwhals>=1.15.1 - packaging From dc489960ccee50b20ba9ff24497b10273efcb610 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 3 Mar 2026 00:39:04 +0100 Subject: [PATCH 17/35] Add QENS and SANS fitting tutorials to docs --- docs/docs/tutorials/fitting-qens.ipynb | 498 +++++++++++++++++++++++++ docs/docs/tutorials/fitting-sans.ipynb | 480 ++++++++++++++++++++++++ docs/docs/tutorials/index.md | 8 +- docs/docs/tutorials/tutorial.py | 20 - docs/mkdocs.yml | 3 +- 5 files changed, 986 insertions(+), 23 deletions(-) create mode 100644 docs/docs/tutorials/fitting-qens.ipynb create mode 100644 docs/docs/tutorials/fitting-sans.ipynb delete mode 100644 docs/docs/tutorials/tutorial.py diff --git a/docs/docs/tutorials/fitting-qens.ipynb b/docs/docs/tutorials/fitting-qens.ipynb new file mode 100644 index 00000000..07fb00e9 --- /dev/null +++ b/docs/docs/tutorials/fitting-qens.ipynb @@ -0,0 +1,498 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Fitting QENS data\n", + "\n", + "Some quasi-elastic neutron scattering (QENS) data has been simulated and reduced and can now be analysed with `easyscience`.\n", + "Before the analysis can begin, it is necessary to load the experimental data and check that it looks reasonable. \n", + "The data can be loaded with `np.loadtxt` as the data has been stored in a simple space-separated column file." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def fetch_data(name: str) -> str:\n", + " \"\"\"\n", + " Fetch pre-prepared data from a remote source and return the path to the file.\n", + " \"\"\"\n", + " import pooch\n", + "\n", + " return pooch.retrieve(\n", + " url=f'https://public.esss.dk/groups/scipp/dmsc-summer-school/2025/{name}',\n", + " known_hash=None,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "remove-cell", + "dmsc-school-keep" + ] + }, + "outputs": [], + "source": [ + "filename = fetch_data('4-reduction/energy_transfer_QENS_unknown_quasi_elastic_many_neutrons.dat')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def load(filename: str):\n", + " \"\"\"\n", + " Load data from a file. Filter out any NaN values.\n", + " \"\"\"\n", + " x, y, e = np.loadtxt(filename, unpack=True)\n", + " sel = np.isfinite(y)\n", + " return x[sel], y[sel], e[sel]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "q, i, di = load(filename)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "With the data read in, we can produce a quick plot. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "fig, ax = plt.subplots()\n", + "ax.errorbar(q, i, di, fmt='.')\n", + "ax.set(xlabel='$\\\\omega$/meV', ylabel='$I(\\\\omega)$')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "The QENS data covers a slightly broader range than we want to investigate.\n", + "Therefore, we will crop the data so that we are only using points between -0.06 and 0.06 meV. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "sel = (q > -0.06) & (q < 0.06)\n", + "q, i, di = q[sel], i[sel], di[sel]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "We now want to consider the mathematical model to be used in the analysis. \n", + "QENS data is typically analysed by fitting a Lorentzian function to the data, which has the functional form\n", + "\n", + "$$\n", + "I(\\omega) = \\frac{A\\gamma}{\\pi\\big[(\\omega - \\omega_0) ^ 2 + \\gamma ^ 2\\big]},\n", + "$$ (lorentzian)\n", + "\n", + "where $A$ is a scale factor, $\\gamma$ is the half-width at half-maximum, and $\\omega_0$ is the centre offset. \n", + "\n", + "## Exercise 1: implement a Lorentzian function\n", + "\n", + "Write a function that implements Eqn. {eq}`lorentzian`, called `lorentzian`. \n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide-cell", + "solution" + ] + }, + "outputs": [], + "source": [ + "def lorentzian(omega: np.ndarray) -> np.ndarray:\n", + " \"\"\"\n", + " A Lorentzian function.\n", + "\n", + " :omega: the energy transfer values to calculate over.\n", + "\n", + " :return: intensity values.\n", + " \"\"\"\n", + " return A.value / np.pi * gamma.value / ((omega - omega_0.value) ** 2 + gamma.value**2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "The instrument has a finite resolution, and to take this into account, the Lorentzian function must be convolved with this resolution. In our case, the resolution is a Gaussian distribution that is centred at zero with width, $\\sigma$. \n", + "In real experiments there are ways to measure $\\sigma$, but for this project, we will simply model it. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "from scipy.stats import norm\n", + "\n", + "\n", + "def intensity(omega):\n", + " \"\"\"\n", + " The convolution of a Gaussian and the Lorentzian.\n", + "\n", + " :omega: the energy transfer values to calculate over.\n", + "\n", + " :return: intensity values.\n", + " \"\"\"\n", + " gauss = norm(0, sigma.value).pdf(omega)\n", + " gauss /= gauss.sum()\n", + " return np.convolve(lorentzian(omega), gauss, 'same')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This means that there are a total of four parameters in our model. \n", + "\n", + "## Exercise 2: create fitting parameters\n", + "\n", + "Create four `Parameter` objects, for $A$, $\\gamma$, $\\omega_0$, and $\\sigma$.\n", + "\n", + "Each should have an initial value and a uniform prior distribution, based on the values given in {numref}`qens-parameters`." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "remove-cell", + "dmsc-school-keep" + ] + }, + "source": [ + "| Parameter | Initial Value | Min | Max |\n", + "| --- | --- | --- | --- |\n", + "| $A$ | 10 | 1 | 100 |\n", + "| $\\gamma$ | 8.0 × 10-3 | 1.0 × 10-4 | 1.0 × 10-2 |\n", + "| $\\omega_0$ | 1.0 × 10-3 | 0 | 2.0 × 10-3 |\n", + "| $\\sigma$ | 1.0 × 10-3 | 1.0 × 10-5 | 1.0 × 10-1 |" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "dmsc-school-remove" + ] + }, + "source": [ + "```{list-table} Parameter values.\n", + ":name: qens-parameters\n", + ":header-rows: 1\n", + ":align: center\n", + "\n", + "* - Parameter\n", + " - Initial Value\n", + " - Min\n", + " - Max\n", + "* - $A$\n", + " - 10\n", + " - 1\n", + " - 100\n", + "* - $\\gamma$\n", + " - 8.0 × 10-3\n", + " - 1.0 × 10-4\n", + " - 1.0 × 10-2\n", + "* - $\\omega_0$\n", + " - 1.0 × 10-3\n", + " - 0\n", + " - 2.0 × 10-3\n", + "* - $\\sigma$\n", + " - 1.0 × 10-3\n", + " - 1.0 × 10-5\n", + " - 1.0 × 10-1\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide-cell", + "solution" + ] + }, + "outputs": [], + "source": [ + "from easyscience import Parameter\n", + "\n", + "A = Parameter(name='A', value=10, fixed=False, min=0.01, max=100)\n", + "gamma = Parameter(name='gamma', value=8e-3, fixed=False, min=1e-4, max=10e-3)\n", + "omega_0 = Parameter(name='omega_0', value=0.001, fixed=False, min=0, max=0.002)\n", + "sigma = Parameter(name='sigma', value=0.001, fixed=False, min=1e-5, max=0.1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "It is now possible to compare our model at the initial estimates to the simulated data. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "ax.errorbar(q, i, di, fmt='.')\n", + "ax.plot(q, intensity(q), '-k', zorder=10)\n", + "ax.set(xlabel='$\\\\omega$/meV', ylabel='$I(\\\\omega)$')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercise 3: find maximum likelihood estimates\n", + "\n", + "Using `easyscience`, obtain maximum likelihood estimates for the four parameters of the model from comparison with the data.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide-cell", + "solution" + ] + }, + "outputs": [], + "source": [ + "from easyscience import Fitter\n", + "from easyscience import ObjBase\n", + "\n", + "params = ObjBase(name='params', A=A, gamma=gamma, omega_0=omega_0, sigma=sigma)\n", + "f = Fitter(params, intensity)\n", + "\n", + "res = f.fit(x=q, y=i, weights=1 / di)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "We can then plot the model and the data together as before and print the values of the parameters along with their uncertainties. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "ax.errorbar(q, i, di, fmt='.')\n", + "ax.plot(q, intensity(q), '-k', zorder=10)\n", + "ax.set(xlabel='$\\\\omega$/meV', ylabel='$I(\\\\omega)$')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "A, gamma, omega_0, sigma" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/docs/tutorials/fitting-sans.ipynb b/docs/docs/tutorials/fitting-sans.ipynb new file mode 100644 index 00000000..b321483c --- /dev/null +++ b/docs/docs/tutorials/fitting-sans.ipynb @@ -0,0 +1,480 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Fitting SANS data\n", + "\n", + "Some small angle neutron scattering (SANS) data has been simulated and reduced, and can now be analysed with `easyscience`.\n", + "Before the analysis can begin, it is necessary to load the experimental data and check that it looks reasonable. \n", + "The data can be loaded with `np.loadtxt` as the data has been stored in a simple space-separated column file. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def fetch_data(name: str) -> str:\n", + " \"\"\"\n", + " Fetch pre-prepared data from a remote source and return the path to the file.\n", + " \"\"\"\n", + " import pooch\n", + "\n", + " return pooch.retrieve(\n", + " url=f'https://public.esss.dk/groups/scipp/dmsc-summer-school/2025/{name}',\n", + " known_hash=None,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "remove-cell", + "dmsc-school-keep" + ] + }, + "outputs": [], + "source": [ + "filename = fetch_data('4-reduction/sans_iofq.dat')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def load(filename: str):\n", + " \"\"\"\n", + " Load data from a file. Filter out any NaN values.\n", + " \"\"\"\n", + " x, y, e = np.loadtxt(filename, unpack=True)\n", + " sel = np.isfinite(y)\n", + " return x[sel], y[sel], e[sel]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "q, i, di = load(filename)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "With the data read in, we can produce a quick plot. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "fig, ax = plt.subplots()\n", + "ax.errorbar(q, i, di, fmt='.')\n", + "ax.set(yscale='log', xlabel='$q$/Å^-1', ylabel='I(q)')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "We now want to consider the mathematical model to be used in the analysis. \n", + "There are SANS models a range of different systems, see for instance [the models in SasView](https://www.sasview.org/docs/user/qtgui/Perspectives/Fitting/models/index.html). \n", + "However, initially, we will assume that our data has arisen from a spherical system. \n", + "\n", + "The mathematical model for a sphere is \n", + "\n", + "$$\n", + "I(q) = \\frac{\\text{scale}}{V} \\bigg(\\frac{3 V \\Delta \\rho [\\sin{(qr)} - qr \\cos{(qr)}]}{(qr)^3}\\bigg)^2 + \\text{bkg}, \n", + "$$ (sphere)\n", + "\n", + "where $\\text{scale}$ is a scale factor, $V$ is the volume of the sphere, $\\Delta \\rho$ is the difference between the solvent and particle scattering length density, $r$ is the radius of the sphere, $\\text{bkg}$ is a uniform background, and $q$ is the *q*-vector that the intensity is being calculated for.\n", + "\n", + "## Exercise 1: simplify the expression\n", + "\n", + "The mathematical model described in Eqn. {eq}`sphere` has five parameters. \n", + "What simple mathematical simplification can be performed to reduce this to four?\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide-cell", + "solution" + ] + }, + "source": [ + "```{toggle}\n", + "The volume of a sphere is related to the radius of the sphere as \n", + "\n", + "$$\n", + "V = \\frac{4}{3} \\pi r^3. \n", + "$$ (volume-sphere)\n", + "\n", + "Therefore, the parameter $V$ can be replaced with Eqn. {eq}`volume-sphere`.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercise 2: write a function that computes for the form factor of a sphere\n", + "\n", + "Four parameters is a suitable number for modelling. \n", + "Therefore, we should write a function that implements your reduced dimensionality version of Eqn. {eq}`sphere`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide-cell", + "solution" + ] + }, + "outputs": [], + "source": [ + "def sphere(q):\n", + " \"\"\"\n", + " The function for the form factor of a sphere.\n", + "\n", + " Parameters\n", + " ----------\n", + " q:\n", + " q-vectors to calculate for.\n", + "\n", + " Returns\n", + " -------\n", + " :\n", + " The modelled intensity.\n", + " \"\"\"\n", + " qr = q * r.value\n", + " V = 4 / 3 * np.pi * r.value**3\n", + " return (\n", + " scale.value\n", + " / V\n", + " * (3 * V * delta_rho.value * (np.sin(qr) - qr * np.cos(qr)) / ((qr) ** 3)) ** 2\n", + " + bkg.value\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercise 3: create fitting parameters\n", + "\n", + "Create four `Parameter` objects, for $\\text{scale}$, $\\Delta \\rho$, $r$, and $\\text{bkg}$.\n", + "\n", + "Each should have an initial value and a uniform prior distribution based on the values given in {numref}`sans-parameters`, except for the $\\text{scale}$ which should be fixed to a value of 1.4 × 10-7." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "remove-cell", + "dmsc-school-keep" + ] + }, + "source": [ + "| Parameter | Initial Value | Min | Max |\n", + "| --- | --- | --- | --- |\n", + "| $\\text{scale}$ | 1.4 × 10-7 | N/A | N/A |\n", + "| $\\Delta \\rho$ | 3 | 0 | 10 |\n", + "| $r$ | 80 | 10 | 1000 |\n", + "| $\\text{bkg}$ | 3.0 × 10-3 | 1.0 × 10-3 | 1.0 × 10-2 |" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "dmsc-school-remove" + ] + }, + "source": [ + "```{list-table} Parameter values for the spherical model.\n", + ":name: sans-parameters\n", + ":header-rows: 1\n", + ":align: center\n", + "\n", + "* - Parameter\n", + " - Initial Value\n", + " - Min\n", + " - Max\n", + "* - $\\text{scale}$\n", + " - 1.4 × 10-8\n", + " - N/A\n", + " - N/A\n", + "* - $\\Delta \\rho$\n", + " - 3\n", + " - 0\n", + " - 10\n", + "* - $r$\n", + " - 80\n", + " - 10\n", + " - 1000\n", + "* - $\\text{bkg}$\n", + " - 3.0 × 10-3\n", + " - 1.0 × 10-3\n", + " - 1.0 × 10-2\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide-cell", + "solution" + ] + }, + "outputs": [], + "source": [ + "from easyscience import Parameter\n", + "\n", + "scale = Parameter(name='scale', value=1.4e-7, fixed=True)\n", + "delta_rho = Parameter(name='delta_rho', value=3, fixed=False, min=0, max=10)\n", + "r = Parameter(name='r', value=80, fixed=False, min=0, max=1000)\n", + "bkg = Parameter(name='bkg', value=0.01, fixed=False, min=0.001, max=0.1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "It is now possible to compare our model at the initial estimates to the simulated data. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "ax.errorbar(q, i, di, fmt='.')\n", + "ax.plot(q, sphere(q), '-k', zorder=10)\n", + "ax.set(yscale='log', xlabel='$q$/Å^-1', ylabel='I(q)')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Exercise 4: find maximum likelihood estimates\n", + "\n", + "Using `easyscience`, obtain maximum likelihood estimates for the four parameters of the model from comparison with the data.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide-cell", + "solution" + ] + }, + "outputs": [], + "source": [ + "from easyscience import Fitter\n", + "from easyscience import ObjBase\n", + "\n", + "params = ObjBase(name='params', delta_rho=delta_rho, r=r, bkg=bkg)\n", + "f = Fitter(params, sphere)\n", + "\n", + "res = f.fit(x=q, y=i, weights=1 / di)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "We can then plot the model and the data together as before and print the values of the parameters along with their uncertainties. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "ax.errorbar(q, i, di, fmt='.')\n", + "ax.plot(q, sphere(q), '-k', zorder=10)\n", + "ax.set(yscale='log', xlabel='$q$/Å^-1', ylabel='I(q)')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "delta_rho, r, bkg" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/docs/tutorials/index.md b/docs/docs/tutorials/index.md index ce63aafe..54871551 100644 --- a/docs/docs/tutorials/index.md +++ b/docs/docs/tutorials/index.md @@ -17,5 +17,9 @@ The tutorials are organized into the following categories: ## Getting Started -- [Dummy tutorial](tutorial.ipynb) – A dummy tutorial to ensure the - tutorial infrastructure is working correctly. +- [Fitting QENS](fitting-qens.ipynb) – A tutorial demonstrating how to + fit a quasielastic neutron scattering (QENS) data using EasyScience + framework. +- [Fitting SANS](fitting-sans.ipynb) – A tutorial demonstrating how to + fit a small-angle neutron scattering (SANS) data using EasyScience + framework. diff --git a/docs/docs/tutorials/tutorial.py b/docs/docs/tutorials/tutorial.py deleted file mode 100644 index 94d8016a..00000000 --- a/docs/docs/tutorials/tutorial.py +++ /dev/null @@ -1,20 +0,0 @@ -# %% [markdown] -# # Dummy Tutorial -# -# This is a dummy tutorial file to ensure that the tutorials section is -# not empty. You can replace this file with actual tutorial content as -# needed. - -# %% [markdown] -# ## Import Library - -# %% -import easyscience - -# %% [markdown] -# ## Step 1: Blah Blah Blah - -# %% -# This is a placeholder for tutorial content. -print('This is a dummy tutorial.') -print('Imported library:', easyscience) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 31e1502f..f1c90f6e 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -169,7 +169,8 @@ nav: - Tutorials: - Tutorials: tutorials/index.md - Getting Started: - - Dummy tutorial: tutorials/tutorial.ipynb + - Fitting QENS: tutorials/fitting-qens.ipynb + - Fitting SANS: tutorials/fitting-sans.ipynb - API Reference: - API Reference: api-reference/index.md - base_classes: api-reference/base_classes.md From 7684177dc00348772b4585c9116f2b3a35a1b155 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 3 Mar 2026 01:05:15 +0100 Subject: [PATCH 18/35] Enable widget backend; stub User Guide --- docs/docs/tutorials/fitting-qens.ipynb | 16 ++-- docs/docs/tutorials/fitting-sans.ipynb | 16 ++-- docs/docs/user-guide/index.md | 20 +---- pixi.lock | 104 ++++++++++++++++++++++++- pyproject.toml | 5 ++ 5 files changed, 127 insertions(+), 34 deletions(-) diff --git a/docs/docs/tutorials/fitting-qens.ipynb b/docs/docs/tutorials/fitting-qens.ipynb index 07fb00e9..da693444 100644 --- a/docs/docs/tutorials/fitting-qens.ipynb +++ b/docs/docs/tutorials/fitting-qens.ipynb @@ -1,5 +1,14 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib widget" + ] + }, { "cell_type": "markdown", "metadata": { @@ -465,13 +474,6 @@ "source": [ "A, gamma, omega_0, sigma" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/docs/docs/tutorials/fitting-sans.ipynb b/docs/docs/tutorials/fitting-sans.ipynb index b321483c..0f488d42 100644 --- a/docs/docs/tutorials/fitting-sans.ipynb +++ b/docs/docs/tutorials/fitting-sans.ipynb @@ -1,5 +1,14 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib widget" + ] + }, { "cell_type": "markdown", "metadata": { @@ -447,13 +456,6 @@ "source": [ "delta_rho, r, bkg" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/docs/docs/user-guide/index.md b/docs/docs/user-guide/index.md index 13c59b61..bff8e315 100644 --- a/docs/docs/user-guide/index.md +++ b/docs/docs/user-guide/index.md @@ -4,21 +4,5 @@ icon: material/book-open-variant # :material-book-open-variant: User Guide -This section provides an overview of the **core concepts**, **key -parameters** and **workflow steps** required for using EasyScience -effectively. - -Here is a brief overview of the User Guide sections: - -- [Glossary](#) – Defines common terms and labels used throughout the - documentation. -- [Concept](#) – Introduces the overall idea behind data analysis in - EasyScience. -- [Data Format](#) – Explains the data structures and file formats used - by EasyScience. -- [Parameters](#) – Describes how parameters are structured, named, and - accessed within the EasyScience. -- [First Steps](#) – Shows how to begin using EasyScience in Python or - Jupyter notebooks. -- [Analysis Workflow](#) – Breaks down the data analysis pipeline into - practical, sequential steps. +This section is currently under development. Please check back later for +updates. diff --git a/pixi.lock b/pixi.lock index 05539bfe..e8770a6a 100644 --- a/pixi.lock +++ b/pixi.lock @@ -104,8 +104,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -123,6 +125,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -247,6 +250,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -342,8 +346,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -361,6 +367,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl @@ -485,6 +492,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -580,8 +588,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -599,6 +609,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl @@ -723,6 +734,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -808,8 +820,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -827,6 +841,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl @@ -951,6 +966,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -1059,8 +1075,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -1078,6 +1096,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -1203,6 +1222,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/64/c53487d9f4968045b8afa51aed7ca44f58b2589e772f32745f3744476c82/yarl-1.23.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -1296,8 +1316,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -1315,6 +1337,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl @@ -1440,6 +1463,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/24/84/e237607faf4e099dbb8a4f511cfd5efcb5f75918baad200ff7380635631b/yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -1533,8 +1557,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -1552,6 +1578,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl @@ -1677,6 +1704,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/0d/71ceabc14c146ba8ee3804ca7b3d42b1664c8440439de5214d366fec7d3a/yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -1760,8 +1788,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -1779,6 +1809,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl @@ -1904,6 +1935,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/93/22/b85eca6fa2ad9491af48c973e4c8cf6b103a73dbb271fe3346949449fca0/yarl-1.23.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -2012,8 +2044,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -2031,6 +2065,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -2155,6 +2190,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -2250,8 +2286,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -2269,6 +2307,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl @@ -2393,6 +2432,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -2488,8 +2528,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -2507,6 +2549,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl @@ -2631,6 +2674,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -2716,8 +2760,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/c9/6869a1dcf4aaf309b9543ec070be3ec3adebee7c9bec9af8c230494134b9/interrogate-1.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -2735,6 +2781,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/52/372d3494766d690dfdd286871bf5f7fb9a6c61f7566ccaa7153a163dd1df/jupyterlab-4.5.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl @@ -2859,6 +2906,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -3836,14 +3884,19 @@ packages: requires_python: '>=3.5' - pypi: ./ name: easyscience - version: 1.0.1+devdirty69 - sha256: fb649e8fd2953408f53c19f20011c65061804995c1c2328ef0e7704afe90c254 + version: 1.0.1+devdirty71 + sha256: 2ed61ffb6a26d4f98b06cfe854ba4794ef34e3a129c2975d248f123129af7ed2 requires_dist: - asteval - bumps - dfo-ls + - ipykernel + - ipympl + - ipython + - ipywidgets - jupyterlab - lmfit + - matplotlib - numpy - pixi-kernel - pooch @@ -4520,6 +4573,27 @@ packages: - pytest-timeout ; extra == 'test' - pytest>=7.0,<9 ; extra == 'test' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + name: ipympl + version: 0.10.0 + sha256: a09c4f0ff86490cc62aed45e53b912fb706e3ec3506c4a51ce4a670d6667f5ce + requires_dist: + - ipython<10 + - ipywidgets>=7.6.0,<9 + - matplotlib>=3.5.0,<4 + - numpy + - pillow + - traitlets<6 + - intersphinx-registry ; extra == 'docs' + - myst-nb ; extra == 'docs' + - sphinx-book-theme ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-thebe ; extra == 'docs' + - sphinx-togglebutton ; extra == 'docs' + - sphinx>=1.5 ; extra == 'docs' + - nbval>=0.11.0 ; extra == 'test' + - pytest>=9.0.2 ; extra == 'test' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl name: ipython version: 9.10.0 @@ -4573,6 +4647,22 @@ packages: requires_dist: - pygments requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl + name: ipywidgets + version: 8.1.8 + sha256: ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e + requires_dist: + - comm>=0.1.3 + - ipython>=6.1.0 + - traitlets>=4.3.1 + - widgetsnbextension~=4.0.14 + - jupyterlab-widgets~=3.0.15 + - jsonschema ; extra == 'test' + - ipykernel ; extra == 'test' + - pytest>=3.6.0 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytz ; extra == 'test' + requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl name: isoduration version: 20.11.0 @@ -4941,6 +5031,11 @@ packages: - strict-rfc3339 ; extra == 'test' - werkzeug ; extra == 'test' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + name: jupyterlab-widgets + version: 3.0.16 + sha256: 45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8 + requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl name: jupyterquiz version: 2.9.6.2 @@ -9900,6 +9995,11 @@ packages: - sphinx-rtd-theme>=1.1.0 ; extra == 'docs' - myst-parser>=2.0.0 ; extra == 'docs' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + name: widgetsnbextension + version: 4.0.15 + sha256: 8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366 + requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl name: wsproto version: 1.3.2 diff --git a/pyproject.toml b/pyproject.toml index b260f0c9..d220bb59 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,8 +30,13 @@ dependencies = [ 'numpy', # Numerical computing 'scipp<26.1.0', # Handling and analysis of scientific data 'pooch', # Data downloader + 'matplotlib', # Plotting library 'jupyterlab', # Jupyter notebooks 'pixi-kernel', # Pixi Jupyter kernel + 'ipykernel', # Jupyter kernel (required for running notebooks) + 'ipywidgets', # Widgets (needed for interactive matplotlib backends) + 'ipympl', # Matplotlib Jupyter widget backend (%matplotlib widget) + 'IPython', # Interactive Python shell ] [project.optional-dependencies] From 7cedddf911a4331c9d900f624884a540939622f9 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 3 Mar 2026 01:26:25 +0100 Subject: [PATCH 19/35] Enable MathJax equation rendering in docs --- docs/mkdocs.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index f1c90f6e..7a659b6a 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -81,8 +81,18 @@ extra: # Customization to be included by the theme extra_css: - assets/stylesheets/extra.css + # KaTeX for rendering mathematical expressions (alternative to MathJax, faster but less feature-rich) + #- https://unpkg.com/katex@0/dist/katex.min.css + extra_javascript: - assets/javascripts/extra.js + # MathJax for rendering mathematical expressions + - javascripts/mathjax.js + - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js + # KaTeX for rendering mathematical expressions (alternative to MathJax, faster but less feature-rich) + #- javascripts/katex.js + #- https://unpkg.com/katex@0/dist/katex.min.js + #- https://unpkg.com/katex@0/dist/contrib/auto-render.min.js # A list of extensions beyond the ones that MkDocs uses by default (meta, toc, tables, and fenced_code) markdown_extensions: @@ -91,6 +101,8 @@ markdown_extensions: - attr_list - def_list - footnotes + - pymdownx.arithmatex: # rendering of equations and integrates with MathJax or KaTeX + generic: true - pymdownx.blocks.caption - pymdownx.details - pymdownx.emoji: From aa5acf35cceec4142fd6166bed4f36d01ba8fc9a Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 3 Mar 2026 01:45:55 +0100 Subject: [PATCH 20/35] Update docs logos and favicon --- .copier-answers.yml | 2 +- docs/docs/assets/images/favicon.png | Bin 77928 -> 26455 bytes docs/docs/assets/images/logo_dark.svg | 42 +++++++------------------ docs/docs/assets/images/logo_light.svg | 42 +++++++------------------ 4 files changed, 25 insertions(+), 61 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 4386c013..8ff71ca6 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,6 +1,6 @@ # WARNING: Do not edit this file manually. # Any changes will be overwritten by Copier. -_commit: v0.7.0-9-g01d70bc +_commit: v0.7.0-10-g7ec6255 _src_path: gh:easyscience/templates lib_docs_url: https://easyscience.github.io/corelib lib_doi: 10.5281/zenodo.18163581 diff --git a/docs/docs/assets/images/favicon.png b/docs/docs/assets/images/favicon.png index 6bdcabb24eab067fdf6cb22330ae361ab6cb36d8..1cdd9d9e3112e9c4e8ccbcd1784aa958b08d4f0c 100644 GIT binary patch literal 26455 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 GNB$p>9b+K? literal 77928 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 diff --git a/docs/docs/assets/images/logo_dark.svg b/docs/docs/assets/images/logo_dark.svg index 22179ce3..980c3174 100644 --- a/docs/docs/assets/images/logo_dark.svg +++ b/docs/docs/assets/images/logo_dark.svg @@ -1,46 +1,28 @@ - - + - + - - - - - - - - - - - - + - - + + Logo - + Main circle - - Inner elements - - - - - - - - - - + + Inner circles + + + + diff --git a/docs/docs/assets/images/logo_light.svg b/docs/docs/assets/images/logo_light.svg index 61b2e226..89b48f9f 100644 --- a/docs/docs/assets/images/logo_light.svg +++ b/docs/docs/assets/images/logo_light.svg @@ -1,46 +1,28 @@ - - + - + - - - - - - - - - - - - + - - + + Logo - + Main circle - - Inner elements - - - - - - - - - - + + Inner circles + + + + From 31b85d47191a4bc8e98bcc550764b6e54a6b9004 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 3 Mar 2026 02:01:13 +0100 Subject: [PATCH 21/35] Apply new notebook template and Pixi kernel --- docs/docs/tutorials/fitting-qens.ipynb | 241 +++++------------------ docs/docs/tutorials/fitting-sans.ipynb | 255 ++++++------------------- 2 files changed, 111 insertions(+), 385 deletions(-) diff --git a/docs/docs/tutorials/fitting-qens.ipynb b/docs/docs/tutorials/fitting-qens.ipynb index da693444..a4929a5c 100644 --- a/docs/docs/tutorials/fitting-qens.ipynb +++ b/docs/docs/tutorials/fitting-qens.ipynb @@ -3,6 +3,7 @@ { "cell_type": "code", "execution_count": null, + "id": "0", "metadata": {}, "outputs": [], "source": [ @@ -11,13 +12,8 @@ }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "1", + "metadata": {}, "source": [ "# Fitting QENS data\n", "\n", @@ -29,13 +25,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "2", + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", @@ -45,6 +36,7 @@ { "cell_type": "code", "execution_count": null, + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -63,12 +55,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [ - "remove-cell", - "dmsc-school-keep" - ] - }, + "id": "4", + "metadata": {}, "outputs": [], "source": [ "filename = fetch_data('4-reduction/energy_transfer_QENS_unknown_quasi_elastic_many_neutrons.dat')" @@ -77,6 +65,7 @@ { "cell_type": "code", "execution_count": null, + "id": "5", "metadata": {}, "outputs": [], "source": [ @@ -92,13 +81,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "6", + "metadata": {}, "outputs": [], "source": [ "q, i, di = load(filename)" @@ -106,13 +90,8 @@ }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "7", + "metadata": {}, "source": [ "With the data read in, we can produce a quick plot. " ] @@ -120,13 +99,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "8", + "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", @@ -139,13 +113,8 @@ }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "9", + "metadata": {}, "source": [ "The QENS data covers a slightly broader range than we want to investigate.\n", "Therefore, we will crop the data so that we are only using points between -0.06 and 0.06 meV. " @@ -154,13 +123,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "10", + "metadata": {}, "outputs": [], "source": [ "sel = (q > -0.06) & (q < 0.06)\n", @@ -169,13 +133,8 @@ }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "11", + "metadata": {}, "source": [ "We now want to consider the mathematical model to be used in the analysis. \n", "QENS data is typically analysed by fitting a Lorentzian function to the data, which has the functional form\n", @@ -196,16 +155,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "hide-cell", - "solution" - ] - }, + "id": "12", + "metadata": {}, "outputs": [], "source": [ "def lorentzian(omega: np.ndarray) -> np.ndarray:\n", @@ -221,13 +172,8 @@ }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "13", + "metadata": {}, "source": [ "The instrument has a finite resolution, and to take this into account, the Lorentzian function must be convolved with this resolution. In our case, the resolution is a Gaussian distribution that is centred at zero with width, $\\sigma$. \n", "In real experiments there are ways to measure $\\sigma$, but for this project, we will simply model it. " @@ -236,13 +182,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "14", + "metadata": {}, "outputs": [], "source": [ "from scipy.stats import norm\n", @@ -263,6 +204,7 @@ }, { "cell_type": "markdown", + "id": "15", "metadata": {}, "source": [ "This means that there are a total of four parameters in our model. \n", @@ -276,63 +218,20 @@ }, { "cell_type": "markdown", - "metadata": { - "tags": [ - "remove-cell", - "dmsc-school-keep" - ] - }, + "id": "16", + "metadata": {}, "source": [ "| Parameter | Initial Value | Min | Max |\n", "| --- | --- | --- | --- |\n", "| $A$ | 10 | 1 | 100 |\n", "| $\\gamma$ | 8.0 × 10-3 | 1.0 × 10-4 | 1.0 × 10-2 |\n", "| $\\omega_0$ | 1.0 × 10-3 | 0 | 2.0 × 10-3 |\n", - "| $\\sigma$ | 1.0 × 10-3 | 1.0 × 10-5 | 1.0 × 10-1 |" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "dmsc-school-remove" - ] - }, - "source": [ - "```{list-table} Parameter values.\n", - ":name: qens-parameters\n", - ":header-rows: 1\n", - ":align: center\n", - "\n", - "* - Parameter\n", - " - Initial Value\n", - " - Min\n", - " - Max\n", - "* - $A$\n", - " - 10\n", - " - 1\n", - " - 100\n", - "* - $\\gamma$\n", - " - 8.0 × 10-3\n", - " - 1.0 × 10-4\n", - " - 1.0 × 10-2\n", - "* - $\\omega_0$\n", - " - 1.0 × 10-3\n", - " - 0\n", - " - 2.0 × 10-3\n", - "* - $\\sigma$\n", - " - 1.0 × 10-3\n", - " - 1.0 × 10-5\n", - " - 1.0 × 10-1\n", - "```" + "| $\\sigma$ | 1.0 × 10-3 | 1.0 × 10-5 | 1.0 × 10-1 |\n" ] }, { "cell_type": "markdown", + "id": "17", "metadata": {}, "source": [ "**Solution:**" @@ -341,16 +240,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "hide-cell", - "solution" - ] - }, + "id": "18", + "metadata": {}, "outputs": [], "source": [ "from easyscience import Parameter\n", @@ -363,13 +254,8 @@ }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "19", + "metadata": {}, "source": [ "It is now possible to compare our model at the initial estimates to the simulated data. " ] @@ -377,13 +263,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "20", + "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots()\n", @@ -395,6 +276,7 @@ }, { "cell_type": "markdown", + "id": "21", "metadata": {}, "source": [ "## Exercise 3: find maximum likelihood estimates\n", @@ -407,16 +289,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "hide-cell", - "solution" - ] - }, + "id": "22", + "metadata": {}, "outputs": [], "source": [ "from easyscience import Fitter\n", @@ -430,13 +304,8 @@ }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "23", + "metadata": {}, "source": [ "We can then plot the model and the data together as before and print the values of the parameters along with their uncertainties. " ] @@ -444,13 +313,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "24", + "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots()\n", @@ -463,13 +327,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "25", + "metadata": {}, "outputs": [], "source": [ "A, gamma, omega_0, sigma" @@ -478,9 +337,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python (Pixi)", "language": "python", - "name": "python3" + "name": "pixi-kernel-python3" }, "language_info": { "codemirror_mode": { @@ -496,5 +355,5 @@ } }, "nbformat": 4, - "nbformat_minor": 4 + "nbformat_minor": 5 } diff --git a/docs/docs/tutorials/fitting-sans.ipynb b/docs/docs/tutorials/fitting-sans.ipynb index 0f488d42..06b0cc36 100644 --- a/docs/docs/tutorials/fitting-sans.ipynb +++ b/docs/docs/tutorials/fitting-sans.ipynb @@ -3,6 +3,7 @@ { "cell_type": "code", "execution_count": null, + "id": "0", "metadata": {}, "outputs": [], "source": [ @@ -11,31 +12,21 @@ }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "1", + "metadata": {}, "source": [ "# Fitting SANS data\n", "\n", "Some small angle neutron scattering (SANS) data has been simulated and reduced, and can now be analysed with `easyscience`.\n", "Before the analysis can begin, it is necessary to load the experimental data and check that it looks reasonable. \n", - "The data can be loaded with `np.loadtxt` as the data has been stored in a simple space-separated column file. " + "The data can be loaded with `np.loadtxt` as the data has been stored in a simple space-separated column file. \n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "2", + "metadata": {}, "outputs": [], "source": [ "import numpy as np" @@ -44,6 +35,7 @@ { "cell_type": "code", "execution_count": null, + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -62,12 +54,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [ - "remove-cell", - "dmsc-school-keep" - ] - }, + "id": "4", + "metadata": {}, "outputs": [], "source": [ "filename = fetch_data('4-reduction/sans_iofq.dat')" @@ -76,6 +64,7 @@ { "cell_type": "code", "execution_count": null, + "id": "5", "metadata": {}, "outputs": [], "source": [ @@ -91,13 +80,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "6", + "metadata": {}, "outputs": [], "source": [ "q, i, di = load(filename)" @@ -105,27 +89,17 @@ }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "7", + "metadata": {}, "source": [ - "With the data read in, we can produce a quick plot. " + "With the data read in, we can produce a quick plot. \n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "8", + "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", @@ -138,13 +112,8 @@ }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "9", + "metadata": {}, "source": [ "We now want to consider the mathematical model to be used in the analysis. \n", "There are SANS models a range of different systems, see for instance [the models in SasView](https://www.sasview.org/docs/user/qtgui/Perspectives/Fitting/models/index.html). \n", @@ -163,56 +132,39 @@ "The mathematical model described in Eqn. {eq}`sphere` has five parameters. \n", "What simple mathematical simplification can be performed to reduce this to four?\n", "\n", - "**Solution:**" + "**Solution:**\n" ] }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "hide-cell", - "solution" - ] - }, + "id": "10", + "metadata": {}, "source": [ - "```{toggle}\n", - "The volume of a sphere is related to the radius of the sphere as \n", + "The volume of a sphere is related to the radius of the sphere as\n", "\n", "$$\n", "V = \\frac{4}{3} \\pi r^3. \n", "$$ (volume-sphere)\n", "\n", - "Therefore, the parameter $V$ can be replaced with Eqn. {eq}`volume-sphere`.\n", - "```" + "Therefore, the parameter $V$ can be replaced with Eqn. {eq}`volume-sphere`.\n" ] }, { "cell_type": "markdown", + "id": "11", "metadata": {}, "source": [ "## Exercise 2: write a function that computes for the form factor of a sphere\n", "\n", "Four parameters is a suitable number for modelling. \n", - "Therefore, we should write a function that implements your reduced dimensionality version of Eqn. {eq}`sphere`." + "Therefore, we should write a function that implements your reduced dimensionality version of Eqn. {eq}`sphere`.\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "hide-cell", - "solution" - ] - }, + "id": "12", + "metadata": {}, "outputs": [], "source": [ "def sphere(q):\n", @@ -241,92 +193,45 @@ }, { "cell_type": "markdown", + "id": "13", "metadata": {}, "source": [ "## Exercise 3: create fitting parameters\n", "\n", - "Create four `Parameter` objects, for $\\text{scale}$, $\\Delta \\rho$, $r$, and $\\text{bkg}$.\n", + "Create four `Parameter` objects, for $\\text{scale}$, $\\Delta \\rho$,\n", + "$r$, and $\\text{bkg}$.\n", "\n", - "Each should have an initial value and a uniform prior distribution based on the values given in {numref}`sans-parameters`, except for the $\\text{scale}$ which should be fixed to a value of 1.4 × 10-7." + "Each should have an initial value and a uniform prior distribution\n", + "based on the values given in {numref}`sans-parameters`, except for the\n", + "$\\text{scale}$ which should be fixed to a value of 1.4 × 10-7.\n" ] }, { "cell_type": "markdown", - "metadata": { - "tags": [ - "remove-cell", - "dmsc-school-keep" - ] - }, + "id": "14", + "metadata": {}, "source": [ "| Parameter | Initial Value | Min | Max |\n", "| --- | --- | --- | --- |\n", "| $\\text{scale}$ | 1.4 × 10-7 | N/A | N/A |\n", "| $\\Delta \\rho$ | 3 | 0 | 10 |\n", "| $r$ | 80 | 10 | 1000 |\n", - "| $\\text{bkg}$ | 3.0 × 10-3 | 1.0 × 10-3 | 1.0 × 10-2 |" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "dmsc-school-remove" - ] - }, - "source": [ - "```{list-table} Parameter values for the spherical model.\n", - ":name: sans-parameters\n", - ":header-rows: 1\n", - ":align: center\n", - "\n", - "* - Parameter\n", - " - Initial Value\n", - " - Min\n", - " - Max\n", - "* - $\\text{scale}$\n", - " - 1.4 × 10-8\n", - " - N/A\n", - " - N/A\n", - "* - $\\Delta \\rho$\n", - " - 3\n", - " - 0\n", - " - 10\n", - "* - $r$\n", - " - 80\n", - " - 10\n", - " - 1000\n", - "* - $\\text{bkg}$\n", - " - 3.0 × 10-3\n", - " - 1.0 × 10-3\n", - " - 1.0 × 10-2\n", - "```" + "| $\\text{bkg}$ | 3.0 × 10-3 | 1.0 × 10-3 | 1.0 × 10-2 |\n" ] }, { "cell_type": "markdown", + "id": "15", "metadata": {}, "source": [ - "**Solution:**" + "**Solution:**\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "hide-cell", - "solution" - ] - }, + "id": "16", + "metadata": {}, "outputs": [], "source": [ "from easyscience import Parameter\n", @@ -339,27 +244,17 @@ }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "17", + "metadata": {}, "source": [ - "It is now possible to compare our model at the initial estimates to the simulated data. " + "It is now possible to compare our model at the initial estimates to the simulated data. \n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "18", + "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots()\n", @@ -371,34 +266,21 @@ }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "19", + "metadata": {}, "source": [ "## Exercise 4: find maximum likelihood estimates\n", "\n", "Using `easyscience`, obtain maximum likelihood estimates for the four parameters of the model from comparison with the data.\n", "\n", - "**Solution:**" + "**Solution:**\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "hide-cell", - "solution" - ] - }, + "id": "20", + "metadata": {}, "outputs": [], "source": [ "from easyscience import Fitter\n", @@ -412,27 +294,17 @@ }, { "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "21", + "metadata": {}, "source": [ - "We can then plot the model and the data together as before and print the values of the parameters along with their uncertainties. " + "We can then plot the model and the data together as before and print the values of the parameters along with their uncertainties. \n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "22", + "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots()\n", @@ -445,13 +317,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "23", + "metadata": {}, "outputs": [], "source": [ "delta_rho, r, bkg" @@ -460,9 +327,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python (Pixi)", "language": "python", - "name": "python3" + "name": "pixi-kernel-python3" }, "language_info": { "codemirror_mode": { @@ -478,5 +345,5 @@ } }, "nbformat": 4, - "nbformat_minor": 4 + "nbformat_minor": 5 } From e830a54a3322cb48e68f3381d7489ca5f33f4375 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 3 Mar 2026 11:19:14 +0100 Subject: [PATCH 22/35] Fix equation rendering in docs with MathJax --- .copier-answers.yml | 2 +- docs/docs/assets/javascripts/mathjax.js | 27 +++++++++++++++++++++++++ docs/mkdocs.yml | 14 ++++--------- 3 files changed, 32 insertions(+), 11 deletions(-) create mode 100644 docs/docs/assets/javascripts/mathjax.js diff --git a/.copier-answers.yml b/.copier-answers.yml index 8ff71ca6..8a898472 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,6 +1,6 @@ # WARNING: Do not edit this file manually. # Any changes will be overwritten by Copier. -_commit: v0.7.0-10-g7ec6255 +_commit: v0.7.0-12-gd43fb97 _src_path: gh:easyscience/templates lib_docs_url: https://easyscience.github.io/corelib lib_doi: 10.5281/zenodo.18163581 diff --git a/docs/docs/assets/javascripts/mathjax.js b/docs/docs/assets/javascripts/mathjax.js new file mode 100644 index 00000000..a92ce69a --- /dev/null +++ b/docs/docs/assets/javascripts/mathjax.js @@ -0,0 +1,27 @@ +window.MathJax = { + tex: { + //inlineMath: [['\\(', '\\)']], + //displayMath: [['\\[', '\\]']], + // Add support for $...$ and \(...\) delimiters + inlineMath: [['$', '$'], ['\\(', '\\)']], + // Add support for $$...$$ and \[...]\ delimiters + displayMath: [['$$', '$$'], ['\\[', '\\]']], + processEscapes: true, + processEnvironments: true + }, + options: { + //ignoreHtmlClass: ".*|", + //processHtmlClass: "arithmatex" + // Skip code blocks only + skipHtmlTags: ['script','noscript','style','textarea','pre','code'], + // Only ignore explicit opt-out + ignoreHtmlClass: 'no-mathjax|tex2jax_ignore', + } +}; + +document$.subscribe(() => { + MathJax.startup.output.clearCache() + MathJax.typesetClear() + MathJax.texReset() + MathJax.typesetPromise() +}) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 7a659b6a..ab76036c 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -21,7 +21,7 @@ theme: - content.tooltips - navigation.footer - navigation.indexes - - navigation.instant # Instant loading (SPA-like) + #- navigation.instant # Instant loading, but it causes issues with rendering equations #- navigation.sections - navigation.top # Back-to-top button - navigation.tracking # Anchor tracking @@ -81,18 +81,12 @@ extra: # Customization to be included by the theme extra_css: - assets/stylesheets/extra.css - # KaTeX for rendering mathematical expressions (alternative to MathJax, faster but less feature-rich) - #- https://unpkg.com/katex@0/dist/katex.min.css extra_javascript: - assets/javascripts/extra.js # MathJax for rendering mathematical expressions - - javascripts/mathjax.js - - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js - # KaTeX for rendering mathematical expressions (alternative to MathJax, faster but less feature-rich) - #- javascripts/katex.js - #- https://unpkg.com/katex@0/dist/katex.min.js - #- https://unpkg.com/katex@0/dist/contrib/auto-render.min.js + - assets/javascripts/mathjax.js # Custom MathJax config to ensure compatibility with mkdocs-jupyter + - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js # Official MathJax CDN # A list of extensions beyond the ones that MkDocs uses by default (meta, toc, tables, and fenced_code) markdown_extensions: @@ -141,7 +135,7 @@ plugins: allow_errors: false include_source: true include_requirejs: true # Required for Plotly - custom_mathjax_url: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS_CHTML-full,Safe' + #custom_mathjax_url: 'https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js' # See 'extra_javascript' above ignore_h1_titles: true # Use titles defined in the nav section below remove_tag_config: remove_input_tags: From 25de8ed83844a9e0258a9e91aaaa52ed825b6a65 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 3 Mar 2026 11:20:01 +0100 Subject: [PATCH 23/35] Rename Getting Started to Workshops & Schools --- docs/docs/tutorials/index.md | 2 +- docs/mkdocs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/tutorials/index.md b/docs/docs/tutorials/index.md index 54871551..8728e9ed 100644 --- a/docs/docs/tutorials/index.md +++ b/docs/docs/tutorials/index.md @@ -15,7 +15,7 @@ section of the documentation. The tutorials are organized into the following categories: -## Getting Started +## Workshops & Schools - [Fitting QENS](fitting-qens.ipynb) – A tutorial demonstrating how to fit a quasielastic neutron scattering (QENS) data using EasyScience diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index ab76036c..6bbd9b3e 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -174,7 +174,7 @@ nav: - User Guide: user-guide/index.md - Tutorials: - Tutorials: tutorials/index.md - - Getting Started: + - Workshops & Schools: - Fitting QENS: tutorials/fitting-qens.ipynb - Fitting SANS: tutorials/fitting-sans.ipynb - API Reference: From 6cf0a60e63660360f772e03edf6a1803abaea814 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 3 Mar 2026 11:27:20 +0100 Subject: [PATCH 24/35] Trigger docs build (temporary) --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index c23c2c8c..8d136ec9 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -17,7 +17,7 @@ on: # Trigger the workflow on push push: # Selected branches - branches: [develop] # master and main are already verified in PR + branches: [develop, apply-new-templates] # master and main are already verified in PR # Runs on creating a new tag starting with 'v', e.g. 'v1.0.3' tags: ['v*'] # Trigger the workflow on pull request From a73c9ad4177915c7e60c4ff96c62ffd0887effdc Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 3 Mar 2026 11:36:49 +0100 Subject: [PATCH 25/35] Revert "Trigger docs build (temporary)" This reverts commit 6cf0a60e63660360f772e03edf6a1803abaea814. --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 8d136ec9..c23c2c8c 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -17,7 +17,7 @@ on: # Trigger the workflow on push push: # Selected branches - branches: [develop, apply-new-templates] # master and main are already verified in PR + branches: [develop] # master and main are already verified in PR # Runs on creating a new tag starting with 'v', e.g. 'v1.0.3' tags: ['v*'] # Trigger the workflow on pull request From 76ae24b893c12e42c49db53c0263049ce60946ba Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 3 Mar 2026 16:17:25 +0100 Subject: [PATCH 26/35] Add Python 3.14 and update templates --- .copier-answers.yml | 4 +- .github/workflows/pypi-test.yml | 4 +- .github/workflows/test.yml | 4 +- docs/docs/installation-and-setup/index.md | 6 +- pixi.lock | 1196 +++++++++++---------- pixi.toml | 4 +- pyproject.toml | 1 + 7 files changed, 616 insertions(+), 603 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 8a898472..7ce7337a 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,11 +1,11 @@ # WARNING: Do not edit this file manually. # Any changes will be overwritten by Copier. -_commit: v0.7.0-12-gd43fb97 +_commit: v0.8.0 _src_path: gh:easyscience/templates lib_docs_url: https://easyscience.github.io/corelib lib_doi: 10.5281/zenodo.18163581 lib_package_name: easyscience -lib_python_max: '3.13' +lib_python_max: '3.14' lib_python_min: '3.11' lib_repo_name: corelib project_contact_email: support@easyscience.org diff --git a/.github/workflows/pypi-test.yml b/.github/workflows/pypi-test.yml index 6f4e582f..29e8261d 100644 --- a/.github/workflows/pypi-test.yml +++ b/.github/workflows/pypi-test.yml @@ -45,9 +45,9 @@ jobs: - name: Init pixi project run: pixi init easyscience - - name: Add Python 3.13 from Conda + - name: Add Python 3.14 from Conda working-directory: easyscience - run: pixi add "python=3.13" + run: pixi add "python=3.14" - name: Add other Conda dependencies working-directory: easyscience diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 05998190..9a823a80 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -44,8 +44,8 @@ concurrency: # Set the environment variables to be used in all jobs defined in this workflow env: CI_BRANCH: ${{ github.head_ref || github.ref_name }} - PY_VERSIONS: '3.11 3.13' - PIXI_ENVS: 'py-311-env py-313-env' + PY_VERSIONS: '3.11 3.14' + PIXI_ENVS: 'py-311-env py-314-env' jobs: # Job 1: Set up environment variables diff --git a/docs/docs/installation-and-setup/index.md b/docs/docs/installation-and-setup/index.md index b6628fed..76416105 100644 --- a/docs/docs/installation-and-setup/index.md +++ b/docs/docs/installation-and-setup/index.md @@ -5,7 +5,7 @@ icon: material/cog-box # :material-cog-box: Installation & Setup **EasyScience** is a cross-platform Python library compatible with -**Python 3.11** through **3.13**. +**Python 3.11** through **3.14**. To install and set up EasyScience, we recommend using [**Pixi**](https://pixi.prefix.dev), a modern package manager for @@ -62,9 +62,9 @@ This section describes the simplest way to set up EasyScience using pixi init easyscience cd easyscience ``` -- Set the Python version for the Pixi environment (e.g., 3.13): +- Set the Python version for the Pixi environment (e.g., 3.14): ```txt - pixi add python=3.13 + pixi add python=3.14 ``` - Add EasyScience to the Pixi environment from PyPI: ```txt diff --git a/pixi.lock b/pixi.lock index e8770a6a..69aa7fbf 100644 --- a/pixi.lock +++ b/pixi.lock @@ -36,14 +36,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-25.7.0-he4ff34a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -56,7 +56,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -64,16 +64,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/06/90/2cdab0974b9b5bbc1623f7876b73603aecac11b8d95b85b5b86b32de5eab/coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl @@ -87,14 +87,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/33/5d/65c619e195e0b5e54ea5a95c1bb600c8ff8715e0d09676e4cce56d89f492/h5py-3.15.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -128,14 +128,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -153,9 +153,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/28/83/36557b04cfdc317ed8a525c4993b23e43a8fbcddaddd78619112ca07138c/msgspec-0.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b8/8e/6b17e43f6eb9369d9858ee32c97959fcd515628a1df376af96c11606cf70/msgspec-0.20.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -166,15 +166,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f2/85/ab6d04733a7d6ff32bfc8382bf1b07078228f5d6ebec5266b91bfc5c4ff7/pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -184,7 +184,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -192,7 +192,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -205,7 +205,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -216,10 +216,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/94/98/aa2d4b9d28969cc7f62409f9f9fc5b5a853af651255eba03e9bee8546dd9/scipp-25.12.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7b/c8/770b6bc4bea3434349817a942eb4f8128d9dbe1356dedd26847e27ae8e0b/scipp-25.12.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -230,7 +230,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -252,7 +252,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-64: @@ -277,14 +277,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.7.0-hf6efa0e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.12-h894a449_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.3-h4f44bb5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -298,7 +298,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -306,16 +306,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/92/11/a9cf762bb83386467737d32187756a42094927150c3e107df4cb078e8590/coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl @@ -329,14 +329,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a0/2c/926eba1514e4d2e47d0e9eb16c784e717d8b066398ccfca9b283917b1bfb/h5py-3.15.1-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -370,14 +370,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -395,9 +395,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/8a/d1/b902d38b6e5ba3bdddbec469bba388d647f960aeed7b5b3623a8debe8a76/msgspec-0.20.0-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/bb/18/62dc13ab0260c7d741dda8dc7f481495b93ac9168cd887dda5929880eef8/msgspec-0.20.0-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -408,15 +408,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/bb/8b/4bb774a998b97e6c2fd62a9e6cfdaae133b636fd1c468f92afb4ae9a447a/pandas-3.0.1-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -426,7 +426,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -434,7 +434,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -447,7 +447,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -458,10 +458,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e5/22/75e119e0a200914f88f121cd956e1eb7f72c8ace4b63171f52ba0334d142/scipp-25.12.0-cp313-cp313-macosx_11_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cc/bc/e455c908cbd0f969bc2cb6fbe01bceeb4ecc41ea88adcf5953162e4177eb/scipp-25.12.0-cp314-cp314-macosx_11_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -472,7 +472,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -487,14 +487,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-arm64: @@ -519,14 +519,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.7.0-hbfc8e16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -540,7 +540,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -548,16 +548,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/d3/28/56e6d892b7b052236d67c95f1936b6a7cf7c3e2634bf27610b8cbd7f9c60/coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl @@ -571,14 +571,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/65/4b/d715ed454d3baa5f6ae1d30b7eca4c7a1c1084f6a2edead9e801a1541d62/h5py-3.15.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -612,14 +612,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -637,9 +637,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/57/b6/eff0305961a1d9447ec2b02f8c73c8946f22564d302a504185b730c9a761/msgspec-0.20.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/dd/1d/b9949e4ad6953e9f9a142c7997b2f7390c81e03e93570c7c33caf65d27e1/msgspec-0.20.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -650,15 +650,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a8/14/5990826f779f79148ae9d3a2c39593dc04d61d5d90541e71b5749f35af95/pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -668,7 +668,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -676,7 +676,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -689,7 +689,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -700,10 +700,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/18/5c/bc0ca94bff65fe0d206a369b54625f8ec7852dfd1d835174692026f34df9/scipp-25.12.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a2/85/4134c04e851dba5528dfbeffe1c664e59f59ff273afa066056d919731c51/scipp-25.12.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -714,7 +714,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -729,14 +729,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ win-64: @@ -750,16 +750,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.7.0-h80d1838_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.12-h09917c8_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -772,7 +773,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -780,18 +781,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/a7/4d/1f8e723f6829977410efeb88f73673d794075091c8c7c18848d273dc9d73/coverage-7.13.4-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e0/d9/1f07395b54413432624d61524dfd98c1a7c7827d2abfdb8829ac92638205/debugpy-1.8.20-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl @@ -803,14 +804,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b6/d8/7368679b8df6925b8415f9dcc9ab1dab01ddc384d2b2c24aac9191bd9ceb/h5py-3.15.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -844,14 +845,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -869,9 +870,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/f1/25/5e8080fe0117f799b1b68008dc29a65862077296b92550632de015128579/msgspec-0.20.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ff/37/9c4b58ff11d890d788e700b827db2366f4d11b3313bf136780da7017278b/msgspec-0.20.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -882,14 +883,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d6/7d/216a1588b65a7aa5f4535570418a599d943c85afb1d95b0876fc00aa1468/pandas-3.0.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -899,14 +900,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -919,9 +920,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/28/88/2ff917caff61e55f38bcdb27de06ee30597881b2cae44fbba7627be015c4/pywinpty-3.0.3-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -932,10 +933,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/eb/d1/b3cd2733a96a36c54c36889b2cfdd0331c1e5b57fa1757485a22d0ec3142/scipp-25.12.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ee/c7/ba86128309ccef3f1a2529fee8df4ab9c86f50c78314266d6b8734c54207/scipp-25.12.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -946,7 +947,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -968,7 +969,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ py-311-env: @@ -1940,7 +1941,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/93/22/b85eca6fa2ad9491af48c973e4c8cf6b103a73dbb271fe3346949449fca0/yarl-1.23.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ - py-313-env: + py-314-env: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -1976,14 +1977,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-25.7.0-he4ff34a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -1996,7 +1997,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -2004,16 +2005,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/06/90/2cdab0974b9b5bbc1623f7876b73603aecac11b8d95b85b5b86b32de5eab/coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl @@ -2027,14 +2028,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/33/5d/65c619e195e0b5e54ea5a95c1bb600c8ff8715e0d09676e4cce56d89f492/h5py-3.15.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -2068,14 +2069,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -2093,9 +2094,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/28/83/36557b04cfdc317ed8a525c4993b23e43a8fbcddaddd78619112ca07138c/msgspec-0.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b8/8e/6b17e43f6eb9369d9858ee32c97959fcd515628a1df376af96c11606cf70/msgspec-0.20.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -2106,15 +2107,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f2/85/ab6d04733a7d6ff32bfc8382bf1b07078228f5d6ebec5266b91bfc5c4ff7/pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -2124,7 +2125,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -2132,7 +2133,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -2145,7 +2146,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -2156,10 +2157,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/94/98/aa2d4b9d28969cc7f62409f9f9fc5b5a853af651255eba03e9bee8546dd9/scipp-25.12.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7b/c8/770b6bc4bea3434349817a942eb4f8128d9dbe1356dedd26847e27ae8e0b/scipp-25.12.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -2170,7 +2171,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -2192,7 +2193,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-64: @@ -2217,14 +2218,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.7.0-hf6efa0e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.12-h894a449_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.3-h4f44bb5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -2238,7 +2239,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -2246,16 +2247,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/92/11/a9cf762bb83386467737d32187756a42094927150c3e107df4cb078e8590/coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl @@ -2269,14 +2270,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a0/2c/926eba1514e4d2e47d0e9eb16c784e717d8b066398ccfca9b283917b1bfb/h5py-3.15.1-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -2310,14 +2311,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -2335,9 +2336,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/8a/d1/b902d38b6e5ba3bdddbec469bba388d647f960aeed7b5b3623a8debe8a76/msgspec-0.20.0-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/bb/18/62dc13ab0260c7d741dda8dc7f481495b93ac9168cd887dda5929880eef8/msgspec-0.20.0-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -2348,15 +2349,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/bb/8b/4bb774a998b97e6c2fd62a9e6cfdaae133b636fd1c468f92afb4ae9a447a/pandas-3.0.1-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -2366,7 +2367,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -2374,7 +2375,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -2387,7 +2388,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -2398,10 +2399,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e5/22/75e119e0a200914f88f121cd956e1eb7f72c8ace4b63171f52ba0334d142/scipp-25.12.0-cp313-cp313-macosx_11_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cc/bc/e455c908cbd0f969bc2cb6fbe01bceeb4ecc41ea88adcf5953162e4177eb/scipp-25.12.0-cp314-cp314-macosx_11_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -2412,7 +2413,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -2427,14 +2428,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-arm64: @@ -2459,14 +2460,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.7.0-hbfc8e16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -2480,7 +2481,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -2488,16 +2489,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/d3/28/56e6d892b7b052236d67c95f1936b6a7cf7c3e2634bf27610b8cbd7f9c60/coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl @@ -2511,14 +2512,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/65/4b/d715ed454d3baa5f6ae1d30b7eca4c7a1c1084f6a2edead9e801a1541d62/h5py-3.15.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -2552,14 +2553,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -2577,9 +2578,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/57/b6/eff0305961a1d9447ec2b02f8c73c8946f22564d302a504185b730c9a761/msgspec-0.20.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/dd/1d/b9949e4ad6953e9f9a142c7997b2f7390c81e03e93570c7c33caf65d27e1/msgspec-0.20.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -2590,15 +2591,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a8/14/5990826f779f79148ae9d3a2c39593dc04d61d5d90541e71b5749f35af95/pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -2608,7 +2609,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -2616,7 +2617,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -2629,7 +2630,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -2640,10 +2641,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/18/5c/bc0ca94bff65fe0d206a369b54625f8ec7852dfd1d835174692026f34df9/scipp-25.12.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a2/85/4134c04e851dba5528dfbeffe1c664e59f59ff273afa066056d919731c51/scipp-25.12.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -2654,7 +2655,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -2669,14 +2670,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ win-64: @@ -2690,16 +2691,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.7.0-h80d1838_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.12-h09917c8_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -2712,7 +2714,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -2720,18 +2722,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/a7/4d/1f8e723f6829977410efeb88f73673d794075091c8c7c18848d273dc9d73/coverage-7.13.4-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e0/d9/1f07395b54413432624d61524dfd98c1a7c7827d2abfdb8829ac92638205/debugpy-1.8.20-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl @@ -2743,14 +2745,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b6/d8/7368679b8df6925b8415f9dcc9ab1dab01ddc384d2b2c24aac9191bd9ceb/h5py-3.15.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -2784,14 +2786,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -2809,9 +2811,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/f1/25/5e8080fe0117f799b1b68008dc29a65862077296b92550632de015128579/msgspec-0.20.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ff/37/9c4b58ff11d890d788e700b827db2366f4d11b3313bf136780da7017278b/msgspec-0.20.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -2822,14 +2824,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d6/7d/216a1588b65a7aa5f4535570418a599d943c85afb1d95b0876fc00aa1468/pandas-3.0.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -2839,14 +2841,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -2859,9 +2861,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/28/88/2ff917caff61e55f38bcdb27de06ee30597881b2cae44fbba7627be015c4/pywinpty-3.0.3-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -2872,10 +2874,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/eb/d1/b3cd2733a96a36c54c36889b2cfdd0331c1e5b57fa1757485a22d0ec3142/scipp-25.12.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ee/c7/ba86128309ccef3f1a2529fee8df4ab9c86f50c78314266d6b8734c54207/scipp-25.12.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -2886,7 +2888,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -2908,7 +2910,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ packages: @@ -2949,10 +2951,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl name: aiohttp version: 3.13.3 - sha256: 425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3 + sha256: 1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64 requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -2967,10 +2969,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: aiohttp version: 3.13.3 - sha256: 87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9 + sha256: 9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1 requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -2985,10 +2987,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/dc/f2/27cdf04c9851712d6c1b99df6821a6623c3c9e55956d4b1e318c337b5a48/aiohttp-3.13.3-cp311-cp311-win_amd64.whl name: aiohttp version: 3.13.3 - sha256: 693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e + sha256: 642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -3003,10 +3005,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl name: aiohttp version: 3.13.3 - sha256: f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0 + sha256: 9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984 requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -3021,10 +3023,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: aiohttp version: 3.13.3 - sha256: 1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64 + sha256: bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1 requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -3039,10 +3041,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl name: aiohttp version: 3.13.3 - sha256: 9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1 + sha256: c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -3057,10 +3059,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/dc/f2/27cdf04c9851712d6c1b99df6821a6623c3c9e55956d4b1e318c337b5a48/aiohttp-3.13.3-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl name: aiohttp version: 3.13.3 - sha256: 642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f + sha256: 6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415 requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -3232,10 +3234,10 @@ packages: requires_dist: - regex ; extra == 'extras' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl +- pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl name: backrefs version: '6.2' - sha256: 12df81596ab511f783b7d87c043ce26bc5b0288cf3bb03610fe76b8189282b2b + sha256: e5f805ae09819caa1aa0623b4a83790e7028604aa2b8c73ba602c4454e665de7 requires_dist: - regex ; extra == 'extras' requires_python: '>=3.9' @@ -3417,45 +3419,45 @@ packages: requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: cffi version: 2.0.0 - sha256: 19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75 + sha256: afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775 requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl name: cffi version: 2.0.0 - sha256: 45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca + sha256: 2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl name: cffi version: 2.0.0 - sha256: 00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb + sha256: c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13 requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl name: cffi version: 2.0.0 - sha256: 2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c + sha256: fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5 requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl name: cffi version: 2.0.0 - sha256: c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 + sha256: 66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5 requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl name: cffi version: 2.0.0 - sha256: 66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5 + sha256: 203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25 requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' @@ -3471,35 +3473,35 @@ packages: version: 3.5.0 sha256: a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl name: charset-normalizer version: 3.4.4 - sha256: 5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016 + sha256: da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl name: charset-normalizer version: 3.4.4 - sha256: 840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381 + sha256: 8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl +- pypi: https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl name: charset-normalizer version: 3.4.4 - sha256: e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794 + sha256: 5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: charset-normalizer version: 3.4.4 - sha256: b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14 + sha256: ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl +- pypi: https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: charset-normalizer version: 3.4.4 - sha256: 6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8 + sha256: 840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl name: charset-normalizer version: 3.4.4 - sha256: a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894 + sha256: 6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8 requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl name: click @@ -3525,10 +3527,10 @@ packages: requires_dist: - pytest ; extra == 'test' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: contourpy version: 1.3.3 - sha256: 23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381 + sha256: f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3 requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3550,10 +3552,10 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl name: contourpy version: 1.3.3 - sha256: 1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263 + sha256: 23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381 requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3575,10 +3577,10 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: contourpy version: 1.3.3 - sha256: 4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9 + sha256: 51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3600,10 +3602,10 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl name: contourpy version: 1.3.3 - sha256: 51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db + sha256: fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3625,10 +3627,10 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl name: contourpy version: 1.3.3 - sha256: 177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5 + sha256: cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3675,10 +3677,10 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl name: contourpy version: 1.3.3 - sha256: d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1 + sha256: 3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42 requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3700,10 +3702,10 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl name: contourpy version: 1.3.3 - sha256: 3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42 + sha256: cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77 requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3745,52 +3747,52 @@ packages: - questionary>=1.8.1 - typing-extensions>=4.0.0,<5.0.0 ; python_full_version < '3.11' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/06/90/2cdab0974b9b5bbc1623f7876b73603aecac11b8d95b85b5b86b32de5eab/coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl name: coverage version: 7.13.4 - sha256: 2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f + sha256: 0dd7ab8278f0d58a0128ba2fca25824321f05d059c1441800e934ff2efa52129 requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl name: coverage version: 7.13.4 - sha256: 8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7 + sha256: 2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl name: coverage version: 7.13.4 - sha256: 3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac + sha256: 8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7 requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/92/11/a9cf762bb83386467737d32187756a42094927150c3e107df4cb078e8590/coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl name: coverage version: 7.13.4 - sha256: d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053 + sha256: 300deaee342f90696ed186e3a00c71b5b3d27bffe9e827677954f4ee56969601 requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/a7/4d/1f8e723f6829977410efeb88f73673d794075091c8c7c18848d273dc9d73/coverage-7.13.4-cp314-cp314-win_amd64.whl name: coverage version: 7.13.4 - sha256: b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9 + sha256: 245e37f664d89861cf2329c9afa2c1fe9e6d4e1a09d872c947e70718aeeac505 requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl name: coverage version: 7.13.4 - sha256: e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd + sha256: d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053 requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/d3/28/56e6d892b7b052236d67c95f1936b6a7cf7c3e2634bf27610b8cbd7f9c60/coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl name: coverage version: 7.13.4 - sha256: b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b + sha256: 29e3220258d682b6226a9b0925bc563ed9a1ebcff3cad30f043eceea7eaf2689 requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' @@ -3814,11 +3816,6 @@ packages: - pytest-cov ; extra == 'tests' - pytest-xdist ; extra == 'tests' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl - name: debugpy - version: 1.8.20 - sha256: eb506e45943cab2efb7c6eafdd65b842f3ae779f020c82221f55aca9de135ed7 - requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl name: debugpy version: 1.8.20 @@ -3829,6 +3826,11 @@ packages: version: 1.8.20 sha256: 5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7 requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/e0/d9/1f07395b54413432624d61524dfd98c1a7c7827d2abfdb8829ac92638205/debugpy-1.8.20-cp314-cp314-win_amd64.whl + name: debugpy + version: 1.8.20 + sha256: a98eec61135465b062846112e5ecf2eebb855305acc1dfbae43b72903b8ab5be + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl name: decorator version: 5.2.1 @@ -3884,8 +3886,8 @@ packages: requires_python: '>=3.5' - pypi: ./ name: easyscience - version: 1.0.1+devdirty71 - sha256: 2ed61ffb6a26d4f98b06cfe854ba4794ef34e3a129c2975d248f123129af7ed2 + version: 1.0.1+devdirty79 + sha256: dc5d3052b21f2409cf5d87492ea0c2806501667b6cfb2310580abb4dd4b19422 requires_dist: - asteval - bumps @@ -4005,10 +4007,10 @@ packages: - skia-pathops>=0.5.0 ; extra == 'all' - uharfbuzz>=0.45.0 ; extra == 'all' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl name: fonttools version: 4.61.1 - sha256: 21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b + sha256: fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd requires_dist: - lxml>=4.0 ; extra == 'lxml' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -4039,10 +4041,10 @@ packages: - skia-pathops>=0.5.0 ; extra == 'all' - uharfbuzz>=0.45.0 ; extra == 'all' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl +- pypi: https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl name: fonttools version: 4.61.1 - sha256: 8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c + sha256: 4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c requires_dist: - lxml>=4.0 ; extra == 'lxml' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -4073,10 +4075,10 @@ packages: - skia-pathops>=0.5.0 ; extra == 'all' - uharfbuzz>=0.45.0 ; extra == 'all' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl name: fonttools version: 4.61.1 - sha256: dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e + sha256: c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09 requires_dist: - lxml>=4.0 ; extra == 'lxml' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -4107,10 +4109,10 @@ packages: - skia-pathops>=0.5.0 ; extra == 'all' - uharfbuzz>=0.45.0 ; extra == 'all' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl +- pypi: https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl name: fonttools version: 4.61.1 - sha256: c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09 + sha256: d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e requires_dist: - lxml>=4.0 ; extra == 'lxml' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -4175,10 +4177,10 @@ packages: - skia-pathops>=0.5.0 ; extra == 'all' - uharfbuzz>=0.45.0 ; extra == 'all' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl name: fonttools version: 4.61.1 - sha256: 64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5 + sha256: fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c requires_dist: - lxml>=4.0 ; extra == 'lxml' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -4255,35 +4257,35 @@ packages: version: 1.8.0 sha256: ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl - name: frozenlist - version: 1.8.0 - sha256: f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40 - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl name: frozenlist version: 1.8.0 sha256: 2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl name: frozenlist version: 1.8.0 - sha256: 96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7 + sha256: 3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0 requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl name: frozenlist version: 1.8.0 sha256: fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl + name: frozenlist + version: 1.8.0 + sha256: 119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl name: frozenlist version: 1.8.0 - sha256: fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027 + sha256: 4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl name: frozenlist version: 1.8.0 - sha256: 878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231 + sha256: cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2 requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl name: frozenlist @@ -4325,10 +4327,10 @@ packages: requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/33/5d/65c619e195e0b5e54ea5a95c1bb600c8ff8715e0d09676e4cce56d89f492/h5py-3.15.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: h5py version: 3.15.1 - sha256: ab2219dbc6fcdb6932f76b548e2b16f34a1f52b7666e998157a4dfc02e2c4123 + sha256: 28a20e1a4082a479b3d7db2169f3a5034af010b90842e75ebbf2e9e49eb4183e requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' @@ -4339,10 +4341,10 @@ packages: requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/65/4b/d715ed454d3baa5f6ae1d30b7eca4c7a1c1084f6a2edead9e801a1541d62/h5py-3.15.1-cp314-cp314-macosx_11_0_arm64.whl name: h5py version: 3.15.1 - sha256: c8440fd8bee9500c235ecb7aa1917a0389a2adb80c209fa1cc485bd70e0d94a5 + sha256: 954e480433e82d3872503104f9b285d369048c3a788b2b1a00e53d1c47c98dd2 requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' @@ -4353,24 +4355,24 @@ packages: requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/c1/b0/1c628e26a0b95858f54aba17e1599e7f6cd241727596cc2580b72cb0a9bf/h5py-3.15.1-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/a0/2c/926eba1514e4d2e47d0e9eb16c784e717d8b066398ccfca9b283917b1bfb/h5py-3.15.1-cp314-cp314-macosx_10_15_x86_64.whl name: h5py version: 3.15.1 - sha256: c970fb80001fffabb0109eaf95116c8e7c0d3ca2de854e0901e8a04c1f098509 + sha256: 5f4fb0567eb8517c3ecd6b3c02c4f4e9da220c8932604960fd04e24ee1254763 requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/b6/d8/7368679b8df6925b8415f9dcc9ab1dab01ddc384d2b2c24aac9191bd9ceb/h5py-3.15.1-cp314-cp314-win_amd64.whl name: h5py version: 3.15.1 - sha256: 121b2b7a4c1915d63737483b7bff14ef253020f617c2fb2811f67a4bed9ac5e8 + sha256: 9c73d1d7cdb97d5b17ae385153472ce118bed607e43be11e9a9deefaa54e0734 requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/c1/b0/1c628e26a0b95858f54aba17e1599e7f6cd241727596cc2580b72cb0a9bf/h5py-3.15.1-cp311-cp311-macosx_11_0_arm64.whl name: h5py version: 3.15.1 - sha256: dea78b092fd80a083563ed79a3171258d4a4d307492e7cf8b2313d464c82ba52 + sha256: c970fb80001fffabb0109eaf95116c8e7c0d3ca2de854e0901e8a04c1f098509 requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' @@ -5118,10 +5120,10 @@ packages: - pytest-xdist ; extra == 'test-integration' - bash-kernel ; extra == 'test-ui' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl name: kiwisolver version: 1.4.9 - sha256: 1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f + sha256: 0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7 requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl name: kiwisolver @@ -5133,30 +5135,30 @@ packages: version: 1.4.9 sha256: be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: kiwisolver version: 1.4.9 - sha256: dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61 + sha256: 767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: kiwisolver version: 1.4.9 - sha256: dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d + sha256: dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61 requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl name: kiwisolver version: 1.4.9 sha256: 39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl name: kiwisolver version: 1.4.9 - sha256: efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2 + sha256: d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl name: kiwisolver version: 1.4.9 - sha256: b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098 + sha256: 2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3 requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl name: lark @@ -5898,50 +5900,50 @@ packages: - pytest-regressions ; extra == 'testing' - requests ; extra == 'testing' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl name: markupsafe version: 3.0.3 - sha256: 9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5 + sha256: 1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl name: markupsafe version: 3.0.3 - sha256: 1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad + sha256: bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581 requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: markupsafe version: 3.0.3 sha256: 0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl name: markupsafe version: 3.0.3 - sha256: e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 + sha256: eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: markupsafe version: 3.0.3 - sha256: de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01 + sha256: 457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl name: markupsafe version: 3.0.3 - sha256: 116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 + sha256: de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl name: markupsafe version: 3.0.3 - sha256: ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 + sha256: c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026 requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl name: markupsafe version: 3.0.3 sha256: 4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl name: matplotlib version: 3.10.8 - sha256: 3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6 + sha256: b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -5957,10 +5959,10 @@ packages: - setuptools-scm>=7 ; extra == 'dev' - setuptools>=64 ; extra == 'dev' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl name: matplotlib version: 3.10.8 - sha256: e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149 + sha256: 32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -5995,10 +5997,10 @@ packages: - setuptools-scm>=7 ; extra == 'dev' - setuptools>=64 ; extra == 'dev' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: matplotlib version: 3.10.8 - sha256: a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486 + sha256: efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -6014,10 +6016,10 @@ packages: - setuptools-scm>=7 ; extra == 'dev' - setuptools>=64 ; extra == 'dev' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl name: matplotlib version: 3.10.8 - sha256: 56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1 + sha256: 83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -6033,10 +6035,10 @@ packages: - setuptools-scm>=7 ; extra == 'dev' - setuptools>=64 ; extra == 'dev' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: matplotlib version: 3.10.8 - sha256: efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4 + sha256: 2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -6297,40 +6299,40 @@ packages: requires_dist: - jinja2 - matplotlib -- pypi: https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl name: msgpack version: 1.1.2 - sha256: d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68 + sha256: 6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl name: msgpack version: 1.1.2 - sha256: 2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c + sha256: e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl name: msgpack version: 1.1.2 - sha256: fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e + sha256: d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl name: msgpack version: 1.1.2 - sha256: 4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf + sha256: 2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: msgpack version: 1.1.2 - sha256: a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9 + sha256: 180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl name: msgpack version: 1.1.2 - sha256: 283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0 + sha256: 9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl name: msgpack version: 1.1.2 - sha256: 42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7 + sha256: 283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0 requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: msgpack @@ -6346,64 +6348,64 @@ packages: - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/28/83/36557b04cfdc317ed8a525c4993b23e43a8fbcddaddd78619112ca07138c/msgspec-0.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/5a/15/3c225610da9f02505d37d69a77f4a2e7daae2a125f99d638df211ba84e59/msgspec-0.20.0-cp311-cp311-macosx_11_0_arm64.whl name: msgspec version: 0.20.0 - sha256: 7fac7e9c92eddcd24c19d9e5f6249760941485dff97802461ae7c995a2450111 + sha256: 23ee3787142e48f5ee746b2909ce1b76e2949fbe0f97f9f6e70879f06c218b54 requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/57/b6/eff0305961a1d9447ec2b02f8c73c8946f22564d302a504185b730c9a761/msgspec-0.20.0-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/6b/96/5c095b940de3aa6b43a71ec76275ac3537b21bd45c7499b5a17a429110fa/msgspec-0.20.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: msgspec version: 0.20.0 - sha256: f6532369ece217fd37c5ebcfd7e981f2615628c21121b7b2df9d3adcf2fd69b8 + sha256: bb4d873f24ae18cd1334f4e37a178ed46c9d186437733351267e0a269bdf7e53 requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/5a/15/3c225610da9f02505d37d69a77f4a2e7daae2a125f99d638df211ba84e59/msgspec-0.20.0-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/89/5e/406b7d578926b68790e390d83a1165a9bfc2d95612a1a9c1c4d5c72ea815/msgspec-0.20.0-cp311-cp311-win_amd64.whl name: msgspec version: 0.20.0 - sha256: 23ee3787142e48f5ee746b2909ce1b76e2949fbe0f97f9f6e70879f06c218b54 + sha256: d1dcc93a3ce3d3195985bfff18a48274d0b5ffbc96fa1c5b89da6f0d9af81b29 requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/6b/96/5c095b940de3aa6b43a71ec76275ac3537b21bd45c7499b5a17a429110fa/msgspec-0.20.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/b8/8e/6b17e43f6eb9369d9858ee32c97959fcd515628a1df376af96c11606cf70/msgspec-0.20.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: msgspec version: 0.20.0 - sha256: bb4d873f24ae18cd1334f4e37a178ed46c9d186437733351267e0a269bdf7e53 + sha256: 27d35044dd8818ac1bd0fedb2feb4fbdff4e3508dd7c5d14316a12a2d96a0de0 requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/89/5e/406b7d578926b68790e390d83a1165a9bfc2d95612a1a9c1c4d5c72ea815/msgspec-0.20.0-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/bb/18/62dc13ab0260c7d741dda8dc7f481495b93ac9168cd887dda5929880eef8/msgspec-0.20.0-cp314-cp314-macosx_10_15_x86_64.whl name: msgspec version: 0.20.0 - sha256: d1dcc93a3ce3d3195985bfff18a48274d0b5ffbc96fa1c5b89da6f0d9af81b29 + sha256: eead16538db1b3f7ec6e3ed1f6f7c5dec67e90f76e76b610e1ffb5671815633a requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/8a/d1/b902d38b6e5ba3bdddbec469bba388d647f960aeed7b5b3623a8debe8a76/msgspec-0.20.0-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/dd/1d/b9949e4ad6953e9f9a142c7997b2f7390c81e03e93570c7c33caf65d27e1/msgspec-0.20.0-cp314-cp314-macosx_11_0_arm64.whl name: msgspec version: 0.20.0 - sha256: 9c1ff8db03be7598b50dd4b4a478d6fe93faae3bd54f4f17aa004d0e46c14c46 + sha256: 703c3bb47bf47801627fb1438f106adbfa2998fe586696d1324586a375fca238 requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/f1/25/5e8080fe0117f799b1b68008dc29a65862077296b92550632de015128579/msgspec-0.20.0-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/ff/37/9c4b58ff11d890d788e700b827db2366f4d11b3313bf136780da7017278b/msgspec-0.20.0-cp314-cp314-win_amd64.whl name: msgspec version: 0.20.0 - sha256: 67d5e4dfad52832017018d30a462604c80561aa62a9d548fc2bd4e430b66a352 + sha256: 7dfebc94fe7d3feec6bc6c9df4f7e9eccc1160bb5b811fbf3e3a56899e398a6b requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' @@ -6416,52 +6418,52 @@ packages: requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl name: multidict version: 6.7.1 - sha256: 935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445 + sha256: 844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl name: multidict version: 6.7.1 - sha256: 844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e + sha256: bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl name: multidict version: 6.7.1 - sha256: 9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429 + sha256: a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2 requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl name: multidict version: 6.7.1 - sha256: 960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5 + sha256: f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855 requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl name: multidict version: 6.7.1 - sha256: 84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2 + sha256: 5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl name: multidict version: 6.7.1 - sha256: bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b + sha256: 0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1 requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: multidict version: 6.7.1 - sha256: f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855 + sha256: 7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709 requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' @@ -6762,25 +6764,30 @@ packages: - pytest-jupyter ; extra == 'test' - pytest-tornasync ; extra == 'test' requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl name: numpy version: 2.4.2 - sha256: d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499 + sha256: 068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75 requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl name: numpy version: 2.4.2 - sha256: bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979 + sha256: 444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: numpy version: 2.4.2 sha256: c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32 requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl name: numpy version: 2.4.2 - sha256: 7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622 + sha256: d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: numpy + version: 2.4.2 + sha256: bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325 requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl name: numpy @@ -6792,11 +6799,6 @@ packages: version: 2.4.2 sha256: b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695 requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl - name: numpy - version: 2.4.2 - sha256: 25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c - requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl name: numpy version: 2.4.2 @@ -6869,10 +6871,10 @@ packages: - pytest ; extra == 'dev' - tox ; extra == 'dev' - black ; extra == 'lint' -- pypi: https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl name: pandas version: 3.0.1 - sha256: 5272627187b5d9c20e55d27caf5f2cd23e286aba25cadf73c8590e432e2b7262 + sha256: 93325b0fe372d192965f4cca88d97667f49557398bbf94abdda3bf1b591dbe66 requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -7139,10 +7141,10 @@ packages: - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.23.0 ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/a8/14/5990826f779f79148ae9d3a2c39593dc04d61d5d90541e71b5749f35af95/pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl name: pandas version: 3.0.1 - sha256: 661e0f665932af88c7877f31da0dc743fe9c8f2524bdffe23d24fdcb67ef9d56 + sha256: c1a9f55e0f46951874b863d1f3906dcb57df2d9be5c5847ba4dfb55b2c815249 requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -7229,10 +7231,10 @@ packages: - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.23.0 ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl name: pandas version: 3.0.1 - sha256: 24ba315ba3d6e5806063ac6eb717504e499ce30bd8c236d8693a5fd3f084c796 + sha256: 3b66857e983208654294bb6477b8a63dee26b37bdd0eb34d010556e91261784f requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -7319,10 +7321,10 @@ packages: - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.23.0 ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/d6/7d/216a1588b65a7aa5f4535570418a599d943c85afb1d95b0876fc00aa1468/pandas-3.0.1-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/bb/8b/4bb774a998b97e6c2fd62a9e6cfdaae133b636fd1c468f92afb4ae9a447a/pandas-3.0.1-cp314-cp314-macosx_10_15_x86_64.whl name: pandas version: 3.0.1 - sha256: 9fea306c783e28884c29057a1d9baa11a349bbf99538ec1da44c8476563d1b25 + sha256: 99d0f92ed92d3083d140bf6b97774f9f13863924cf3f52a70711f4e7588f9d0a requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -7409,10 +7411,10 @@ packages: - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.23.0 ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/f2/85/ab6d04733a7d6ff32bfc8382bf1b07078228f5d6ebec5266b91bfc5c4ff7/pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl name: pandas version: 3.0.1 - sha256: 1ff8cf1d2896e34343197685f432450ec99a85ba8d90cce2030c5eee2ef98791 + sha256: 24ba315ba3d6e5806063ac6eb717504e499ce30bd8c236d8693a5fd3f084c796 requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -7622,10 +7624,10 @@ packages: sha256: 7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 requires_dist: - ptyprocess>=0.5 -- pypi: https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl name: pillow version: 12.1.1 - sha256: 6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60 + sha256: f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -7718,10 +7720,10 @@ packages: - trove-classifiers>=2024.10.12 ; extra == 'tests' - defusedxml ; extra == 'xmp' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl name: pillow version: 12.1.1 - sha256: 344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1 + sha256: 50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -7750,10 +7752,10 @@ packages: - trove-classifiers>=2024.10.12 ; extra == 'tests' - defusedxml ; extra == 'xmp' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl name: pillow version: 12.1.1 - sha256: 47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717 + sha256: 2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -7846,10 +7848,10 @@ packages: - trove-classifiers>=2024.10.12 ; extra == 'tests' - defusedxml ; extra == 'xmp' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: pillow version: 12.1.1 - sha256: 8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2 + sha256: a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -7995,20 +7997,30 @@ packages: requires_dist: - wcwidth requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl + name: propcache + version: 0.4.1 + sha256: 5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153 + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: propcache version: 0.4.1 sha256: fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl + name: propcache + version: 0.4.1 + sha256: c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: propcache version: 0.4.1 - sha256: cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74 + sha256: 8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl name: propcache version: 0.4.1 - sha256: d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311 + sha256: 9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl name: propcache @@ -8020,21 +8032,11 @@ packages: version: 0.4.1 sha256: 6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: propcache - version: 0.4.1 - sha256: d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl name: propcache version: 0.4.1 sha256: 364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl - name: propcache - version: 0.4.1 - sha256: 381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl name: psutil version: 7.2.2 @@ -8262,24 +8264,24 @@ packages: requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl name: pydantic-core version: 2.41.5 - sha256: 941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9 + sha256: 8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: pydantic-core version: 2.41.5 - sha256: 112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34 + sha256: 22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375 requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl name: pydantic-core version: 2.41.5 - sha256: 79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11 + sha256: 1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14 requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' @@ -8290,17 +8292,17 @@ packages: requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl name: pydantic-core version: 2.41.5 - sha256: 406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586 + sha256: a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6 requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl name: pydantic-core version: 2.41.5 - sha256: a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6 + sha256: 3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' @@ -8404,10 +8406,10 @@ packages: purls: [] size: 30905206 timestamp: 1769472446175 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda - build_number: 100 - sha256: 8a08fe5b7cb5a28aa44e2994d18dbf77f443956990753a4ca8173153ffb6eb56 - md5: 4c875ed0e78c2d407ec55eadffb8cf3d +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda + build_number: 101 + sha256: cb0628c5f1732f889f53a877484da98f5a0e0f47326622671396fb4f2b0cd6bd + md5: c014ad06e60441661737121d3eae8a60 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -8422,15 +8424,16 @@ packages: - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.5,<4.0a0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata + - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 purls: [] - size: 37364553 - timestamp: 1770272309861 - python_site_packages_path: lib/python3.13/site-packages + size: 36702440 + timestamp: 1770675584356 + python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.14-h74c2667_3_cpython.conda build_number: 3 sha256: 327d6c5eb61657d4b76e1024da9c790d3e7aacee84487403e9eef1b730982e63 @@ -8454,10 +8457,10 @@ packages: purls: [] size: 15666344 timestamp: 1769473006716 -- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.12-h894a449_100_cp313.conda - build_number: 100 - sha256: 9548dcf58cf6045aa4aa1f2f3fa6110115ca616a8d5fa142a24081d2b9d91291 - md5: 99b1fa1fe8a8ab58224969f4568aadca +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.3-h4f44bb5_101_cp314.conda + build_number: 101 + sha256: f64e357aa0168a201c9b3eedf500d89a8550d6631d26a95590b12de61f8fd660 + md5: 030ec23658b941438ac42303aff0db2b depends: - __osx >=10.13 - bzip2 >=1.0.8,<2.0a0 @@ -8469,15 +8472,16 @@ packages: - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.5,<4.0a0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata + - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 purls: [] - size: 17570178 - timestamp: 1770272361922 - python_site_packages_path: lib/python3.13/site-packages + size: 14387288 + timestamp: 1770676578632 + python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.14-h18782d2_3_cpython.conda build_number: 3 sha256: f862d544a455bedfa5d77305f0a42c8e3392956e364f8f92d6ca1c844fb3fbd1 @@ -8501,10 +8505,10 @@ packages: purls: [] size: 13707418 timestamp: 1769472290774 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda - build_number: 100 - sha256: 9a4f16a64def0853f0a7b6a7beb40d498fd6b09bee10b90c3d6069b664156817 - md5: 179c0f5ae4f22bc3be567298ed0b17b9 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda + build_number: 101 + sha256: fccce2af62d11328d232df9f6bbf63464fd45f81f718c661757f9c628c4378ce + md5: 753c8d0447677acb7ddbcc6e03e82661 depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 @@ -8516,15 +8520,16 @@ packages: - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.5,<4.0a0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata + - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 purls: [] - size: 12770674 - timestamp: 1770272314517 - python_site_packages_path: lib/python3.13/site-packages + size: 13522698 + timestamp: 1770675365241 + python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.14-h0159041_3_cpython.conda build_number: 3 sha256: 5676dadd9d4fba1bce51bd7e5cf8fcf76f85b88b7baa15bd10ca00557e67f10e @@ -8548,10 +8553,10 @@ packages: purls: [] size: 18353938 timestamp: 1769471078924 -- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.12-h09917c8_100_cp313.conda - build_number: 100 - sha256: da70aec20ff5a5ae18bbba9fdd1e18190b419605cafaafb3bdad8becf11ce94d - md5: 4440c24966d0aa0c8f1e1d5006dac2d6 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda + build_number: 101 + sha256: 3f99d83bfd95b9bdae64a42a1e4bf5131dc20b724be5ac8a9a7e1ac2c0f006d7 + md5: 7ec2be7eaf59f83f3e5617665f3fbb2e depends: - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.7.3,<3.0a0 @@ -8561,16 +8566,17 @@ packages: - libsqlite >=3.51.2,<4.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.5,<4.0a0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 - tk >=8.6.13,<8.7.0a0 - tzdata - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 purls: [] - size: 16535316 - timestamp: 1770270322707 + size: 18273230 + timestamp: 1770675442998 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 @@ -8649,40 +8655,45 @@ packages: - sphinx ; extra == 'docs' - furo ; extra == 'docs' requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda build_number: 8 - sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 - md5: 94305520c52a4aa3f6c2b1ff6008d9f8 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 0539938c55b6b1a59b560e843ad864a4 constrains: - - python 3.13.* *_cp313 + - python 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD purls: [] - size: 7002 - timestamp: 1752805902938 + size: 6989 + timestamp: 1752805904792 - pypi: https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl name: pywin32 version: '311' sha256: 3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503 -- pypi: https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl name: pywin32 version: '311' - sha256: 718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d -- pypi: https://files.pythonhosted.org/packages/79/c3/3e75075c7f71735f22b66fab0481f2c98e3a4d58cba55cb50ba29114bcf6/pywinpty-3.0.3-cp311-cp311-win_amd64.whl + sha256: 3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87 +- pypi: https://files.pythonhosted.org/packages/28/88/2ff917caff61e55f38bcdb27de06ee30597881b2cae44fbba7627be015c4/pywinpty-3.0.3-cp314-cp314-win_amd64.whl name: pywinpty version: 3.0.3 - sha256: dff25a9a6435f527d7c65608a7e62783fc12076e7d44487a4911ee91be5a8ac8 + sha256: d4b6b7b0fe0cdcd02e956bd57cfe9f4e5a06514eecf3b5ae174da4f951b58be9 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/79/c3/3e75075c7f71735f22b66fab0481f2c98e3a4d58cba55cb50ba29114bcf6/pywinpty-3.0.3-cp311-cp311-win_amd64.whl name: pywinpty version: 3.0.3 - sha256: 9c91dbb026050c77bdcef964e63a4f10f01a639113c4d3658332614544c467ab + sha256: dff25a9a6435f527d7c65608a7e62783fc12076e7d44487a4911ee91be5a8ac8 requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl name: pyyaml version: 6.0.3 sha256: 652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl + name: pyyaml + version: 6.0.3 + sha256: 4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl name: pyyaml version: 6.0.3 @@ -8693,25 +8704,20 @@ packages: version: 6.0.3 sha256: b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: pyyaml - version: 6.0.3 - sha256: 0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: pyyaml version: 6.0.3 - sha256: 79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c + sha256: c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl name: pyyaml version: 6.0.3 - sha256: 2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 + sha256: 8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl name: pyyaml version: 6.0.3 - sha256: 8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 + sha256: 34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl name: pyyaml @@ -8868,30 +8874,35 @@ packages: - lark>=1.2.2 - pytest>=8.3.5 ; extra == 'testing' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl name: rpds-py version: 0.30.0 - sha256: a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425 + sha256: ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl name: rpds-py version: 0.30.0 - sha256: dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d + sha256: 95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl + name: rpds-py + version: 0.30.0 + sha256: a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl name: rpds-py version: 0.30.0 - sha256: 9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6 + sha256: 68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl name: rpds-py version: 0.30.0 - sha256: f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2 + sha256: dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: rpds-py version: 0.30.0 - sha256: 806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15 + sha256: 47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: rpds-py @@ -8903,11 +8914,6 @@ packages: version: 0.30.0 sha256: a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl - name: rpds-py - version: 0.30.0 - sha256: e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8 - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl name: ruff version: 0.15.4 @@ -8954,10 +8960,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/18/5c/bc0ca94bff65fe0d206a369b54625f8ec7852dfd1d835174692026f34df9/scipp-25.12.0-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/4e/b6/ffe0bb67cec66cd450acff599bb07507bbf5ffda1a3a15dd2d8dbe7a6da7/scipp-25.12.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scipp version: 25.12.0 - sha256: 0285c91b202dea9aeb18f29d73ff135208a19b2068cd30e17ee81fc435b1943c + sha256: 9ec0200eeb660965056b27f5f05505a961d8921b78d0a92c04743d1c22ce7203 requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -8980,10 +8986,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/4e/b6/ffe0bb67cec66cd450acff599bb07507bbf5ffda1a3a15dd2d8dbe7a6da7/scipp-25.12.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/6a/3a/ab0eb61593569d5a0d080002e4b8c0998cb1116d8710781b7225c304b880/scipp-25.12.0-cp311-cp311-macosx_11_0_arm64.whl name: scipp version: 25.12.0 - sha256: 9ec0200eeb660965056b27f5f05505a961d8921b78d0a92c04743d1c22ce7203 + sha256: e27082f5bd3655f15479ce87be495235b9bcd9b5db654a7219261be0c6117b31 requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -9006,10 +9012,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/6a/3a/ab0eb61593569d5a0d080002e4b8c0998cb1116d8710781b7225c304b880/scipp-25.12.0-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/7b/c8/770b6bc4bea3434349817a942eb4f8128d9dbe1356dedd26847e27ae8e0b/scipp-25.12.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scipp version: 25.12.0 - sha256: e27082f5bd3655f15479ce87be495235b9bcd9b5db654a7219261be0c6117b31 + sha256: a647a5b82d054a9210d0c4208194b7272cce2721a2fcfea81d1b94362bd5b932 requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -9032,10 +9038,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/94/98/aa2d4b9d28969cc7f62409f9f9fc5b5a853af651255eba03e9bee8546dd9/scipp-25.12.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/a2/85/4134c04e851dba5528dfbeffe1c664e59f59ff273afa066056d919731c51/scipp-25.12.0-cp314-cp314-macosx_11_0_arm64.whl name: scipp version: 25.12.0 - sha256: e5694bef45299c4813ee2fe863fab600c3b0f5e13e2735072dbbb5cf1804d0e0 + sha256: b07e85835ee733e020a6e3692538d235ece81b4a1b96915141084b82844c4aaf requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -9084,10 +9090,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/e5/22/75e119e0a200914f88f121cd956e1eb7f72c8ace4b63171f52ba0334d142/scipp-25.12.0-cp313-cp313-macosx_11_0_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/cc/bc/e455c908cbd0f969bc2cb6fbe01bceeb4ecc41ea88adcf5953162e4177eb/scipp-25.12.0-cp314-cp314-macosx_11_0_x86_64.whl name: scipp version: 25.12.0 - sha256: 27ebc37f3b7e20c9dca9cf1a0ac53c4ffaea31c02dfc8ba2b5aa008a252cbcba + sha256: 0c7881b464b12dda1285c92d3f7ea2a1d4b5c150742b7afcb4758f6ccceb6ee2 requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -9110,10 +9116,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/eb/d1/b3cd2733a96a36c54c36889b2cfdd0331c1e5b57fa1757485a22d0ec3142/scipp-25.12.0-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/ee/c7/ba86128309ccef3f1a2529fee8df4ab9c86f50c78314266d6b8734c54207/scipp-25.12.0-cp314-cp314-win_amd64.whl name: scipp version: 25.12.0 - sha256: 015db5035749750cf026db56fe537af10f159dc3cd0f51f0ea9f4ecc3a7a5da8 + sha256: 61d6f671cc372f5eb93e9a9bc8a54e566ebd445b00c42326fb76cc8898b47629 requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -9180,10 +9186,10 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scipy version: 1.17.1 - sha256: 37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448 + sha256: eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118 requires_dist: - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' @@ -9224,10 +9230,10 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl name: scipy version: 1.17.1 - sha256: 5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c + sha256: 3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19 requires_dist: - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' @@ -9312,10 +9318,10 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl name: scipy version: 1.17.1 - sha256: 1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec + sha256: a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717 requires_dist: - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' @@ -9356,10 +9362,10 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl name: scipy version: 1.17.1 - sha256: 6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f + sha256: 1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec requires_dist: - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' @@ -9400,10 +9406,10 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl name: scipy version: 1.17.1 - sha256: 581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464 + sha256: 45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9 requires_dist: - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' @@ -9682,20 +9688,10 @@ packages: version: 2.4.0 sha256: d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: tomli version: 2.4.0 - sha256: 9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl - name: tomli - version: 2.4.0 - sha256: 84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl - name: tomli - version: 2.4.0 - sha256: 3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87 + sha256: a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl name: tomli @@ -9707,16 +9703,26 @@ packages: version: 2.4.0 sha256: 5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9 requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl + name: tomli + version: 2.4.0 + sha256: 43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl name: tomli version: 2.4.0 - sha256: 1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e + sha256: 20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: tomli version: 2.4.0 sha256: 5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76 requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl + name: tomli + version: 2.4.0 + sha256: 26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6 + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: tornado version: 6.5.4 @@ -9933,13 +9939,6 @@ packages: requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl - name: watchdog - version: 6.0.0 - sha256: 76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134 - requires_dist: - - pyyaml>=3.10 ; extra == 'watchmedo' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl name: watchdog version: 6.0.0 @@ -9954,17 +9953,17 @@ packages: requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz name: watchdog version: 6.0.0 - sha256: cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680 + sha256: 9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282 requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl name: watchdog version: 6.0.0 - sha256: a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b + sha256: cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680 requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' @@ -10016,28 +10015,28 @@ packages: - multidict>=4.0 - propcache>=0.2.1 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl name: yarl version: 1.23.0 - sha256: 34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4 + sha256: 23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719 requires_dist: - idna>=2.0 - multidict>=4.0 - propcache>=0.2.1 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl name: yarl version: 1.23.0 - sha256: 4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5 + sha256: 85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474 requires_dist: - idna>=2.0 - multidict>=4.0 - propcache>=0.2.1 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: yarl version: 1.23.0 - sha256: baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3 + sha256: 1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52 requires_dist: - idna>=2.0 - multidict>=4.0 @@ -10061,10 +10060,10 @@ packages: - multidict>=4.0 - propcache>=0.2.1 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl name: yarl version: 1.23.0 - sha256: 7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b + sha256: 63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70 requires_dist: - idna>=2.0 - multidict>=4.0 @@ -10136,3 +10135,16 @@ packages: purls: [] size: 433413 timestamp: 1764777166076 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + sha256: 368d8628424966fd8f9c8018326a9c779e06913dd39e646cf331226acc90e5b2 + md5: 053b84beec00b71ea8ff7a4f84b55207 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 388453 + timestamp: 1764777142545 diff --git a/pixi.toml b/pixi.toml index 24c0854c..aae6407b 100644 --- a/pixi.toml +++ b/pixi.toml @@ -53,7 +53,7 @@ easyscience = { path = ".", editable = true, extras = ['dev'] } [feature.py-min.dependencies] python = '3.11.*' [feature.py-max.dependencies] -python = '3.13.*' +python = '3.14.*' ############## # ENVIRONMENTS @@ -64,7 +64,7 @@ python = '3.13.*' # The `default` feature is always included in all environments. # Additional features can be specified per environment. py-311-env = { features = ['default', 'py-min'] } -py-313-env = { features = ['default', 'py-max'] } +py-314-env = { features = ['default', 'py-max'] } # The `default` environment is always created and includes the `default` feature. # It does not need to be specified explicitly unless non-default features are included. diff --git a/pyproject.toml b/pyproject.toml index d220bb59..8e8738cf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,7 @@ classifiers = [ 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', 'Programming Language :: Python :: 3.13', + 'Programming Language :: Python :: 3.14', ] requires-python = '>=3.11' dependencies = [ From f9be8f65feb59c0a3a2a1da4753b9ce110a88cd0 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 3 Mar 2026 22:54:02 +0100 Subject: [PATCH 27/35] Revert "Add Python 3.14 and update templates" This reverts commit 76ae24b893c12e42c49db53c0263049ce60946ba. --- .copier-answers.yml | 4 +- .github/workflows/pypi-test.yml | 4 +- .github/workflows/test.yml | 4 +- docs/docs/installation-and-setup/index.md | 6 +- pixi.lock | 1196 ++++++++++----------- pixi.toml | 4 +- pyproject.toml | 1 - 7 files changed, 603 insertions(+), 616 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 7ce7337a..8a898472 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,11 +1,11 @@ # WARNING: Do not edit this file manually. # Any changes will be overwritten by Copier. -_commit: v0.8.0 +_commit: v0.7.0-12-gd43fb97 _src_path: gh:easyscience/templates lib_docs_url: https://easyscience.github.io/corelib lib_doi: 10.5281/zenodo.18163581 lib_package_name: easyscience -lib_python_max: '3.14' +lib_python_max: '3.13' lib_python_min: '3.11' lib_repo_name: corelib project_contact_email: support@easyscience.org diff --git a/.github/workflows/pypi-test.yml b/.github/workflows/pypi-test.yml index 29e8261d..6f4e582f 100644 --- a/.github/workflows/pypi-test.yml +++ b/.github/workflows/pypi-test.yml @@ -45,9 +45,9 @@ jobs: - name: Init pixi project run: pixi init easyscience - - name: Add Python 3.14 from Conda + - name: Add Python 3.13 from Conda working-directory: easyscience - run: pixi add "python=3.14" + run: pixi add "python=3.13" - name: Add other Conda dependencies working-directory: easyscience diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9a823a80..05998190 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -44,8 +44,8 @@ concurrency: # Set the environment variables to be used in all jobs defined in this workflow env: CI_BRANCH: ${{ github.head_ref || github.ref_name }} - PY_VERSIONS: '3.11 3.14' - PIXI_ENVS: 'py-311-env py-314-env' + PY_VERSIONS: '3.11 3.13' + PIXI_ENVS: 'py-311-env py-313-env' jobs: # Job 1: Set up environment variables diff --git a/docs/docs/installation-and-setup/index.md b/docs/docs/installation-and-setup/index.md index 76416105..b6628fed 100644 --- a/docs/docs/installation-and-setup/index.md +++ b/docs/docs/installation-and-setup/index.md @@ -5,7 +5,7 @@ icon: material/cog-box # :material-cog-box: Installation & Setup **EasyScience** is a cross-platform Python library compatible with -**Python 3.11** through **3.14**. +**Python 3.11** through **3.13**. To install and set up EasyScience, we recommend using [**Pixi**](https://pixi.prefix.dev), a modern package manager for @@ -62,9 +62,9 @@ This section describes the simplest way to set up EasyScience using pixi init easyscience cd easyscience ``` -- Set the Python version for the Pixi environment (e.g., 3.14): +- Set the Python version for the Pixi environment (e.g., 3.13): ```txt - pixi add python=3.14 + pixi add python=3.13 ``` - Add EasyScience to the Pixi environment from PyPI: ```txt diff --git a/pixi.lock b/pixi.lock index 69aa7fbf..e8770a6a 100644 --- a/pixi.lock +++ b/pixi.lock @@ -36,14 +36,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-25.7.0-he4ff34a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -56,7 +56,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -64,16 +64,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/06/90/2cdab0974b9b5bbc1623f7876b73603aecac11b8d95b85b5b86b32de5eab/coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl @@ -87,14 +87,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/33/5d/65c619e195e0b5e54ea5a95c1bb600c8ff8715e0d09676e4cce56d89f492/h5py-3.15.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -128,14 +128,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -153,9 +153,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b8/8e/6b17e43f6eb9369d9858ee32c97959fcd515628a1df376af96c11606cf70/msgspec-0.20.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/83/36557b04cfdc317ed8a525c4993b23e43a8fbcddaddd78619112ca07138c/msgspec-0.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -166,15 +166,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f2/85/ab6d04733a7d6ff32bfc8382bf1b07078228f5d6ebec5266b91bfc5c4ff7/pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -184,7 +184,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -192,7 +192,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -205,7 +205,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -216,10 +216,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/7b/c8/770b6bc4bea3434349817a942eb4f8128d9dbe1356dedd26847e27ae8e0b/scipp-25.12.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/94/98/aa2d4b9d28969cc7f62409f9f9fc5b5a853af651255eba03e9bee8546dd9/scipp-25.12.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -230,7 +230,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -252,7 +252,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-64: @@ -277,14 +277,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.7.0-hf6efa0e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.3-h4f44bb5_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.12-h894a449_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -298,7 +298,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -306,16 +306,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/11/a9cf762bb83386467737d32187756a42094927150c3e107df4cb078e8590/coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl @@ -329,14 +329,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/2c/926eba1514e4d2e47d0e9eb16c784e717d8b066398ccfca9b283917b1bfb/h5py-3.15.1-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -370,14 +370,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -395,9 +395,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/bb/18/62dc13ab0260c7d741dda8dc7f481495b93ac9168cd887dda5929880eef8/msgspec-0.20.0-cp314-cp314-macosx_10_15_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8a/d1/b902d38b6e5ba3bdddbec469bba388d647f960aeed7b5b3623a8debe8a76/msgspec-0.20.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -408,15 +408,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bb/8b/4bb774a998b97e6c2fd62a9e6cfdaae133b636fd1c468f92afb4ae9a447a/pandas-3.0.1-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -426,7 +426,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -434,7 +434,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -447,7 +447,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -458,10 +458,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/cc/bc/e455c908cbd0f969bc2cb6fbe01bceeb4ecc41ea88adcf5953162e4177eb/scipp-25.12.0-cp314-cp314-macosx_11_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e5/22/75e119e0a200914f88f121cd956e1eb7f72c8ace4b63171f52ba0334d142/scipp-25.12.0-cp313-cp313-macosx_11_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -472,7 +472,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -487,14 +487,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-arm64: @@ -519,14 +519,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.7.0-hbfc8e16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -540,7 +540,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -548,16 +548,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d3/28/56e6d892b7b052236d67c95f1936b6a7cf7c3e2634bf27610b8cbd7f9c60/coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl @@ -571,14 +571,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/4b/d715ed454d3baa5f6ae1d30b7eca4c7a1c1084f6a2edead9e801a1541d62/h5py-3.15.1-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -612,14 +612,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -637,9 +637,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/dd/1d/b9949e4ad6953e9f9a142c7997b2f7390c81e03e93570c7c33caf65d27e1/msgspec-0.20.0-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/57/b6/eff0305961a1d9447ec2b02f8c73c8946f22564d302a504185b730c9a761/msgspec-0.20.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -650,15 +650,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a8/14/5990826f779f79148ae9d3a2c39593dc04d61d5d90541e71b5749f35af95/pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -668,7 +668,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -676,7 +676,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -689,7 +689,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -700,10 +700,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/a2/85/4134c04e851dba5528dfbeffe1c664e59f59ff273afa066056d919731c51/scipp-25.12.0-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/18/5c/bc0ca94bff65fe0d206a369b54625f8ec7852dfd1d835174692026f34df9/scipp-25.12.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -714,7 +714,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -729,14 +729,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ win-64: @@ -750,17 +750,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.7.0-h80d1838_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.12-h09917c8_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -773,7 +772,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -781,18 +780,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a7/4d/1f8e723f6829977410efeb88f73673d794075091c8c7c18848d273dc9d73/coverage-7.13.4-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e0/d9/1f07395b54413432624d61524dfd98c1a7c7827d2abfdb8829ac92638205/debugpy-1.8.20-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl @@ -804,14 +803,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/d8/7368679b8df6925b8415f9dcc9ab1dab01ddc384d2b2c24aac9191bd9ceb/h5py-3.15.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -845,14 +844,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -870,9 +869,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/ff/37/9c4b58ff11d890d788e700b827db2366f4d11b3313bf136780da7017278b/msgspec-0.20.0-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/f1/25/5e8080fe0117f799b1b68008dc29a65862077296b92550632de015128579/msgspec-0.20.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -883,14 +882,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d6/7d/216a1588b65a7aa5f4535570418a599d943c85afb1d95b0876fc00aa1468/pandas-3.0.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -900,14 +899,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -920,9 +919,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/28/88/2ff917caff61e55f38bcdb27de06ee30597881b2cae44fbba7627be015c4/pywinpty-3.0.3-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -933,10 +932,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/ee/c7/ba86128309ccef3f1a2529fee8df4ab9c86f50c78314266d6b8734c54207/scipp-25.12.0-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/eb/d1/b3cd2733a96a36c54c36889b2cfdd0331c1e5b57fa1757485a22d0ec3142/scipp-25.12.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -947,7 +946,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -969,7 +968,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ py-311-env: @@ -1941,7 +1940,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/93/22/b85eca6fa2ad9491af48c973e4c8cf6b103a73dbb271fe3346949449fca0/yarl-1.23.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ - py-314-env: + py-313-env: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -1977,14 +1976,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-25.7.0-he4ff34a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -1997,7 +1996,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -2005,16 +2004,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/06/90/2cdab0974b9b5bbc1623f7876b73603aecac11b8d95b85b5b86b32de5eab/coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl @@ -2028,14 +2027,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/33/5d/65c619e195e0b5e54ea5a95c1bb600c8ff8715e0d09676e4cce56d89f492/h5py-3.15.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -2069,14 +2068,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -2094,9 +2093,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b8/8e/6b17e43f6eb9369d9858ee32c97959fcd515628a1df376af96c11606cf70/msgspec-0.20.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/83/36557b04cfdc317ed8a525c4993b23e43a8fbcddaddd78619112ca07138c/msgspec-0.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -2107,15 +2106,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f2/85/ab6d04733a7d6ff32bfc8382bf1b07078228f5d6ebec5266b91bfc5c4ff7/pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -2125,7 +2124,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -2133,7 +2132,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -2146,7 +2145,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -2157,10 +2156,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/7b/c8/770b6bc4bea3434349817a942eb4f8128d9dbe1356dedd26847e27ae8e0b/scipp-25.12.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/94/98/aa2d4b9d28969cc7f62409f9f9fc5b5a853af651255eba03e9bee8546dd9/scipp-25.12.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -2171,7 +2170,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -2193,7 +2192,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-64: @@ -2218,14 +2217,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.7.0-hf6efa0e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.3-h4f44bb5_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.12-h894a449_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -2239,7 +2238,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -2247,16 +2246,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/11/a9cf762bb83386467737d32187756a42094927150c3e107df4cb078e8590/coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl @@ -2270,14 +2269,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/2c/926eba1514e4d2e47d0e9eb16c784e717d8b066398ccfca9b283917b1bfb/h5py-3.15.1-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -2311,14 +2310,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -2336,9 +2335,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/bb/18/62dc13ab0260c7d741dda8dc7f481495b93ac9168cd887dda5929880eef8/msgspec-0.20.0-cp314-cp314-macosx_10_15_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8a/d1/b902d38b6e5ba3bdddbec469bba388d647f960aeed7b5b3623a8debe8a76/msgspec-0.20.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -2349,15 +2348,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bb/8b/4bb774a998b97e6c2fd62a9e6cfdaae133b636fd1c468f92afb4ae9a447a/pandas-3.0.1-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -2367,7 +2366,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -2375,7 +2374,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -2388,7 +2387,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -2399,10 +2398,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/cc/bc/e455c908cbd0f969bc2cb6fbe01bceeb4ecc41ea88adcf5953162e4177eb/scipp-25.12.0-cp314-cp314-macosx_11_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e5/22/75e119e0a200914f88f121cd956e1eb7f72c8ace4b63171f52ba0334d142/scipp-25.12.0-cp313-cp313-macosx_11_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -2413,7 +2412,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -2428,14 +2427,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ osx-arm64: @@ -2460,14 +2459,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.7.0-hbfc8e16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -2481,7 +2480,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -2489,16 +2488,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d3/28/56e6d892b7b052236d67c95f1936b6a7cf7c3e2634bf27610b8cbd7f9c60/coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl @@ -2512,14 +2511,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/4b/d715ed454d3baa5f6ae1d30b7eca4c7a1c1084f6a2edead9e801a1541d62/h5py-3.15.1-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -2553,14 +2552,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -2578,9 +2577,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/dd/1d/b9949e4ad6953e9f9a142c7997b2f7390c81e03e93570c7c33caf65d27e1/msgspec-0.20.0-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/57/b6/eff0305961a1d9447ec2b02f8c73c8946f22564d302a504185b730c9a761/msgspec-0.20.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -2591,15 +2590,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a8/14/5990826f779f79148ae9d3a2c39593dc04d61d5d90541e71b5749f35af95/pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -2609,7 +2608,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -2617,7 +2616,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -2630,7 +2629,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -2641,10 +2640,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/a2/85/4134c04e851dba5528dfbeffe1c664e59f59ff273afa066056d919731c51/scipp-25.12.0-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/18/5c/bc0ca94bff65fe0d206a369b54625f8ec7852dfd1d835174692026f34df9/scipp-25.12.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -2655,7 +2654,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -2670,14 +2669,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/1c/59/964ecb8008722d27d8a835baea81f56a91cea8e097b3be992bc6ccde6367/versioningit-3.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/55/896b06bf93a49bec0f4ae2a6f1ed12bd05c8860744ac3a70eda041064e4d/virtualenv-21.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ win-64: @@ -2691,17 +2690,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.7.0-h80d1838_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.12-h09917c8_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl @@ -2714,7 +2712,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -2722,18 +2720,18 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/8e/278ea79cf8ee0c395a5ad74625b3465c2fc234bb277f171dd59dd203820d/bumps-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/9c/22/6d9cfea622a064d17f406bbea1dd37f95ac75094d44e23447df934661add/copier-9.12.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a7/4d/1f8e723f6829977410efeb88f73673d794075091c8c7c18848d273dc9d73/coverage-7.13.4-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e0/d9/1f07395b54413432624d61524dfd98c1a7c7827d2abfdb8829ac92638205/debugpy-1.8.20-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/13/40/e412e277c43983693456d7f11f2bc72ca9209aa1342255bb446496d2fb48/dfo_ls-1.6.2-py3-none-any.whl @@ -2745,14 +2743,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/0b/de6f54d4a8bedfe8645c41497f3c18d749f0bd3218170c667bf4b81d0cdd/filelock-3.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/d8/7368679b8df6925b8415f9dcc9ab1dab01ddc384d2b2c24aac9191bd9ceb/h5py-3.15.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/66/71c1227dff78aaeb942fed29dd5651f2aec166cc7c9aeea3e8b26a539b7d/identify-2.6.17-py2.py3-none-any.whl @@ -2786,14 +2784,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/f0/834e479e47e499b6478e807fb57b31cc2db696c4db30557bb6f5aea4a90b/mando-0.7.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl @@ -2811,9 +2809,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/ff/37/9c4b58ff11d890d788e700b827db2366f4d11b3313bf136780da7017278b/msgspec-0.20.0-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/f1/25/5e8080fe0117f799b1b68008dc29a65862077296b92550632de015128579/msgspec-0.20.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl @@ -2824,14 +2822,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d6/7d/216a1588b65a7aa5f4535570418a599d943c85afb1d95b0876fc00aa1468/pandas-3.0.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl @@ -2841,14 +2839,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl @@ -2861,9 +2859,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/aa/54/0cce26da03a981f949bb8449c9778537f75f5917c172e1d2992ff25cb57d/python_engineio-4.13.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/c7/deb8c5e604404dbf10a3808a858946ca3547692ff6316b698945bb72177e/python_socketio-5.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/28/88/2ff917caff61e55f38bcdb27de06ee30597881b2cae44fbba7627be015c4/pywinpty-3.0.3-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl @@ -2874,10 +2872,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/ee/c7/ba86128309ccef3f1a2529fee8df4ab9c86f50c78314266d6b8734c54207/scipp-25.12.0-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/eb/d1/b3cd2733a96a36c54c36889b2cfdd0331c1e5b57fa1757485a22d0ec3142/scipp-25.12.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -2888,7 +2886,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl @@ -2910,7 +2908,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ packages: @@ -2951,10 +2949,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl name: aiohttp version: 3.13.3 - sha256: 1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64 + sha256: 425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3 requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -2969,10 +2967,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl name: aiohttp version: 3.13.3 - sha256: 9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1 + sha256: 87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9 requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -2987,10 +2985,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/dc/f2/27cdf04c9851712d6c1b99df6821a6623c3c9e55956d4b1e318c337b5a48/aiohttp-3.13.3-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl name: aiohttp version: 3.13.3 - sha256: 642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f + sha256: 693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -3005,10 +3003,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: aiohttp version: 3.13.3 - sha256: 9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984 + sha256: f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0 requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -3023,10 +3021,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl name: aiohttp version: 3.13.3 - sha256: bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1 + sha256: 1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64 requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -3041,10 +3039,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: aiohttp version: 3.13.3 - sha256: c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f + sha256: 9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1 requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -3059,10 +3057,10 @@ packages: - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and extra == 'speedups' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/dc/f2/27cdf04c9851712d6c1b99df6821a6623c3c9e55956d4b1e318c337b5a48/aiohttp-3.13.3-cp311-cp311-win_amd64.whl name: aiohttp version: 3.13.3 - sha256: 6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415 + sha256: 642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f requires_dist: - aiohappyeyeballs>=2.5.0 - aiosignal>=1.4.0 @@ -3234,10 +3232,10 @@ packages: requires_dist: - regex ; extra == 'extras' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl +- pypi: https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl name: backrefs version: '6.2' - sha256: e5f805ae09819caa1aa0623b4a83790e7028604aa2b8c73ba602c4454e665de7 + sha256: 12df81596ab511f783b7d87c043ce26bc5b0288cf3bb03610fe76b8189282b2b requires_dist: - regex ; extra == 'extras' requires_python: '>=3.9' @@ -3419,45 +3417,45 @@ packages: requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl name: cffi version: 2.0.0 - sha256: afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775 + sha256: 19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75 requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl name: cffi version: 2.0.0 - sha256: 2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c + sha256: 45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl name: cffi version: 2.0.0 - sha256: c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13 + sha256: 00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl name: cffi version: 2.0.0 - sha256: fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5 + sha256: 2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: cffi version: 2.0.0 - sha256: 66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5 + sha256: c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl name: cffi version: 2.0.0 - sha256: 203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25 + sha256: 66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5 requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' @@ -3473,35 +3471,35 @@ packages: version: 3.5.0 sha256: a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl +- pypi: https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl name: charset-normalizer version: 3.4.4 - sha256: da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd + sha256: 5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: charset-normalizer version: 3.4.4 - sha256: 8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c + sha256: 840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl name: charset-normalizer version: 3.4.4 - sha256: 5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016 + sha256: e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl name: charset-normalizer version: 3.4.4 - sha256: ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838 + sha256: b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl name: charset-normalizer version: 3.4.4 - sha256: 840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381 + sha256: 6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl +- pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: charset-normalizer version: 3.4.4 - sha256: 6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8 + sha256: a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894 requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl name: click @@ -3527,10 +3525,10 @@ packages: requires_dist: - pytest ; extra == 'test' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl name: contourpy version: 1.3.3 - sha256: f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3 + sha256: 23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381 requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3552,10 +3550,10 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl name: contourpy version: 1.3.3 - sha256: 23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381 + sha256: 1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263 requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3577,10 +3575,10 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: contourpy version: 1.3.3 - sha256: 51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db + sha256: 4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9 requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3602,10 +3600,10 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: contourpy version: 1.3.3 - sha256: fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a + sha256: 51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3627,10 +3625,10 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl name: contourpy version: 1.3.3 - sha256: cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd + sha256: 177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5 requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3677,10 +3675,10 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl name: contourpy version: 1.3.3 - sha256: 3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42 + sha256: d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1 requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3702,10 +3700,10 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl name: contourpy version: 1.3.3 - sha256: cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77 + sha256: 3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42 requires_dist: - numpy>=1.25 - furo ; extra == 'docs' @@ -3747,52 +3745,52 @@ packages: - questionary>=1.8.1 - typing-extensions>=4.0.0,<5.0.0 ; python_full_version < '3.11' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/06/90/2cdab0974b9b5bbc1623f7876b73603aecac11b8d95b85b5b86b32de5eab/coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl name: coverage version: 7.13.4 - sha256: 0dd7ab8278f0d58a0128ba2fca25824321f05d059c1441800e934ff2efa52129 + sha256: 2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl name: coverage version: 7.13.4 - sha256: 2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f + sha256: 8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7 requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl name: coverage version: 7.13.4 - sha256: 8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7 + sha256: 3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/92/11/a9cf762bb83386467737d32187756a42094927150c3e107df4cb078e8590/coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl name: coverage version: 7.13.4 - sha256: 300deaee342f90696ed186e3a00c71b5b3d27bffe9e827677954f4ee56969601 + sha256: d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053 requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/a7/4d/1f8e723f6829977410efeb88f73673d794075091c8c7c18848d273dc9d73/coverage-7.13.4-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl name: coverage version: 7.13.4 - sha256: 245e37f664d89861cf2329c9afa2c1fe9e6d4e1a09d872c947e70718aeeac505 + sha256: b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9 requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl name: coverage version: 7.13.4 - sha256: d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053 + sha256: e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/d3/28/56e6d892b7b052236d67c95f1936b6a7cf7c3e2634bf27610b8cbd7f9c60/coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl name: coverage version: 7.13.4 - sha256: 29e3220258d682b6226a9b0925bc563ed9a1ebcff3cad30f043eceea7eaf2689 + sha256: b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b requires_dist: - tomli ; python_full_version <= '3.11' and extra == 'toml' requires_python: '>=3.10' @@ -3816,6 +3814,11 @@ packages: - pytest-cov ; extra == 'tests' - pytest-xdist ; extra == 'tests' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl + name: debugpy + version: 1.8.20 + sha256: eb506e45943cab2efb7c6eafdd65b842f3ae779f020c82221f55aca9de135ed7 + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl name: debugpy version: 1.8.20 @@ -3826,11 +3829,6 @@ packages: version: 1.8.20 sha256: 5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7 requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/e0/d9/1f07395b54413432624d61524dfd98c1a7c7827d2abfdb8829ac92638205/debugpy-1.8.20-cp314-cp314-win_amd64.whl - name: debugpy - version: 1.8.20 - sha256: a98eec61135465b062846112e5ecf2eebb855305acc1dfbae43b72903b8ab5be - requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl name: decorator version: 5.2.1 @@ -3886,8 +3884,8 @@ packages: requires_python: '>=3.5' - pypi: ./ name: easyscience - version: 1.0.1+devdirty79 - sha256: dc5d3052b21f2409cf5d87492ea0c2806501667b6cfb2310580abb4dd4b19422 + version: 1.0.1+devdirty71 + sha256: 2ed61ffb6a26d4f98b06cfe854ba4794ef34e3a129c2975d248f123129af7ed2 requires_dist: - asteval - bumps @@ -4007,10 +4005,10 @@ packages: - skia-pathops>=0.5.0 ; extra == 'all' - uharfbuzz>=0.45.0 ; extra == 'all' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl +- pypi: https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl name: fonttools version: 4.61.1 - sha256: fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd + sha256: 21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b requires_dist: - lxml>=4.0 ; extra == 'lxml' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -4041,10 +4039,10 @@ packages: - skia-pathops>=0.5.0 ; extra == 'all' - uharfbuzz>=0.45.0 ; extra == 'all' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl name: fonttools version: 4.61.1 - sha256: 4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c + sha256: 8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c requires_dist: - lxml>=4.0 ; extra == 'lxml' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -4075,10 +4073,10 @@ packages: - skia-pathops>=0.5.0 ; extra == 'all' - uharfbuzz>=0.45.0 ; extra == 'all' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl +- pypi: https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl name: fonttools version: 4.61.1 - sha256: c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09 + sha256: dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e requires_dist: - lxml>=4.0 ; extra == 'lxml' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -4109,10 +4107,10 @@ packages: - skia-pathops>=0.5.0 ; extra == 'all' - uharfbuzz>=0.45.0 ; extra == 'all' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl name: fonttools version: 4.61.1 - sha256: d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e + sha256: c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09 requires_dist: - lxml>=4.0 ; extra == 'lxml' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -4177,10 +4175,10 @@ packages: - skia-pathops>=0.5.0 ; extra == 'all' - uharfbuzz>=0.45.0 ; extra == 'all' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl name: fonttools version: 4.61.1 - sha256: fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c + sha256: 64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5 requires_dist: - lxml>=4.0 ; extra == 'lxml' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -4257,35 +4255,35 @@ packages: version: 1.8.0 sha256: ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl + name: frozenlist + version: 1.8.0 + sha256: f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40 + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl name: frozenlist version: 1.8.0 sha256: 2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl name: frozenlist version: 1.8.0 - sha256: 3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0 + sha256: 96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7 requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl name: frozenlist version: 1.8.0 sha256: fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl - name: frozenlist - version: 1.8.0 - sha256: 119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl name: frozenlist version: 1.8.0 - sha256: 4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c + sha256: fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl name: frozenlist version: 1.8.0 - sha256: cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2 + sha256: 878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231 requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl name: frozenlist @@ -4327,10 +4325,10 @@ packages: requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/33/5d/65c619e195e0b5e54ea5a95c1bb600c8ff8715e0d09676e4cce56d89f492/h5py-3.15.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl name: h5py version: 3.15.1 - sha256: 28a20e1a4082a479b3d7db2169f3a5034af010b90842e75ebbf2e9e49eb4183e + sha256: ab2219dbc6fcdb6932f76b548e2b16f34a1f52b7666e998157a4dfc02e2c4123 requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' @@ -4341,10 +4339,10 @@ packages: requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/65/4b/d715ed454d3baa5f6ae1d30b7eca4c7a1c1084f6a2edead9e801a1541d62/h5py-3.15.1-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl name: h5py version: 3.15.1 - sha256: 954e480433e82d3872503104f9b285d369048c3a788b2b1a00e53d1c47c98dd2 + sha256: c8440fd8bee9500c235ecb7aa1917a0389a2adb80c209fa1cc485bd70e0d94a5 requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' @@ -4355,24 +4353,24 @@ packages: requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/a0/2c/926eba1514e4d2e47d0e9eb16c784e717d8b066398ccfca9b283917b1bfb/h5py-3.15.1-cp314-cp314-macosx_10_15_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/c1/b0/1c628e26a0b95858f54aba17e1599e7f6cd241727596cc2580b72cb0a9bf/h5py-3.15.1-cp311-cp311-macosx_11_0_arm64.whl name: h5py version: 3.15.1 - sha256: 5f4fb0567eb8517c3ecd6b3c02c4f4e9da220c8932604960fd04e24ee1254763 + sha256: c970fb80001fffabb0109eaf95116c8e7c0d3ca2de854e0901e8a04c1f098509 requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/b6/d8/7368679b8df6925b8415f9dcc9ab1dab01ddc384d2b2c24aac9191bd9ceb/h5py-3.15.1-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: h5py version: 3.15.1 - sha256: 9c73d1d7cdb97d5b17ae385153472ce118bed607e43be11e9a9deefaa54e0734 + sha256: 121b2b7a4c1915d63737483b7bff14ef253020f617c2fb2811f67a4bed9ac5e8 requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/c1/b0/1c628e26a0b95858f54aba17e1599e7f6cd241727596cc2580b72cb0a9bf/h5py-3.15.1-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl name: h5py version: 3.15.1 - sha256: c970fb80001fffabb0109eaf95116c8e7c0d3ca2de854e0901e8a04c1f098509 + sha256: dea78b092fd80a083563ed79a3171258d4a4d307492e7cf8b2313d464c82ba52 requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' @@ -5120,10 +5118,10 @@ packages: - pytest-xdist ; extra == 'test-integration' - bash-kernel ; extra == 'test-ui' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl name: kiwisolver version: 1.4.9 - sha256: 0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7 + sha256: 1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl name: kiwisolver @@ -5135,30 +5133,30 @@ packages: version: 1.4.9 sha256: be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: kiwisolver version: 1.4.9 - sha256: 767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58 + sha256: dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl name: kiwisolver version: 1.4.9 - sha256: dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61 + sha256: dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl name: kiwisolver version: 1.4.9 sha256: 39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl name: kiwisolver version: 1.4.9 - sha256: d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552 + sha256: efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: kiwisolver version: 1.4.9 - sha256: 2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3 + sha256: b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098 requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl name: lark @@ -5900,50 +5898,50 @@ packages: - pytest-regressions ; extra == 'testing' - requests ; extra == 'testing' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl name: markupsafe version: 3.0.3 - sha256: 1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad + sha256: 9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl name: markupsafe version: 3.0.3 - sha256: bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581 + sha256: 1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: markupsafe version: 3.0.3 sha256: 0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl name: markupsafe version: 3.0.3 - sha256: eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe + sha256: e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl name: markupsafe version: 3.0.3 - sha256: 457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97 + sha256: de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl name: markupsafe version: 3.0.3 - sha256: de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01 + sha256: 116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: markupsafe version: 3.0.3 - sha256: c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026 + sha256: ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl name: markupsafe version: 3.0.3 sha256: 4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl name: matplotlib version: 3.10.8 - sha256: b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f + sha256: 3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -5959,10 +5957,10 @@ packages: - setuptools-scm>=7 ; extra == 'dev' - setuptools>=64 ; extra == 'dev' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl name: matplotlib version: 3.10.8 - sha256: 32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b + sha256: e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -5997,10 +5995,10 @@ packages: - setuptools-scm>=7 ; extra == 'dev' - setuptools>=64 ; extra == 'dev' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: matplotlib version: 3.10.8 - sha256: efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4 + sha256: a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -6016,10 +6014,10 @@ packages: - setuptools-scm>=7 ; extra == 'dev' - setuptools>=64 ; extra == 'dev' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl name: matplotlib version: 3.10.8 - sha256: 83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11 + sha256: 56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -6035,10 +6033,10 @@ packages: - setuptools-scm>=7 ; extra == 'dev' - setuptools>=64 ; extra == 'dev' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: matplotlib version: 3.10.8 - sha256: 2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008 + sha256: efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -6299,16 +6297,6 @@ packages: requires_dist: - jinja2 - matplotlib -- pypi: https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl - name: msgpack - version: 1.1.2 - sha256: 6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl - name: msgpack - version: 1.1.2 - sha256: e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00 - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl name: msgpack version: 1.1.2 @@ -6319,21 +6307,31 @@ packages: version: 1.1.2 sha256: 2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: msgpack version: 1.1.2 - sha256: 180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931 + sha256: fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl name: msgpack version: 1.1.2 - sha256: 9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b + sha256: 4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl + name: msgpack + version: 1.1.2 + sha256: a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9 requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl name: msgpack version: 1.1.2 sha256: 283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0 requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl + name: msgpack + version: 1.1.2 + sha256: 42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7 + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: msgpack version: 1.1.2 @@ -6348,64 +6346,64 @@ packages: - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/5a/15/3c225610da9f02505d37d69a77f4a2e7daae2a125f99d638df211ba84e59/msgspec-0.20.0-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/28/83/36557b04cfdc317ed8a525c4993b23e43a8fbcddaddd78619112ca07138c/msgspec-0.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: msgspec version: 0.20.0 - sha256: 23ee3787142e48f5ee746b2909ce1b76e2949fbe0f97f9f6e70879f06c218b54 + sha256: 7fac7e9c92eddcd24c19d9e5f6249760941485dff97802461ae7c995a2450111 requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/6b/96/5c095b940de3aa6b43a71ec76275ac3537b21bd45c7499b5a17a429110fa/msgspec-0.20.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/57/b6/eff0305961a1d9447ec2b02f8c73c8946f22564d302a504185b730c9a761/msgspec-0.20.0-cp313-cp313-macosx_11_0_arm64.whl name: msgspec version: 0.20.0 - sha256: bb4d873f24ae18cd1334f4e37a178ed46c9d186437733351267e0a269bdf7e53 + sha256: f6532369ece217fd37c5ebcfd7e981f2615628c21121b7b2df9d3adcf2fd69b8 requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/89/5e/406b7d578926b68790e390d83a1165a9bfc2d95612a1a9c1c4d5c72ea815/msgspec-0.20.0-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/5a/15/3c225610da9f02505d37d69a77f4a2e7daae2a125f99d638df211ba84e59/msgspec-0.20.0-cp311-cp311-macosx_11_0_arm64.whl name: msgspec version: 0.20.0 - sha256: d1dcc93a3ce3d3195985bfff18a48274d0b5ffbc96fa1c5b89da6f0d9af81b29 + sha256: 23ee3787142e48f5ee746b2909ce1b76e2949fbe0f97f9f6e70879f06c218b54 requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/b8/8e/6b17e43f6eb9369d9858ee32c97959fcd515628a1df376af96c11606cf70/msgspec-0.20.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/6b/96/5c095b940de3aa6b43a71ec76275ac3537b21bd45c7499b5a17a429110fa/msgspec-0.20.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: msgspec version: 0.20.0 - sha256: 27d35044dd8818ac1bd0fedb2feb4fbdff4e3508dd7c5d14316a12a2d96a0de0 + sha256: bb4d873f24ae18cd1334f4e37a178ed46c9d186437733351267e0a269bdf7e53 requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/bb/18/62dc13ab0260c7d741dda8dc7f481495b93ac9168cd887dda5929880eef8/msgspec-0.20.0-cp314-cp314-macosx_10_15_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/89/5e/406b7d578926b68790e390d83a1165a9bfc2d95612a1a9c1c4d5c72ea815/msgspec-0.20.0-cp311-cp311-win_amd64.whl name: msgspec version: 0.20.0 - sha256: eead16538db1b3f7ec6e3ed1f6f7c5dec67e90f76e76b610e1ffb5671815633a + sha256: d1dcc93a3ce3d3195985bfff18a48274d0b5ffbc96fa1c5b89da6f0d9af81b29 requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/dd/1d/b9949e4ad6953e9f9a142c7997b2f7390c81e03e93570c7c33caf65d27e1/msgspec-0.20.0-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/8a/d1/b902d38b6e5ba3bdddbec469bba388d647f960aeed7b5b3623a8debe8a76/msgspec-0.20.0-cp313-cp313-macosx_10_13_x86_64.whl name: msgspec version: 0.20.0 - sha256: 703c3bb47bf47801627fb1438f106adbfa2998fe586696d1324586a375fca238 + sha256: 9c1ff8db03be7598b50dd4b4a478d6fe93faae3bd54f4f17aa004d0e46c14c46 requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/ff/37/9c4b58ff11d890d788e700b827db2366f4d11b3313bf136780da7017278b/msgspec-0.20.0-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/f1/25/5e8080fe0117f799b1b68008dc29a65862077296b92550632de015128579/msgspec-0.20.0-cp313-cp313-win_amd64.whl name: msgspec version: 0.20.0 - sha256: 7dfebc94fe7d3feec6bc6c9df4f7e9eccc1160bb5b811fbf3e3a56899e398a6b + sha256: 67d5e4dfad52832017018d30a462604c80561aa62a9d548fc2bd4e430b66a352 requires_dist: - tomli ; python_full_version < '3.11' and extra == 'toml' - tomli-w ; extra == 'toml' @@ -6418,52 +6416,52 @@ packages: requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl name: multidict version: 6.7.1 - sha256: 844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e + sha256: 935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445 requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl name: multidict version: 6.7.1 - sha256: bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b + sha256: 844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: multidict version: 6.7.1 - sha256: a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2 + sha256: 9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429 requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl name: multidict version: 6.7.1 - sha256: f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855 + sha256: 960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5 requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl name: multidict version: 6.7.1 - sha256: 5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f + sha256: 84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2 requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl name: multidict version: 6.7.1 - sha256: 0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1 + sha256: bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl name: multidict version: 6.7.1 - sha256: 7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709 + sha256: f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855 requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' @@ -6764,30 +6762,25 @@ packages: - pytest-jupyter ; extra == 'test' - pytest-tornasync ; extra == 'test' requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: numpy version: 2.4.2 - sha256: 068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75 + sha256: d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499 requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl name: numpy version: 2.4.2 - sha256: 444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b + sha256: bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979 requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: numpy version: 2.4.2 sha256: c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32 requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl name: numpy version: 2.4.2 - sha256: d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000 - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - name: numpy - version: 2.4.2 - sha256: bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325 + sha256: 7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622 requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl name: numpy @@ -6799,6 +6792,11 @@ packages: version: 2.4.2 sha256: b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695 requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl + name: numpy + version: 2.4.2 + sha256: 25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl name: numpy version: 2.4.2 @@ -6871,10 +6869,10 @@ packages: - pytest ; extra == 'dev' - tox ; extra == 'dev' - black ; extra == 'lint' -- pypi: https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl name: pandas version: 3.0.1 - sha256: 93325b0fe372d192965f4cca88d97667f49557398bbf94abdda3bf1b591dbe66 + sha256: 5272627187b5d9c20e55d27caf5f2cd23e286aba25cadf73c8590e432e2b7262 requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -7141,10 +7139,10 @@ packages: - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.23.0 ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/a8/14/5990826f779f79148ae9d3a2c39593dc04d61d5d90541e71b5749f35af95/pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl name: pandas version: 3.0.1 - sha256: c1a9f55e0f46951874b863d1f3906dcb57df2d9be5c5847ba4dfb55b2c815249 + sha256: 661e0f665932af88c7877f31da0dc743fe9c8f2524bdffe23d24fdcb67ef9d56 requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -7231,10 +7229,10 @@ packages: - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.23.0 ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl name: pandas version: 3.0.1 - sha256: 3b66857e983208654294bb6477b8a63dee26b37bdd0eb34d010556e91261784f + sha256: 24ba315ba3d6e5806063ac6eb717504e499ce30bd8c236d8693a5fd3f084c796 requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -7321,10 +7319,10 @@ packages: - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.23.0 ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/bb/8b/4bb774a998b97e6c2fd62a9e6cfdaae133b636fd1c468f92afb4ae9a447a/pandas-3.0.1-cp314-cp314-macosx_10_15_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/d6/7d/216a1588b65a7aa5f4535570418a599d943c85afb1d95b0876fc00aa1468/pandas-3.0.1-cp313-cp313-win_amd64.whl name: pandas version: 3.0.1 - sha256: 99d0f92ed92d3083d140bf6b97774f9f13863924cf3f52a70711f4e7588f9d0a + sha256: 9fea306c783e28884c29057a1d9baa11a349bbf99538ec1da44c8476563d1b25 requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -7411,10 +7409,10 @@ packages: - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.23.0 ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/f2/85/ab6d04733a7d6ff32bfc8382bf1b07078228f5d6ebec5266b91bfc5c4ff7/pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl name: pandas version: 3.0.1 - sha256: 24ba315ba3d6e5806063ac6eb717504e499ce30bd8c236d8693a5fd3f084c796 + sha256: 1ff8cf1d2896e34343197685f432450ec99a85ba8d90cce2030c5eee2ef98791 requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -7624,10 +7622,10 @@ packages: sha256: 7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 requires_dist: - ptyprocess>=0.5 -- pypi: https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl name: pillow version: 12.1.1 - sha256: f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202 + sha256: 6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -7720,10 +7718,10 @@ packages: - trove-classifiers>=2024.10.12 ; extra == 'tests' - defusedxml ; extra == 'xmp' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl name: pillow version: 12.1.1 - sha256: 50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15 + sha256: 344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -7752,10 +7750,10 @@ packages: - trove-classifiers>=2024.10.12 ; extra == 'tests' - defusedxml ; extra == 'xmp' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: pillow version: 12.1.1 - sha256: 2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd + sha256: 47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -7848,10 +7846,10 @@ packages: - trove-classifiers>=2024.10.12 ; extra == 'tests' - defusedxml ; extra == 'xmp' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl name: pillow version: 12.1.1 - sha256: a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e + sha256: 8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -7997,30 +7995,20 @@ packages: requires_dist: - wcwidth requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl - name: propcache - version: 0.4.1 - sha256: 5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153 - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: propcache version: 0.4.1 sha256: fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl - name: propcache - version: 0.4.1 - sha256: c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl name: propcache version: 0.4.1 - sha256: 8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d + sha256: cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl name: propcache version: 0.4.1 - sha256: 9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded + sha256: d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311 requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl name: propcache @@ -8032,11 +8020,21 @@ packages: version: 0.4.1 sha256: 6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: propcache + version: 0.4.1 + sha256: d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl name: propcache version: 0.4.1 sha256: 364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6 requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl + name: propcache + version: 0.4.1 + sha256: 381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl name: psutil version: 7.2.2 @@ -8264,24 +8262,24 @@ packages: requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl name: pydantic-core version: 2.41.5 - sha256: 8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf + sha256: 941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9 requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl name: pydantic-core version: 2.41.5 - sha256: 22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375 + sha256: 112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34 requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl name: pydantic-core version: 2.41.5 - sha256: 1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14 + sha256: 79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11 requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' @@ -8292,17 +8290,17 @@ packages: requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: pydantic-core version: 2.41.5 - sha256: a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6 + sha256: 406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586 requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl name: pydantic-core version: 2.41.5 - sha256: 3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a + sha256: a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6 requires_dist: - typing-extensions>=4.14.1 requires_python: '>=3.9' @@ -8406,10 +8404,10 @@ packages: purls: [] size: 30905206 timestamp: 1769472446175 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda - build_number: 101 - sha256: cb0628c5f1732f889f53a877484da98f5a0e0f47326622671396fb4f2b0cd6bd - md5: c014ad06e60441661737121d3eae8a60 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda + build_number: 100 + sha256: 8a08fe5b7cb5a28aa44e2994d18dbf77f443956990753a4ca8173153ffb6eb56 + md5: 4c875ed0e78c2d407ec55eadffb8cf3d depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -8424,16 +8422,15 @@ packages: - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.5,<4.0a0 - - python_abi 3.14.* *_cp314 + - python_abi 3.13.* *_cp313 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 purls: [] - size: 36702440 - timestamp: 1770675584356 - python_site_packages_path: lib/python3.14/site-packages + size: 37364553 + timestamp: 1770272309861 + python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.14-h74c2667_3_cpython.conda build_number: 3 sha256: 327d6c5eb61657d4b76e1024da9c790d3e7aacee84487403e9eef1b730982e63 @@ -8457,10 +8454,10 @@ packages: purls: [] size: 15666344 timestamp: 1769473006716 -- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.3-h4f44bb5_101_cp314.conda - build_number: 101 - sha256: f64e357aa0168a201c9b3eedf500d89a8550d6631d26a95590b12de61f8fd660 - md5: 030ec23658b941438ac42303aff0db2b +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.12-h894a449_100_cp313.conda + build_number: 100 + sha256: 9548dcf58cf6045aa4aa1f2f3fa6110115ca616a8d5fa142a24081d2b9d91291 + md5: 99b1fa1fe8a8ab58224969f4568aadca depends: - __osx >=10.13 - bzip2 >=1.0.8,<2.0a0 @@ -8472,16 +8469,15 @@ packages: - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.5,<4.0a0 - - python_abi 3.14.* *_cp314 + - python_abi 3.13.* *_cp313 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 purls: [] - size: 14387288 - timestamp: 1770676578632 - python_site_packages_path: lib/python3.14/site-packages + size: 17570178 + timestamp: 1770272361922 + python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.14-h18782d2_3_cpython.conda build_number: 3 sha256: f862d544a455bedfa5d77305f0a42c8e3392956e364f8f92d6ca1c844fb3fbd1 @@ -8505,10 +8501,10 @@ packages: purls: [] size: 13707418 timestamp: 1769472290774 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda - build_number: 101 - sha256: fccce2af62d11328d232df9f6bbf63464fd45f81f718c661757f9c628c4378ce - md5: 753c8d0447677acb7ddbcc6e03e82661 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda + build_number: 100 + sha256: 9a4f16a64def0853f0a7b6a7beb40d498fd6b09bee10b90c3d6069b664156817 + md5: 179c0f5ae4f22bc3be567298ed0b17b9 depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 @@ -8520,16 +8516,15 @@ packages: - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.5,<4.0a0 - - python_abi 3.14.* *_cp314 + - python_abi 3.13.* *_cp313 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 purls: [] - size: 13522698 - timestamp: 1770675365241 - python_site_packages_path: lib/python3.14/site-packages + size: 12770674 + timestamp: 1770272314517 + python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.14-h0159041_3_cpython.conda build_number: 3 sha256: 5676dadd9d4fba1bce51bd7e5cf8fcf76f85b88b7baa15bd10ca00557e67f10e @@ -8553,10 +8548,10 @@ packages: purls: [] size: 18353938 timestamp: 1769471078924 -- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda - build_number: 101 - sha256: 3f99d83bfd95b9bdae64a42a1e4bf5131dc20b724be5ac8a9a7e1ac2c0f006d7 - md5: 7ec2be7eaf59f83f3e5617665f3fbb2e +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.12-h09917c8_100_cp313.conda + build_number: 100 + sha256: da70aec20ff5a5ae18bbba9fdd1e18190b419605cafaafb3bdad8becf11ce94d + md5: 4440c24966d0aa0c8f1e1d5006dac2d6 depends: - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.7.3,<3.0a0 @@ -8566,17 +8561,16 @@ packages: - libsqlite >=3.51.2,<4.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.5,<4.0a0 - - python_abi 3.14.* *_cp314 + - python_abi 3.13.* *_cp313 - tk >=8.6.13,<8.7.0a0 - tzdata - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 purls: [] - size: 18273230 - timestamp: 1770675442998 + size: 16535316 + timestamp: 1770270322707 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 @@ -8655,45 +8649,40 @@ packages: - sphinx ; extra == 'docs' - furo ; extra == 'docs' requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda build_number: 8 - sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 - md5: 0539938c55b6b1a59b560e843ad864a4 + sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 + md5: 94305520c52a4aa3f6c2b1ff6008d9f8 constrains: - - python 3.14.* *_cp314 + - python 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD purls: [] - size: 6989 - timestamp: 1752805904792 + size: 7002 + timestamp: 1752805902938 - pypi: https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl name: pywin32 version: '311' sha256: 3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503 -- pypi: https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl name: pywin32 version: '311' - sha256: 3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87 -- pypi: https://files.pythonhosted.org/packages/28/88/2ff917caff61e55f38bcdb27de06ee30597881b2cae44fbba7627be015c4/pywinpty-3.0.3-cp314-cp314-win_amd64.whl + sha256: 718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d +- pypi: https://files.pythonhosted.org/packages/79/c3/3e75075c7f71735f22b66fab0481f2c98e3a4d58cba55cb50ba29114bcf6/pywinpty-3.0.3-cp311-cp311-win_amd64.whl name: pywinpty version: 3.0.3 - sha256: d4b6b7b0fe0cdcd02e956bd57cfe9f4e5a06514eecf3b5ae174da4f951b58be9 + sha256: dff25a9a6435f527d7c65608a7e62783fc12076e7d44487a4911ee91be5a8ac8 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/79/c3/3e75075c7f71735f22b66fab0481f2c98e3a4d58cba55cb50ba29114bcf6/pywinpty-3.0.3-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl name: pywinpty version: 3.0.3 - sha256: dff25a9a6435f527d7c65608a7e62783fc12076e7d44487a4911ee91be5a8ac8 + sha256: 9c91dbb026050c77bdcef964e63a4f10f01a639113c4d3658332614544c467ab requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl name: pyyaml version: 6.0.3 sha256: 652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl - name: pyyaml - version: 6.0.3 - sha256: 4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac - requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl name: pyyaml version: 6.0.3 @@ -8704,20 +8693,25 @@ packages: version: 6.0.3 sha256: b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: pyyaml + version: 6.0.3 + sha256: 0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl name: pyyaml version: 6.0.3 - sha256: c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 + sha256: 79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl name: pyyaml version: 6.0.3 - sha256: 8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac + sha256: 2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl name: pyyaml version: 6.0.3 - sha256: 34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 + sha256: 8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl name: pyyaml @@ -8874,35 +8868,30 @@ packages: - lark>=1.2.2 - pytest>=8.3.5 ; extra == 'testing' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl - name: rpds-py - version: 0.30.0 - sha256: ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl name: rpds-py version: 0.30.0 - sha256: 95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950 + sha256: a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl name: rpds-py version: 0.30.0 - sha256: a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425 + sha256: dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: rpds-py version: 0.30.0 - sha256: 68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0 + sha256: 9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl name: rpds-py version: 0.30.0 - sha256: dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d + sha256: f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl name: rpds-py version: 0.30.0 - sha256: 47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad + sha256: 806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15 requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: rpds-py @@ -8914,6 +8903,11 @@ packages: version: 0.30.0 sha256: a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825 requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl + name: rpds-py + version: 0.30.0 + sha256: e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl name: ruff version: 0.15.4 @@ -8960,10 +8954,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/4e/b6/ffe0bb67cec66cd450acff599bb07507bbf5ffda1a3a15dd2d8dbe7a6da7/scipp-25.12.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/18/5c/bc0ca94bff65fe0d206a369b54625f8ec7852dfd1d835174692026f34df9/scipp-25.12.0-cp313-cp313-macosx_11_0_arm64.whl name: scipp version: 25.12.0 - sha256: 9ec0200eeb660965056b27f5f05505a961d8921b78d0a92c04743d1c22ce7203 + sha256: 0285c91b202dea9aeb18f29d73ff135208a19b2068cd30e17ee81fc435b1943c requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -8986,10 +8980,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/6a/3a/ab0eb61593569d5a0d080002e4b8c0998cb1116d8710781b7225c304b880/scipp-25.12.0-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/4e/b6/ffe0bb67cec66cd450acff599bb07507bbf5ffda1a3a15dd2d8dbe7a6da7/scipp-25.12.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scipp version: 25.12.0 - sha256: e27082f5bd3655f15479ce87be495235b9bcd9b5db654a7219261be0c6117b31 + sha256: 9ec0200eeb660965056b27f5f05505a961d8921b78d0a92c04743d1c22ce7203 requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -9012,10 +9006,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/7b/c8/770b6bc4bea3434349817a942eb4f8128d9dbe1356dedd26847e27ae8e0b/scipp-25.12.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/6a/3a/ab0eb61593569d5a0d080002e4b8c0998cb1116d8710781b7225c304b880/scipp-25.12.0-cp311-cp311-macosx_11_0_arm64.whl name: scipp version: 25.12.0 - sha256: a647a5b82d054a9210d0c4208194b7272cce2721a2fcfea81d1b94362bd5b932 + sha256: e27082f5bd3655f15479ce87be495235b9bcd9b5db654a7219261be0c6117b31 requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -9038,10 +9032,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/a2/85/4134c04e851dba5528dfbeffe1c664e59f59ff273afa066056d919731c51/scipp-25.12.0-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/94/98/aa2d4b9d28969cc7f62409f9f9fc5b5a853af651255eba03e9bee8546dd9/scipp-25.12.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scipp version: 25.12.0 - sha256: b07e85835ee733e020a6e3692538d235ece81b4a1b96915141084b82844c4aaf + sha256: e5694bef45299c4813ee2fe863fab600c3b0f5e13e2735072dbbb5cf1804d0e0 requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -9090,10 +9084,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/cc/bc/e455c908cbd0f969bc2cb6fbe01bceeb4ecc41ea88adcf5953162e4177eb/scipp-25.12.0-cp314-cp314-macosx_11_0_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/e5/22/75e119e0a200914f88f121cd956e1eb7f72c8ace4b63171f52ba0334d142/scipp-25.12.0-cp313-cp313-macosx_11_0_x86_64.whl name: scipp version: 25.12.0 - sha256: 0c7881b464b12dda1285c92d3f7ea2a1d4b5c150742b7afcb4758f6ccceb6ee2 + sha256: 27ebc37f3b7e20c9dca9cf1a0ac53c4ffaea31c02dfc8ba2b5aa008a252cbcba requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -9116,10 +9110,10 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/ee/c7/ba86128309ccef3f1a2529fee8df4ab9c86f50c78314266d6b8734c54207/scipp-25.12.0-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/eb/d1/b3cd2733a96a36c54c36889b2cfdd0331c1e5b57fa1757485a22d0ec3142/scipp-25.12.0-cp313-cp313-win_amd64.whl name: scipp version: 25.12.0 - sha256: 61d6f671cc372f5eb93e9a9bc8a54e566ebd445b00c42326fb76cc8898b47629 + sha256: 015db5035749750cf026db56fe537af10f159dc3cd0f51f0ea9f4ecc3a7a5da8 requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -9186,10 +9180,10 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl name: scipy version: 1.17.1 - sha256: eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118 + sha256: 37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448 requires_dist: - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' @@ -9230,10 +9224,10 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl name: scipy version: 1.17.1 - sha256: 3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19 + sha256: 5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c requires_dist: - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' @@ -9318,10 +9312,10 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl name: scipy version: 1.17.1 - sha256: a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717 + sha256: 1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec requires_dist: - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' @@ -9362,10 +9356,10 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl name: scipy version: 1.17.1 - sha256: 1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec + sha256: 6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f requires_dist: - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' @@ -9406,10 +9400,10 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scipy version: 1.17.1 - sha256: 45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9 + sha256: 581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464 requires_dist: - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' @@ -9688,40 +9682,40 @@ packages: version: 2.4.0 sha256: d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl name: tomli version: 2.4.0 - sha256: a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d + sha256: 9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl name: tomli version: 2.4.0 - sha256: b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867 + sha256: 84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0 requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl name: tomli version: 2.4.0 - sha256: 5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9 + sha256: 3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87 requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl name: tomli version: 2.4.0 - sha256: 43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475 + sha256: b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867 requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl name: tomli version: 2.4.0 - sha256: 20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc + sha256: 5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9 requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: tomli version: 2.4.0 - sha256: 5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76 + sha256: 1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: tomli version: 2.4.0 - sha256: 26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6 + sha256: 5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76 requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: tornado @@ -9939,6 +9933,13 @@ packages: requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl + name: watchdog + version: 6.0.0 + sha256: 76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134 + requires_dist: + - pyyaml>=3.10 ; extra == 'watchmedo' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl name: watchdog version: 6.0.0 @@ -9953,17 +9954,17 @@ packages: requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz +- pypi: https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl name: watchdog version: 6.0.0 - sha256: 9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282 + sha256: cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680 requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl name: watchdog version: 6.0.0 - sha256: cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680 + sha256: a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' @@ -10015,28 +10016,28 @@ packages: - multidict>=4.0 - propcache>=0.2.1 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: yarl version: 1.23.0 - sha256: 23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719 + sha256: 34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4 requires_dist: - idna>=2.0 - multidict>=4.0 - propcache>=0.2.1 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl name: yarl version: 1.23.0 - sha256: 85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474 + sha256: 4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5 requires_dist: - idna>=2.0 - multidict>=4.0 - propcache>=0.2.1 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl name: yarl version: 1.23.0 - sha256: 1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52 + sha256: baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3 requires_dist: - idna>=2.0 - multidict>=4.0 @@ -10060,10 +10061,10 @@ packages: - multidict>=4.0 - propcache>=0.2.1 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl name: yarl version: 1.23.0 - sha256: 63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70 + sha256: 7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b requires_dist: - idna>=2.0 - multidict>=4.0 @@ -10135,16 +10136,3 @@ packages: purls: [] size: 433413 timestamp: 1764777166076 -- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - sha256: 368d8628424966fd8f9c8018326a9c779e06913dd39e646cf331226acc90e5b2 - md5: 053b84beec00b71ea8ff7a4f84b55207 - depends: - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - ucrt >=10.0.20348.0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 388453 - timestamp: 1764777142545 diff --git a/pixi.toml b/pixi.toml index aae6407b..24c0854c 100644 --- a/pixi.toml +++ b/pixi.toml @@ -53,7 +53,7 @@ easyscience = { path = ".", editable = true, extras = ['dev'] } [feature.py-min.dependencies] python = '3.11.*' [feature.py-max.dependencies] -python = '3.14.*' +python = '3.13.*' ############## # ENVIRONMENTS @@ -64,7 +64,7 @@ python = '3.14.*' # The `default` feature is always included in all environments. # Additional features can be specified per environment. py-311-env = { features = ['default', 'py-min'] } -py-314-env = { features = ['default', 'py-max'] } +py-313-env = { features = ['default', 'py-max'] } # The `default` environment is always created and includes the `default` feature. # It does not need to be specified explicitly unless non-default features are included. diff --git a/pyproject.toml b/pyproject.toml index 8e8738cf..d220bb59 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,6 @@ classifiers = [ 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', 'Programming Language :: Python :: 3.13', - 'Programming Language :: Python :: 3.14', ] requires-python = '>=3.11' dependencies = [ From 1480a8d19808efde0547db07d6c32f9c6513cbc8 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 3 Mar 2026 22:57:52 +0100 Subject: [PATCH 28/35] Update Copier template to v0.8.0 --- .copier-answers.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 8a898472..cb3460c1 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,6 +1,6 @@ # WARNING: Do not edit this file manually. # Any changes will be overwritten by Copier. -_commit: v0.7.0-12-gd43fb97 +_commit: v0.8.0 _src_path: gh:easyscience/templates lib_docs_url: https://easyscience.github.io/corelib lib_doi: 10.5281/zenodo.18163581 From 5b3e04ad3d51e47b943570a3308fcbd276e2145c Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 4 Mar 2026 11:32:40 +0100 Subject: [PATCH 29/35] Reapply templates --- .copier-answers.yml | 2 +- .github/workflows/lint-format.yml | 2 +- README.md | 18 ++++++++---------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index cb3460c1..56c43e79 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,6 +1,6 @@ # WARNING: Do not edit this file manually. # Any changes will be overwritten by Copier. -_commit: v0.8.0 +_commit: v0.8.0-3-g2cd3485 _src_path: gh:easyscience/templates lib_docs_url: https://easyscience.github.io/corelib lib_doi: 10.5281/zenodo.18163581 diff --git a/.github/workflows/lint-format.yml b/.github/workflows/lint-format.yml index fadf1634..6164b032 100644 --- a/.github/workflows/lint-format.yml +++ b/.github/workflows/lint-format.yml @@ -95,7 +95,7 @@ jobs: shell: bash run: | { - echo "## 🧪 Code Quality Checks Summary" + echo "## 🧪 Checks Summary" echo "" echo "| Check | Status |" echo "|-------|--------|" diff --git a/README.md b/README.md index e360e0fa..75ab7109 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,12 @@ making data analysis easier. **EasyScience** is developed as a Python library. +License: +[BSD 3-Clause](https://github.com/easyscience/corelib/blob/master/LICENSE) + ## Useful Links -### 📚 For Users +### For Users - 📖 [Documentation](https://easyscience.github.io/corelib/latest) - 🚀 @@ -30,17 +33,12 @@ making data analysis easier. - 🧾 [Citation](https://easyscience.github.io/corelib/latest/introduction/#citation) -### 🤝 For Contributors +### For Contributors +- 🧑‍💻 [Source Code](https://github.com/easyscience/corelib) +- 🐞 [Issue Tracker](https://github.com/easyscience/corelib/issues) +- 💡 [Discussions](https://github.com/easyscience/corelib/discussions) - 🤝 [Contributing Guide](https://github.com/easyscience/corelib/blob/master/CONTRIBUTING.md) - 🛡 [Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md) -- 🐞 [Issue Tracker](https://github.com/easyscience/corelib/issues) -- 💡 [Discussions](https://github.com/easyscience/corelib/discussions) -- 🧑‍💻 [Source Code](https://github.com/easyscience/corelib) - -### ⚖️ Project Information - -- ⚖️ - [License](https://raw.githubusercontent.com/easyscience/corelib/refs/heads/master/LICENSE) From 2b93f58a5f9df2640cee39dfc7129c3bf1b67685 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Thu, 5 Mar 2026 11:15:13 +0100 Subject: [PATCH 30/35] Apply templates 0.9.0 --- .copier-answers.yml | 6 +- .github/actions/setup-pixi/action.yml | 2 +- .github/workflows/lint-format.yml | 10 ++ .github/workflows/pypi-publish.yml | 2 +- .gitignore | 13 +- .pre-commit-config.yaml | 7 ++ CONTRIBUTING.md | 10 +- README.md | 28 ++--- docs/docs/installation-and-setup/index.md | 4 +- docs/docs/introduction/index.md | 13 +- docs/mkdocs.yml | 6 +- pixi.toml | 25 ++-- pyproject.toml | 54 +++++--- src/easyscience/__init__.py | 2 +- tools/add_spdx.py | 142 ++++++++++++++++++++++ tools/check_spdx.py | 43 +++++++ tools/remove_spdx.py | 39 ++++++ tools/update_spdx.py | 106 ---------------- 18 files changed, 334 insertions(+), 178 deletions(-) create mode 100644 tools/add_spdx.py create mode 100644 tools/check_spdx.py create mode 100644 tools/remove_spdx.py delete mode 100644 tools/update_spdx.py diff --git a/.copier-answers.yml b/.copier-answers.yml index 56c43e79..7e71a658 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,13 +1,13 @@ # WARNING: Do not edit this file manually. # Any changes will be overwritten by Copier. -_commit: v0.8.0-3-g2cd3485 +_commit: v0.9.0 _src_path: gh:easyscience/templates -lib_docs_url: https://easyscience.github.io/corelib +lib_docs_url: https://easyscience.github.io/core lib_doi: 10.5281/zenodo.18163581 lib_package_name: easyscience lib_python_max: '3.13' lib_python_min: '3.11' -lib_repo_name: corelib +lib_repo_name: core project_contact_email: support@easyscience.org project_copyright_years: 2021-2026 project_extended_description: The foundation of the framework, providing reusable diff --git a/.github/actions/setup-pixi/action.yml b/.github/actions/setup-pixi/action.yml index eb891e1f..167ee623 100644 --- a/.github/actions/setup-pixi/action.yml +++ b/.github/actions/setup-pixi/action.yml @@ -33,7 +33,7 @@ inputs: runs: using: 'composite' steps: - - uses: prefix-dev/setup-pixi@v0.9.3 + - uses: prefix-dev/setup-pixi@v0.9.4 with: environments: ${{ inputs.environments }} activate-environment: ${{ inputs.activate-environment }} diff --git a/.github/workflows/lint-format.yml b/.github/workflows/lint-format.yml index 6164b032..fc451d14 100644 --- a/.github/workflows/lint-format.yml +++ b/.github/workflows/lint-format.yml @@ -53,6 +53,14 @@ jobs: shell: bash run: pixi run pyproject-check + # Check the presence and correctness of SPDX license headers in + # the code files + - name: Check SPDX license headers + id: check_spdx_headers + continue-on-error: true + shell: bash + run: pixi run spdx-check + # Check code linting with Ruff in the project root - name: Check code linting id: check_code_linting @@ -100,6 +108,7 @@ jobs: echo "| Check | Status |" echo "|-------|--------|" echo "| pyproject.toml | ${{ steps.check_pyproject.outcome == 'success' && '✅' || '❌' }} |" + echo "| SPDX headers | ${{ steps.check_spdx_headers.outcome == 'success' && '✅' || '❌' }} |" echo "| py lint | ${{ steps.check_code_linting.outcome == 'success' && '✅' || '❌' }} |" echo "| py format | ${{ steps.check_code_formatting.outcome == 'success' && '✅' || '❌' }} |" echo "| docstring format | ${{ steps.check_docs_formatting.outcome == 'success' && '✅' || '❌' }} |" @@ -111,6 +120,7 @@ jobs: - name: Fail job if any check failed if: | steps.check_pyproject.outcome == 'failure' + || steps.check_spdx_headers.outcome == 'failure' || steps.check_code_linting.outcome == 'failure' || steps.check_code_formatting.outcome == 'failure' || steps.check_docs_formatting.outcome == 'failure' diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/pypi-publish.yml index db25546f..95a3b394 100644 --- a/.github/workflows/pypi-publish.yml +++ b/.github/workflows/pypi-publish.yml @@ -38,7 +38,7 @@ jobs: # https://pypi.org/manage/project/easyscience/settings/publishing/ # Use the following data: # Owner: easyscience - # Repository name: corelib + # Repository name: core # Workflow name: pypi-publish.yml - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.gitignore b/.gitignore index 6201275a..0500ede3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ __pycache__/ .coverage .pyc +# Pixi +.pixi/ + # PyInstaller dist/ build/ @@ -20,16 +23,10 @@ node_modules/ # QtCreator *.autosave - -# QtCreator Qml *.qmlproject.user *.qmlproject.user.* - -# QtCreator Python *.pyproject.user *.pyproject.user.* - -# QtCreator CMake CMakeLists.txt.user* # PyCharm @@ -42,3 +39,7 @@ CMakeLists.txt.user* .DS_Store *.app *.dmg + +# Misc +*.log +*.zip diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 007d2389..feb102db 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,6 +11,13 @@ repos: pass_filenames: false stages: [manual] + - id: spdx-headers-check + name: pixi run spdx-check + entry: pixi run spdx-check + language: system + pass_filenames: false + stages: [manual] + - id: pixi-py-lint-check name: pixi run py-lint-check entry: pixi run py-lint-check diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 42f8472b..fa245c37 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,7 +45,7 @@ If you are not planning to modify the code, you may want to: - 🛡 Report a security issue — see [Security Issues](#12-security-issues) - 💬 Ask a question or start a discussion at - [Project Discussions](https://github.com/easyscience/corelib/discussions) + [Project Discussions](https://github.com/easyscience/core/discussions) If you plan to contribute code or documentation, continue below. @@ -83,7 +83,7 @@ strategy. If you are not a core maintainer of this repository, follow these steps. -1. Open the repository page: `https://github.com/easyscience/corelib` +1. Open the repository page: `https://github.com/easyscience/core` 2. Click the **Fork** button (top-right corner). This creates your own copy of the repository. @@ -91,14 +91,14 @@ If you are not a core maintainer of this repository, follow these steps. 3. Clone your fork locally: ```bash - git clone https://github.com//corelib.git - cd corelib + git clone https://github.com//core.git + cd core ``` 4. Add the original repository as `upstream`: ```bash - git remote add upstream https://github.com/easyscience/corelib.git + git remote add upstream https://github.com/easyscience/core.git ``` 5. Switch to the `develop` branch and update it: diff --git a/README.md b/README.md index 75ab7109..46f5925a 100644 --- a/README.md +++ b/README.md @@ -20,25 +20,23 @@ making data analysis easier. License: [BSD 3-Clause](https://github.com/easyscience/corelib/blob/master/LICENSE) + +License: [BSD 3-Clause](https://github.com/easyscience/core/blob/master/LICENSE) + ## Useful Links ### For Users -- 📖 [Documentation](https://easyscience.github.io/corelib/latest) -- 🚀 - [Getting Started](https://easyscience.github.io/corelib/latest/introduction) -- 🧪 [Tutorials](https://easyscience.github.io/corelib/latest/tutorials) -- 💬 - [Get in Touch](https://easyscience.github.io/corelib/latest/introduction/#get-in-touch) -- 🧾 - [Citation](https://easyscience.github.io/corelib/latest/introduction/#citation) +- 📖 [Documentation](https://easyscience.github.io/core/latest) +- 🚀 [Getting Started](https://easyscience.github.io/core/latest/introduction) +- 🧪 [Tutorials](https://easyscience.github.io/core/latest/tutorials) +- 💬 [Get in Touch](https://easyscience.github.io/core/latest/introduction/#get-in-touch) +- 🧾 [Citation](https://easyscience.github.io/core/latest/introduction/#citation) ### For Contributors -- 🧑‍💻 [Source Code](https://github.com/easyscience/corelib) -- 🐞 [Issue Tracker](https://github.com/easyscience/corelib/issues) -- 💡 [Discussions](https://github.com/easyscience/corelib/discussions) -- 🤝 - [Contributing Guide](https://github.com/easyscience/corelib/blob/master/CONTRIBUTING.md) -- 🛡 - [Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md) +- 🧑‍💻 [Source Code](https://github.com/easyscience/core) +- 🐞 [Issue Tracker](https://github.com/easyscience/core/issues) +- 💡 [Discussions](https://github.com/easyscience/core/discussions) +- 🤝 [Contributing Guide](https://github.com/easyscience/core/blob/master/CONTRIBUTING.md) +- 🛡 [Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md) diff --git a/docs/docs/installation-and-setup/index.md b/docs/docs/installation-and-setup/index.md index b6628fed..64064d08 100644 --- a/docs/docs/installation-and-setup/index.md +++ b/docs/docs/installation-and-setup/index.md @@ -200,13 +200,13 @@ useful for testing. To install EasyScience from the `develop` branch of GitHub, for example: ```txt -pip install git+https://github.com/easyscience/corelib@develop +pip install git+https://github.com/easyscience/core@develop ``` To include extra dependencies (e.g., dev): ```txt -pip install 'easyscience[dev] @ git+https://github.com/easyscience/corelib@develop' +pip install 'easyscience[dev] @ git+https://github.com/easyscience/core@develop' ``` ## How to Run Tutorials diff --git a/docs/docs/introduction/index.md b/docs/docs/introduction/index.md index b7ae6ac2..b95b6de3 100644 --- a/docs/docs/introduction/index.md +++ b/docs/docs/introduction/index.md @@ -20,16 +20,16 @@ making data analysis easier. ## License **EasyScience** library is released under the -[BSD 3-Clause License](https://raw.githubusercontent.com/easyscience/corelib/master/LICENSE). +[BSD 3-Clause License](https://raw.githubusercontent.com/easyscience/core/master/LICENSE). ## Releases The latest version of the **EasyScience** library is -[{{ vars.release_version }}](https://github.com/easyscience/corelib/releases/latest). +[{{ vars.release_version }}](https://github.com/easyscience/core/releases/latest). For a complete list of new features, bug fixes, and improvements, see the -[GitHub Releases page](https://github.com/easyscience/corelib/releases). +[GitHub Releases page](https://github.com/easyscience/core/releases). ## Citation @@ -54,12 +54,11 @@ The project is maintained by the [European Spallation Source (ESS)](https://ess.eu). If you would like to report a bug or request a new feature, please use -the -[GitHub Issue Tracker](https://github.com/easyscience/corelib/issues) (A -free GitHub account is required.) +the [GitHub Issue Tracker](https://github.com/easyscience/core/issues) +(A free GitHub account is required.) To contribute code, documentation, or tests, please see our -[:material-account-plus: Contributing Guidelines](https://github.com/easyscience/corelib/blob/master/CONTRIBUTING.md) +[:material-account-plus: Contributing Guidelines](https://github.com/easyscience/core/blob/master/CONTRIBUTING.md) for detailed development instructions. ## Get in Touch diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 6bbd9b3e..c721c75d 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -1,9 +1,9 @@ # Project information site_name: EasyScience Library -site_url: https://easyscience.github.io/corelib +site_url: https://easyscience.github.io/core # Repository -repo_url: https://github.com/easyscience/corelib +repo_url: https://github.com/easyscience/core edit_uri: edit/develop/docs/ # Copyright @@ -65,7 +65,7 @@ extra: link: https://easyscience.github.io/corelib name: EasyScience Main Webpage - icon: fontawesome/brands/github # Name as in Font Awesome - link: https://github.com/easyscience/corelib + link: https://github.com/easyscience/core name: EasyScience Library Source Code on GitHub # Set custom variables to be used in Markdown and HTML files vars: diff --git a/pixi.toml b/pixi.toml index 24c0854c..5bc43ea6 100644 --- a/pixi.toml +++ b/pixi.toml @@ -203,10 +203,10 @@ pre-commit-setup = { depends-on = [ # 🐙️ GitHub Tasks ################# -repo-wiki = 'gh api -X PATCH repos/easyscience/corelib -f has_wiki=false' -repo-discussions = 'gh api -X PATCH repos/easyscience/corelib -f has_discussions=true' -repo-description = "gh api -X PATCH repos/easyscience/corelib -f description='Core building blocks for EasyScience'" -repo-homepage = "gh api -X PATCH repos/easyscience/corelib -f homepage='https://easyscience.github.io/corelib'" +repo-wiki = 'gh api -X PATCH repos/easyscience/core -f has_wiki=false' +repo-discussions = 'gh api -X PATCH repos/easyscience/core -f has_discussions=true' +repo-description = "gh api -X PATCH repos/easyscience/core -f description='Core building blocks for EasyScience'" +repo-homepage = "gh api -X PATCH repos/easyscience/core -f homepage='https://easyscience.github.io/core'" repo-config = { depends-on = [ 'repo-wiki', 'repo-discussions', @@ -214,19 +214,27 @@ repo-config = { depends-on = [ 'repo-homepage', ] } -master-protection = 'gh api -X POST repos/easyscience/corelib/rulesets --input .github/configs/rulesets-master.json' -develop-protection = 'gh api -X POST repos/easyscience/corelib/rulesets --input .github/configs/rulesets-develop.json' -gh-pages-protection = 'gh api -X POST repos/easyscience/corelib/rulesets --input .github/configs/rulesets-gh-pages.json' +master-protection = 'gh api -X POST repos/easyscience/core/rulesets --input .github/configs/rulesets-master.json' +develop-protection = 'gh api -X POST repos/easyscience/core/rulesets --input .github/configs/rulesets-develop.json' +gh-pages-protection = 'gh api -X POST repos/easyscience/core/rulesets --input .github/configs/rulesets-gh-pages.json' branch-protection = { depends-on = [ 'master-protection', 'develop-protection', 'gh-pages-protection', ] } -pages-deployment = 'gh api -X POST repos/easyscience/corelib/pages --input .github/configs/pages-deployment.json' +pages-deployment = 'gh api -X POST repos/easyscience/core/pages --input .github/configs/pages-deployment.json' github-labels = 'python tools/update_github_labels.py' +######################### +# ⚖️ SPDX License Headers +######################### + +spdx-remove = 'python tools/remove_spdx.py src/ tests/' +spdx-add = 'python tools/add_spdx.py src/ tests/' +spdx-check = 'python tools/check_spdx.py src/ tests/' + #################################### # 🚀 Other Development & Build Tasks #################################### @@ -238,7 +246,6 @@ npm-config = 'npm config set registry https://registry.npmjs.org/' prettier-install = 'npm install --no-save --no-audit --no-fund prettier prettier-plugin-toml' clean-pycache = "find . -type d -name '__pycache__' -prune -exec rm -rf '{}' +" -spdx-update = 'python tools/update_spdx.py' post-install = { depends-on = [ 'npm-config', diff --git a/pyproject.toml b/pyproject.toml index d220bb59..c4cba0c2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,8 @@ dynamic = ['version'] # Use versioningit to manage the version description = 'Core building blocks for EasyScience' authors = [{ name = 'EasyScience contributors' }] readme = 'README.md' -license = { file = 'LICENSE' } +license = 'BSD-3-Clause' +license-files = ['LICENSE'] classifiers = [ 'Intended Audience :: Science/Research', 'Topic :: Scientific/Engineering', @@ -41,6 +42,7 @@ dependencies = [ [project.optional-dependencies] dev = [ + 'GitPython', # Interact with Git repositories 'build', # Building the package 'pre-commit', # Pre-commit hooks 'jinja2', # Templating @@ -68,12 +70,14 @@ dev = [ 'mkdocs-markdownextradata-plugin', # MkDocs: Markdown extra data support, such as global variables 'mkdocstrings-python', # MkDocs: Python docstring support 'pyyaml', # YAML parser + 'spdx-headers', # SPDX license header validation ] [project.urls] -documentation = 'https://easyscience.github.io/corelib' -source = 'https://github.com/easyscience/corelib' -tracker = 'https://github.com/easyscience/corelib/issues' +Documentation = 'https://easyscience.github.io/core' +'Release Notes' = 'https://github.com/easyscience/core/releases' +'Source Code' = 'https://github.com/easyscience/core' +'Issue Tracker' = 'https://github.com/easyscience/core/issues' ############################ # Build system configuration @@ -126,19 +130,6 @@ method = 'git' match = ['v*'] default-tag = 'v999.0.0' -################################ -# Configuration for docformatter -################################ - -# 'docformatter' -- Code formatter for docstrings -# https://docformatter.readthedocs.io/en/latest/ - -[tool.docformatter] -recursive = true -wrap-summaries = 72 -wrap-descriptions = 72 -close-quotes-on-newline = true - ################################ # Configuration for interrogate ################################ @@ -220,8 +211,33 @@ force-single-line = true max-complexity = 10 # default is 10 [tool.ruff.lint.pycodestyle] -max-line-length = 99 # https://peps.python.org/pep-0008/#maximum-line-length -max-doc-length = 72 # https://peps.python.org/pep-0008/#maximum-line-length +# PEP 8 line length guidance: +# https://peps.python.org/pep-0008/#maximum-line-length +# Use 99 characters as the project-wide maximum for regular code lines. +max-line-length = 99 +# allow longer lines so that parameter declarations such as +# `name (Type | Type | None):` remain on a single line. Splitting these +# lines can prevent tools such as MkDocs and IDEs from correctly +# parsing and rendering parameter documentation. +# The descriptive text itself is wrapped more strictly by +# `docformatter` (see the configuration in [tool.docformatter] below) +# whenever it is treated as normal paragraph text. +# The line length for code snippets in docstrings is also more strict, +# as defined in the [tool.ruff.format] section above. +max-doc-length = 99 [tool.ruff.lint.pydocstyle] convention = 'google' + +################################ +# Configuration for docformatter +################################ + +# 'docformatter' -- Code formatter for docstrings +# https://docformatter.readthedocs.io/en/latest/ + +[tool.docformatter] +recursive = true +wrap-summaries = 72 +wrap-descriptions = 72 +close-quotes-on-newline = true diff --git a/src/easyscience/__init__.py b/src/easyscience/__init__.py index 29cf8b5e..e155aeae 100644 --- a/src/easyscience/__init__.py +++ b/src/easyscience/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from importlib.metadata import version diff --git a/tools/add_spdx.py b/tools/add_spdx.py new file mode 100644 index 00000000..196256d3 --- /dev/null +++ b/tools/add_spdx.py @@ -0,0 +1,142 @@ +"""Add SPDX headers to Python files. + +- SPDX-FileCopyrightText with the license holder name and organization + URL from ``pyproject.toml`` as well as the file's creation year. +- SPDX-License-Identifier is taken from the project license value in + ``pyproject.toml``. +""" + +from __future__ import annotations + +import argparse +import tomllib +from datetime import datetime +from pathlib import Path +from typing import Optional +from typing import Union + +from git import Repo +from spdx_headers.core import find_repository_root +from spdx_headers.core import get_copyright_info +from spdx_headers.data import load_license_data +from spdx_headers.operations import add_header_to_single_file + +LICENSE_DATABASE = load_license_data() + + +def load_pyproject(repo_path: Union[str, Path]) -> dict: + """Load and return parsed ``pyproject.toml`` data for the + repository. + """ + repo_root = find_repository_root(repo_path) + pyproject_path = repo_root / 'pyproject.toml' + + with open(pyproject_path, 'rb') as file_handle: + return tomllib.load(file_handle) + + +def get_file_creation_year(file_path: Union[str, Path]) -> str: + """Return the year the file was first added to Git history. + + If the year cannot be determined, fall back to the current year. + """ + file_path = Path(file_path) + + repo = Repo(file_path, search_parent_directories=True) + root = Path(repo.working_tree_dir).resolve() + rel_path = file_path.resolve().relative_to(root) + + output = repo.git.log( + '--follow', + '--diff-filter=A', + '--reverse', + '--max-count=1', + '--format=%ad', + '--date=format:%Y', + '--', + str(rel_path), + ).strip() + + return output or str(datetime.now().year) + + +def get_org_url(repo_path: Union[str, Path]) -> str: + """Return the organization URL derived from the repository source + URL. + """ + pyproject_data = load_pyproject(repo_path) + repo_url = pyproject_data['project']['urls']['Source Code'] + return repo_url.rsplit('/', 1)[0] + + +def get_project_license(repo_path: Union[str, Path]) -> str: + """Return the project license value from ``pyproject.toml``.""" + pyproject_data = load_pyproject(repo_path) + return pyproject_data['project']['license'] + + +def get_copyright_holder(repo_path: Union[str, Path]) -> str: + """Return the repository copyright holder name.""" + _, name, _ = get_copyright_info(repo_path) + return name + + +def add_spdx_header( + target_file: Union[str, Path], + *, + license_key: str, + copyright_holder: str, + org_url: str, +) -> None: + """Add SPDX headers.""" + year = get_file_creation_year(target_file) + + add_header_to_single_file( + filepath=target_file, + license_key=license_key, + license_data=LICENSE_DATABASE, + year=year, + name=copyright_holder, + email=org_url, + ) + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description='Add SPDX headers to Python files under the given paths.', + ) + parser.add_argument( + 'paths', + nargs='+', + help='Relative paths to scan (e.g. src tests)', + ) + return parser + + +def main(argv: Optional[list[str]] = None) -> int: + parser = build_parser() + args = parser.parse_args(argv) + + repo_path = Path('.').resolve() + license_key = get_project_license(repo_path) + copyright_holder = get_copyright_holder(repo_path) + org_url = get_org_url(repo_path) + + for base_dir in args.paths: + base_path = Path(base_dir) + if not base_path.exists(): + parser.error(f'Path does not exist: {base_dir}') + + for py_file in base_path.rglob('*.py'): + add_spdx_header( + py_file, + license_key=license_key, + copyright_holder=copyright_holder, + org_url=org_url, + ) + + return 0 + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/tools/check_spdx.py b/tools/check_spdx.py new file mode 100644 index 00000000..80555ab1 --- /dev/null +++ b/tools/check_spdx.py @@ -0,0 +1,43 @@ +"""Check SPDX headers in Python files.""" + +from __future__ import annotations + +import argparse +from pathlib import Path +from typing import Optional + +from spdx_headers.operations import check_headers + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description='Check SPDX headers in Python files under the given paths.', + ) + parser.add_argument( + 'paths', + nargs='+', + help='Relative paths to scan (e.g. src tests)', + ) + return parser + + +def main(argv: Optional[list[str]] = None) -> int: + parser = build_parser() + args = parser.parse_args(argv) + + exit_codes = [] + + for base_dir in args.paths: + base_path = Path(base_dir) + if not base_path.exists(): + parser.error(f'Path does not exist: {base_dir}') + + print('=' * 50) + print(f'Checking SPDX headers in: {base_dir}') + exit_codes.append(check_headers(base_dir)) + + return 0 if all(code == 0 for code in exit_codes) else 1 + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/tools/remove_spdx.py b/tools/remove_spdx.py new file mode 100644 index 00000000..50e547a7 --- /dev/null +++ b/tools/remove_spdx.py @@ -0,0 +1,39 @@ +"""Remove SPDX headers from Python files.""" + +from __future__ import annotations + +import argparse +from pathlib import Path +from typing import Optional + +from spdx_headers.operations import remove_header_from_py_files + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description='Remove SPDX headers from Python files under the given paths.', + ) + parser.add_argument( + 'paths', + nargs='+', + help='Relative paths to scan (e.g. src tests)', + ) + return parser + + +def main(argv: Optional[list[str]] = None) -> int: + parser = build_parser() + args = parser.parse_args(argv) + + for base_dir in args.paths: + base_path = Path(base_dir) + if not base_path.exists(): + parser.error(f'Path does not exist: {base_dir}') + + remove_header_from_py_files(base_dir) + + return 0 + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/tools/update_spdx.py b/tools/update_spdx.py deleted file mode 100644 index 5ae444da..00000000 --- a/tools/update_spdx.py +++ /dev/null @@ -1,106 +0,0 @@ -"""Update or insert SPDX headers in Python files. - -- Ensures SPDX-FileCopyrightText has the current year. -- Ensures SPDX-License-Identifier is set to BSD-3-Clause. -""" - -import fnmatch -import re -from pathlib import Path - -COPYRIGHT_TEXT = ( - '# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors ' -) -LICENSE_TEXT = '# SPDX-License-Identifier: BSD-3-Clause' - -# Patterns to exclude from SPDX header updates (vendored code) -EXCLUDE_PATTERNS = [ - '*/_vendored/jupyter_dark_detect/*', -] - - -def should_exclude(file_path: Path) -> bool: - """Check if a file should be excluded from SPDX header updates.""" - path_str = str(file_path) - return any(fnmatch.fnmatch(path_str, pattern) for pattern in EXCLUDE_PATTERNS) - - -def update_spdx_header(file_path: Path): - # Use Path.open to satisfy lint rule PTH123. - with file_path.open('r', encoding='utf-8') as f: - original_lines = f.readlines() - - # Regexes for SPDX lines - copy_re = re.compile(r'^#\s*SPDX-FileCopyrightText:.*$') - lic_re = re.compile(r'^#\s*SPDX-License-Identifier:.*$') - - # 1) Preserve any leading shebang / coding cookie lines - prefix = [] - body_start = 0 - if original_lines: - # Shebang line like "#!/usr/bin/env python3" - if original_lines[0].startswith('#!'): - prefix.append(original_lines[0]) - body_start = 1 - # PEP 263 coding cookie on first or second line - # e.g. "# -*- coding: utf-8 -*-" or "# coding: utf-8" - for _ in range(2): # at most one more line to inspect - if body_start < len(original_lines): - line = original_lines[body_start] - if re.match(r'^#.*coding[:=]\s*[-\w.]+', line): - prefix.append(line) - body_start += 1 - else: - break - - # 2) Work on the remaining body - body = original_lines[body_start:] - - # Remove any existing SPDX lines anywhere in the body - body = [ln for ln in body if not (copy_re.match(ln) or lic_re.match(ln))] - - # Strip leading blank lines in the body so header is tight - while body and not body[0].strip(): - body.pop(0) - - # 3) Build canonical SPDX block: two lines + exactly one blank - spdx_block = [ - COPYRIGHT_TEXT + '\n', - LICENSE_TEXT + '\n', - '\n', - ] - - # 4) New content: prefix + SPDX + body - new_lines = prefix + spdx_block + body - - # 5) Normalize: collapse any extra blank lines immediately after - # LICENSE to exactly one. This keeps the script idempotent. - # Find the index of LICENSE we just inserted (prefix may be 0, 1, - # or 2 lines) - lic_idx = len(prefix) + 1 # spdx_block[1] is the license line - # Ensure exactly one blank line after LICENSE - # Remove all blank lines after lic_idx, then insert a single blank. - j = lic_idx + 1 - # Remove any number of blank lines following - while j < len(new_lines) and not new_lines[j].strip(): - new_lines.pop(j) - # Insert exactly one blank line at this position - new_lines.insert(j, '\n') - - with file_path.open('w', encoding='utf-8') as f: - f.writelines(new_lines) - - -def main(): - """Recursively update or insert SPDX headers in all Python files - under the 'src' and 'tests' directories. - """ - for base_dir in ('src', 'tests'): - for py_file in Path(base_dir).rglob('*.py'): - if should_exclude(py_file): - continue - update_spdx_header(py_file) - - -if __name__ == '__main__': - main() From 48aa48023dd8e299cfde50e42a3659fca7b6becd Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Thu, 5 Mar 2026 11:41:11 +0100 Subject: [PATCH 31/35] Update pix lock --- pixi.lock | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 160 insertions(+), 2 deletions(-) diff --git a/pixi.lock b/pixi.lock index e8770a6a..5d5f40a6 100644 --- a/pixi.lock +++ b/pixi.lock @@ -66,6 +66,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/45/860a82d618e5c3930faef0a0fe205b752323e5d10ce0c18fe5016fd4f8d2/chardet-7.0.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -92,6 +93,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl @@ -224,7 +227,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/17/1f31d8562e6f970d64911f1abc330d233bc0c0601411cf7e19c1292be6da/spdx_headers-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl @@ -308,6 +313,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/26/1a22b9a19b4ca167ca462eaf91d0fc31285874d80b0381c55fdc5bc5f066/chardet-7.0.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -334,6 +340,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl @@ -466,7 +474,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/17/1f31d8562e6f970d64911f1abc330d233bc0c0601411cf7e19c1292be6da/spdx_headers-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl @@ -550,6 +560,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/24/fe/2f2425f3b0801e897653723ee827bc87e5a0feacf826ab268a9216680615/chardet-7.0.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -576,6 +587,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl @@ -708,7 +721,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/17/1f31d8562e6f970d64911f1abc330d233bc0c0601411cf7e19c1292be6da/spdx_headers-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl @@ -782,6 +797,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ed/44/7acb8f84fc7b5ad3c977ac31865b308881da1c0a6ca58be35554d2473dd7/chardet-7.0.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -808,6 +824,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl @@ -940,7 +958,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/17/1f31d8562e6f970d64911f1abc330d233bc0c0601411cf7e19c1292be6da/spdx_headers-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl @@ -1037,6 +1057,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/9f/3d4ba1650e3eb3e7431a054e3bf1b5eaea25b84c72afabf5ef6fc33305d1/chardet-7.0.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -1063,6 +1084,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8b/23/4ab1108e87851ccc69694b03b817d92e142966a6c4abd99e17db77f2c066/h5py-3.15.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl @@ -1196,7 +1219,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/17/1f31d8562e6f970d64911f1abc330d233bc0c0601411cf7e19c1292be6da/spdx_headers-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl @@ -1278,6 +1303,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/00/fb/a90b4510aa9080966c65321db2084bcfa184518ee1ed15570d351649ecb2/chardet-7.0.1-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -1304,6 +1330,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/fd/8349b48b15b47768042cff06ad6e1c229f0a4bd89225bf6b6894fea27e6d/h5py-3.15.1-cp311-cp311-macosx_10_9_x86_64.whl @@ -1437,7 +1465,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/17/1f31d8562e6f970d64911f1abc330d233bc0c0601411cf7e19c1292be6da/spdx_headers-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl @@ -1519,6 +1549,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/24/fa/3ad0b454a55376b7971fe64c2f225dfe56a491d8d8728fbfba63f8ff416d/chardet-7.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -1545,6 +1576,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/b0/1c628e26a0b95858f54aba17e1599e7f6cd241727596cc2580b72cb0a9bf/h5py-3.15.1-cp311-cp311-macosx_11_0_arm64.whl @@ -1678,7 +1711,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/17/1f31d8562e6f970d64911f1abc330d233bc0c0601411cf7e19c1292be6da/spdx_headers-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl @@ -1750,6 +1785,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/73/64/9c5c450ba18359a8e8ab2943e6c3a0b100bd394799bc73a844e3c5cd9c7c/chardet-7.0.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -1776,6 +1812,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/95/499b4e56452ef8b6c95a271af0dde08dac4ddb70515a75f346d4f400579b/h5py-3.15.1-cp311-cp311-win_amd64.whl @@ -1909,7 +1947,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/17/1f31d8562e6f970d64911f1abc330d233bc0c0601411cf7e19c1292be6da/spdx_headers-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl @@ -2006,6 +2046,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/45/860a82d618e5c3930faef0a0fe205b752323e5d10ce0c18fe5016fd4f8d2/chardet-7.0.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -2032,6 +2073,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl @@ -2164,7 +2207,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/17/1f31d8562e6f970d64911f1abc330d233bc0c0601411cf7e19c1292be6da/spdx_headers-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl @@ -2248,6 +2293,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/26/1a22b9a19b4ca167ca462eaf91d0fc31285874d80b0381c55fdc5bc5f066/chardet-7.0.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -2274,6 +2320,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl @@ -2406,7 +2454,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/17/1f31d8562e6f970d64911f1abc330d233bc0c0601411cf7e19c1292be6da/spdx_headers-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl @@ -2490,6 +2540,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/24/fe/2f2425f3b0801e897653723ee827bc87e5a0feacf826ab268a9216680615/chardet-7.0.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -2516,6 +2567,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl @@ -2648,7 +2701,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/17/1f31d8562e6f970d64911f1abc330d233bc0c0601411cf7e19c1292be6da/spdx_headers-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl @@ -2722,6 +2777,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ed/44/7acb8f84fc7b5ad3c977ac31865b308881da1c0a6ca58be35554d2473dd7/chardet-7.0.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -2748,6 +2804,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl @@ -2880,7 +2938,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/17/1f31d8562e6f970d64911f1abc330d233bc0c0601411cf7e19c1292be6da/spdx_headers-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl @@ -3471,6 +3531,46 @@ packages: version: 3.5.0 sha256: a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0 requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/00/fb/a90b4510aa9080966c65321db2084bcfa184518ee1ed15570d351649ecb2/chardet-7.0.1-cp311-cp311-macosx_10_9_x86_64.whl + name: chardet + version: 7.0.1 + sha256: c3f59dc3e148b54813ec5c7b4b2e025d37f5dc221ee28a06d1a62f169cfaedf5 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/24/fa/3ad0b454a55376b7971fe64c2f225dfe56a491d8d8728fbfba63f8ff416d/chardet-7.0.1-cp311-cp311-macosx_11_0_arm64.whl + name: chardet + version: 7.0.1 + sha256: 3355a3c8453d673e7c1664fdd24a0c6ef39964c3d41befc4849250f7eb1de3b5 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/24/fe/2f2425f3b0801e897653723ee827bc87e5a0feacf826ab268a9216680615/chardet-7.0.1-cp313-cp313-macosx_11_0_arm64.whl + name: chardet + version: 7.0.1 + sha256: 63bc210ce73f8a1b87430b949f84d086cb326d67eb259305862e7c8861b73374 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/56/26/1a22b9a19b4ca167ca462eaf91d0fc31285874d80b0381c55fdc5bc5f066/chardet-7.0.1-cp313-cp313-macosx_10_13_x86_64.whl + name: chardet + version: 7.0.1 + sha256: 67fe3f453416ed9343057dcf06583b36aae6d8bdb013370b3ff46bc37b7e30ac + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/73/64/9c5c450ba18359a8e8ab2943e6c3a0b100bd394799bc73a844e3c5cd9c7c/chardet-7.0.1-cp311-cp311-win_amd64.whl + name: chardet + version: 7.0.1 + sha256: 26186f0ea03c4c1f9be20c088b127c71b0e9d487676930fab77625ddec2a4ef2 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/b9/45/860a82d618e5c3930faef0a0fe205b752323e5d10ce0c18fe5016fd4f8d2/chardet-7.0.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: chardet + version: 7.0.1 + sha256: 8714f0013c208452a98e23595d99cef53c5364565454425f431446eb586e2591 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/e4/9f/3d4ba1650e3eb3e7431a054e3bf1b5eaea25b84c72afabf5ef6fc33305d1/chardet-7.0.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: chardet + version: 7.0.1 + sha256: 265cb3b5dafc0411c0949800a0692f07e986fb663b6ae1ecfba32ad193a55a03 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ed/44/7acb8f84fc7b5ad3c977ac31865b308881da1c0a6ca58be35554d2473dd7/chardet-7.0.1-cp313-cp313-win_amd64.whl + name: chardet + version: 7.0.1 + sha256: c12abc65830068ad05bd257fb953aaaf63a551446688e03e145522086be5738c + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl name: charset-normalizer version: 3.4.4 @@ -3884,8 +3984,8 @@ packages: requires_python: '>=3.5' - pypi: ./ name: easyscience - version: 1.0.1+devdirty71 - sha256: 2ed61ffb6a26d4f98b06cfe854ba4794ef34e3a129c2975d248f123129af7ed2 + version: 1.0.1+dev84 + sha256: e259614d3fa62f79e61c5da4d77be6a3479b428b17b850090289b8f306b1856c requires_dist: - asteval - bumps @@ -3905,6 +4005,7 @@ packages: - build ; extra == 'dev' - copier ; extra == 'dev' - docformatter ; extra == 'dev' + - gitpython ; extra == 'dev' - interrogate ; extra == 'dev' - jinja2 ; extra == 'dev' - jupyterquiz ; extra == 'dev' @@ -3927,6 +4028,7 @@ packages: - pyyaml ; extra == 'dev' - radon ; extra == 'dev' - ruff ; extra == 'dev' + - spdx-headers ; extra == 'dev' - validate-pyproject[all] ; extra == 'dev' - versioningit ; extra == 'dev' requires_python: '>=3.11' @@ -4304,6 +4406,35 @@ packages: - markdown ; extra == 'dev' - flake8 ; extra == 'dev' - wheel ; extra == 'dev' +- pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + name: gitdb + version: 4.0.12 + sha256: 67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf + requires_dist: + - smmap>=3.0.1,<6 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl + name: gitpython + version: 3.1.46 + sha256: 79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058 + requires_dist: + - gitdb>=4.0.1,<5 + - typing-extensions>=3.10.0.2 ; python_full_version < '3.10' + - coverage[toml] ; extra == 'test' + - ddt>=1.1.1,!=1.4.3 ; extra == 'test' + - mock ; python_full_version < '3.8' and extra == 'test' + - mypy==1.18.2 ; python_full_version >= '3.9' and extra == 'test' + - pre-commit ; extra == 'test' + - pytest>=7.3.1 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-instafail ; extra == 'test' + - pytest-mock ; extra == 'test' + - pytest-sugar ; extra == 'test' + - typing-extensions ; python_full_version < '3.11' and extra == 'test' + - sphinx>=7.1.2,<7.2 ; extra == 'doc' + - sphinx-rtd-theme ; extra == 'doc' + - sphinx-autodoc-typehints ; extra == 'doc' + requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl name: griffelib version: 2.0.0 @@ -9571,11 +9702,38 @@ packages: version: 1.17.0 sha256: 4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl + name: smmap + version: 5.0.2 + sha256: b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e + requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl name: soupsieve version: 2.8.3 sha256: ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95 requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/3e/17/1f31d8562e6f970d64911f1abc330d233bc0c0601411cf7e19c1292be6da/spdx_headers-1.5.1-py3-none-any.whl + name: spdx-headers + version: 1.5.1 + sha256: 73bcb1ed087824b55ccaa497d03d8f0f0b0eaf30e5f0f7d5bbd29d2c4fe78fcf + requires_dist: + - chardet>=5.2.0 + - requests>=2.32.3 + - black>=23.0.0 ; extra == 'dev' + - build>=0.10.0 ; extra == 'dev' + - hatch>=1.9.0 ; extra == 'dev' + - isort>=5.12.0 ; extra == 'dev' + - mypy>=1.0.0 ; extra == 'dev' + - pre-commit>=4.3.0 ; extra == 'dev' + - pytest-cov>=4.0.0 ; extra == 'dev' + - pytest>=7.0.0 ; extra == 'dev' + - ruff>=0.5.0 ; extra == 'dev' + - twine>=4.0.0 ; extra == 'dev' + - types-requests>=2.31.0.6 ; extra == 'dev' + - pytest-cov>=4.0.0 ; extra == 'test' + - pytest-mock>=3.10.0 ; extra == 'test' + - pytest>=7.0.0 ; extra == 'test' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl name: stack-data version: 0.6.3 From 46346ab9560fa8a567d3116eff7d025bbe45b694 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Thu, 5 Mar 2026 11:41:43 +0100 Subject: [PATCH 32/35] Apply templates 0.10.0 --- .copier-answers.yml | 2 +- tools/add_spdx.py | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 7e71a658..335c340b 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,6 +1,6 @@ # WARNING: Do not edit this file manually. # Any changes will be overwritten by Copier. -_commit: v0.9.0 +_commit: v0.10.0 _src_path: gh:easyscience/templates lib_docs_url: https://easyscience.github.io/core lib_doi: 10.5281/zenodo.18163581 diff --git a/tools/add_spdx.py b/tools/add_spdx.py index 196256d3..295a7e0d 100644 --- a/tools/add_spdx.py +++ b/tools/add_spdx.py @@ -46,18 +46,25 @@ def get_file_creation_year(file_path: Union[str, Path]) -> str: root = Path(repo.working_tree_dir).resolve() rel_path = file_path.resolve().relative_to(root) - output = repo.git.log( + rel_path_git = rel_path.as_posix() # IMPORTANT for git pathspec + + # Get the year when the file was first added to Git history. + # NOTE: Do not combine `--reverse` with `--max-count=1` here, as it can + # yield an empty result with some Git versions. Instead, get the full + # filtered output and take the first line. + log_output = repo.git.log( '--follow', '--diff-filter=A', '--reverse', - '--max-count=1', '--format=%ad', '--date=format:%Y', '--', - str(rel_path), + rel_path_git, ).strip() - return output or str(datetime.now().year) + year = log_output.splitlines()[0].strip() if log_output else '' + + return year or str(datetime.now().year) def get_org_url(repo_path: Union[str, Path]) -> str: From 57181aecd334cf59f92c6fb58a50fead264ec969 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Thu, 5 Mar 2026 11:42:17 +0100 Subject: [PATCH 33/35] Update SPDX headers --- README.md | 19 ++- src/easyscience/__init__.py | 2 +- src/easyscience/base_classes/__init__.py | 2 +- src/easyscience/base_classes/based_base.py | 2 +- .../base_classes/collection_base.py | 2 +- src/easyscience/base_classes/easy_list.py | 2 +- src/easyscience/base_classes/model_base.py | 2 +- src/easyscience/base_classes/new_base.py | 2 +- src/easyscience/base_classes/obj_base.py | 2 +- src/easyscience/fitting/__init__.py | 2 +- .../fitting/available_minimizers.py | 2 +- .../fitting/calculators/__init__.py | 2 +- .../fitting/calculators/interface_factory.py | 2 +- src/easyscience/fitting/fitter.py | 2 +- .../fitting/minimizers/__init__.py | 2 +- src/easyscience/fitting/minimizers/factory.py | 2 +- .../fitting/minimizers/minimizer_base.py | 2 +- .../fitting/minimizers/minimizer_bumps.py | 2 +- .../fitting/minimizers/minimizer_dfo.py | 2 +- .../fitting/minimizers/minimizer_lmfit.py | 2 +- src/easyscience/fitting/minimizers/utils.py | 2 +- src/easyscience/fitting/multi_fitter.py | 2 +- src/easyscience/global_object/__init__.py | 2 +- .../global_object/global_object.py | 2 +- .../global_object/hugger/__init__.py | 3 +- .../global_object/hugger/hugger.py | 2 +- .../global_object/hugger/property.py | 2 +- src/easyscience/global_object/logger.py | 2 +- src/easyscience/global_object/map.py | 2 +- src/easyscience/global_object/undo_redo.py | 2 +- src/easyscience/io/__init__.py | 2 +- src/easyscience/io/serializer_base.py | 2 +- src/easyscience/io/serializer_component.py | 2 +- src/easyscience/io/serializer_dict.py | 2 +- src/easyscience/job/__init__.py | 2 +- src/easyscience/job/analysis.py | 2 +- src/easyscience/job/experiment.py | 2 +- src/easyscience/job/job.py | 2 +- src/easyscience/job/theoreticalmodel.py | 2 +- src/easyscience/legacy/dict.py | 2 +- src/easyscience/legacy/json.py | 2 +- src/easyscience/legacy/legacy_core.py | 2 +- src/easyscience/legacy/xml.py | 2 +- src/easyscience/models/__init__.py | 2 +- src/easyscience/models/polynomial.py | 2 +- src/easyscience/utils/__init__.py | 3 +- src/easyscience/utils/classTools.py | 2 +- src/easyscience/utils/classUtils.py | 2 +- src/easyscience/utils/decorators.py | 2 +- src/easyscience/utils/string.py | 2 +- src/easyscience/variable/__init__.py | 2 +- .../variable/descriptor_any_type.py | 2 +- src/easyscience/variable/descriptor_array.py | 2 +- src/easyscience/variable/descriptor_base.py | 2 +- src/easyscience/variable/descriptor_bool.py | 2 +- src/easyscience/variable/descriptor_number.py | 2 +- src/easyscience/variable/descriptor_str.py | 2 +- src/easyscience/variable/parameter.py | 2 +- .../variable/parameter_dependency_resolver.py | 2 +- tests/integration/fitting/test_fitter.py | 2 +- .../integration/fitting/test_multi_fitter.py | 2 +- tests/unit/base_classes/__init__.py | 3 +- .../unit/base_classes/test_collection_base.py | 2 +- tests/unit/base_classes/test_easy_list.py | 2 +- tests/unit/base_classes/test_model_base.py | 2 +- tests/unit/base_classes/test_new_base.py | 2 +- tests/unit/base_classes/test_obj_base.py | 2 +- tests/unit/fitting/__init__.py | 3 +- tests/unit/fitting/calculators/__init__.py | 3 +- .../calculators/test_interface_factory.py | 2 +- tests/unit/fitting/minimizers/__init__.py | 3 +- tests/unit/fitting/minimizers/test_factory.py | 2 +- .../fitting/minimizers/test_minimizer_base.py | 2 +- .../minimizers/test_minimizer_bumps.py | 2 +- .../fitting/minimizers/test_minimizer_dfo.py | 2 +- .../minimizers/test_minimizer_lmfit.py | 2 +- tests/unit/fitting/test_fitter.py | 2 +- tests/unit/global_object/__init__.py | 3 +- .../test_entry_list_comprehensive.py | 2 +- .../unit/global_object/test_global_object.py | 2 +- .../test_integration_comprehensive.py | 2 +- tests/unit/global_object/test_map.py | 2 +- tests/unit/global_object/test_undo_redo.py | 2 +- .../test_undo_redo_comprehensive.py | 2 +- tests/unit/io/test_serializer_base.py | 2 +- tests/unit/io/test_serializer_component.py | 2 +- tests/unit/io/test_serializer_dict.py | 2 +- tests/unit/legacy/__init__.py | 3 +- tests/unit/legacy/test_dict.py | 157 +----------------- tests/unit/legacy/test_json.py | 124 +------------- tests/unit/legacy/test_xml.py | 112 +------------ tests/unit/models/__init__.py | 3 +- tests/unit/models/test_polynomial.py | 5 +- tests/unit/variable/__init__.py | 3 +- .../unit/variable/test_descriptor_any_type.py | 2 +- tests/unit/variable/test_descriptor_array.py | 2 +- tests/unit/variable/test_descriptor_base.py | 2 +- tests/unit/variable/test_descriptor_bool.py | 2 +- tests/unit/variable/test_descriptor_number.py | 2 +- tests/unit/variable/test_descriptor_str.py | 2 +- tests/unit/variable/test_parameter.py | 2 +- ...test_parameter_dependency_serialization.py | 2 +- 102 files changed, 123 insertions(+), 498 deletions(-) diff --git a/README.md b/README.md index 46f5925a..b9c7a8b7 100644 --- a/README.md +++ b/README.md @@ -20,23 +20,28 @@ making data analysis easier. License: [BSD 3-Clause](https://github.com/easyscience/corelib/blob/master/LICENSE) - -License: [BSD 3-Clause](https://github.com/easyscience/core/blob/master/LICENSE) +License: +[BSD 3-Clause](https://github.com/easyscience/core/blob/master/LICENSE) ## Useful Links ### For Users - 📖 [Documentation](https://easyscience.github.io/core/latest) -- 🚀 [Getting Started](https://easyscience.github.io/core/latest/introduction) +- 🚀 + [Getting Started](https://easyscience.github.io/core/latest/introduction) - 🧪 [Tutorials](https://easyscience.github.io/core/latest/tutorials) -- 💬 [Get in Touch](https://easyscience.github.io/core/latest/introduction/#get-in-touch) -- 🧾 [Citation](https://easyscience.github.io/core/latest/introduction/#citation) +- 💬 + [Get in Touch](https://easyscience.github.io/core/latest/introduction/#get-in-touch) +- 🧾 + [Citation](https://easyscience.github.io/core/latest/introduction/#citation) ### For Contributors - 🧑‍💻 [Source Code](https://github.com/easyscience/core) - 🐞 [Issue Tracker](https://github.com/easyscience/core/issues) - 💡 [Discussions](https://github.com/easyscience/core/discussions) -- 🤝 [Contributing Guide](https://github.com/easyscience/core/blob/master/CONTRIBUTING.md) -- 🛡 [Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md) +- 🤝 + [Contributing Guide](https://github.com/easyscience/core/blob/master/CONTRIBUTING.md) +- 🛡 + [Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md) diff --git a/src/easyscience/__init__.py b/src/easyscience/__init__.py index e155aeae..167e98e0 100644 --- a/src/easyscience/__init__.py +++ b/src/easyscience/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2026 EasyScience contributors +# SPDX-FileCopyrightText: 2024 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from importlib.metadata import version diff --git a/src/easyscience/base_classes/__init__.py b/src/easyscience/base_classes/__init__.py index 6702dfbc..b5dc0418 100644 --- a/src/easyscience/base_classes/__init__.py +++ b/src/easyscience/base_classes/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2025 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from .based_base import BasedBase diff --git a/src/easyscience/base_classes/based_base.py b/src/easyscience/base_classes/based_base.py index 64ec92b1..1e5ac567 100644 --- a/src/easyscience/base_classes/based_base.py +++ b/src/easyscience/base_classes/based_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2025 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/base_classes/collection_base.py b/src/easyscience/base_classes/collection_base.py index c3b34ca2..3328abc5 100644 --- a/src/easyscience/base_classes/collection_base.py +++ b/src/easyscience/base_classes/collection_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/base_classes/easy_list.py b/src/easyscience/base_classes/easy_list.py index 115d7f5a..39f04eaa 100644 --- a/src/easyscience/base_classes/easy_list.py +++ b/src/easyscience/base_classes/easy_list.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/base_classes/model_base.py b/src/easyscience/base_classes/model_base.py index 701f4a68..419492c9 100644 --- a/src/easyscience/base_classes/model_base.py +++ b/src/easyscience/base_classes/model_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2025 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/base_classes/new_base.py b/src/easyscience/base_classes/new_base.py index 5ed69a9d..778e9ba9 100644 --- a/src/easyscience/base_classes/new_base.py +++ b/src/easyscience/base_classes/new_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2025 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/base_classes/obj_base.py b/src/easyscience/base_classes/obj_base.py index 31cfed99..8576b67b 100644 --- a/src/easyscience/base_classes/obj_base.py +++ b/src/easyscience/base_classes/obj_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2025 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/fitting/__init__.py b/src/easyscience/fitting/__init__.py index 3684d122..54bad74a 100644 --- a/src/easyscience/fitting/__init__.py +++ b/src/easyscience/fitting/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from .available_minimizers import AvailableMinimizers diff --git a/src/easyscience/fitting/available_minimizers.py b/src/easyscience/fitting/available_minimizers.py index 0b9952d3..0cfd262b 100644 --- a/src/easyscience/fitting/available_minimizers.py +++ b/src/easyscience/fitting/available_minimizers.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2024 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import warnings diff --git a/src/easyscience/fitting/calculators/__init__.py b/src/easyscience/fitting/calculators/__init__.py index a007475b..4104ddae 100644 --- a/src/easyscience/fitting/calculators/__init__.py +++ b/src/easyscience/fitting/calculators/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2025 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from .interface_factory import InterfaceFactoryTemplate diff --git a/src/easyscience/fitting/calculators/interface_factory.py b/src/easyscience/fitting/calculators/interface_factory.py index 88f935bd..f9103523 100644 --- a/src/easyscience/fitting/calculators/interface_factory.py +++ b/src/easyscience/fitting/calculators/interface_factory.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/fitting/fitter.py b/src/easyscience/fitting/fitter.py index 0a6bbb9f..70524996 100644 --- a/src/easyscience/fitting/fitter.py +++ b/src/easyscience/fitting/fitter.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import functools diff --git a/src/easyscience/fitting/minimizers/__init__.py b/src/easyscience/fitting/minimizers/__init__.py index abc05ba1..ca70e748 100644 --- a/src/easyscience/fitting/minimizers/__init__.py +++ b/src/easyscience/fitting/minimizers/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2024 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from .minimizer_base import MinimizerBase diff --git a/src/easyscience/fitting/minimizers/factory.py b/src/easyscience/fitting/minimizers/factory.py index 2ebcead4..335d288c 100644 --- a/src/easyscience/fitting/minimizers/factory.py +++ b/src/easyscience/fitting/minimizers/factory.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2024 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from typing import Callable diff --git a/src/easyscience/fitting/minimizers/minimizer_base.py b/src/easyscience/fitting/minimizers/minimizer_base.py index 2f113fc1..b4539ac4 100644 --- a/src/easyscience/fitting/minimizers/minimizer_base.py +++ b/src/easyscience/fitting/minimizers/minimizer_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from abc import ABCMeta diff --git a/src/easyscience/fitting/minimizers/minimizer_bumps.py b/src/easyscience/fitting/minimizers/minimizer_bumps.py index 4be96d13..37f8873e 100644 --- a/src/easyscience/fitting/minimizers/minimizer_bumps.py +++ b/src/easyscience/fitting/minimizers/minimizer_bumps.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import copy diff --git a/src/easyscience/fitting/minimizers/minimizer_dfo.py b/src/easyscience/fitting/minimizers/minimizer_dfo.py index 48568cbf..a480c823 100644 --- a/src/easyscience/fitting/minimizers/minimizer_dfo.py +++ b/src/easyscience/fitting/minimizers/minimizer_dfo.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from typing import Callable diff --git a/src/easyscience/fitting/minimizers/minimizer_lmfit.py b/src/easyscience/fitting/minimizers/minimizer_lmfit.py index 86cb24e3..4a8104b2 100644 --- a/src/easyscience/fitting/minimizers/minimizer_lmfit.py +++ b/src/easyscience/fitting/minimizers/minimizer_lmfit.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from typing import Callable diff --git a/src/easyscience/fitting/minimizers/utils.py b/src/easyscience/fitting/minimizers/utils.py index 3f3d6d41..76449a17 100644 --- a/src/easyscience/fitting/minimizers/utils.py +++ b/src/easyscience/fitting/minimizers/utils.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import numpy as np diff --git a/src/easyscience/fitting/multi_fitter.py b/src/easyscience/fitting/multi_fitter.py index b8509884..94e715c6 100644 --- a/src/easyscience/fitting/multi_fitter.py +++ b/src/easyscience/fitting/multi_fitter.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from typing import Callable diff --git a/src/easyscience/global_object/__init__.py b/src/easyscience/global_object/__init__.py index 24dd991a..c0934dde 100644 --- a/src/easyscience/global_object/__init__.py +++ b/src/easyscience/global_object/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2024 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from .global_object import GlobalObject # noqa: F401 diff --git a/src/easyscience/global_object/global_object.py b/src/easyscience/global_object/global_object.py index 0b2a4b6e..dbaa994d 100644 --- a/src/easyscience/global_object/global_object.py +++ b/src/easyscience/global_object/global_object.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from ..utils.classUtils import singleton diff --git a/src/easyscience/global_object/hugger/__init__.py b/src/easyscience/global_object/hugger/__init__.py index 8a2c8a73..b1990ec8 100644 --- a/src/easyscience/global_object/hugger/__init__.py +++ b/src/easyscience/global_object/hugger/__init__.py @@ -1,2 +1,3 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/src/easyscience/global_object/hugger/hugger.py b/src/easyscience/global_object/hugger/hugger.py index 8393de6f..42bf4497 100644 --- a/src/easyscience/global_object/hugger/hugger.py +++ b/src/easyscience/global_object/hugger/hugger.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import inspect diff --git a/src/easyscience/global_object/hugger/property.py b/src/easyscience/global_object/hugger/property.py index dcea7f81..2367d1fb 100644 --- a/src/easyscience/global_object/hugger/property.py +++ b/src/easyscience/global_object/hugger/property.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import sys diff --git a/src/easyscience/global_object/logger.py b/src/easyscience/global_object/logger.py index 064d8f80..0400d524 100644 --- a/src/easyscience/global_object/logger.py +++ b/src/easyscience/global_object/logger.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import logging diff --git a/src/easyscience/global_object/map.py b/src/easyscience/global_object/map.py index 1bc9f2f3..c9172c09 100644 --- a/src/easyscience/global_object/map.py +++ b/src/easyscience/global_object/map.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import gc diff --git a/src/easyscience/global_object/undo_redo.py b/src/easyscience/global_object/undo_redo.py index 73c31b96..bb1e173c 100644 --- a/src/easyscience/global_object/undo_redo.py +++ b/src/easyscience/global_object/undo_redo.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import abc diff --git a/src/easyscience/io/__init__.py b/src/easyscience/io/__init__.py index 2babae2b..6a53db96 100644 --- a/src/easyscience/io/__init__.py +++ b/src/easyscience/io/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2025 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from .serializer_base import SerializerBase diff --git a/src/easyscience/io/serializer_base.py b/src/easyscience/io/serializer_base.py index 868aaa23..8bcf987a 100644 --- a/src/easyscience/io/serializer_base.py +++ b/src/easyscience/io/serializer_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/io/serializer_component.py b/src/easyscience/io/serializer_component.py index 0b680417..02938a29 100644 --- a/src/easyscience/io/serializer_component.py +++ b/src/easyscience/io/serializer_component.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2025 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/io/serializer_dict.py b/src/easyscience/io/serializer_dict.py index 21857ac2..8dc73a63 100644 --- a/src/easyscience/io/serializer_dict.py +++ b/src/easyscience/io/serializer_dict.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2025 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/job/__init__.py b/src/easyscience/job/__init__.py index ac3189d6..73852c24 100644 --- a/src/easyscience/job/__init__.py +++ b/src/easyscience/job/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from .analysis import AnalysisBase # noqa: F401 diff --git a/src/easyscience/job/analysis.py b/src/easyscience/job/analysis.py index 280115c7..448f1c3c 100644 --- a/src/easyscience/job/analysis.py +++ b/src/easyscience/job/analysis.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from abc import ABCMeta diff --git a/src/easyscience/job/experiment.py b/src/easyscience/job/experiment.py index ac69694e..0f9577c3 100644 --- a/src/easyscience/job/experiment.py +++ b/src/easyscience/job/experiment.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from ..base_classes.obj_base import ObjBase diff --git a/src/easyscience/job/job.py b/src/easyscience/job/job.py index 99f69adf..b48cbb1d 100644 --- a/src/easyscience/job/job.py +++ b/src/easyscience/job/job.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from abc import ABCMeta diff --git a/src/easyscience/job/theoreticalmodel.py b/src/easyscience/job/theoreticalmodel.py index fcbdeeba..609f889e 100644 --- a/src/easyscience/job/theoreticalmodel.py +++ b/src/easyscience/job/theoreticalmodel.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from ..base_classes.obj_base import ObjBase diff --git a/src/easyscience/legacy/dict.py b/src/easyscience/legacy/dict.py index b7dccb16..72c57c1d 100644 --- a/src/easyscience/legacy/dict.py +++ b/src/easyscience/legacy/dict.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/legacy/json.py b/src/easyscience/legacy/json.py index 2a228725..12a151e7 100644 --- a/src/easyscience/legacy/json.py +++ b/src/easyscience/legacy/json.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/legacy/legacy_core.py b/src/easyscience/legacy/legacy_core.py index e875c107..1fed4b86 100644 --- a/src/easyscience/legacy/legacy_core.py +++ b/src/easyscience/legacy/legacy_core.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/legacy/xml.py b/src/easyscience/legacy/xml.py index 7e046eb1..7ec29950 100644 --- a/src/easyscience/legacy/xml.py +++ b/src/easyscience/legacy/xml.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/models/__init__.py b/src/easyscience/models/__init__.py index da0f905f..3fc7f778 100644 --- a/src/easyscience/models/__init__.py +++ b/src/easyscience/models/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2024 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from .polynomial import Polynomial # noqa: F401 diff --git a/src/easyscience/models/polynomial.py b/src/easyscience/models/polynomial.py index bbfb3ac8..5cc4170b 100644 --- a/src/easyscience/models/polynomial.py +++ b/src/easyscience/models/polynomial.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2024 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from typing import ClassVar diff --git a/src/easyscience/utils/__init__.py b/src/easyscience/utils/__init__.py index 8a2c8a73..554dc85e 100644 --- a/src/easyscience/utils/__init__.py +++ b/src/easyscience/utils/__init__.py @@ -1,2 +1,3 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2025 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/src/easyscience/utils/classTools.py b/src/easyscience/utils/classTools.py index 8c22437e..151f36c1 100644 --- a/src/easyscience/utils/classTools.py +++ b/src/easyscience/utils/classTools.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/utils/classUtils.py b/src/easyscience/utils/classUtils.py index b43c5b9f..6d56028a 100644 --- a/src/easyscience/utils/classUtils.py +++ b/src/easyscience/utils/classUtils.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from functools import wraps diff --git a/src/easyscience/utils/decorators.py b/src/easyscience/utils/decorators.py index 8040bd09..16457b48 100644 --- a/src/easyscience/utils/decorators.py +++ b/src/easyscience/utils/decorators.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import collections.abc diff --git a/src/easyscience/utils/string.py b/src/easyscience/utils/string.py index 5f50c7b6..e8a2456d 100644 --- a/src/easyscience/utils/string.py +++ b/src/easyscience/utils/string.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from fractions import Fraction diff --git a/src/easyscience/variable/__init__.py b/src/easyscience/variable/__init__.py index 443f4db4..121d5cf9 100644 --- a/src/easyscience/variable/__init__.py +++ b/src/easyscience/variable/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from .descriptor_any_type import DescriptorAnyType diff --git a/src/easyscience/variable/descriptor_any_type.py b/src/easyscience/variable/descriptor_any_type.py index 24879569..6bdf7f39 100644 --- a/src/easyscience/variable/descriptor_any_type.py +++ b/src/easyscience/variable/descriptor_any_type.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/variable/descriptor_array.py b/src/easyscience/variable/descriptor_array.py index 0965574a..aecc684a 100644 --- a/src/easyscience/variable/descriptor_array.py +++ b/src/easyscience/variable/descriptor_array.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/variable/descriptor_base.py b/src/easyscience/variable/descriptor_base.py index d455a15a..07b4aaa1 100644 --- a/src/easyscience/variable/descriptor_base.py +++ b/src/easyscience/variable/descriptor_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/variable/descriptor_bool.py b/src/easyscience/variable/descriptor_bool.py index 030a911e..88135d61 100644 --- a/src/easyscience/variable/descriptor_bool.py +++ b/src/easyscience/variable/descriptor_bool.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/variable/descriptor_number.py b/src/easyscience/variable/descriptor_number.py index dc1b1eeb..b526afbf 100644 --- a/src/easyscience/variable/descriptor_number.py +++ b/src/easyscience/variable/descriptor_number.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/variable/descriptor_str.py b/src/easyscience/variable/descriptor_str.py index dffc0d11..c6e26f9c 100644 --- a/src/easyscience/variable/descriptor_str.py +++ b/src/easyscience/variable/descriptor_str.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/variable/parameter.py b/src/easyscience/variable/parameter.py index bc75ebd7..36e2c7a3 100644 --- a/src/easyscience/variable/parameter.py +++ b/src/easyscience/variable/parameter.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/src/easyscience/variable/parameter_dependency_resolver.py b/src/easyscience/variable/parameter_dependency_resolver.py index b38b57ea..a4a21732 100644 --- a/src/easyscience/variable/parameter_dependency_resolver.py +++ b/src/easyscience/variable/parameter_dependency_resolver.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2025 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from __future__ import annotations diff --git a/tests/integration/fitting/test_fitter.py b/tests/integration/fitting/test_fitter.py index 6556017c..c6d130fd 100644 --- a/tests/integration/fitting/test_fitter.py +++ b/tests/integration/fitting/test_fitter.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import numpy as np diff --git a/tests/integration/fitting/test_multi_fitter.py b/tests/integration/fitting/test_multi_fitter.py index f9138c1f..1cc5b395 100644 --- a/tests/integration/fitting/test_multi_fitter.py +++ b/tests/integration/fitting/test_multi_fitter.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import numpy as np diff --git a/tests/unit/base_classes/__init__.py b/tests/unit/base_classes/__init__.py index 8a2c8a73..b1990ec8 100644 --- a/tests/unit/base_classes/__init__.py +++ b/tests/unit/base_classes/__init__.py @@ -1,2 +1,3 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/base_classes/test_collection_base.py b/tests/unit/base_classes/test_collection_base.py index bc96e4ca..732c3acf 100644 --- a/tests/unit/base_classes/test_collection_base.py +++ b/tests/unit/base_classes/test_collection_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import pytest diff --git a/tests/unit/base_classes/test_easy_list.py b/tests/unit/base_classes/test_easy_list.py index e31504ab..32f6a60b 100644 --- a/tests/unit/base_classes/test_easy_list.py +++ b/tests/unit/base_classes/test_easy_list.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import warnings diff --git a/tests/unit/base_classes/test_model_base.py b/tests/unit/base_classes/test_model_base.py index efe24f34..e91c20a9 100644 --- a/tests/unit/base_classes/test_model_base.py +++ b/tests/unit/base_classes/test_model_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from unittest.mock import MagicMock diff --git a/tests/unit/base_classes/test_new_base.py b/tests/unit/base_classes/test_new_base.py index 012d0d19..e1562860 100644 --- a/tests/unit/base_classes/test_new_base.py +++ b/tests/unit/base_classes/test_new_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import pytest diff --git a/tests/unit/base_classes/test_obj_base.py b/tests/unit/base_classes/test_obj_base.py index e6030633..357aa4f1 100644 --- a/tests/unit/base_classes/test_obj_base.py +++ b/tests/unit/base_classes/test_obj_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from contextlib import contextmanager diff --git a/tests/unit/fitting/__init__.py b/tests/unit/fitting/__init__.py index 8a2c8a73..b1990ec8 100644 --- a/tests/unit/fitting/__init__.py +++ b/tests/unit/fitting/__init__.py @@ -1,2 +1,3 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/fitting/calculators/__init__.py b/tests/unit/fitting/calculators/__init__.py index 8a2c8a73..b1990ec8 100644 --- a/tests/unit/fitting/calculators/__init__.py +++ b/tests/unit/fitting/calculators/__init__.py @@ -1,2 +1,3 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/fitting/calculators/test_interface_factory.py b/tests/unit/fitting/calculators/test_interface_factory.py index 37d93091..cab3b30f 100644 --- a/tests/unit/fitting/calculators/test_interface_factory.py +++ b/tests/unit/fitting/calculators/test_interface_factory.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from unittest.mock import MagicMock diff --git a/tests/unit/fitting/minimizers/__init__.py b/tests/unit/fitting/minimizers/__init__.py index 8a2c8a73..b1990ec8 100644 --- a/tests/unit/fitting/minimizers/__init__.py +++ b/tests/unit/fitting/minimizers/__init__.py @@ -1,2 +1,3 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/fitting/minimizers/test_factory.py b/tests/unit/fitting/minimizers/test_factory.py index 771cbda5..8ee4df6c 100644 --- a/tests/unit/fitting/minimizers/test_factory.py +++ b/tests/unit/fitting/minimizers/test_factory.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from unittest.mock import MagicMock diff --git a/tests/unit/fitting/minimizers/test_minimizer_base.py b/tests/unit/fitting/minimizers/test_minimizer_base.py index 6598bd28..86ec4292 100644 --- a/tests/unit/fitting/minimizers/test_minimizer_base.py +++ b/tests/unit/fitting/minimizers/test_minimizer_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from inspect import Parameter as InspectParameter diff --git a/tests/unit/fitting/minimizers/test_minimizer_bumps.py b/tests/unit/fitting/minimizers/test_minimizer_bumps.py index c7ba0658..ba86b4d0 100644 --- a/tests/unit/fitting/minimizers/test_minimizer_bumps.py +++ b/tests/unit/fitting/minimizers/test_minimizer_bumps.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from unittest.mock import MagicMock diff --git a/tests/unit/fitting/minimizers/test_minimizer_dfo.py b/tests/unit/fitting/minimizers/test_minimizer_dfo.py index bbf558f1..e1d5eeef 100644 --- a/tests/unit/fitting/minimizers/test_minimizer_dfo.py +++ b/tests/unit/fitting/minimizers/test_minimizer_dfo.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from unittest.mock import MagicMock diff --git a/tests/unit/fitting/minimizers/test_minimizer_lmfit.py b/tests/unit/fitting/minimizers/test_minimizer_lmfit.py index 62d7ec45..ac280873 100644 --- a/tests/unit/fitting/minimizers/test_minimizer_lmfit.py +++ b/tests/unit/fitting/minimizers/test_minimizer_lmfit.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from unittest.mock import MagicMock diff --git a/tests/unit/fitting/test_fitter.py b/tests/unit/fitting/test_fitter.py index c6500f1f..73f5a12a 100644 --- a/tests/unit/fitting/test_fitter.py +++ b/tests/unit/fitting/test_fitter.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from unittest.mock import MagicMock diff --git a/tests/unit/global_object/__init__.py b/tests/unit/global_object/__init__.py index 8a2c8a73..b1990ec8 100644 --- a/tests/unit/global_object/__init__.py +++ b/tests/unit/global_object/__init__.py @@ -1,2 +1,3 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/global_object/test_entry_list_comprehensive.py b/tests/unit/global_object/test_entry_list_comprehensive.py index 54b8f49c..7a15ba2f 100644 --- a/tests/unit/global_object/test_entry_list_comprehensive.py +++ b/tests/unit/global_object/test_entry_list_comprehensive.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from unittest.mock import MagicMock diff --git a/tests/unit/global_object/test_global_object.py b/tests/unit/global_object/test_global_object.py index c7686093..719fee5a 100644 --- a/tests/unit/global_object/test_global_object.py +++ b/tests/unit/global_object/test_global_object.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import pytest diff --git a/tests/unit/global_object/test_integration_comprehensive.py b/tests/unit/global_object/test_integration_comprehensive.py index d2c3d57d..61268954 100644 --- a/tests/unit/global_object/test_integration_comprehensive.py +++ b/tests/unit/global_object/test_integration_comprehensive.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import gc diff --git a/tests/unit/global_object/test_map.py b/tests/unit/global_object/test_map.py index 297fdd4c..c68aa96f 100644 --- a/tests/unit/global_object/test_map.py +++ b/tests/unit/global_object/test_map.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import gc diff --git a/tests/unit/global_object/test_undo_redo.py b/tests/unit/global_object/test_undo_redo.py index c43a6c13..be39eac3 100644 --- a/tests/unit/global_object/test_undo_redo.py +++ b/tests/unit/global_object/test_undo_redo.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import math diff --git a/tests/unit/global_object/test_undo_redo_comprehensive.py b/tests/unit/global_object/test_undo_redo_comprehensive.py index 35c2fc66..05264c1b 100644 --- a/tests/unit/global_object/test_undo_redo_comprehensive.py +++ b/tests/unit/global_object/test_undo_redo_comprehensive.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from unittest.mock import MagicMock diff --git a/tests/unit/io/test_serializer_base.py b/tests/unit/io/test_serializer_base.py index 194b00d3..c3c8dd21 100644 --- a/tests/unit/io/test_serializer_base.py +++ b/tests/unit/io/test_serializer_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import datetime diff --git a/tests/unit/io/test_serializer_component.py b/tests/unit/io/test_serializer_component.py index 54a50716..c4e21f49 100644 --- a/tests/unit/io/test_serializer_component.py +++ b/tests/unit/io/test_serializer_component.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from copy import deepcopy diff --git a/tests/unit/io/test_serializer_dict.py b/tests/unit/io/test_serializer_dict.py index a902c21a..1ddf21ef 100644 --- a/tests/unit/io/test_serializer_dict.py +++ b/tests/unit/io/test_serializer_dict.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from copy import deepcopy diff --git a/tests/unit/legacy/__init__.py b/tests/unit/legacy/__init__.py index 8a2c8a73..b1990ec8 100644 --- a/tests/unit/legacy/__init__.py +++ b/tests/unit/legacy/__init__.py @@ -1,2 +1,3 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/legacy/test_dict.py b/tests/unit/legacy/test_dict.py index c5ac9860..b1990ec8 100644 --- a/tests/unit/legacy/test_dict.py +++ b/tests/unit/legacy/test_dict.py @@ -1,158 +1,3 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause -# from copy import deepcopy -# from typing import Type - -# import pytest - -# from easyscience.io.dict import DataDictSerializer -# from easyscience.io.dict import DictSerializer -# from easyscience.variable import DescriptorNumber -# from easyscience.base_classes import BaseObj - -# from .test_core import check_dict -# from .test_core import dp_param_dict -# from .test_core import skip_dict -# from easyscience import global_object - - -# def recursive_remove(d, remove_keys: list) -> dict: -# """ -# Remove keys from a dictionary. -# """ -# if not isinstance(remove_keys, list): -# remove_keys = [remove_keys] -# if isinstance(d, dict): -# dd = {} -# for k in d.keys(): -# if k not in remove_keys: -# dd[k] = recursive_remove(d[k], remove_keys) -# return dd -# else: -# return d - - -# ######################################################################################################################## -# # TESTING ENCODING -# ######################################################################################################################## -# @pytest.mark.parametrize(**skip_dict) -# @pytest.mark.parametrize(**dp_param_dict) -# def test_variable_DictSerializer(dp_kwargs: dict, dp_cls: Type[DescriptorNumber], skip): -# data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} - -# obj = dp_cls(**data_dict) - -# dp_kwargs = deepcopy(dp_kwargs) - -# if isinstance(skip, str): -# del dp_kwargs[skip] - -# if not isinstance(skip, list): -# skip = [skip] - -# enc = obj.encode(skip=skip, encoder=DictSerializer) - -# expected_keys = set(dp_kwargs.keys()) -# obtained_keys = set(enc.keys()) - -# dif = expected_keys.difference(obtained_keys) - -# assert len(dif) == 0 - -# check_dict(dp_kwargs, enc) - - -# @pytest.mark.parametrize(**skip_dict) -# @pytest.mark.parametrize(**dp_param_dict) -# def test_variable_DataDictSerializer(dp_kwargs: dict, dp_cls: Type[DescriptorNumber], skip): -# data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} - -# obj = dp_cls(**data_dict) - -# if isinstance(skip, str): -# del data_dict[skip] - -# if not isinstance(skip, list): -# skip = [skip] - -# enc_d = obj.encode(skip=skip, encoder=DataDictSerializer) - -# expected_keys = set(data_dict.keys()) -# obtained_keys = set(enc_d.keys()) - -# dif = expected_keys.difference(obtained_keys) - -# assert len(dif) == 0 - -# check_dict(data_dict, enc_d) - - -# ######################################################################################################################## -# # TESTING DECODING -# ######################################################################################################################## -# @pytest.mark.parametrize(**dp_param_dict) -# def test_variable_DictSerializer_decode(dp_kwargs: dict, dp_cls: Type[DescriptorNumber]): -# data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} - -# obj = dp_cls(**data_dict) - -# enc = obj.encode(encoder=DictSerializer) -# global_object.map._clear() -# dec = dp_cls.decode(enc, decoder=DictSerializer) - -# for k in data_dict.keys(): -# if hasattr(obj, k) and hasattr(dec, k): -# assert getattr(obj, k) == getattr(dec, k) -# else: -# raise AttributeError(f"{k} not found in decoded object") - - -# @pytest.mark.parametrize(**dp_param_dict) -# def test_variable_DictSerializer_from_dict(dp_kwargs: dict, dp_cls: Type[DescriptorNumber]): -# data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} - -# obj = dp_cls(**data_dict) - -# enc = obj.encode(encoder=DictSerializer) -# global_object.map._clear() -# dec = dp_cls.from_dict(enc) - -# for k in data_dict.keys(): -# if hasattr(obj, k) and hasattr(dec, k): -# assert getattr(obj, k) == getattr(dec, k) -# else: -# raise AttributeError(f"{k} not found in decoded object") - - -# @pytest.mark.parametrize(**dp_param_dict) -# def test_variable_DataDictSerializer_decode(dp_kwargs: dict, dp_cls: Type[DescriptorNumber]): -# data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} - -# obj = dp_cls(**data_dict) - -# enc = obj.encode(encoder=DataDictSerializer) -# with pytest.raises(NotImplementedError): -# dec = obj.decode(enc, decoder=DataDictSerializer) - - -# def test_group_encode(): -# d0 = DescriptorNumber("a", 0) -# d1 = DescriptorNumber("b", 1) - -# from easyscience.base_classes import BaseCollection - -# b = BaseCollection("test", d0, d1) -# d = b.as_dict() -# assert isinstance(d["data"], list) - - -# def test_group_encode2(): -# d0 = DescriptorNumber("a", 0) -# d1 = DescriptorNumber("b", 1) - -# from easyscience.base_classes import BaseCollection - -# b = BaseObj("outer", b=BaseCollection("test", d0, d1)) -# d = b.as_dict() -# assert isinstance(d["b"], dict) diff --git a/tests/unit/legacy/test_json.py b/tests/unit/legacy/test_json.py index 6a77ddc5..b1990ec8 100644 --- a/tests/unit/legacy/test_json.py +++ b/tests/unit/legacy/test_json.py @@ -1,125 +1,3 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause -# import json -# from copy import deepcopy -# from typing import Type - -# import pytest - -# from easyscience.io.json import JsonDataSerializer -# from easyscience.io.json import JsonSerializer -# from easyscience.variable import DescriptorNumber - -# from .test_core import check_dict -# from .test_core import dp_param_dict -# from .test_core import skip_dict -# from easyscience import global_object - - -# def recursive_remove(d, remove_keys: list) -> dict: -# """ -# Remove keys from a dictionary. -# """ -# if not isinstance(remove_keys, list): -# remove_keys = [remove_keys] -# if isinstance(d, dict): -# dd = {} -# for k in d.keys(): -# if k not in remove_keys: -# dd[k] = recursive_remove(d[k], remove_keys) -# return dd -# else: -# return d - - -# ######################################################################################################################## -# # TESTING ENCODING -# ######################################################################################################################## -# @pytest.mark.parametrize(**skip_dict) -# @pytest.mark.parametrize(**dp_param_dict) -# def test_variable_DictSerializer(dp_kwargs: dict, dp_cls: Type[DescriptorNumber], skip): -# data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} - -# obj = dp_cls(**data_dict) - -# dp_kwargs = deepcopy(dp_kwargs) - -# if isinstance(skip, str): -# del dp_kwargs[skip] - -# if not isinstance(skip, list): -# skip = [skip] - -# enc = obj.encode(skip=skip, encoder=JsonSerializer) -# assert isinstance(enc, str) - -# # We can test like this as we don't have "complex" objects yet -# dec = json.loads(enc) -# expected_keys = set(dp_kwargs.keys()) -# obtained_keys = set(dec.keys()) - -# dif = expected_keys.difference(obtained_keys) - -# assert len(dif) == 0 - -# check_dict(dp_kwargs, dec) - - -# @pytest.mark.parametrize(**skip_dict) -# @pytest.mark.parametrize(**dp_param_dict) -# def test_variable_DataDictSerializer(dp_kwargs: dict, dp_cls: Type[DescriptorNumber], skip): -# data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} - -# obj = dp_cls(**data_dict) - -# if isinstance(skip, str): -# del data_dict[skip] - -# if not isinstance(skip, list): -# skip = [skip] - -# enc = obj.encode(skip=skip, encoder=JsonDataSerializer) -# assert isinstance(enc, str) -# enc_d = json.loads(enc) - -# expected_keys = set(data_dict.keys()) -# obtained_keys = set(enc_d.keys()) - -# dif = expected_keys.difference(obtained_keys) - -# assert len(dif) == 0 - -# check_dict(data_dict, enc_d) - -# # ######################################################################################################################## -# # # TESTING DECODING -# # ######################################################################################################################## -# @pytest.mark.parametrize(**dp_param_dict) -# def test_variable_DictSerializer_decode(dp_kwargs: dict, dp_cls: Type[DescriptorNumber]): -# data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} - -# obj = dp_cls(**data_dict) - -# enc = obj.encode(encoder=JsonSerializer) -# global_object.map._clear() -# assert isinstance(enc, str) -# dec = obj.decode(enc, decoder=JsonSerializer) - -# for k in data_dict.keys(): -# if hasattr(obj, k) and hasattr(dec, k): -# assert getattr(obj, k) == getattr(dec, k) -# else: -# raise AttributeError(f"{k} not found in decoded object") - - -# @pytest.mark.parametrize(**dp_param_dict) -# def test_variable_DataDictSerializer_decode(dp_kwargs: dict, dp_cls: Type[DescriptorNumber]): -# data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} - -# obj = dp_cls(**data_dict) - -# enc = obj.encode(encoder=JsonDataSerializer) -# global_object.map._clear() -# with pytest.raises(NotImplementedError): -# dec = obj.decode(enc, decoder=JsonDataSerializer) diff --git a/tests/unit/legacy/test_xml.py b/tests/unit/legacy/test_xml.py index 278f1c9b..b1990ec8 100644 --- a/tests/unit/legacy/test_xml.py +++ b/tests/unit/legacy/test_xml.py @@ -1,113 +1,3 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause -# import sys -# import xml.etree.ElementTree as ET -# from copy import deepcopy -# from typing import Type - -# import pytest - -# from easyscience.legacy.xml import XMLSerializer -# from easyscience.variable import DescriptorNumber - -# from ..io.test_core import dp_param_dict -# from ..io.test_core import skip_dict -# from easyscience import global_object - -# def recursive_remove(d, remove_keys: list) -> dict: -# """ -# Remove keys from a dictionary. -# """ -# if not isinstance(remove_keys, list): -# remove_keys = [remove_keys] -# if isinstance(d, dict): -# dd = {} -# for k in d.keys(): -# if k not in remove_keys: -# dd[k] = recursive_remove(d[k], remove_keys) -# return dd -# else: -# return d - - -# def recursive_test(testing_obj, reference_obj): -# for i, (k, v) in enumerate(testing_obj.items()): -# if isinstance(v, dict): -# recursive_test(v, reference_obj[i]) -# else: -# assert v == XMLSerializer.string_to_variable(reference_obj[i].text) - - -# ######################################################################################################################## -# # TESTING ENCODING -# ######################################################################################################################## -# @pytest.mark.parametrize(**skip_dict) -# @pytest.mark.parametrize(**dp_param_dict) -# def test_variable_XMLDictSerializer(dp_kwargs: dict, dp_cls: Type[DescriptorNumber], skip): -# data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} - -# obj = dp_cls(**data_dict) - -# dp_kwargs = deepcopy(dp_kwargs) - -# if isinstance(skip, str): -# del dp_kwargs[skip] - -# if not isinstance(skip, list): -# skip = [skip] - -# enc = obj.encode(skip=skip, encoder=XMLSerializer) -# ref_encode = obj.encode(skip=skip) -# assert isinstance(enc, str) -# data_xml = ET.XML(enc) -# assert data_xml.tag == "data" -# recursive_test(data_xml, ref_encode) - -# # ######################################################################################################################## -# # # TESTING DECODING -# # ######################################################################################################################## -# @pytest.mark.parametrize(**dp_param_dict) -# def test_variable_XMLDictSerializer_decode(dp_kwargs: dict, dp_cls: Type[DescriptorNumber]): -# data_dict = {k: v for k, v in dp_kwargs.items() if k[0] != "@"} - -# obj = dp_cls(**data_dict) - -# enc = obj.encode(encoder=XMLSerializer) -# assert isinstance(enc, str) -# data_xml = ET.XML(enc) -# assert data_xml.tag == "data" -# global_object.map._clear() -# dec = dp_cls.decode(enc, decoder=XMLSerializer) - -# for k in data_dict.keys(): -# if hasattr(obj, k) and hasattr(dec, k): -# assert getattr(obj, k) == getattr(dec, k) -# else: -# raise AttributeError(f"{k} not found in decoded object") - - -# def test_slow_encode(): - -# if sys.version_info < (3, 9): -# pytest.skip("This test is only for python 3.9+") - -# a = {"a": [1, 2, 3]} -# slow_xml = XMLSerializer().encode(a, fast=False) -# reference = """ -# 1 -# 2 -# 3 -# """ -# assert slow_xml == reference - - -# def test_include_header(): - -# if sys.version_info < (3, 9): -# pytest.skip("This test is only for python 3.9+") - -# a = {"a": [1, 2, 3]} -# header_xml = XMLSerializer().encode(a, use_header=True) -# reference = '?xml version="1.0" encoding="UTF-8"?\n\n 1\n 2\n 3\n' -# assert header_xml == reference diff --git a/tests/unit/models/__init__.py b/tests/unit/models/__init__.py index 8a2c8a73..b1990ec8 100644 --- a/tests/unit/models/__init__.py +++ b/tests/unit/models/__init__.py @@ -1,2 +1,3 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/models/test_polynomial.py b/tests/unit/models/test_polynomial.py index f6d5f29a..5376d03e 100644 --- a/tests/unit/models/test_polynomial.py +++ b/tests/unit/models/test_polynomial.py @@ -1,9 +1,6 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause -# © 2025 Contributors to the EasyScience project - - import numpy as np import pytest diff --git a/tests/unit/variable/__init__.py b/tests/unit/variable/__init__.py index 8a2c8a73..b1990ec8 100644 --- a/tests/unit/variable/__init__.py +++ b/tests/unit/variable/__init__.py @@ -1,2 +1,3 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause + diff --git a/tests/unit/variable/test_descriptor_any_type.py b/tests/unit/variable/test_descriptor_any_type.py index 8256deb5..5dc28b58 100644 --- a/tests/unit/variable/test_descriptor_any_type.py +++ b/tests/unit/variable/test_descriptor_any_type.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import numpy as np diff --git a/tests/unit/variable/test_descriptor_array.py b/tests/unit/variable/test_descriptor_array.py index 1426a6ba..73bb0857 100644 --- a/tests/unit/variable/test_descriptor_array.py +++ b/tests/unit/variable/test_descriptor_array.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import numpy as np diff --git a/tests/unit/variable/test_descriptor_base.py b/tests/unit/variable/test_descriptor_base.py index 58d08aed..24c342dc 100644 --- a/tests/unit/variable/test_descriptor_base.py +++ b/tests/unit/variable/test_descriptor_base.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import pytest diff --git a/tests/unit/variable/test_descriptor_bool.py b/tests/unit/variable/test_descriptor_bool.py index 80d9513b..3c181f0e 100644 --- a/tests/unit/variable/test_descriptor_bool.py +++ b/tests/unit/variable/test_descriptor_bool.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import pytest diff --git a/tests/unit/variable/test_descriptor_number.py b/tests/unit/variable/test_descriptor_number.py index c7085774..6abd3029 100644 --- a/tests/unit/variable/test_descriptor_number.py +++ b/tests/unit/variable/test_descriptor_number.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import pytest diff --git a/tests/unit/variable/test_descriptor_str.py b/tests/unit/variable/test_descriptor_str.py index e07608d7..46acc847 100644 --- a/tests/unit/variable/test_descriptor_str.py +++ b/tests/unit/variable/test_descriptor_str.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import pytest diff --git a/tests/unit/variable/test_parameter.py b/tests/unit/variable/test_parameter.py index e4d5480f..87c1ce4f 100644 --- a/tests/unit/variable/test_parameter.py +++ b/tests/unit/variable/test_parameter.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause from unittest.mock import MagicMock diff --git a/tests/unit/variable/test_parameter_dependency_serialization.py b/tests/unit/variable/test_parameter_dependency_serialization.py index d4a9337b..62feb5f3 100644 --- a/tests/unit/variable/test_parameter_dependency_serialization.py +++ b/tests/unit/variable/test_parameter_dependency_serialization.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2026 EasyScience contributors +# SPDX-FileCopyrightText: 2026 EasyScience contributors # SPDX-License-Identifier: BSD-3-Clause import json From 4e8d67a238a101387b3751ebcf19afb9b82b2e4b Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Thu, 5 Mar 2026 12:11:22 +0100 Subject: [PATCH 34/35] Remove legacy workflows and version file --- .github/workflows/documentation-build.yml | 49 ------------ .github/workflows/nightly-check.yml | 24 ------ .github/workflows/python-ci.yml | 94 ----------------------- .github/workflows/python-package.yml | 46 ----------- .github/workflows/python-publish.yml | 38 --------- src/easyscience/__version__.py | 1 - 6 files changed, 252 deletions(-) delete mode 100644 .github/workflows/documentation-build.yml delete mode 100644 .github/workflows/nightly-check.yml delete mode 100644 .github/workflows/python-ci.yml delete mode 100644 .github/workflows/python-package.yml delete mode 100644 .github/workflows/python-publish.yml delete mode 100644 src/easyscience/__version__.py diff --git a/.github/workflows/documentation-build.yml b/.github/workflows/documentation-build.yml deleted file mode 100644 index 958a8dde..00000000 --- a/.github/workflows/documentation-build.yml +++ /dev/null @@ -1,49 +0,0 @@ -# This pipeline -# - builds developer documentation using pixi -# - pushes documentation to gh-pages branch of the same repository -# -# Deployment is handled by pages-build-deployment bot - -name: Build Documentation and Push to gh-pages Branch - -# Controls when the workflow will run -on: - # Triggers the workflow on tag creation - push: - tags: - - 'v*' - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -permissions: - contents: write - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "build" - build_documentation: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v5 - with: - fetch-depth: 0 # otherwise, you will failed to push refs to dest repo - - - name: Setup Pixi - uses: prefix-dev/setup-pixi@v0.9.4 - - - name: Build documentation - run: pixi run --environment dev docs-build - - # - name: Build and Commit - # uses: sphinx-notes/pages@master - # with: - # install_requirements: true - # documentation_path: docs/src - - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./docs/_build/html diff --git a/.github/workflows/nightly-check.yml b/.github/workflows/nightly-check.yml deleted file mode 100644 index f35a232c..00000000 --- a/.github/workflows/nightly-check.yml +++ /dev/null @@ -1,24 +0,0 @@ -# Nightly Check - install dependencies and run tests after pixi update-lock -name: Nightly Check -on: - schedule: - - cron: '0 0 * * *' # Runs every day at midnight UTC - workflow_dispatch: - -jobs: - nightly-check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v5 - - - name: Setup Pixi - uses: prefix-dev/setup-pixi@v0.9.4 - - - name: Update lock file - run: pixi run update-lock - - - name: Build package - run: pixi run build - - - name: Run tox tests - run: pixi run -e dev tox diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml deleted file mode 100644 index ed16dfdd..00000000 --- a/.github/workflows/python-ci.yml +++ /dev/null @@ -1,94 +0,0 @@ -# This workflow will for a variety of Python versions -# - install the code base with pixi -# - lint the code base -# - test the code base -# - upload the test coverage to codecov -# -# It will also -# - build the package -# - check the package -# -# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries - -name: CI using pixi - -on: [push, pull_request] - -jobs: - Code_Consistency: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v5 - - name: Setup Pixi - uses: prefix-dev/setup-pixi@v0.9.4 - - name: Run linting - run: pixi run -e dev lint-check - - - name: Suggestion to fix lint issues - if: ${{ failure() }} - run: | - echo "::notice::In project root run 'pixi run -e dev lint' and commit changes to fix issues." - exit 1 - - - name: Run formatting - run: pixi run -e dev format-check - - - name: Suggestion to fix format issues - if: ${{ failure() }} - run: | - echo "::notice::In project root run 'pixi run -e dev format' and commit changes to fix issues." - exit 1 - - Code_Testing: - strategy: - max-parallel: 4 - matrix: - python-version: ['3.11', '3.12', '3.13'] - os: [ubuntu-latest, macos-latest, macos-15-intel, windows-latest] - - runs-on: ${{ matrix.os }} - if: "!contains(github.event.head_commit.message, '[ci skip]')" - - steps: - - uses: actions/checkout@v5 - - - name: Setup Pixi - uses: prefix-dev/setup-pixi@v0.9.0 - with: - run-install: false - cache: false - post-cleanup: false - - - name: Set Python version - run: pixi add python=${{ matrix.python-version }} - - - name: Install dependencies and run tests - run: pixi run -e dev test - - - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v5 - with: - name: unit-tests-job - flags: unittests - files: ./coverage-unit.xml - fail_ci_if_error: true - verbose: true - token: ${{ secrets.CODECOV_TOKEN }} - slug: EasyScience/corelib - - Package_Testing: - - runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, '[ci skip]')" - - steps: - - uses: actions/checkout@v5 - - - name: Setup Pixi - uses: prefix-dev/setup-pixi@v0.9.4 - - - name: Build package - run: pixi run build - - - name: Run tox tests - run: pixi run -e dev tox diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml deleted file mode 100644 index 9158390b..00000000 --- a/.github/workflows/python-package.yml +++ /dev/null @@ -1,46 +0,0 @@ -# This workflow will for a variety of Python versions -# - build a python package using pixi -# - run tests on the produced package -# - upload the package as an artifact -# -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions - -name: Create Python Package using pixi - - -on: - push: - branches: - - master - pull_request: - branches: - - master - -jobs: - build: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ['3.11', '3.12', '3.13'] - if: "!contains(github.event.head_commit.message, '[ci skip]')" - - steps: - - uses: actions/checkout@v5 - - - name: Setup Pixi - uses: prefix-dev/setup-pixi@v0.9.4 - - - name: Set Python version - run: pixi add python=${{ matrix.python-version }} - - - name: Build package - run: pixi run build - - - name: Run tests with tox - run: pixi run -e dev tox - - - uses: actions/upload-artifact@v4 - with: - name: EasyScience - Python ${{ matrix.python-version }} - path: ${{ github.workspace }}/dist/* - overwrite: true \ No newline at end of file diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml deleted file mode 100644 index 17a81037..00000000 --- a/.github/workflows/python-publish.yml +++ /dev/null @@ -1,38 +0,0 @@ -# This workflow will -# - build distribution package, pure python wheel using pixi -# - publish produced distribution package to PyPI -# -# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries - -name: Publish Python Package - -# Controls when the workflow will run -on: - # Triggers the workflow on tag creation - push: - tags: - - 'v*' - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -jobs: - deploy: - - runs-on: ubuntu-latest - permissions: - id-token: write - contents: read - steps: - - uses: actions/checkout@v5 - - - name: Setup Pixi - uses: prefix-dev/setup-pixi@v0.9.4 - - - name: Build package - run: pixi run build - - - name: Publish distribution 📦 to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - password: ${{ secrets.PYPI_TOKEN_ES }} diff --git a/src/easyscience/__version__.py b/src/easyscience/__version__.py deleted file mode 100644 index 04188a16..00000000 --- a/src/easyscience/__version__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = '2.2.0' From d6a19b297ace37f3b4587e3e5b671b798a17c3ca Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Thu, 5 Mar 2026 12:33:52 +0100 Subject: [PATCH 35/35] Remove duplicate license section in README --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index b9c7a8b7..15bf48f8 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,6 @@ making data analysis easier. **EasyScience** is developed as a Python library. -License: -[BSD 3-Clause](https://github.com/easyscience/corelib/blob/master/LICENSE) - License: [BSD 3-Clause](https://github.com/easyscience/core/blob/master/LICENSE)