From 6f7057e66bfa1e360236617ba373987c53b9a3d2 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 2 Sep 2025 13:40:55 +0200 Subject: [PATCH 1/8] Split add() into dedicated methods for experiment creation (#86) * Refactor ExperimentFactory and Experiments classes for improved argument handling and creation methods * Refactor Experiment initialization across tutorials to follow new API * Refactor functional tests to follow new API * Refactor unit tests to follow new API * Remove unused pytest import * Prevents building font cache info in docs build * Refines workflow name for clarity * Renames workflow for clarity and purpose * Removes Pixi validation workflow. The user specific validation is in another workflow. * More fixes for the functional tests * Automates tutorial script conversion and deployment * Update checkout action to version 5 in GitHub workflows * Updates release workflow to use enhanced actions * Enhances checkout action for full history fetching * Streamlines GitHub Actions YAML syntax * Removes push and pull_request triggers * Removes feature branch from CI config * Adds ID to draft release notes step * Refines experiment documentation to follow new API * Adds manual trigger to draft release notes workflow * Restricts GitHub Actions to master and develop branches * Simplifies experiment doc headings and clarifications * Refactors test workflow and adds cron trigger * Enables GitHub token for tutorial scripts * Removes branch-specific logic from workflows * Add tests for ExperimentFactory argument validation * Bump dependencies --- .github/workflows/build-docs.yml | 11 +- .github/workflows/draft-release-notes.yml | 43 +- .github/workflows/publish-pypi.yml | 5 +- .github/workflows/scan-security.yml | 5 +- .github/workflows/test-code.yaml | 43 +- .github/workflows/test-package-pypi.yaml | 14 +- .github/workflows/test-tutorials-colab.yaml | 14 +- .github/workflows/test-tutorials.yaml | 16 +- .github/workflows/trigger-test-code.yaml | 30 + ...ghtly.yaml => trigger-test-tutorials.yaml} | 6 +- .github/workflows/validate-pixi.yaml | 76 - .../analysis-workflow/experiment.md | 132 +- pixi.lock | 1246 ++++++++--------- pixi.toml | 4 +- pixi/prod/pixi.toml | 4 +- pixi/wheel/pixi.toml | 4 +- pytest.ini | 3 + src/easydiffraction/experiments/experiment.py | 169 ++- .../experiments/experiments.py | 116 +- .../test_pair-distribution-function.py | 14 +- ..._powder-diffraction_constant-wavelength.py | 8 +- .../test_powder-diffraction_joint-fit.py | 19 +- .../test_powder-diffraction_multiphase.py | 6 +- .../test_powder-diffraction_time-of-flight.py | 12 +- .../calculators/test_calculator_base.py | 0 .../calculators/test_calculator_cryspy.py | 0 .../calculators/test_calculator_factory.py | 0 .../collections/test_joint_fit_experiment.py | 0 .../test_fitting_progress_tracker.py | 0 .../minimizers/test_minimizer_base.py | 0 .../minimizers/test_minimizer_dfols.py | 0 .../minimizers/test_minimizer_factory.py | 0 .../minimizers/test_minimizer_lmfit.py | 0 .../analysis/test_analysis.py | 0 .../analysis/test_minimization.py | 0 .../analysis/test_reliability_factors.py | 0 .../{unit_tests => unit}/core/test_objects.py | 0 .../core/test_singletons.py | 0 .../collections/test_background.py | 0 .../experiments/collections/test_datastore.py | 0 .../collections/test_linked_phases.py | 0 .../components/test_experiment_type.py | 0 .../experiments/components/test_instrument.py | 0 .../experiments/components/test_peak.py | 0 .../experiments/test_experiment.py | 29 + .../experiments/test_experiments.py | 16 +- .../collections/test_atom_sites.py | 0 .../sample_models/components/test_cell.py | 0 .../components/test_space_group.py | 0 .../sample_models/test_sample_models.py | 0 tests/{unit_tests => unit}/test_project.py | 0 .../test_symmetry_lookup_table.py | 0 ...vanced_joint-fit_pd-neut-xray-cwl_PbSO4.py | 12 +- .../basic_single-fit_pd-neut-cwl_LBCO-HRPT.py | 4 +- .../cryst-struct_pd-neut-cwl_CoSiO4-D20.py | 2 +- tutorials/cryst-struct_pd-neut-tof_Si-SEPD.py | 2 +- ...-struct_pd-neut-tof_multidata_NCAF-WISH.py | 8 +- ...t_pd-neut-tof_multiphase-LBCO-Si_McStas.py | 4 +- ...school-2025_analysis-powder-diffraction.py | 8 +- tutorials/pdf_pd-neut-cwl_Ni.py | 4 +- tutorials/pdf_pd-neut-tof_Si-NOMAD.py | 4 +- tutorials/pdf_pd-xray_NaCl.py | 4 +- .../quick_single-fit_pd-neut-cwl_LBCO-HRPT.py | 4 +- 63 files changed, 1130 insertions(+), 971 deletions(-) create mode 100644 .github/workflows/trigger-test-code.yaml rename .github/workflows/{test-tutorials-nightly.yaml => trigger-test-tutorials.yaml} (87%) delete mode 100644 .github/workflows/validate-pixi.yaml create mode 100644 pytest.ini rename tests/{functional_tests => functional}/fitting/test_pair-distribution-function.py (97%) rename tests/{functional_tests => functional}/fitting/test_powder-diffraction_constant-wavelength.py (97%) rename tests/{functional_tests => functional}/fitting/test_powder-diffraction_joint-fit.py (93%) rename tests/{functional_tests => functional}/fitting/test_powder-diffraction_multiphase.py (96%) rename tests/{functional_tests => functional}/fitting/test_powder-diffraction_time-of-flight.py (94%) rename tests/{unit_tests => unit}/analysis/calculators/test_calculator_base.py (100%) rename tests/{unit_tests => unit}/analysis/calculators/test_calculator_cryspy.py (100%) rename tests/{unit_tests => unit}/analysis/calculators/test_calculator_factory.py (100%) rename tests/{unit_tests => unit}/analysis/collections/test_joint_fit_experiment.py (100%) rename tests/{unit_tests => unit}/analysis/minimizers/test_fitting_progress_tracker.py (100%) rename tests/{unit_tests => unit}/analysis/minimizers/test_minimizer_base.py (100%) rename tests/{unit_tests => unit}/analysis/minimizers/test_minimizer_dfols.py (100%) rename tests/{unit_tests => unit}/analysis/minimizers/test_minimizer_factory.py (100%) rename tests/{unit_tests => unit}/analysis/minimizers/test_minimizer_lmfit.py (100%) rename tests/{unit_tests => unit}/analysis/test_analysis.py (100%) rename tests/{unit_tests => unit}/analysis/test_minimization.py (100%) rename tests/{unit_tests => unit}/analysis/test_reliability_factors.py (100%) rename tests/{unit_tests => unit}/core/test_objects.py (100%) rename tests/{unit_tests => unit}/core/test_singletons.py (100%) rename tests/{unit_tests => unit}/experiments/collections/test_background.py (100%) rename tests/{unit_tests => unit}/experiments/collections/test_datastore.py (100%) rename tests/{unit_tests => unit}/experiments/collections/test_linked_phases.py (100%) rename tests/{unit_tests => unit}/experiments/components/test_experiment_type.py (100%) rename tests/{unit_tests => unit}/experiments/components/test_instrument.py (100%) rename tests/{unit_tests => unit}/experiments/components/test_peak.py (100%) rename tests/{unit_tests => unit}/experiments/test_experiment.py (80%) rename tests/{unit_tests => unit}/experiments/test_experiments.py (84%) rename tests/{unit_tests => unit}/sample_models/collections/test_atom_sites.py (100%) rename tests/{unit_tests => unit}/sample_models/components/test_cell.py (100%) rename tests/{unit_tests => unit}/sample_models/components/test_space_group.py (100%) rename tests/{unit_tests => unit}/sample_models/test_sample_models.py (100%) rename tests/{unit_tests => unit}/test_project.py (100%) rename tests/{unit_tests => unit}/test_symmetry_lookup_table.py (100%) diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 77bf31b4..899c3b50 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -6,8 +6,7 @@ on: # Selected branches branches: [master, develop, docs, patch] # Runs on creating a new tag starting with 'v', e.g. 'v1.0.3' - tags: - - 'v*' + tags: ['v*'] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -41,7 +40,7 @@ jobs: steps: - name: Check-out repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 # full history + tags. needed to get the latest release version @@ -92,6 +91,12 @@ jobs: - name: Convert tutorial scripts to notebooks run: pixi run notebook-prepare + # The following step is needed to avoid the following message during the build: + # "Matplotlib is building the font cache; this may take a moment" + - name: Pre-build site step + run: pixi run python -c "import easydiffraction" + + # Run the notebooks to generate the output cells using multiple cores - name: Run notebooks run: pixi run notebook-exec diff --git a/.github/workflows/draft-release-notes.yml b/.github/workflows/draft-release-notes.yml index 8c0d86af..54f039a3 100644 --- a/.github/workflows/draft-release-notes.yml +++ b/.github/workflows/draft-release-notes.yml @@ -7,6 +7,8 @@ on: # Runs on pushes targeting the default branch (updates the real draft release) push: branches: [master] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: jobs: draft-release-notes: @@ -17,9 +19,34 @@ jobs: runs-on: ubuntu-latest steps: - - name: Drafts the next release notes - uses: enhantica/drafterino@v1 + - name: Checkout repository + uses: actions/checkout@v5 + with: + fetch-depth: 0 # full history with tags to get the version number by drafterino + + - name: Set up pixi + uses: prefix-dev/setup-pixi@v0.9.0 + with: + environments: >- + default + activate-environment: default + run-install: true + frozen: true + cache: false + post-cleanup: false + + - name: Convert tutorial scripts to notebooks + run: pixi run notebook-prepare + + - name: Clean up unnecessary script files + run: rm -rf tutorials/*.py + - name: Zip the tutorials directory + run: zip -9 -r tutorials.zip tutorials + + - name: Drafts the next release notes + id: draft + uses: enhantica/drafterino@v2 with: config: | title: 'easydiffraction $COMPUTED_VERSION' @@ -43,3 +70,15 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_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 }} + files: | + tutorials.zip + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml index 805ef813..583e8cc0 100644 --- a/.github/workflows/publish-pypi.yml +++ b/.github/workflows/publish-pypi.yml @@ -6,8 +6,7 @@ name: Publish to PyPI on: # Runs on creating a new tag starting with 'v', e.g. 'v1.0.3' push: - tags: - - 'v*' + tags: ['v*'] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -17,7 +16,7 @@ jobs: steps: - name: Check-out repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: '0' # full history with tags to get the version number by versioningit diff --git a/.github/workflows/scan-security.yml b/.github/workflows/scan-security.yml index f551d5d4..e10753e4 100644 --- a/.github/workflows/scan-security.yml +++ b/.github/workflows/scan-security.yml @@ -7,8 +7,7 @@ name: Scan security (static analysis) on: # Trigger the workflow on pull request pull_request: - branches: - - '**' + branches: ['**'] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -20,7 +19,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + 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. diff --git a/.github/workflows/test-code.yaml b/.github/workflows/test-code.yaml index e0d61695..b83b9b3d 100644 --- a/.github/workflows/test-code.yaml +++ b/.github/workflows/test-code.yaml @@ -6,7 +6,7 @@ # - Check code linting # - Check code formatting # - Check formatting of Markdown, YAML, TOML, etc. files -# 2. run-tests: +# 2. test-source: # - Test the code base against the latest code in the repository # - Create the Python package # - Upload the Python package for the next job @@ -21,16 +21,13 @@ on: # Trigger the workflow on push push: # Every branch - branches: - - '**' + branches: ['**'] # 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*' + tags-ignore: ['v*'] # Trigger the workflow on pull request pull_request: - branches: - - '**' + branches: ['**'] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -57,9 +54,21 @@ jobs: runs-on: ${{ matrix.os }} + outputs: + pytest-marks: ${{ steps.set-mark.outputs.pytest_marks }} + steps: + - name: Set mark for functional tests + id: set-mark + run: | + if [[ "${{ env.CI_BRANCH }}" != "master" && "${{ env.CI_BRANCH }}" != "develop" ]]; then + echo "pytest_marks=-m 'fast'" >> $GITHUB_OUTPUT + else + echo "pytest_marks=" >> $GITHUB_OUTPUT + fi + - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up pixi (incl. environments and dependencies) uses: prefix-dev/setup-pixi@v0.9.0 @@ -136,7 +145,7 @@ jobs: # Job 2: Test code # TODO: Add coverage reporting with upload to Codecov? - run-tests: + test-source: needs: code-quality # previous job needs to be finished first strategy: @@ -151,7 +160,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: '0' # full history with tags to get the version number by versioningit @@ -172,12 +181,13 @@ jobs: pixi run -e $env unit-tests done - - name: Run functional tests + - name: + Run functional tests ${{ needs.code-quality.outputs.pytest-marks }} shell: bash run: | for env in ${{ env.PIXI_ENVS }}; do echo "πŸ”ΉπŸ”ΈπŸ”ΉπŸ”ΈπŸ”Ή Current env: $env πŸ”ΉπŸ”ΈπŸ”ΉπŸ”ΈπŸ”Ή" - pixi run -e $env func-tests + pixi run -e $env func-tests "${{ needs.code-quality.outputs.pytest-marks }}" done # Delete all local tags when not on a tagged commit to force versioningit @@ -215,7 +225,7 @@ jobs: # Job 3: Test the package test-package: - needs: run-tests # the previous job needs to be finished first + needs: test-source # the previous job needs to be finished first strategy: fail-fast: false @@ -260,7 +270,7 @@ jobs: pixi run -e $env easydiffraction version done - - name: Run unit tests (using built package from previous job) + - name: Run unit tests shell: bash run: | for env in ${{ env.PIXI_ENVS }}; do @@ -268,10 +278,11 @@ jobs: pixi run -e $env unit-tests done - - name: Run functional tests (using built package from previous job) + - name: + Run functional tests ${{ needs.code-quality.outputs.pytest-marks }} shell: bash run: | for env in ${{ env.PIXI_ENVS }}; do echo "πŸ”ΉπŸ”ΈπŸ”ΉπŸ”ΈπŸ”Ή Current env: $env πŸ”ΉπŸ”ΈπŸ”ΉπŸ”ΈπŸ”Ή" - pixi run -e $env func-tests + pixi run -e $env func-tests "${{ needs.code-quality.outputs.pytest-marks }}" done diff --git a/.github/workflows/test-package-pypi.yaml b/.github/workflows/test-package-pypi.yaml index 9eab468c..d6038f7c 100644 --- a/.github/workflows/test-package-pypi.yaml +++ b/.github/workflows/test-package-pypi.yaml @@ -1,4 +1,4 @@ -name: Test unpinned package from PyPI +name: Test unpinned PyPI package on: # Run daily, at 00:00. @@ -52,11 +52,13 @@ jobs: - name: Run functional tests to verify the installation run: pixi run func-tests - - name: List the available EasyDiffraction tutorials - run: pixi run tutorials-list - - - name: Fetch the EasyDiffraction tutorials - run: pixi run tutorials-fetch + # Github token to avoid hitting the unauthenticated API rate limit + - name: List and fetch the EasyDiffraction tutorials + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + pixi run tutorials-list + pixi run tutorials-fetch - name: Test tutorials as notebooks run: pixi run notebook-tests diff --git a/.github/workflows/test-tutorials-colab.yaml b/.github/workflows/test-tutorials-colab.yaml index 6cfa6d76..d9429153 100644 --- a/.github/workflows/test-tutorials-colab.yaml +++ b/.github/workflows/test-tutorials-colab.yaml @@ -1,18 +1,6 @@ name: Test tutorials on Colab on: - # Trigger the workflow on push - #push: - # # Every branch - # branches: - # - '**' - # # 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: @@ -37,7 +25,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 diff --git a/.github/workflows/test-tutorials.yaml b/.github/workflows/test-tutorials.yaml index ccc0db3e..50928e0e 100644 --- a/.github/workflows/test-tutorials.yaml +++ b/.github/workflows/test-tutorials.yaml @@ -3,17 +3,11 @@ name: Test tutorials on: # Trigger the workflow on push push: - # Every branch - branches: - - '**' - # 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*' + # Selected branches + branches: [master, develop] # Trigger the workflow on pull request pull_request: - branches: - - '**' + 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. @@ -39,7 +33,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up pixi uses: prefix-dev/setup-pixi@v0.9.0 @@ -82,7 +76,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up pixi uses: prefix-dev/setup-pixi@v0.9.0 diff --git a/.github/workflows/trigger-test-code.yaml b/.github/workflows/trigger-test-code.yaml new file mode 100644 index 00000000..9346ceb2 --- /dev/null +++ b/.github/workflows/trigger-test-code.yaml @@ -0,0 +1,30 @@ +name: Trigger scheduled test code + +on: + # Run daily, at 00:00. + schedule: + - cron: '0 0 * * *' + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + trigger-test-tutorials: + runs-on: ubuntu-latest + + steps: + - name: Checkout develop branch + uses: actions/checkout@v5 + with: + ref: develop + + - name: Trigger test-tutorials workflow + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + await github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: "test-code.yaml", + ref: "develop" + }); diff --git a/.github/workflows/test-tutorials-nightly.yaml b/.github/workflows/trigger-test-tutorials.yaml similarity index 87% rename from .github/workflows/test-tutorials-nightly.yaml rename to .github/workflows/trigger-test-tutorials.yaml index 3a33b0df..4c09d5fc 100644 --- a/.github/workflows/test-tutorials-nightly.yaml +++ b/.github/workflows/trigger-test-tutorials.yaml @@ -1,4 +1,4 @@ -name: Test tutorials nightly (develop) +name: Trigger scheduled test tutorials on: # Run daily, at 00:00. @@ -8,12 +8,12 @@ on: workflow_dispatch: jobs: - call-tutorials: + trigger-test-tutorials: runs-on: ubuntu-latest steps: - name: Checkout develop branch - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: ref: develop diff --git a/.github/workflows/validate-pixi.yaml b/.github/workflows/validate-pixi.yaml deleted file mode 100644 index d2e1a468..00000000 --- a/.github/workflows/validate-pixi.yaml +++ /dev/null @@ -1,76 +0,0 @@ -name: Validate installation via Pixi - -on: - # Trigger the workflow on push - push: - # Every branch - branches: - - '**' - # 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: - -# 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 - the branch name (used in mkdocs.yml) - # GITHUB_TOKEN - to authenticate on GitHub (e.g. increase API rate limit) - CI_BRANCH: ${{ github.head_ref || github.ref_name }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - -jobs: - validate-pixi: - strategy: - matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - - runs-on: ${{ matrix.os }} - - steps: - - name: Set up pixi - uses: prefix-dev/setup-pixi@v0.9.0 - with: - run-install: false - cache: false - post-cleanup: false - - - name: Initialize a new Pixi project for EasyDiffraction - run: pixi init - - - name: Add Conda dependencies - run: pixi add python==3.13 jupyterlab pixi-kernel libcblas - - - name: Add PyPI dependencies - run: > - pixi add --pypi 'easydiffraction[dev, visualization]' --git - https://github.com/easyscience/diffraction-lib.git --branch ${{ - env.CI_BRANCH }} - - - name: Add a task to run EasyDiffraction from the command line - run: pixi task add easydiffraction "python -m easydiffraction" - - - name: List the available EasyDiffraction tutorials - run: pixi run easydiffraction list-tutorials - - - name: Fetch the EasyDiffraction tutorials - run: pixi run easydiffraction fetch-tutorials - - - name: Test execution of one of the tutorial notebooks - shell: bash - run: > - pixi run jupyter nbconvert --to notebook --execute - tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.ipynb --inplace - --ExecutePreprocessor.kernel_name=pixi-kernel-python3 --log-level=WARN diff --git a/docs/user-guide/analysis-workflow/experiment.md b/docs/user-guide/analysis-workflow/experiment.md index 90f51e6f..3bbc9fdc 100644 --- a/docs/user-guide/analysis-workflow/experiment.md +++ b/docs/user-guide/analysis-workflow/experiment.md @@ -4,11 +4,13 @@ icon: material/microscope # :material-microscope: Experiment -The **Experiment** in EasyDiffraction includes both the measured diffraction -data and all the other relevant parameters that describe the experimental setup -and related conditions. This can include information about the instrumental +An **Experiment** in EasyDiffraction includes the measured diffraction data +along with all relevant parameters that describe the experimental setup and +associated conditions. This can include information about the instrumental resolution, peak shape, background, etc. +## Defining an Experiment + EasyDiffraction allows you to: - **Load an existing experiment** from a file (**CIF** format). Both the @@ -23,24 +25,35 @@ EasyDiffraction. It is assumed that you have already created a `project` object, as described in the [Project](project.md) section as well as defined its `sample_models`, as described in the [Sample Model](model.md) section. -### Adding an Experiment from CIF +### Adding from CIF This is the most straightforward way to define an experiment in EasyDiffraction. If you have a crystallographic information file (CIF) for your experiment, that contains both the necessary information (metadata) about the experiment as well -as the measured data, you can add it to your project using the -`add_experiment_from_cif` method of the `project` instance. In this case, the -name of the experiment will be taken from CIF. +as the measured data, you can add it to your `project.experiments` collection +using the `add_from_cif_path` method. In this case, the name of the experiment +will be taken from CIF. ```python # Load an experiment from a CIF file -project.add_experiment_from_cif('data/hrpt_300K.cif') +project.experiments.add_from_cif_path('data/hrpt_300K.cif') +``` + +You can also pass the content of the CIF file as a string using the +`add_from_cif_str` method: + +```python +# Add an experiment from a CIF string +cif_string = """ +... content of the CIF file ... +""" +project.experiments.add_from_cif_str(cif_string) ``` -Accessing the experiment after loading it will be done through the `experiments` -object of the `project` instance. The name of the model will be the same as the -data block id in the CIF file. For example, if the CIF file contains a data -block with the id `hrpt`, +Accessing the experiment after adding it will also be done through the +`experiments` object of the `project` instance. The name of the experiment will +be the same as the data block id in the CIF file. For example, if the CIF file +contains a data block with the id `hrpt`, @@ -62,14 +75,19 @@ you can access it in the code as follows: project.experiments['hrpt'] ``` -## Defining an Experiment Manually +### Defining Manually If you do not have a CIF file or prefer to define the experiment manually, you -can use the `add` method of the `experiments` object of the `project` instance. -In this case, you will need to specify the name of the experiment, which will be -used to reference it later. Along with the name, you need to provide the -following parameters, essential for defining the experiment, which define the -**type of experiment**: +can use the `add_from_data_path` method of the `experiments` object of the +`project` instance. In this case, you will need to specify the **name** of the +experiment, which will be used to reference it later, as well as **data_path** +to the measured data file (e.g., `.xye`, `.xy`). Supported formats are described +in the [Measured Data Category](#5-measured-data-category) section. + +Optionally, you can also specify the additional parameters that define the +**type of experiment** you want to create. If you do not specify any of these +parameters, the default values will be used, which are the first in the list of +supported options for each parameter: - **sample_form**: The form of the sample (powder, single crystal). - **beam_mode**: The mode of the beam (constant wavelength, time-of-flight). @@ -82,42 +100,59 @@ following parameters, essential for defining the experiment, which define the these parameters. If you need to change them, you must create a new experiment or redefine the existing one. -If you have a measured data file, you can also specify: - -- **data_path**: The path to the measured data file (e.g., `.xye`, `.xy`). - Supported formats are described in the - [Measured Data Category](#5-measured-data-category) section. - -Here is an example of how to add an experiment with all components needed to -define the experiment explicitly set: +Here is an example of how to add an experiment with all relevant components +explicitly defined: ```python # Add an experiment with default parameters, based on the specified type. -# The experiment name is used to reference it later. -project.experiments.add(name='hrpt', - sample_form='powder', - beam_mode='constant wavelength', - radiation_probe='neutron', - scattering_type='bragg', - data_path='data/hrpt_lbco.xye') +project.experiments.add_from_data_path(name='hrpt', + data_path='data/hrpt_lbco.xye', + sample_form='powder', + beam_mode='constant wavelength', + radiation_probe='neutron', + scattering_type='bragg') ``` To add an experiment of default type, you can simply do: ```python # Add an experiment of default type -# The experiment name is used to reference it later. -project.experiments.add(name='hrpt', - data_path='data/hrpt_lbco.xye') +project.experiments.add_from_data_path(name='hrpt', + data_path='data/hrpt_lbco.xye') +``` + +If you do not have measured data for fitting and only want to view the simulated +pattern, you can define an experiment without measured data using the +`add_without_data` method: + +```python +# Add an experiment without measured data +project.experiments.add_without_data(name='hrpt', + sample_form='powder', + beam_mode='constant wavelength', + radiation_probe='x-ray') +``` + +Finally, you can also add an experiment by passing the experiment object +directly using the `add` method: + +```python +# Add an experiment by passing the experiment object directly +from easydiffraction import Experiment +experiment = Experiment(name='hrpt', + sample_form='powder', + beam_mode='constant wavelength', + radiation_probe='neutron', + scattering_type='bragg') +project.experiments.add(experiment) ``` -You can now change the default parameters of the experiment, categorized into -the groups based on the type of experiment. +## Modifying Parameters -The `add` method creates a new experiment of the specified type with default -parameters. You can then modify its parameters to match your specific -experimental setup. All parameters are grouped into the following categories, -which makes it easier to manage the experiment: +When an experiment is added, it is created with a set of default parameters that +you can modify to match your specific experimental setup. All parameters are +grouped into categories based on their function, making it easier to manage and +understand the different aspects of the experiment: 1. **Instrument Category**: Defines the instrument configuration, including wavelength, two-theta offset, and resolution parameters. @@ -349,14 +384,13 @@ Experiment πŸ”¬ 'hrpt' as cif ## Saving an Experiment -Saving the project, as described in the [Project](project.md) section, -will also save the experiment. Each experiment is saved as a separate -CIF file in the `experiments` subdirectory of the project directory. The project file contains -references to these files. +Saving the project, as described in the [Project](project.md) section, will +also save the experiment. Each experiment is saved as a separate CIF file in +the `experiments` subdirectory of the project directory. The project file +contains references to these files. -EasyDiffraction supports different types of experiments, and each experiment is saved in a -dedicated CIF file with -experiment-specific parameters. +EasyDiffraction supports different types of experiments, and each experiment +is saved in a dedicated CIF file with experiment-specific parameters. Below are examples of how different experiments are saved in CIF format. diff --git a/pixi.lock b/pixi.lock index 11d1feba..082cc218 100644 --- a/pixi.lock +++ b/pixi.lock @@ -21,21 +21,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h46c70d0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h7033f15_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hfab6e84_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hf01b4d8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -53,7 +53,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -127,7 +127,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py313h843e2db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py313h843e2db_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -212,7 +212,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9d/87/bc14f49bc95c4cb0dd0a8c56028a67c014ee7e6818ccdce74a4862af259b/msgspec-0.19.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/80/e5/5e22c5bf96a64bdd43518b1834c6d95a4922cc2066b7d8e467dae9b6cee6/multidict-6.6.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -277,21 +277,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py313h14b76d3_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py313h253db18_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313h49682b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313he20ea1e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -309,7 +309,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py313habf4b1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py313habf4b1d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -324,7 +324,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.0-h3d58e20_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda @@ -378,7 +378,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py313h66e1e84_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py313h66e1e84_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -463,7 +463,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/cb/2842c312bbe618d8fefc8b9cedce37f773cdc8fa453306546dba2c21fd98/msgspec-0.19.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4c/aa/8b6f548d839b6c13887253af4e29c939af22a18591bfb5d0ee6f1931dae8/multidict-6.6.4-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -528,21 +528,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313h928ef07_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313hb4b7877_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313hc845a76_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313h755b2b2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -560,7 +560,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -575,7 +575,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.0-hf598326_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda @@ -629,7 +629,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py313h80e0809_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py313h80e0809_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -713,7 +713,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/58/95/c40b01b93465e1a5f3b6c7d91b10fb574818163740cc3acbe722d1e0e7e4/msgspec-0.19.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/eb/c6/f5e97e5d99a729bc2aa58eb3ebfa9f1e56a9b517cc38c60537c81834a73f/multidict-6.6.4-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -777,22 +777,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py313h5813708_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py313hfe59770_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py313ha7868ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py313h5ea7bf4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -809,7 +809,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -879,7 +879,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py313hfbe8231_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py313hfbe8231_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh5737063_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -969,7 +969,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/d8/f15b40611c2d5753d1abb0ca0da0c75348daf1252220e5dda2867bd81062/msgspec-0.19.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/9d/34/746696dffff742e97cd6a23da953e55d0ea51fa601fa2ff387b3edcfaa2c/multidict-6.6.4-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -1040,20 +1040,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311h1ddb823_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311h5b438cf_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py311hc665b79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py311hc665b79_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -1071,7 +1071,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py311h38be061_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py311h38be061_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -1145,7 +1145,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py311h902ca64_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py311h902ca64_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -1216,7 +1216,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/2e/db7e189b57901955239f7689b5dcd6ae9458637a9c66747326726c650523/msgspec-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/6e/fac58b1072a6fc59af5e7acb245e8754d3e1f97f4f808a6559951f72a0d4/multidict-6.6.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -1275,20 +1275,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py311hc356e98_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py311h7b20566_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py311h137bacd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py311he66fa18_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py311hc651eee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py311hc651eee_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -1306,7 +1306,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py311h6eed73b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py311h6eed73b_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -1321,7 +1321,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.0-h3d58e20_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda @@ -1373,7 +1373,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py311hd3d88a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py311hd3d88a1_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -1444,7 +1444,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/24/d4/2ec2567ac30dab072cce3e91fb17803c52f0a37aab6b0c24375d2b20a581/msgspec-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/54/a3/bed07bc9e2bb302ce752f1dabc69e884cd6a676da44fb0e501b246031fdd/multidict-6.6.4-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -1503,20 +1503,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311h155a34a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311hf719da1_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py311h3a79f62_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py311h146a0b8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py311ha59bd64_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py311ha59bd64_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -1534,7 +1534,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py311h267d04e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py311h267d04e_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -1549,7 +1549,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.0-hf598326_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda @@ -1601,7 +1601,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py311h1c3fc1a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py311h1c3fc1a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -1671,7 +1671,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2b/c0/18226e4328897f4f19875cb62bb9259fe47e901eade9d9376ab5f251a929/msgspec-0.19.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/a7/4b/ceeb4f8f33cf81277da464307afeaf164fb0297947642585884f5cad4f28/multidict-6.6.4-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -1729,22 +1729,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311hda3d55a_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h3e6a449_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py311h3485c13_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.13-py311hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py311h5dfdfe8_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py311h5dfdfe8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -1761,7 +1761,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py311h1ea47a8_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py311h1ea47a8_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -1829,7 +1829,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py311hf51aa87_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py311hf51aa87_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh5737063_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -1905,7 +1905,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/3d/71b2dffd3a1c743ffe13296ff701ee503feaebc3f04d0e75613b6563c374/msgspec-0.19.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/74/7d/36b045c23a1ab98507aefd44fd8b264ee1dd5e5010543c6fccf82141ccef/multidict-6.6.4-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -1972,21 +1972,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h1289d80_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h35888ee_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.11-py312hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py312h8285ef7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py312h8285ef7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -2004,7 +2004,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py312h7900ff3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py312h7900ff3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -2079,7 +2079,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py312h868fb18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py312h868fb18_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -2150,7 +2150,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d0/ef/c5422ce8af73928d194a6606f8ae36e93a52fd5e8df5abd366903a5ca8da/msgspec-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/65/753a2d8b05daf496f4a9c367fe844e90a1b2cac78e2be2c844200d10cc4c/multidict-6.6.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -2210,21 +2210,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312haafddd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312h462f358_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py312hf857d28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py312hc05cdf7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.11-py312hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py312h2ac44ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py312h2ac44ba_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -2242,7 +2242,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py312hb401068_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py312hb401068_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -2257,7 +2257,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.0-h3d58e20_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda @@ -2310,7 +2310,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py312h00ff6fd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py312h00ff6fd_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -2381,7 +2381,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/5f/a70c24f075e3e7af2fae5414c7048b0e11389685b7f717bb55ba282a34a7/msgspec-0.19.0-cp312-cp312-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/99/58/45c3e75deb8855c36bd66cc1658007589662ba584dbf423d01df478dd1c5/multidict-6.6.4-cp312-cp312-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -2441,21 +2441,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hd8f9ff3_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312h6b01ec3_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h429097b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.11-py312hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py312he360a15_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py312he360a15_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -2473,7 +2473,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py312h81bd7bf_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py312h81bd7bf_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -2488,7 +2488,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.0-hf598326_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda @@ -2541,7 +2541,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py312h6f58b40_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py312h6f58b40_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -2611,7 +2611,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/89/b0/1b9763938cfae12acf14b682fcf05c92855974d921a5a985ecc197d1c672/msgspec-0.19.0-cp312-cp312-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fd/ca/e8c4472a93a26e4507c0b8e1f0762c0d8a32de1328ef72fd704ef9cc5447/multidict-6.6.4-cp312-cp312-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -2670,22 +2670,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py312h275cf98_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py312hbb81ca0_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py312h4389bb4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py312he06e257_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.11-py312hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py312ha1a9051_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py312ha1a9051_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -2702,7 +2702,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py312h2e8e312_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py312h2e8e312_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -2771,7 +2771,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py312hdabe01f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py312hdabe01f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh5737063_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -2847,7 +2847,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/ef/27dd35a7049c9a4f4211c6cd6a8c9db0a50647546f003a5867827ec45391/msgspec-0.19.0-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c7/eb/d88b1780d43a56db2cba24289fa744a9d216c1a8546a0dc3956563fd53ea/multidict-6.6.4-cp312-cp312-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -2914,21 +2914,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h46c70d0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h7033f15_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hfab6e84_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hf01b4d8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -2946,7 +2946,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -3020,7 +3020,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py313h843e2db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py313h843e2db_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -3090,7 +3090,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9d/87/bc14f49bc95c4cb0dd0a8c56028a67c014ee7e6818ccdce74a4862af259b/msgspec-0.19.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/80/e5/5e22c5bf96a64bdd43518b1834c6d95a4922cc2066b7d8e467dae9b6cee6/multidict-6.6.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -3150,21 +3150,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py313h14b76d3_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py313h253db18_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313h49682b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313he20ea1e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -3182,7 +3182,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py313habf4b1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py313habf4b1d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -3197,7 +3197,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.0-h3d58e20_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda @@ -3251,7 +3251,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py313h66e1e84_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py313h66e1e84_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -3321,7 +3321,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/cb/2842c312bbe618d8fefc8b9cedce37f773cdc8fa453306546dba2c21fd98/msgspec-0.19.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4c/aa/8b6f548d839b6c13887253af4e29c939af22a18591bfb5d0ee6f1931dae8/multidict-6.6.4-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -3381,21 +3381,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313h928ef07_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313hb4b7877_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313hc845a76_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313h755b2b2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -3413,7 +3413,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -3428,7 +3428,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.0-hf598326_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda @@ -3482,7 +3482,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py313h80e0809_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py313h80e0809_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -3551,7 +3551,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/58/95/c40b01b93465e1a5f3b6c7d91b10fb574818163740cc3acbe722d1e0e7e4/msgspec-0.19.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/eb/c6/f5e97e5d99a729bc2aa58eb3ebfa9f1e56a9b517cc38c60537c81834a73f/multidict-6.6.4-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -3610,22 +3610,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py313h5813708_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py313hfe59770_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py313ha7868ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py313h5ea7bf4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -3642,7 +3642,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -3712,7 +3712,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py313hfbe8231_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py313hfbe8231_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh5737063_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -3787,7 +3787,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/d8/f15b40611c2d5753d1abb0ca0da0c75348daf1252220e5dda2867bd81062/msgspec-0.19.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/9d/34/746696dffff742e97cd6a23da953e55d0ea51fa601fa2ff387b3edcfaa2c/multidict-6.6.4-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -3854,21 +3854,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h46c70d0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h7033f15_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hfab6e84_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hf01b4d8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -3885,7 +3885,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -3957,7 +3957,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py313h843e2db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py313h843e2db_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -4041,7 +4041,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9d/87/bc14f49bc95c4cb0dd0a8c56028a67c014ee7e6818ccdce74a4862af259b/msgspec-0.19.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/80/e5/5e22c5bf96a64bdd43518b1834c6d95a4922cc2066b7d8e467dae9b6cee6/multidict-6.6.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -4106,21 +4106,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py313h14b76d3_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py313h253db18_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313h49682b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313he20ea1e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -4137,7 +4137,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py313habf4b1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py313habf4b1d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -4152,7 +4152,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.0-h3d58e20_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda @@ -4204,7 +4204,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py313h66e1e84_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py313h66e1e84_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -4288,7 +4288,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/cb/2842c312bbe618d8fefc8b9cedce37f773cdc8fa453306546dba2c21fd98/msgspec-0.19.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4c/aa/8b6f548d839b6c13887253af4e29c939af22a18591bfb5d0ee6f1931dae8/multidict-6.6.4-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -4353,21 +4353,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313h928ef07_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313hb4b7877_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313hc845a76_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313h755b2b2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -4385,7 +4385,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -4400,7 +4400,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.0-hf598326_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda @@ -4452,7 +4452,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py313h80e0809_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py313h80e0809_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -4535,7 +4535,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/58/95/c40b01b93465e1a5f3b6c7d91b10fb574818163740cc3acbe722d1e0e7e4/msgspec-0.19.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/eb/c6/f5e97e5d99a729bc2aa58eb3ebfa9f1e56a9b517cc38c60537c81834a73f/multidict-6.6.4-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -4599,22 +4599,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py313h5813708_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py313hfe59770_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py313ha7868ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py313h5ea7bf4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -4631,7 +4631,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -4700,7 +4700,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py313hfbe8231_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py313hfbe8231_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh5737063_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -4790,7 +4790,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/d8/f15b40611c2d5753d1abb0ca0da0c75348daf1252220e5dda2867bd81062/msgspec-0.19.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/9d/34/746696dffff742e97cd6a23da953e55d0ea51fa601fa2ff387b3edcfaa2c/multidict-6.6.4-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -4862,21 +4862,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h46c70d0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h7033f15_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hfab6e84_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hf01b4d8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -4893,7 +4893,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -4965,7 +4965,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py313h843e2db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py313h843e2db_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -5003,6 +5003,7 @@ environments: - 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/91/3e/f7329f3beb975edf740f6112f72b5e32933bffb7011c96f68cc3c92934c3/bumps-1.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-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/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/73/dd/508420fb47d09d904d962f123221bc249f64b5e56aa93d5f5f7603be475f/coverage-7.10.6-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl @@ -5014,7 +5015,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/52/39914bf42bb01901c91781def35c1aeffa431a59299e9748c0cfae3e5493/diffpy_structure-3.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/c8/f0f4ab7fd08950d5358579364a0a9b9198bf03e179a4fcceae4b353be32e/diffpy_utils-3.6.1-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/32/bc/3f3ec4b7086d308c6ed2c76fb9f7f7a168b45500050bc69a01276754b9b0/easydiffraction-0.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3a/be/75c823e07c6c4d5d7ff78c65af162abf4ede96f6edd609635a1c5a1b3f09/easydiffraction-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f2/9f/bf231c2a3fac99d1d7f1d89c76594f158693f981a4aa02be406e9f036832/fonttools-4.59.2-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/72/31/bc8c5c99c7818293458fe745dab4fd5730ff49697ccc82b554eb69f16a24/frozenlist-1.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl @@ -5022,6 +5023,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/ec/86f59025306dcc6deee5fda54d980d077075b8d9889aac80f158bd585f1b/h5py-3.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.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/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-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 @@ -5033,7 +5035,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9d/87/bc14f49bc95c4cb0dd0a8c56028a67c014ee7e6818ccdce74a4862af259b/msgspec-0.19.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/80/e5/5e22c5bf96a64bdd43518b1834c6d95a4922cc2066b7d8e467dae9b6cee6/multidict-6.6.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -5059,14 +5061,17 @@ environments: - pypi: https://files.pythonhosted.org/packages/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/22/3c6cef96627f89b344c933781ed38329bfb87737aa438f15da95907cbfd5/ruff-0.12.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e4/82/08e4076df538fb56caa1d489588d880ec7c52d8273a606bb54d660528f7c/scipy-1.16.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.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/dc/29/11ae2c2b981de60187f7cbc84277d9d21f101093d1b2e945c63774477aba/sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.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/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -5089,21 +5094,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py313h14b76d3_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py313h253db18_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313h49682b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313he20ea1e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -5120,7 +5125,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py313habf4b1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py313habf4b1d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -5135,7 +5140,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.0-h3d58e20_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda @@ -5187,7 +5192,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py313h66e1e84_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py313h66e1e84_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -5225,6 +5230,7 @@ environments: - 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/91/3e/f7329f3beb975edf740f6112f72b5e32933bffb7011c96f68cc3c92934c3/bumps-1.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-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/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/bd/e7/917e5953ea29a28c1057729c1d5af9084ab6d9c66217523fd0e10f14d8f6/coverage-7.10.6-cp313-cp313-macosx_10_13_x86_64.whl @@ -5236,7 +5242,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/52/39914bf42bb01901c91781def35c1aeffa431a59299e9748c0cfae3e5493/diffpy_structure-3.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/c8/f0f4ab7fd08950d5358579364a0a9b9198bf03e179a4fcceae4b353be32e/diffpy_utils-3.6.1-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/32/bc/3f3ec4b7086d308c6ed2c76fb9f7f7a168b45500050bc69a01276754b9b0/easydiffraction-0.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3a/be/75c823e07c6c4d5d7ff78c65af162abf4ede96f6edd609635a1c5a1b3f09/easydiffraction-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/be/fc5fe58dd76af7127b769b68071dbc32d4b95adc8b58d1d28d42d93c90f2/fonttools-4.59.2-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/83/2e/5b70b6a3325363293fe5fc3ae74cdcbc3e996c2a11dde2fd9f1fb0776d19/frozenlist-1.7.0-cp313-cp313-macosx_10_13_x86_64.whl @@ -5244,6 +5250,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl - pypi: https://files.pythonhosted.org/packages/6c/c2/7efe82d09ca10afd77cd7c286e42342d520c049a8c43650194928bcc635c/h5py-3.14.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.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/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-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 @@ -5255,7 +5262,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/cb/2842c312bbe618d8fefc8b9cedce37f773cdc8fa453306546dba2c21fd98/msgspec-0.19.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4c/aa/8b6f548d839b6c13887253af4e29c939af22a18591bfb5d0ee6f1931dae8/multidict-6.6.4-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -5281,14 +5288,17 @@ environments: - pypi: https://files.pythonhosted.org/packages/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/e4/235ad6d1785a2012d3ded2350fd9bc5c5af8c6f56820e696b0118dfe7d24/ruff-0.12.11-py3-none-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/93/0b/b5c99382b839854a71ca9482c684e3472badc62620287cbbdab499b75ce6/scipy-1.16.1-cp313-cp313-macosx_10_14_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.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/41/1c/a7260bd47a6fae7e03768bf66451437b36451143f36b285522b865987ced/sqlalchemy-2.0.43-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.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/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -5311,21 +5321,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313h928ef07_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313hb4b7877_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313hc845a76_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313h755b2b2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -5343,7 +5353,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -5358,7 +5368,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.0-hf598326_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda @@ -5410,7 +5420,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py313h80e0809_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py313h80e0809_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -5448,6 +5458,7 @@ environments: - 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/91/3e/f7329f3beb975edf740f6112f72b5e32933bffb7011c96f68cc3c92934c3/bumps-1.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-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/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/eb/86/2e161b93a4f11d0ea93f9bebb6a53f113d5d6e416d7561ca41bb0a29996b/coverage-7.10.6-cp313-cp313-macosx_11_0_arm64.whl @@ -5459,13 +5470,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/52/39914bf42bb01901c91781def35c1aeffa431a59299e9748c0cfae3e5493/diffpy_structure-3.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/c8/f0f4ab7fd08950d5358579364a0a9b9198bf03e179a4fcceae4b353be32e/diffpy_utils-3.6.1-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/32/bc/3f3ec4b7086d308c6ed2c76fb9f7f7a168b45500050bc69a01276754b9b0/easydiffraction-0.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3a/be/75c823e07c6c4d5d7ff78c65af162abf4ede96f6edd609635a1c5a1b3f09/easydiffraction-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/13/7b/d0d3b9431642947b5805201fbbbe938a47b70c76685ef1f0cb5f5d7140d6/fonttools-4.59.2-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/f4/25/a0895c99270ca6966110f4ad98e87e5662eab416a17e7fd53c364bf8b954/frozenlist-1.7.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/06/6e3a083a02d2a1b7da69dce5538d51b4a83dc308e3ea9e21edcf324e10de/gemmi-0.7.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4f/31/f570fab1239b0d9441024b92b6ad03bb414ffa69101a985e4c83d37608bd/h5py-3.14.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.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/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-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 @@ -5477,7 +5489,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/58/95/c40b01b93465e1a5f3b6c7d91b10fb574818163740cc3acbe722d1e0e7e4/msgspec-0.19.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/eb/c6/f5e97e5d99a729bc2aa58eb3ebfa9f1e56a9b517cc38c60537c81834a73f/multidict-6.6.4-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -5503,14 +5515,17 @@ environments: - pypi: https://files.pythonhosted.org/packages/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/0d/15b72c5fe6b1e402a543aa9d8960e0a7e19dfb079f5b0b424db48b7febab/ruff-0.12.11-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/eb/e5/69ab2771062c91e23e07c12e7d5033a6b9b80b0903ee709c3c36b3eb520c/scipy-1.16.1-cp313-cp313-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.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/8e/84/8a337454e82388283830b3586ad7847aa9c76fdd4f1df09cdd1f94591873/sqlalchemy-2.0.43-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.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/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -5532,22 +5547,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py313h5813708_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py313hfe59770_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py313ha7868ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py313h5ea7bf4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -5564,7 +5579,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.1-he01879c_0.conda @@ -5633,7 +5648,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py313hfbe8231_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py313hfbe8231_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh5737063_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -5678,6 +5693,7 @@ environments: - 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/91/3e/f7329f3beb975edf740f6112f72b5e32933bffb7011c96f68cc3c92934c3/bumps-1.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-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/a7/14/0b831122305abcc1060c008f6c97bbdc0a913ab47d65070a01dc50293c2b/coverage-7.10.6-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fc/2f/27f1f4b79d968bb6d3a3b61e0679ddfb7c583c7654e14ddfa2ec9e07ddcf/cryspy-0.7.8-py3-none-any.whl @@ -5688,7 +5704,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/52/39914bf42bb01901c91781def35c1aeffa431a59299e9748c0cfae3e5493/diffpy_structure-3.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/c8/f0f4ab7fd08950d5358579364a0a9b9198bf03e179a4fcceae4b353be32e/diffpy_utils-3.6.1-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/32/bc/3f3ec4b7086d308c6ed2c76fb9f7f7a168b45500050bc69a01276754b9b0/easydiffraction-0.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3a/be/75c823e07c6c4d5d7ff78c65af162abf4ede96f6edd609635a1c5a1b3f09/easydiffraction-0.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ea/a9/be7219fc64a6026cc0aded17fa3720f9277001c185434230bd351bf678e6/fonttools-4.59.2-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/35/89/a487a98d94205d85745080a37860ff5744b9820a2c9acbcdd9440bfddf98/frozenlist-1.7.0-cp313-cp313-win_amd64.whl @@ -5696,6 +5712,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/3f/6d/0084ed0b78d4fd3e7530c32491f2884140d9b06365dac8a08de726421d4a/h5py-3.14.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.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/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-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 @@ -5707,7 +5724,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/d8/f15b40611c2d5753d1abb0ca0da0c75348daf1252220e5dda2867bd81062/msgspec-0.19.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/9d/34/746696dffff742e97cd6a23da953e55d0ea51fa601fa2ff387b3edcfaa2c/multidict-6.6.4-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-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/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl @@ -5733,14 +5750,17 @@ environments: - pypi: https://files.pythonhosted.org/packages/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/08/a5/34276984705bfe069cd383101c45077ee029c3fe3b28225bf67aa35f0647/ruff-0.12.11-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/21/12/c0efd2941f01940119b5305c375ae5c0fcb7ec193f806bd8f158b73a1782/scipy-1.16.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.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/ac/a5/ca2f07a2a201f9497de1928f787926613db6307992fe5cda97624eb07c2f/sqlalchemy-2.0.43-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.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/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -6368,207 +6388,207 @@ packages: version: 1.9.0 sha256: ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda - sha256: 4fab04fcc599853efb2904ea3f935942108613c7515f7dd57e7f034650738c52 - md5: 8565f7297b28af62e5de2d968ca32e31 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311h1ddb823_4.conda + sha256: 318d4985acbf46457d254fbd6f0df80cc069890b5fc0013b3546d88eee1b1a1f + md5: 7138a06a7b0d11a23cfae323e6010a08 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 + - libgcc >=14 + - libstdcxx >=14 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 constrains: - - libbrotlicommon 1.1.0 hb9d3cd8_3 + - libbrotlicommon 1.1.0 hb03c661_4 license: MIT license_family: MIT purls: - - pkg:pypi/brotli?source=hash-mapping - size: 350166 - timestamp: 1749230304421 -- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda - sha256: dc27c58dc717b456eee2d57d8bc71df3f562ee49368a2351103bc8f1b67da251 - md5: a32e0c069f6c3dcac635f7b0b0dac67e + - pkg:pypi/brotli?source=compressed-mapping + size: 354304 + timestamp: 1756599521587 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h1289d80_4.conda + sha256: 52a9ac412512b418ecdb364ba21c0f3dc96f0abbdb356b3cfbb980020b663d9b + md5: fd0e7746ed0676f008daacb706ce69e4 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 + - libgcc >=14 + - libstdcxx >=14 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 constrains: - - libbrotlicommon 1.1.0 hb9d3cd8_3 + - libbrotlicommon 1.1.0 hb03c661_4 license: MIT license_family: MIT purls: - - pkg:pypi/brotli?source=hash-mapping - size: 351721 - timestamp: 1749230265727 -- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h46c70d0_3.conda - sha256: e510ad1db7ea882505712e815ff02514490560fd74b5ec3a45a6c7cf438f754d - md5: 2babfedd9588ad40c7113ddfe6a5ca82 + - pkg:pypi/brotli?source=compressed-mapping + size: 354149 + timestamp: 1756599553574 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h7033f15_4.conda + sha256: b1941426e564d326097ded7af8b525540be219be7a88ca961d58a8d4fc116db2 + md5: bc8624c405856b1d047dd0a81829b08c depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 + - libgcc >=14 + - libstdcxx >=14 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 constrains: - - libbrotlicommon 1.1.0 hb9d3cd8_3 + - libbrotlicommon 1.1.0 hb03c661_4 license: MIT license_family: MIT purls: - - pkg:pypi/brotli?source=hash-mapping - size: 350295 - timestamp: 1749230225293 -- conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py311hc356e98_3.conda - sha256: 63f3771e23a1f3f9866ece0252586b5b57eefba8d83a2871a72c82716944cc7b - md5: 7259b2f4870cab602f1512562e5cbb30 + - pkg:pypi/brotli?source=compressed-mapping + size: 353639 + timestamp: 1756599425945 +- conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py311h7b20566_4.conda + sha256: 10afc3a0df8e7447c56b0753848336eeeeea04be9bf1817569c45755392de14b + md5: 13de3b969fd0ba12c4f6f9513f486f16 depends: - __osx >=10.13 - - libcxx >=18 + - libcxx >=19 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 constrains: - - libbrotlicommon 1.1.0 h6e16a3a_3 + - libbrotlicommon 1.1.0 h1c43f85_4 license: MIT license_family: MIT purls: - pkg:pypi/brotli?source=hash-mapping - size: 367210 - timestamp: 1749230581348 -- conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312haafddd8_3.conda - sha256: d1a8635422d99b4b7cc1b35d62d1a5c392ae0a4d74e0a44bf190916a21180ba3 - md5: 11489c0fc22f550acf63da5e7ec7304d + size: 368751 + timestamp: 1756600247737 +- conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312h462f358_4.conda + sha256: f5b7f28d19f21c2f5bd4608b2a075e872727dae8409303f53c756f44044a3a7f + md5: 6ed15514446509f33df546dcc1752eb1 depends: - __osx >=10.13 - - libcxx >=18 + - libcxx >=19 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 constrains: - - libbrotlicommon 1.1.0 h6e16a3a_3 + - libbrotlicommon 1.1.0 h1c43f85_4 license: MIT license_family: MIT purls: - pkg:pypi/brotli?source=hash-mapping - size: 367262 - timestamp: 1749230495846 -- conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py313h14b76d3_3.conda - sha256: b486b5d469bd412fcf5a49d50056a069d84d44f0762b64e18f5a3027b1871278 - md5: b48636a1c2074e650b7a930e3a68f104 + size: 369380 + timestamp: 1756600123615 +- conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py313h253db18_4.conda + sha256: fc4db6916598d1c634de85337db6d351d6f1cb8a93679715e0ee572777a5007e + md5: 8643345f12d0db3096a8aa0abd74f6e9 depends: - __osx >=10.13 - - libcxx >=18 + - libcxx >=19 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 constrains: - - libbrotlicommon 1.1.0 h6e16a3a_3 + - libbrotlicommon 1.1.0 h1c43f85_4 license: MIT license_family: MIT purls: - - pkg:pypi/brotli?source=hash-mapping - size: 366909 - timestamp: 1749230725855 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311h155a34a_3.conda - sha256: 7414997b02a5f07d0b089fb24f1e755347fd827fa5fd158681766fce9583dd9b - md5: ba41239b4753557a20cf2ac2cd4250c5 + - pkg:pypi/brotli?source=compressed-mapping + size: 369082 + timestamp: 1756600456664 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311hf719da1_4.conda + sha256: 64645da991de052f0e522486cf97f8457fb37ed5c30d67655d3a32d2b9f56167 + md5: 4cd43bb7ba1a3cb4cd7a2e335f6d3c32 depends: - __osx >=11.0 - - libcxx >=18 + - libcxx >=19 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 constrains: - - libbrotlicommon 1.1.0 h5505292_3 + - libbrotlicommon 1.1.0 h6caf38d_4 license: MIT license_family: MIT purls: - - pkg:pypi/brotli?source=hash-mapping - size: 338502 - timestamp: 1749230799184 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hd8f9ff3_3.conda - sha256: 35df7079768b4c51764149c42b14ccc25c4415e4365ecc06c38f74562d9e4d16 - md5: c7c728df70dc05a443f1e337c28de22d + - pkg:pypi/brotli?source=compressed-mapping + size: 340889 + timestamp: 1756599941690 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312h6b01ec3_4.conda + sha256: e45f24660a89c734c3d54f185ecdc359e52a5604d7e0b371e35dce042fa3cf3a + md5: 0d50ab05d6d8fa7a38213c809637ba6d depends: - __osx >=11.0 - - libcxx >=18 + - libcxx >=19 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 constrains: - - libbrotlicommon 1.1.0 h5505292_3 + - libbrotlicommon 1.1.0 h6caf38d_4 license: MIT license_family: MIT purls: - pkg:pypi/brotli?source=hash-mapping - size: 339365 - timestamp: 1749230606596 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313h928ef07_3.conda - sha256: 0f2f3c7b3f6a19a27b2878b58bfd16af69cea90d0d3052a2a0b4e0a2cbede8f9 - md5: 3030bcec50cc407b596f9311eeaa611f + size: 341750 + timestamp: 1756600036931 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313hb4b7877_4.conda + sha256: a6402a7186ace5c3eb21ed4ce50eda3592c44ce38ab4e9a7ddd57d72b1e61fb3 + md5: 9518cd948fc334d66119c16a2106a959 depends: - __osx >=11.0 - - libcxx >=18 + - libcxx >=19 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 constrains: - - libbrotlicommon 1.1.0 h5505292_3 + - libbrotlicommon 1.1.0 h6caf38d_4 license: MIT license_family: MIT purls: - - pkg:pypi/brotli?source=hash-mapping - size: 338938 - timestamp: 1749230456550 -- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311hda3d55a_3.conda - sha256: a602b15fe1b3a6b40aab7d99099a410b69ccad9bb273779531cef00fc52d762e - md5: 2d99144abeb3b6b65608fdd7810dbcbd + - pkg:pypi/brotli?source=compressed-mapping + size: 341104 + timestamp: 1756600117644 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h3e6a449_4.conda + sha256: d524edc172239fec70ad946e3b2fa1b9d7eea145ad80e9e66da25a4d815770ea + md5: 21d3a7fa95d27938158009cd08e461f2 depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 constrains: - - libbrotlicommon 1.1.0 h2466b09_3 + - libbrotlicommon 1.1.0 hfd05255_4 license: MIT license_family: MIT purls: - pkg:pypi/brotli?source=hash-mapping - size: 321757 - timestamp: 1749231264056 -- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py312h275cf98_3.conda - sha256: d5c18a90220853c86f7cc23db62b32b22c6c5fe5d632bc111fc1e467c9fd776f - md5: a87a39f9eb9fd5f171b13d8c79f7a99a + size: 323289 + timestamp: 1756600106141 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py312hbb81ca0_4.conda + sha256: f3c7c9b0a41c0ec0c231b92fe944e1ab9e64cf0b4ae9d82e25994d3233baa20c + md5: 3bb5cbb24258cc7ab83126976d36e711 depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 constrains: - - libbrotlicommon 1.1.0 h2466b09_3 + - libbrotlicommon 1.1.0 hfd05255_4 license: MIT license_family: MIT purls: - pkg:pypi/brotli?source=hash-mapping - size: 321941 - timestamp: 1749231054102 -- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py313h5813708_3.conda - sha256: 152e1f4bb8076b4f37a70e80dcd457a50e14e0bd5501351cd0fc602c5ef782a5 - md5: a25f98cfd4eb1ac26325c1869f11edf5 + size: 323090 + timestamp: 1756599941278 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py313hfe59770_4.conda + sha256: 0e98ebafd586c4da7d848f9de94770cb27653ba9232a2badb28f8a01f6e48fb5 + md5: 477bf04a8a3030368068ccd39b8c5532 depends: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 constrains: - - libbrotlicommon 1.1.0 h2466b09_3 + - libbrotlicommon 1.1.0 hfd05255_4 license: MIT license_family: MIT purls: - - pkg:pypi/brotli?source=hash-mapping - size: 321652 - timestamp: 1749231335599 + - pkg:pypi/brotli?source=compressed-mapping + size: 323459 + timestamp: 1756600051044 - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl name: build version: 1.3.0 @@ -6703,195 +6723,183 @@ packages: - pkg:pypi/certifi?source=compressed-mapping size: 158692 timestamp: 1754231530168 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda - sha256: bc47aa39c8254e9e487b8bcd74cfa3b4a3de3648869eb1a0b89905986b668e35 - md5: 55553ecd5328336368db611f350b7039 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311h5b438cf_1.conda + sha256: bbd04c8729e6400fa358536b1007c1376cc396d569b71de10f1df7669d44170e + md5: 82e0123a459d095ac99c76d150ccdacf depends: - __glibc >=2.17,<3.0.a0 - - libffi >=3.4,<4.0a0 - - libgcc >=13 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 - pycparser - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: MIT - license_family: MIT purls: - - pkg:pypi/cffi?source=hash-mapping - size: 302115 - timestamp: 1725560701719 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda - sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 - md5: a861504bbea4161a9170b85d4d2be840 + - pkg:pypi/cffi?source=compressed-mapping + size: 303055 + timestamp: 1756808613387 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h35888ee_1.conda + sha256: 13bf94678e7a853a39a2c6dc2674b096cfe80f43ad03d7fff4bcde05edf9fda4 + md5: 918e2510c64000a916355dcf09d26da2 depends: - __glibc >=2.17,<3.0.a0 - - libffi >=3.4,<4.0a0 - - libgcc >=13 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 - pycparser - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: MIT - license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping - size: 294403 - timestamp: 1725560714366 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hfab6e84_0.conda - sha256: 73cd6199b143a8a6cbf733ce124ed57defc1b9a7eab9b10fd437448caf8eaa45 - md5: ce6386a5892ef686d6d680c345c40ad1 + size: 295227 + timestamp: 1756808421998 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hf01b4d8_1.conda + sha256: 2c2d68ef3480c22e0d5837b9314579b4a8484ccfed264b8b7d5da70f695afdd9 + md5: c4a0f01c46bc155d205694bec57bd709 depends: - __glibc >=2.17,<3.0.a0 - - libffi >=3.4,<4.0a0 - - libgcc >=13 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 - pycparser - - python >=3.13.0rc1,<3.14.0a0 + - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: MIT - license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping - size: 295514 - timestamp: 1725560706794 -- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py311h137bacd_0.conda - sha256: 012ee7b1ed4f9b0490d6e90c72decf148d7575173c7eaf851cd87fd434d2cacc - md5: a4b0f531064fa3dd5e3afbb782ea2cd5 + size: 297231 + timestamp: 1756808418076 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py311he66fa18_1.conda + sha256: f5c6c73e0a389d2c89e10b36883e18cd3abd14756d9d01d53856aaae3131f219 + md5: 70cd671f73c5c08899d5c43366d37787 depends: - __osx >=10.13 - - libffi >=3.4,<4.0a0 + - libffi >=3.4.6,<3.5.0a0 - pycparser - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: MIT - license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping - size: 288762 - timestamp: 1725560945833 -- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py312hf857d28_0.conda - sha256: 94fe49aed25d84997e2630d6e776a75ee2a85bd64f258702c57faa4fe2986902 - md5: 5bbc69b8194fedc2792e451026cac34f + size: 294021 + timestamp: 1756808523082 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py312hc05cdf7_1.conda + sha256: b15b6214b6caad516e508878dccde3959b4c0226bc0c570501894d870ae54d0a + md5: c02ef6c340f9045e651a4e1bf6e99015 depends: - __osx >=10.13 - - libffi >=3.4,<4.0a0 + - libffi >=3.4.6,<3.5.0a0 - pycparser - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: MIT - license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping - size: 282425 - timestamp: 1725560725144 -- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313h49682b3_0.conda - sha256: 660c8f8488f78c500a1bb4a803c31403104b1ee2cabf1476a222a3b8abf5a4d7 - md5: 98afc301e6601a3480f9e0b9f8867ee0 + size: 288317 + timestamp: 1756808571109 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313he20ea1e_1.conda + sha256: be88bd2cbb3f1f4e16326affc22b2c26f926dd18e03defc24df1fe6c80e7ce18 + md5: fc55afa9103145b51e5227a4ef0b8bad depends: - __osx >=10.13 - - libffi >=3.4,<4.0a0 + - libffi >=3.4.6,<3.5.0a0 - pycparser - - python >=3.13.0rc1,<3.14.0a0 + - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: MIT - license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping - size: 284540 - timestamp: 1725560667915 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py311h3a79f62_0.conda - sha256: 253605b305cc4548b8f97eb7c2e146697e0c7672b099c4862ec5ca7e8e995307 - md5: a42272c5dbb6ffbc1a5af70f24c7b448 + size: 289490 + timestamp: 1756808563 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py311h146a0b8_1.conda + sha256: 97635f50d473eae17e11b954570efdc66b615dfa6321dd069742d6df4c14a8ba + md5: 1c72ccc307e7681c34e1c06c1711ee33 depends: - __osx >=11.0 - - libffi >=3.4,<4.0a0 + - libffi >=3.4.6,<3.5.0a0 - pycparser - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: MIT - license_family: MIT purls: - - pkg:pypi/cffi?source=hash-mapping - size: 288211 - timestamp: 1725560745212 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda - sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f - md5: 19a5456f72f505881ba493979777b24e + - pkg:pypi/cffi?source=compressed-mapping + size: 293204 + timestamp: 1756808628759 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h429097b_1.conda + sha256: d6f96b95916d994166d2649374420b11132b33043c68d8681ab9afe29df3fbc3 + md5: 9641dfbf70709463180c574a3a7a0b13 depends: - __osx >=11.0 - - libffi >=3.4,<4.0a0 + - libffi >=3.4.6,<3.5.0a0 - pycparser - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: MIT - license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping - size: 281206 - timestamp: 1725560813378 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313hc845a76_0.conda - sha256: 50650dfa70ccf12b9c4a117d7ef0b41895815bb7328d830d667a6ba3525b60e8 - md5: 6d24d5587a8615db33c961a4ca0a8034 + size: 287170 + timestamp: 1756808571913 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313h755b2b2_1.conda + sha256: 6dd0ba5c68f59eb4039399d0c51d060b89f2028acd5c2f7f6879476ab108d797 + md5: a9024b1e15f59ce83654d542f83c23be depends: - __osx >=11.0 - - libffi >=3.4,<4.0a0 + - libffi >=3.4.6,<3.5.0a0 - pycparser - - python >=3.13.0rc1,<3.14.0a0 - - python >=3.13.0rc1,<3.14.0a0 *_cp313 + - 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: 282115 - timestamp: 1725560759157 -- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py311he736701_0.conda - sha256: 9689fbd8a31fdf273f826601e90146006f6631619767a67955048c7ad7798a1d - md5: e1c69be23bd05471a6c623e91680ad59 + size: 289263 + timestamp: 1756808593662 +- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py311h3485c13_1.conda + sha256: 46baee342b50ce7fbf4c52267f73327cb0512b970332037c8911afee1e54f063 + md5: 553a1836df919ca232b80ce1324fa5bb depends: - pycparser - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT - license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping - size: 297627 - timestamp: 1725561079708 -- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py312h4389bb4_0.conda - sha256: ac007bf5fd56d13e16d95eea036433012f2e079dc015505c8a79efebbad1fcbc - md5: 08310c1a22ef957d537e547f8d484f92 + size: 296743 + timestamp: 1756808544874 +- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py312he06e257_1.conda + sha256: d175cbc3b11496456360922b0773d5b1f0bf8e414b48c55472d0790a5ceefdb9 + md5: a73ee5cb34f7a18dd6a11015de607e15 depends: - pycparser - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT - license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping - size: 288142 - timestamp: 1725560896359 -- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py313ha7868ed_0.conda - sha256: b19f581fe423858f1f477c52e10978be324c55ebf2e418308d30d013f4a476ff - md5: 519a29d7ac273f8c165efc0af099da42 + size: 291041 + timestamp: 1756808860538 +- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py313h5ea7bf4_1.conda + sha256: 8e2cd5b827a717d4a9f14594404a7d3693a5a7b7a9a181409ca1bd24a995d78c + md5: 69a537fed13191160f1a139b6d42f6c1 depends: - pycparser - - python >=3.13.0rc1,<3.14.0a0 + - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT - license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping - size: 291828 - timestamp: 1725561211547 + size: 290632 + timestamp: 1756808584791 - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda sha256: 838d5a011f0e7422be6427becba3de743c78f3874ad2743c341accbba9bb2624 md5: 7e7d5ef1b9ed630e4a1c358d6bc62284 @@ -7384,69 +7392,70 @@ packages: requires_dist: - pyobjc-framework-cocoa ; sys_platform == 'darwin' and extra == 'macos-listener' requires_python: '>=3.6' -- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py311hc665b79_0.conda - sha256: 6756a97f58d71258537463851b8d65470eb5a654a7f2cfe2454f552a043d0f3a - md5: c6e461ca971ca858743101f4d73d7de4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py311hc665b79_1.conda + sha256: 19b0d1d9b0459db1466ad5846f6a30408ca9bbe244dcbbf32708116b564ceb11 + md5: 06e8c743932cc7788624128d08bc8806 depends: - python - - __glibc >=2.17,<3.0.a0 + - libgcc >=14 - libstdcxx >=14 - libgcc >=14 + - __glibc >=2.17,<3.0.a0 - python_abi 3.11.* *_cp311 license: MIT license_family: MIT purls: - - pkg:pypi/debugpy?source=compressed-mapping - size: 2729938 - timestamp: 1754523410012 -- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py312h8285ef7_0.conda - sha256: ad6193b4c2771a82a8df3408d9c6174016b487fd1f7501b1618fa034c5118534 - md5: 6205bf8723b4b79275dd52ef60cf6af1 + - pkg:pypi/debugpy?source=hash-mapping + size: 2729957 + timestamp: 1756742061937 +- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py312h8285ef7_1.conda + sha256: 1212cba3b9eb610b53a59c88460049f0cce4e3b8b66c6376e10df3cdd74d80f1 + md5: 45b13b9f0c8995cef3cc4e62f8b4a3f3 depends: - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - libgcc >=14 + - __glibc >=2.17,<3.0.a0 - python_abi 3.12.* *_cp312 license: MIT license_family: MIT purls: - - pkg:pypi/debugpy?source=compressed-mapping - size: 2856116 - timestamp: 1754523420446 -- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_0.conda - sha256: 26c56e7f93cde8be5b1b3ec3404f95d2874946f6fe0182f6720e5c3232e006ed - md5: c6286f4df7bec3d3712d617a358149b4 + - pkg:pypi/debugpy?source=hash-mapping + size: 2856148 + timestamp: 1756742065364 +- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_1.conda + sha256: a5cefff8a7ef8a0ede9af01247bcebbc6222bc95a8e7eeeb0495765e22fc3f1c + md5: 17e1e8f60454cf198f17234ccbb2fa8d depends: - python - - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - - pkg:pypi/debugpy?source=compressed-mapping - size: 2868365 - timestamp: 1754523414483 -- conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py311hc651eee_0.conda - sha256: 54dcc946353860ab7a1850526cfee79b3f37a1740a3453fbdee4679c58356f77 - md5: 9d51e4f528d222d1bacde9793756ae1b + - pkg:pypi/debugpy?source=hash-mapping + size: 2868399 + timestamp: 1756742083538 +- conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py311hc651eee_1.conda + sha256: 7f7300ee62b58658813e99a08f4a6f8daf585420cab6330f083ae697f569e66a + md5: 32c16e5c0e427989aff77ead02bf7f88 depends: - python - - libcxx >=19 - __osx >=10.13 + - libcxx >=19 - python_abi 3.11.* *_cp311 license: MIT license_family: MIT purls: - pkg:pypi/debugpy?source=hash-mapping - size: 2665549 - timestamp: 1754523427493 -- conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py312h2ac44ba_0.conda - sha256: eeb94df68e7ff704a2a8ceb8bb945dc8bfbe009e900c510eb2125e2e34d98945 - md5: 5a6b041083ed03590235b65c7c8f32b4 + size: 2665552 + timestamp: 1756742018979 +- conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py312h2ac44ba_1.conda + sha256: 429e4d588b3b47933f9609ec57921be7751ea96aed94346d872eedbb72b9cdb6 + md5: 0dc68c62a279766247f2b317deb044d2 depends: - python - __osx >=10.13 @@ -7456,11 +7465,11 @@ packages: license_family: MIT purls: - pkg:pypi/debugpy?source=hash-mapping - size: 2760376 - timestamp: 1754523425543 -- conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_0.conda - sha256: 1c07630626879de9c4a63a767cc304d23373dc1c4fb92b1f1891534dcc316917 - md5: 3cd9930005c64df818f07d56c29bff1f + size: 2760369 + timestamp: 1756742032470 +- conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_1.conda + sha256: e57e4f91b2433d5726430cfe0a1b60cebb9743a18114614e7953ee726ff743d3 + md5: 35b920d8af8948d80dcbc01fe2d88467 depends: - python - __osx >=10.13 @@ -7470,56 +7479,56 @@ packages: license_family: MIT purls: - pkg:pypi/debugpy?source=hash-mapping - size: 2769397 - timestamp: 1754523432779 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py311ha59bd64_0.conda - sha256: 7fc4629c85a77ee9451250bb8927a021d1824591e7d71087e9d939120652b769 - md5: 5c8f35ae8f942259a3cdbc18d59f8cee + size: 2769428 + timestamp: 1756742032895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py311ha59bd64_1.conda + sha256: eea58c83203a96c1967574d495860bab109c52e10b41c5ac12daad7b66b81e70 + md5: 9d7f1641fc7385ed8dfc337d35ad4008 depends: - python - - __osx >=11.0 - - python 3.11.* *_cpython - libcxx >=19 + - python 3.11.* *_cpython + - __osx >=11.0 - python_abi 3.11.* *_cp311 license: MIT license_family: MIT purls: - - pkg:pypi/debugpy?source=compressed-mapping - size: 2666628 - timestamp: 1754523486167 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py312he360a15_0.conda - sha256: 144542a7c6f3970a8c7012f2b0bea625e0024e809091861f688a7c0786c3e4ee - md5: 5324a4353a78309f0cb874d1fa98e4da + - pkg:pypi/debugpy?source=hash-mapping + size: 2666633 + timestamp: 1756742041729 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py312he360a15_1.conda + sha256: cba7445a8f66174db5474635f57be16366f868609ad4cb8d9fd1bcda0d4c574e + md5: a32874675d3568f218e4ebd9a94cbd43 depends: - python + - libcxx >=19 - __osx >=11.0 - python 3.12.* *_cpython - - libcxx >=19 - python_abi 3.12.* *_cp312 license: MIT license_family: MIT purls: - pkg:pypi/debugpy?source=hash-mapping - size: 2752346 - timestamp: 1754523441845 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_0.conda - sha256: 214010d0ef5ec170cc24a28277c11893ecca0f78f0ba6ba6b90e8031ca8fff15 - md5: b8a25de90e021082a106f01be64c9c5b + size: 2752432 + timestamp: 1756742046739 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_1.conda + sha256: 25062aad4e332f5f083584b13f4e1e06748ad8e53779482fa62c036c761bddbd + md5: ceea9fb6d7a6205ad329692ae053736e depends: - python - - python 3.13.* *_cp313 - - __osx >=11.0 - libcxx >=19 + - __osx >=11.0 + - python 3.13.* *_cp313 - python_abi 3.13.* *_cp313 license: MIT license_family: MIT purls: - pkg:pypi/debugpy?source=hash-mapping - size: 2755818 - timestamp: 1754523422224 -- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py311h5dfdfe8_0.conda - sha256: 7f77807f4b514546ed99d16e32a7a5cb50a7cfb29ffda9ed7b387b86c8d5270b - md5: d6c11976c0cd038dccb7b6d443003dc5 + size: 2755888 + timestamp: 1756742003334 +- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py311h5dfdfe8_1.conda + sha256: 810fa69eca6adfbf707e2e31e26f24842ab313d2efbfdb8e73c15c164a8010d9 + md5: 5996fd469da1e196fd42c72a7b7a65ca depends: - python - vc >=14.3,<15 @@ -7532,12 +7541,12 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/debugpy?source=compressed-mapping - size: 3933374 - timestamp: 1754523438591 -- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py312ha1a9051_0.conda - sha256: 218fedb9654763d534575c1326115ef1bd09e72629876a06ce9a7c2bc71f68d7 - md5: d375809db8ab66d9f168241ce6942db5 + - pkg:pypi/debugpy?source=hash-mapping + size: 3933261 + timestamp: 1756742011482 +- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py312ha1a9051_1.conda + sha256: 67c240c00cc8bab3b8102bff19cc826d4ca555f28a71556b7c5cf24054ea71d5 + md5: f5b883d00fcf2671e0a501fdc1f69f43 depends: - python - vc >=14.3,<15 @@ -7550,12 +7559,12 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/debugpy?source=compressed-mapping - size: 3991664 - timestamp: 1754523434951 -- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_0.conda - sha256: 5829816abc09896825c1f587cbfbf5548b1e0aa39758fbb10a65d53889dfeac8 - md5: 5fe037380ae0b46e412141e4ddea31a0 + - pkg:pypi/debugpy?source=hash-mapping + size: 3991912 + timestamp: 1756742011688 +- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_1.conda + sha256: 89e86812b7163820e7316971e7b4cfcc32db9e043cf4698b7793207c3ef2592a + md5: f8323ed8df3c1a137fd0ef88cdaec20d depends: - python - vc >=14.3,<15 @@ -7568,9 +7577,9 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/debugpy?source=compressed-mapping - size: 4000318 - timestamp: 1754523432925 + - pkg:pypi/debugpy?source=hash-mapping + size: 4000266 + timestamp: 1756742028369 - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda sha256: c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017 md5: 9ce473d1d1be1cc3810856a48b3fab32 @@ -7716,10 +7725,10 @@ packages: - objgraph>=1.7.2 ; extra == 'graph' - gprof2dot>=2022.7.29 ; extra == 'profile' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/32/bc/3f3ec4b7086d308c6ed2c76fb9f7f7a168b45500050bc69a01276754b9b0/easydiffraction-0.6.1-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/3a/be/75c823e07c6c4d5d7ff78c65af162abf4ede96f6edd609635a1c5a1b3f09/easydiffraction-0.7.1-py3-none-any.whl name: easydiffraction - version: 0.6.1 - sha256: 3cef71522cfdef897c5d4a26e8884de3d6ea952ef19777a34a2e5c1f7514f565 + version: 0.7.1 + sha256: ec087650add423d65905aab66d9485c88191328560e8b1cca562338b0ab9b38c requires_dist: - asciichartpy - asteval @@ -7732,12 +7741,15 @@ packages: - gemmi - lmfit - pooch + - rich - scipy - sympy - tabulate + - typer - varname - build ; extra == 'dev' - jinja2 ; extra == 'dev' + - jupyterquiz ; extra == 'dev' - jupytext ; extra == 'dev' - nbmake ; extra == 'dev' - nbqa ; extra == 'dev' @@ -7763,7 +7775,7 @@ packages: requires_python: '>=3.11,<3.14' - pypi: ./ name: easydiffraction - version: 0.6.1+d2 + version: 0.7.1+d26 sha256: 46fc86fb1a4bfe96069b3bc7724859ee328306bd671558c80d11a3675e9d074e requires_dist: - asciichartpy @@ -7812,7 +7824,7 @@ packages: editable: true - pypi: ./ name: easydiffraction - version: 0.6.1+d2 + version: 0.7.1+d26 sha256: 46fc86fb1a4bfe96069b3bc7724859ee328306bd671558c80d11a3675e9d074e requires_dist: - asciichartpy @@ -7879,17 +7891,17 @@ packages: - pytest ; extra == 'testing' - tox ; extra == 'testing' requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda - sha256: 7510dd93b9848c6257c43fdf9ad22adf62e7aa6da5f12a6a757aed83bcfedf05 - md5: 81d30c08f9a3e556e8ca9e124b044d14 +- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + sha256: 210c8165a58fdbf16e626aac93cc4c14dbd551a01d1516be5ecad795d2422cad + md5: ff9efb7f7469aed3c4a8106ffa29593c depends: - - python >=3.9 + - python >=3.10 license: MIT license_family: MIT purls: - - pkg:pypi/executing?source=hash-mapping - size: 29652 - timestamp: 1745502200340 + - pkg:pypi/executing?source=compressed-mapping + size: 30753 + timestamp: 1756729456476 - pypi: https://files.pythonhosted.org/packages/13/7b/d0d3b9431642947b5805201fbbbe938a47b70c76685ef1f0cb5f5d7140d6/fonttools-4.59.2-cp313-cp313-macosx_10_13_universal2.whl name: fonttools version: 4.59.2 @@ -8952,153 +8964,141 @@ packages: - pkg:pypi/json5?source=hash-mapping size: 34191 timestamp: 1755034963991 -- conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py311h38be061_1.conda - sha256: 2f082f7b12a7c6824e051321c1029452562ad6d496ad2e8c8b7b3dea1c8feb92 - md5: 5ca76f61b00a15a9be0612d4d883badc +- conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py311h38be061_2.conda + sha256: 4e744b30e3002b519c48868b3f5671328274d1d78cc8cbc0cda43057b570c508 + md5: 5dd29601defbcc14ac6953d9504a80a7 depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping - size: 17645 - timestamp: 1725303065473 -- conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py312h7900ff3_1.conda - sha256: 76ccb7bffc7761d1d3133ffbe1f7f1710a0f0d9aaa9f7ea522652e799f3601f4 - md5: 6b51f7459ea4073eeb5057207e2e1e3d + size: 18368 + timestamp: 1756754243123 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py312h7900ff3_2.conda + sha256: 39c77cd86d9f544e3ce11fdbab1047181d08dd14a72461d06d957b5fcfc78615 + md5: eeaf37c3dc2d1660668bd102c841f783 depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping - size: 17277 - timestamp: 1725303032027 -- conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_1.conda - sha256: 18d412dc91ee7560f0f94c19bb1c3c23f413b9a7f55948e2bb3ce44340439a58 - md5: 668d64b50e7ce7984cfe09ed7045b9fa + size: 17957 + timestamp: 1756754245172 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_2.conda + sha256: 9174f5209f835cc8918acddc279be919674d874179197e025181fe2a71cb0bce + md5: c1375f38e5f3ee38a9ee0e405a601c35 depends: - - python >=3.13.0rc1,<3.14.0a0 + - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping - size: 17568 - timestamp: 1725303033801 -- conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py311h6eed73b_1.conda - sha256: 2499e5ebb3efa4186d6922122224d16bac791a5c0adad5b48b2bcd1e1e2afc8d - md5: b6c1710105dad14d47001a339cd14da6 + size: 18143 + timestamp: 1756754243113 +- conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py311h6eed73b_2.conda + sha256: 8e0f5af4d5bd59f52d27926750416638e32a65d58a202593fa0e97f312ad78c3 + md5: 9983b3959da3b695c8da48c93510cbdf depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping - size: 17727 - timestamp: 1725302991176 -- conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py312hb401068_1.conda - sha256: 52fcb1db44a935bba26988cc17247a0f71a8ad2fbc2b717274a8c8940856ee0d - md5: 5dcf96bca4649d496d818a0f5cfb962e + size: 18407 + timestamp: 1756754411612 +- conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py312hb401068_2.conda + sha256: a945774394a13fb5f17a3f74038bd7788ffb46aff22aea9f56995e4719f57ee8 + md5: 7632694baab67c90efad51eb38e53fbd depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping - size: 17560 - timestamp: 1725303027769 -- conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py313habf4b1d_1.conda - sha256: f4fdd6b6451492d0b179efcd31b0b3b75ec6d6ee962ea50e693f5e71a94089b7 - md5: a93dd2fcffa0290ca107f3bda7bc68ac + size: 18062 + timestamp: 1756754437263 +- conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py313habf4b1d_2.conda + sha256: 444b99db8da2f87910967012bca4767dbc27024604cb11674baf5b33ad05e216 + md5: 6c9ecc26d54c3b9f9c40a7a21f780243 depends: - - python >=3.13.0rc1,<3.14.0a0 + - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping - size: 17733 - timestamp: 1725303034373 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py311h267d04e_1.conda - sha256: 736304347653ed421b13c56ba6f4f87c1d78d24cd3fa74db0db6fb70c814fa65 - md5: 5bce88ac1bef7d47c62cb574b25891ae + size: 18208 + timestamp: 1756754393540 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py311h267d04e_2.conda + sha256: 92b998fa9e68b7793b5b15882932f7703cdc1cc6e1348d0a1799567ef6f04428 + md5: 0edc5f25c32d86d5b4327e0f4de539f9 depends: - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping - size: 18253 - timestamp: 1725303181400 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py312h81bd7bf_1.conda - sha256: f6fb3734e967d1cd0cde32844ee952809f6c0a49895da7ec1c8cfdf97739b947 - md5: 80f403c03290e1662be03e026fb5f8ab + size: 18716 + timestamp: 1756754690458 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py312h81bd7bf_2.conda + sha256: 1580c22576df479b8a05370a162aa1bca8ba048f6f5c43ec9269e600c64f43b0 + md5: bfd72094f8390de02e426ac61fb7b8ee depends: - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping - size: 17865 - timestamp: 1725303130815 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_1.conda - sha256: cc2f68ceb34bca53b7b9a3eb3806cc893ef8713a5a6df7edf7ff989f559ef81d - md5: f2757998237755a74a12680a4e6a6bd6 - depends: - - python >=3.13.0rc1,<3.14.0a0 - - python >=3.13.0rc1,<3.14.0a0 *_cp313 + size: 18540 + timestamp: 1756754421272 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_2.conda + sha256: 6e6097b156b2c69bcf05842f86a6650eb474477bec5e2233b4b8bcd2936cda5a + md5: 51a61cf0de7b177b4c09fa5eb4775c76 + depends: + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping - size: 18232 - timestamp: 1725303194596 -- conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py311h1ea47a8_1.conda - sha256: 9a667eeae67936e710ff69ee7ce0e784d6052eeba9670b268c565a55178098c4 - md5: 943f7fab631e12750641efd7279a268c + size: 18604 + timestamp: 1756754452012 +- conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py311h1ea47a8_2.conda + sha256: 64bcf78dbbda7ec523672c4b3f085527fd109732518e33907eac6b8049125113 + md5: c8f80d7bee5c66371969936eba774c45 depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping - size: 42891 - timestamp: 1725303340467 -- conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py312h2e8e312_1.conda - sha256: 6865b97780e795337f65592582aee6f25e5b96214c64ffd3f8cdf580fd64ba22 - md5: e3ceda014d8461a11ca8552830a978f9 + size: 43432 + timestamp: 1756754355044 +- conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py312h2e8e312_2.conda + sha256: c90c629ee1aba706a3ff833a94f9eee7732a11cbc897ec38a45f22c812aef408 + md5: fc28e1f2ded45c9213cc9470600a1a2b depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping - size: 42235 - timestamp: 1725303419414 -- conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_1.conda - sha256: a0625cb0e86775b8996b4ee7117f1912b2fa3d76be8d10bf1d7b39578f5d99f7 - md5: 001efbf150f0ca5fd0a0c5e6e713c1d1 + size: 43140 + timestamp: 1756754401483 +- conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_2.conda + sha256: dda25a66128a7b883515a659cd53c694e735374ccfbfa87a998160a33679424a + md5: 8da802c2a92986f7054f97c45e0f4bee depends: - - python >=3.13.0rc1,<3.14.0a0 + - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping - size: 42805 - timestamp: 1725303293802 + size: 43276 + timestamp: 1756754377785 - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda sha256: ac377ef7762e49cb9c4f985f1281eeff471e9adc3402526eea78e6ac6589cf1d md5: 341fd940c242cf33e832c0402face56f @@ -9591,26 +9591,26 @@ packages: purls: [] size: 70700 timestamp: 1754682490395 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda - sha256: 9643d6c5a94499cddb5ae1bccc4f78aef8cfd77bcf6b37ad325bc7232a8a870f - md5: d2db320b940047515f7a27f870984fe7 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.0-h3d58e20_1.conda + sha256: ff2c82c14232cc0ff8038b3d43dace4a792c05a9b01465448445ac52539dee40 + md5: d5bb255dcf8d208f30089a5969a0314b depends: - __osx >=10.13 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 564830 - timestamp: 1752814841086 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda - sha256: 119b3ac75cb1ea29981e5053c2cb10d5f0b06fcc81b486cb7281f160daf673a1 - md5: a69ef3239d3268ef8602c7a7823fd982 + size: 572463 + timestamp: 1756698407882 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.0-hf598326_1.conda + sha256: 58427116dc1b58b13b48163808daa46aacccc2c79d40000f8a3582938876fed7 + md5: 0fb2c0c9b1c1259bc7db75c1342b1d99 depends: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 568267 - timestamp: 1752814881595 + size: 568692 + timestamp: 1756698505599 - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 md5: c277e0a4d549b03ac1e9d6cbbe3d017b @@ -11398,10 +11398,10 @@ packages: requires_dist: - typing-extensions>=4.1.0 ; python_full_version < '3.11' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/dd/54/1ecca75e51d7da8ca53d1ffa8636ef9077a6eaa31f43ade71360b3e6449a/narwhals-2.2.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/7d/81/1cf7a468ef2f8e88266d5c3e5ab026a045aa76150e6640bfe9c5450a8c11/narwhals-2.3.0-py3-none-any.whl name: narwhals - version: 2.2.0 - sha256: 2b5e3d61a486fa4328c286b0c8018b3e781a964947ff725d66ba12f6d5ca3d2a + version: 2.3.0 + sha256: 5507b1a9a9c2b1c55a627fdf6cf722fef2e23498bd14362a332c8848a311c321 requires_dist: - cudf>=24.10.0 ; extra == 'cudf' - dask[dataframe]>=2024.8 ; extra == 'dask' @@ -11416,7 +11416,7 @@ packages: - pyarrow>=13.0.0 ; extra == 'pyarrow' - pyspark>=3.5.0 ; extra == 'pyspark' - pyspark[connect]>=3.5.0 ; extra == 'pyspark-connect' - - sqlframe>=3.22.0 ; extra == 'sqlframe' + - sqlframe>=3.22.0,!=3.39.3 ; extra == 'sqlframe' requires_python: '>=3.9' - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda sha256: a20cff739d66c2f89f413e4ba4c6f6b59c50d5c30b5f0d840c13e8c9c2df9135 @@ -15030,25 +15030,25 @@ packages: - markdown-it-py>=2.2.0 - pygments>=2.13.0,<3.0.0 requires_python: '>=3.8.0' -- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py311h902ca64_0.conda - sha256: 72231a2721aa5d1bcee36bf1a33e57e500f820feb09058700365ea8e5d9c982d - md5: 486cb477243a9538130c439e66277069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py311h902ca64_1.conda + sha256: d9bc1564949ede4abd32aea34cf1997d704b6091e547f255dc0168996f5d5ec8 + md5: 622c389c080689ba1575a0750eb0209d depends: - python - - __glibc >=2.17,<3.0.a0 - libgcc >=14 + - __glibc >=2.17,<3.0.a0 - python_abi 3.11.* *_cp311 constrains: - __glibc >=2.17 license: MIT license_family: MIT purls: - - pkg:pypi/rpds-py?source=hash-mapping - size: 387122 - timestamp: 1756315600112 -- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py312h868fb18_0.conda - sha256: d9ace02196f551cbe608fd9d64628239a2101815a96a8a095e7a426b19956176 - md5: 2c5c390ddeffeb6eecc79df2416783d0 + - pkg:pypi/rpds-py?source=compressed-mapping + size: 387057 + timestamp: 1756737832651 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py312h868fb18_1.conda + sha256: 76efba673e02d4d47bc2de6e48a8787ed98bae4933233dee5ce810fa3de6ef2b + md5: 0e32f9c8ca00c1b926a1b77be6937112 depends: - python - __glibc >=2.17,<3.0.a0 @@ -15060,11 +15060,11 @@ packages: license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 389613 - timestamp: 1756315744748 -- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py313h843e2db_0.conda - sha256: 64e5748673d41f055ff4ca5e7a720e9a0a6122f7b2954d21d427f247b9d3e2b8 - md5: f713aec06900657c138e60dc61889557 + size: 389483 + timestamp: 1756737801011 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.1-py313h843e2db_1.conda + sha256: a976e90dbd229f7dcd357b0f9a5b637bf85243f3a3e844c1e266472cae53e359 + md5: 06c117e49934b564ef9ff6e61f279301 depends: - python - __glibc >=2.17,<3.0.a0 @@ -15076,11 +15076,11 @@ packages: license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 389201 - timestamp: 1756315722486 -- conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py311hd3d88a1_0.conda - sha256: e4b010b8576d2da3826f0d31e298bf4af6dd22cc3c4b99ac537aa378bbae56f9 - md5: 2313cb4dcdec1663a07c03d3181111ea + size: 389189 + timestamp: 1756737629819 +- conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py311hd3d88a1_1.conda + sha256: 85357c87af076680c071a8ea843bea554d58694d011104b721cc13bbf9ad0e75 + md5: 4b9839b15de18289ee5289a6dbcb8a45 depends: - python - __osx >=10.13 @@ -15091,11 +15091,11 @@ packages: license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 376104 - timestamp: 1756315362043 -- conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py312h00ff6fd_0.conda - sha256: 2306a04385d8e25d0e7279baed4b65633b4cb4548bdccbbbbb0dd3f78f1808b3 - md5: 552f8c0cb3f903bdbf4c9ca247ec17da + size: 376118 + timestamp: 1756737583772 +- conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py312h00ff6fd_1.conda + sha256: f874aec023c935c85a2ab189ba95686a3b635ccd7ca34fef14a31a1ad018c31d + md5: a9774657c6e8fa5ec812b96b61fee9e0 depends: - python - __osx >=10.13 @@ -15106,11 +15106,11 @@ packages: license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 368751 - timestamp: 1756315393985 -- conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py313h66e1e84_0.conda - sha256: 8c5ffeca70230f1a17f7a77c4e076630d6f7b6f3d22b5d3a876947de9474c072 - md5: 1c76a37ff2400bc40a83ef4c765eaf5c + size: 368760 + timestamp: 1756737471940 +- conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.1-py313h66e1e84_1.conda + sha256: a4f887801670167d92152bfe240e9c5c0ed2431c3576241058bc6724e691c486 + md5: 5525368b99f51b2593de0f0b335fec8f depends: - python - __osx >=10.13 @@ -15121,11 +15121,11 @@ packages: license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 368886 - timestamp: 1756315420318 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py311h1c3fc1a_0.conda - sha256: 68196572450da817fb3c526ad2737ea793aa9c87f1b4814a1e731c457459c0ea - md5: 56ebedc5c64f5c3d513a9532d67952fc + size: 368896 + timestamp: 1756737495945 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py311h1c3fc1a_1.conda + sha256: 95714a24265b6b4d4b218e303dcb075ba435826cb1d5927792ec94a8196c3e72 + md5: 5236ffaff99e6421aa4431b4c00ca47a depends: - python - python 3.11.* *_cpython @@ -15137,15 +15137,15 @@ packages: license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 362222 - timestamp: 1756315412012 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py312h6f58b40_0.conda - sha256: 6f5facd8070e49d765e048d1c1020695e92f3599613a8aba906e8b7a138e82cf - md5: c19f1dc374945c973e6eb9fe8a59eee5 + size: 362213 + timestamp: 1756737586989 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py312h6f58b40_1.conda + sha256: 6a7d5d862f90a1d594213d2be34598988e34dd19040fd865dcd60c4fca023cbc + md5: ba21b22f398ede2df8c35f88a967be97 depends: - python - - python 3.12.* *_cpython - __osx >=11.0 + - python 3.12.* *_cpython - python_abi 3.12.* *_cp312 constrains: - __osx >=11.0 @@ -15153,15 +15153,15 @@ packages: license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 355120 - timestamp: 1756315384118 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py313h80e0809_0.conda - sha256: a4bd0f620cdab3760b7f8a39248ce974187c160f8cd54860f2d8674d75e7d711 - md5: 853010644628104ea462f6458a7e0a44 + size: 355109 + timestamp: 1756737521820 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.1-py313h80e0809_1.conda + sha256: 26a8e509a1fc87986c24534bc3eddfa25ed3bbcea32ed64663f380b5b28e8c94 + md5: 22c8096afd85182d01d95f5a411ef804 depends: - python - - __osx >=11.0 - python 3.13.* *_cp313 + - __osx >=11.0 - python_abi 3.13.* *_cp313 constrains: - __osx >=11.0 @@ -15169,11 +15169,11 @@ packages: license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 354660 - timestamp: 1756315398955 -- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py311hf51aa87_0.conda - sha256: 99984fb89ee84721a7d31e1346f4f973e71e284252e17d7c7a1806e945ab6e14 - md5: 46f38e6cf7d54ba38d57400d72a3fe51 + size: 354648 + timestamp: 1756737507794 +- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py311hf51aa87_1.conda + sha256: e61607627213b70e7be73570e7ef5e2d36b583512def108aaf78a6ab16f0cdd9 + md5: 3c5b42969dae70e100154750d29d43cc depends: - python - vc >=14.3,<15 @@ -15187,11 +15187,11 @@ packages: license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 247099 - timestamp: 1756315334599 -- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py312hdabe01f_0.conda - sha256: 3d475dd9aba7517c744ba7e78e5a902dc37029de2b74be7e04d6885bfba65904 - md5: 995d26b9ef26e098ddb6a14d999a5a1b + size: 247101 + timestamp: 1756737437304 +- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py312hdabe01f_1.conda + sha256: 67f9ba28a0fd97cecba1203770c60c501adcefa86330f96a1581de34ec79f22e + md5: b918460732f2e1de583e831e1388648d depends: - python - vc >=14.3,<15 @@ -15205,11 +15205,11 @@ packages: license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 250682 - timestamp: 1756315335998 -- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py313hfbe8231_0.conda - sha256: 3239b9612d2ee2e8e1c6af84b426a46031a8c6c712420024afacdaa534ee0411 - md5: bdaef5397588a4b73e788cf33d6b2a5e + size: 250680 + timestamp: 1756737469101 +- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.27.1-py313hfbe8231_1.conda + sha256: 0a300df3466cb98834d60f1863db60fc8d4d0cbbd732b153d3a656654f307fa2 + md5: 9fbdb4338b80392e5d59529712f30763 depends: - python - vc >=14.3,<15 @@ -15223,8 +15223,8 @@ packages: license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 250241 - timestamp: 1756315366475 + size: 250236 + timestamp: 1756737484957 - pypi: https://files.pythonhosted.org/packages/08/a5/34276984705bfe069cd383101c45077ee029c3fe3b28225bf67aa35f0647/ruff-0.12.11-py3-none-win_amd64.whl name: ruff version: 0.12.11 diff --git a/pixi.toml b/pixi.toml index e96045d4..caadd8fe 100644 --- a/pixi.toml +++ b/pixi.toml @@ -101,8 +101,8 @@ py313-prod = { features = ["py313", "ed-pypi"] } [tasks] # πŸ§ͺ Testing Tasks -unit-tests = "python -m pytest tests/unit_tests/ --color=yes -v" -func-tests = "python -m pytest tests/functional_tests/ --color=yes -n auto -v" +unit-tests = "python -m pytest tests/unit/ --color=yes -v" +func-tests = "python -m pytest tests/functional/ --color=yes -n auto -v" notebook-tests = 'python -m pytest --nbmake tutorials/ --nbmake-timeout=600 --color=yes -n auto -v' script-tests = 'python -m pytest tools/test_scripts.py --color=yes -n auto -v' diff --git a/pixi/prod/pixi.toml b/pixi/prod/pixi.toml index 918a6d46..dd95fd5d 100644 --- a/pixi/prod/pixi.toml +++ b/pixi/prod/pixi.toml @@ -15,8 +15,8 @@ pixi-kernel = "*" easydiffraction = { version = "*", extras = ["dev", "visualization"] } [tasks] -unit-tests = "python -m pytest tests/unit_tests/ --color=yes -v" -func-tests = "python -m pytest tests/functional_tests/ --color=yes -n auto -v" +unit-tests = "python -m pytest tests/unit/ --color=yes -v" +func-tests = "python -m pytest tests/functional/ --color=yes -n auto -v" notebook-tests = "python -m pytest --nbmake tutorials/ --nbmake-timeout=600 --color=yes -n auto -v" easydiffraction = "python -m easydiffraction" tutorials-list = "python -m easydiffraction list-tutorials" diff --git a/pixi/wheel/pixi.toml b/pixi/wheel/pixi.toml index 9aa05d85..03cd0f74 100644 --- a/pixi/wheel/pixi.toml +++ b/pixi/wheel/pixi.toml @@ -26,6 +26,6 @@ py312-wheel = { features = ["py312"] } # = ["default", "py312"] py313-wheel = { features = ["py313"] } # = ["default", "py313"] [tasks] -unit-tests = "python -m pytest tests/unit_tests/ --color=yes -v" -func-tests = "python -m pytest tests/functional_tests/ --color=yes -n auto -v" +unit-tests = "python -m pytest tests/unit/ --color=yes -v" +func-tests = "python -m pytest tests/functional/ --color=yes -n auto -v" easydiffraction = "python -m easydiffraction" diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 00000000..9aae88b7 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +markers = + fast: mark test as fast (should be run on every push) diff --git a/src/easydiffraction/experiments/experiment.py b/src/easydiffraction/experiments/experiment.py index ffef2ada..d1a5bd1d 100644 --- a/src/easydiffraction/experiments/experiment.py +++ b/src/easydiffraction/experiments/experiment.py @@ -418,6 +418,38 @@ def show_meas_chart(self) -> None: class ExperimentFactory: """Creates Experiment instances with only relevant attributes.""" + _valid_arg_sets = [ + { + 'required': ['cif_path'], + 'optional': [], + }, + { + 'required': ['cif_str'], + 'optional': [], + }, + { + 'required': [ + 'name', + 'data_path', + ], + 'optional': [ + 'sample_form', + 'beam_mode', + 'radiation_probe', + 'scattering_type', + ], + }, + { + 'required': ['name'], + 'optional': [ + 'sample_form', + 'beam_mode', + 'radiation_probe', + 'scattering_type', + ], + }, + ] + _supported = { 'bragg': { 'powder': PowderExperiment, @@ -429,50 +461,105 @@ class ExperimentFactory: } @classmethod - def create( - cls, - name: str, - sample_form: DEFAULT_SAMPLE_FORM, - beam_mode: DEFAULT_BEAM_MODE, - radiation_probe: DEFAULT_RADIATION_PROBE, - scattering_type: DEFAULT_SCATTERING_TYPE, - ) -> BaseExperiment: - # TODO: Add checks for expt_type and expt_class - expt_type = ExperimentType( - sample_form=sample_form, - beam_mode=beam_mode, - radiation_probe=radiation_probe, - scattering_type=scattering_type, - ) + def create(cls, **kwargs): + """ + Main factory method for creating an experiment instance. + Validates argument combinations and dispatches to the appropriate creation method. + Raises ValueError if arguments are invalid or no valid dispatch is found. + """ + user_args = [k for k, v in kwargs.items() if v is not None] + if not cls.is_valid_args(user_args): + raise ValueError(f'Invalid argument combination: {user_args}') + + if 'cif_path' in kwargs: + return cls._create_from_cif_path(kwargs) + elif 'cif_str' in kwargs: + return cls._create_from_cif_str(kwargs) + elif 'data_path' in kwargs: + return cls._create_from_data_path(kwargs) + elif 'name' in kwargs: + return cls._create_without_data(kwargs) + raise ValueError('No valid argument combination found for experiment creation.') + + @staticmethod + def _create_from_cif_path(cif_path): + """ + Create an experiment from a CIF file path. + Not yet implemented. + """ + # TODO: Implement CIF file loading logic + raise NotImplementedError('CIF file loading not implemented yet.') + + @staticmethod + def _create_from_cif_str(cif_str): + """ + Create an experiment from a CIF string. + Not yet implemented. + """ + # TODO: Implement CIF string loading logic + raise NotImplementedError('CIF string loading not implemented yet.') + + @classmethod + def _create_from_data_path(cls, kwargs): + """ + Create an experiment from a raw data ASCII file. + Loads the experiment and attaches measured data from the specified file. + """ + expt_type = cls._make_experiment_type(kwargs) + scattering_type = expt_type.scattering_type.value + sample_form = expt_type.sample_form.value + expt_class = cls._supported[scattering_type][sample_form] + expt_name = kwargs['name'] + expt_obj = expt_class(name=expt_name, type=expt_type) + data_path = kwargs['data_path'] + expt_obj._load_ascii_data_to_experiment(data_path) + return expt_obj + @classmethod + def _create_without_data(cls, kwargs): + """ + Create an experiment without measured data. + Returns an experiment instance with only metadata and configuration. + """ + expt_type = cls._make_experiment_type(kwargs) + scattering_type = expt_type.scattering_type.value + sample_form = expt_type.sample_form.value expt_class = cls._supported[scattering_type][sample_form] - expt_obj = expt_class( - name=name, - type=expt_type, + expt_name = kwargs['name'] + expt_obj = expt_class(name=expt_name, type=expt_type) + return expt_obj + + @classmethod + def _make_experiment_type(cls, kwargs): + """ + Helper to construct an ExperimentType from keyword arguments, using defaults as needed. + """ + return ExperimentType( + sample_form=kwargs.get('sample_form', DEFAULT_SAMPLE_FORM), + beam_mode=kwargs.get('beam_mode', DEFAULT_BEAM_MODE), + radiation_probe=kwargs.get('radiation_probe', DEFAULT_RADIATION_PROBE), + scattering_type=kwargs.get('scattering_type', DEFAULT_SCATTERING_TYPE), ) - return expt_obj + @staticmethod + def is_valid_args(user_args): + """ + Validate user argument set against allowed combinations. + Returns True if the argument set matches any valid combination, else False. + """ + user_arg_set = set(user_args) + for arg_set in ExperimentFactory._valid_arg_sets: + required = set(arg_set['required']) + optional = set(arg_set['optional']) + # Must have all required, and only required+optional + if required.issubset(user_arg_set) and user_arg_set <= (required | optional): + return True + return False -# User exposed API for convenience -# TODO: Refactor based on the implementation of method add() in class Experiments -# TODO: Think of where to keep default values for sample_form, beam_mode, radiation_probe, as they are also defined in the -# class ExperimentType -def Experiment( - name: str, - sample_form: str = DEFAULT_SAMPLE_FORM, - beam_mode: str = DEFAULT_BEAM_MODE, - radiation_probe: str = DEFAULT_RADIATION_PROBE, - scattering_type: str = DEFAULT_SCATTERING_TYPE, - data_path: str = None, -): - experiment = ExperimentFactory.create( - name=name, - sample_form=sample_form, - beam_mode=beam_mode, - radiation_probe=radiation_probe, - scattering_type=scattering_type, - ) - if data_path: - experiment._load_ascii_data_to_experiment(data_path) - return experiment +def Experiment(**kwargs): + """ + User-facing API for creating an experiment. Accepts keyword arguments and delegates + validation and creation to ExperimentFactory. + """ + return ExperimentFactory.create(**kwargs) diff --git a/src/easydiffraction/experiments/experiments.py b/src/easydiffraction/experiments/experiments.py index a15b0919..01c6e6e9 100644 --- a/src/easydiffraction/experiments/experiments.py +++ b/src/easydiffraction/experiments/experiments.py @@ -1,13 +1,16 @@ # SPDX-FileCopyrightText: 2021-2025 EasyDiffraction Python Library contributors # SPDX-License-Identifier: BSD-3-Clause -import os.path from typing import Dict from typing import List +from easydiffraction.core.constants import DEFAULT_BEAM_MODE +from easydiffraction.core.constants import DEFAULT_RADIATION_PROBE +from easydiffraction.core.constants import DEFAULT_SAMPLE_FORM +from easydiffraction.core.constants import DEFAULT_SCATTERING_TYPE from easydiffraction.core.objects import Collection from easydiffraction.experiments.experiment import BaseExperiment -from easydiffraction.experiments.experiment import ExperimentFactory +from easydiffraction.experiments.experiment import Experiment from easydiffraction.utils.decorators import enforce_type from easydiffraction.utils.formatting import paragraph @@ -25,83 +28,70 @@ def __init__(self) -> None: super().__init__() self._experiments: Dict[str, BaseExperiment] = self._items # Alias for legacy support - def add( - self, - experiment=None, - name=None, - sample_form=None, - beam_mode=None, - radiation_probe=None, - scattering_type=None, - cif_path=None, - cif_str=None, - data_path=None, - ): + def add(self, experiment: BaseExperiment): """ - Add a new experiment to the collection. + Add a pre-built experiment instance. """ - if scattering_type is None: - scattering_type = 'bragg' - if experiment: - self._add_prebuilt_experiment(experiment) - elif cif_path: - self._add_from_cif_path(cif_path) - elif cif_str: - self._add_from_cif_string(cif_str) - elif all( - [ - name, - sample_form, - beam_mode, - radiation_probe, - data_path, - ] - ): - self._add_from_data_path( - name=name, - sample_form=sample_form, - beam_mode=beam_mode, - radiation_probe=radiation_probe, - scattering_type=scattering_type, - data_path=data_path, - ) - else: - raise ValueError('Provide either experiment, type parameters, cif_path, cif_str, or data_path') + self._add_prebuilt_experiment(experiment) - @enforce_type - def _add_prebuilt_experiment(self, experiment: BaseExperiment): - self._experiments[experiment.name] = experiment + def add_from_cif_path(self, cif_path: str): + """ + Add a new experiment from a CIF file path. + """ + experiment = Experiment(cif_path=cif_path) + self._add_prebuilt_experiment(experiment) - def _add_from_cif_path(self, cif_path: str) -> None: - print('Loading Experiment from CIF path...') - raise NotImplementedError('CIF loading not implemented.') + def add_from_cif_str(self, cif_str: str): + """ + Add a new experiment from CIF file content (string). + """ + experiment = Experiment(cif_str=cif_str) + self._add_prebuilt_experiment(experiment) - def _add_from_cif_string(self, cif_str: str) -> None: - print('Loading Experiment from CIF string...') - raise NotImplementedError('CIF loading not implemented.') + def add_from_data_path( + self, + name: str, + data_path: str, + sample_form: str = DEFAULT_SAMPLE_FORM, + beam_mode: str = DEFAULT_BEAM_MODE, + radiation_probe: str = DEFAULT_RADIATION_PROBE, + scattering_type: str = DEFAULT_SCATTERING_TYPE, + ): + """ + Add a new experiment from a data file path. + """ + experiment = Experiment( + name=name, + data_path=data_path, + sample_form=sample_form, + beam_mode=beam_mode, + radiation_probe=radiation_probe, + scattering_type=scattering_type, + ) + self._add_prebuilt_experiment(experiment) - def _add_from_data_path( + def add_without_data( self, - name, - sample_form, - beam_mode, - radiation_probe, - scattering_type, - data_path, + name: str, + sample_form: str = DEFAULT_SAMPLE_FORM, + beam_mode: str = DEFAULT_BEAM_MODE, + radiation_probe: str = DEFAULT_RADIATION_PROBE, + scattering_type: str = DEFAULT_SCATTERING_TYPE, ): """ - Load an experiment from raw data ASCII file. + Add a new experiment without any data file. """ - print(paragraph('Loading measured data from ASCII file')) - print(os.path.abspath(data_path)) - experiment = ExperimentFactory.create( + experiment = Experiment( name=name, sample_form=sample_form, beam_mode=beam_mode, radiation_probe=radiation_probe, scattering_type=scattering_type, ) - experiment._load_ascii_data_to_experiment(data_path) + self._add_prebuilt_experiment(experiment) + + @enforce_type + def _add_prebuilt_experiment(self, experiment: BaseExperiment): self._experiments[experiment.name] = experiment def remove(self, experiment_id: str) -> None: diff --git a/tests/functional_tests/fitting/test_pair-distribution-function.py b/tests/functional/fitting/test_pair-distribution-function.py similarity index 97% rename from tests/functional_tests/fitting/test_pair-distribution-function.py rename to tests/functional/fitting/test_pair-distribution-function.py index 4e57620f..70f03d7a 100644 --- a/tests/functional_tests/fitting/test_pair-distribution-function.py +++ b/tests/functional/fitting/test_pair-distribution-function.py @@ -1,6 +1,7 @@ import os import tempfile +import pytest from numpy.testing import assert_almost_equal import easydiffraction as ed @@ -27,13 +28,13 @@ def test_single_fit_pdf_xray_pd_cw_nacl() -> None: # Set experiment data_file = 'NaCl.gr' ed.download_from_repository(data_file, destination=TEMP_DIR) - project.experiments.add( + project.experiments.add_from_data_path( name='xray_pdf', + data_path=os.path.join(TEMP_DIR, data_file), sample_form='powder', beam_mode='constant wavelength', radiation_probe='xray', scattering_type='total', - data_path=os.path.join(TEMP_DIR, data_file), ) experiment = project.experiments['xray_pdf'] experiment.peak_profile_type = 'gaussian-damped-sinc' @@ -61,6 +62,7 @@ def test_single_fit_pdf_xray_pd_cw_nacl() -> None: assert_almost_equal(project.analysis.fit_results.reduced_chi_square, desired=1.48, decimal=2) +@pytest.mark.fast def test_single_fit_pdf_neutron_pd_cw_ni(): project = ed.Project() @@ -77,13 +79,13 @@ def test_single_fit_pdf_neutron_pd_cw_ni(): # Set experiment data_file = 'ni-q27r100-neutron_from-2.gr' ed.download_from_repository(data_file, destination=TEMP_DIR) - project.experiments.add( + project.experiments.add_from_data_path( name='pdf', + data_path=os.path.join(TEMP_DIR, data_file), sample_form='powder', beam_mode='constant wavelength', radiation_probe='neutron', scattering_type='total', - data_path=os.path.join(TEMP_DIR, data_file), ) experiment = project.experiments['pdf'] experiment.peak.damp_q = 0 @@ -123,13 +125,13 @@ def test_single_fit_pdf_neutron_pd_tof_si(): # Set experiment data_file = 'NOM_9999_Si_640g_PAC_50_ff_ftfrgr_up-to-50.gr' ed.download_from_repository(data_file, destination=TEMP_DIR) - project.experiments.add( + project.experiments.add_from_data_path( name='nomad', + data_path=os.path.join(TEMP_DIR, data_file), sample_form='powder', beam_mode='time-of-flight', radiation_probe='neutron', scattering_type='total', - data_path=os.path.join(TEMP_DIR, data_file), ) experiment = project.experiments['nomad'] experiment.peak.damp_q = 0.0251 diff --git a/tests/functional_tests/fitting/test_powder-diffraction_constant-wavelength.py b/tests/functional/fitting/test_powder-diffraction_constant-wavelength.py similarity index 97% rename from tests/functional_tests/fitting/test_powder-diffraction_constant-wavelength.py rename to tests/functional/fitting/test_powder-diffraction_constant-wavelength.py index 5c6e321c..98c0a5fc 100644 --- a/tests/functional_tests/fitting/test_powder-diffraction_constant-wavelength.py +++ b/tests/functional/fitting/test_powder-diffraction_constant-wavelength.py @@ -1,6 +1,7 @@ import os import tempfile +import pytest from numpy.testing import assert_almost_equal from easydiffraction import Experiment @@ -24,7 +25,7 @@ def test_single_fit_neutron_pd_cwl_lbco() -> None: # Set experiment data_file = 'hrpt_lbco.xye' download_from_repository(data_file, destination=TEMP_DIR) - expt = Experiment('hrpt', data_path=os.path.join(TEMP_DIR, data_file)) + expt = Experiment(name='hrpt', data_path=os.path.join(TEMP_DIR, data_file)) expt.instrument.setup_wavelength = 1.494 expt.instrument.calib_twotheta_offset = 0 expt.peak.broad_gauss_u = 0.1 @@ -89,6 +90,7 @@ def test_single_fit_neutron_pd_cwl_lbco() -> None: assert_almost_equal(project.analysis.fit_results.reduced_chi_square, desired=1.3, decimal=1) +@pytest.mark.fast def test_single_fit_neutron_pd_cwl_lbco_with_constraints() -> None: # Set sample model model = SampleModel('lbco') @@ -109,7 +111,7 @@ def test_single_fit_neutron_pd_cwl_lbco_with_constraints() -> None: data_file = 'hrpt_lbco.xye' download_from_repository(data_file, destination=TEMP_DIR) - expt = Experiment('hrpt', data_path=os.path.join(TEMP_DIR, data_file)) + expt = Experiment(name='hrpt', data_path=os.path.join(TEMP_DIR, data_file)) instrument = expt.instrument instrument.setup_wavelength = 1.494 @@ -224,7 +226,7 @@ def test_fit_neutron_pd_cwl_hs() -> None: # Set experiment data_file = 'hrpt_hs.xye' download_from_repository(data_file, destination=TEMP_DIR) - expt = Experiment('hrpt', data_path=os.path.join(TEMP_DIR, data_file)) + expt = Experiment(name='hrpt', data_path=os.path.join(TEMP_DIR, data_file)) expt.instrument.setup_wavelength = 1.89 expt.instrument.calib_twotheta_offset = 0.0 expt.peak.broad_gauss_u = 0.1579 diff --git a/tests/functional_tests/fitting/test_powder-diffraction_joint-fit.py b/tests/functional/fitting/test_powder-diffraction_joint-fit.py similarity index 93% rename from tests/functional_tests/fitting/test_powder-diffraction_joint-fit.py rename to tests/functional/fitting/test_powder-diffraction_joint-fit.py index c460d468..a9b505a6 100644 --- a/tests/functional_tests/fitting/test_powder-diffraction_joint-fit.py +++ b/tests/functional/fitting/test_powder-diffraction_joint-fit.py @@ -1,6 +1,7 @@ import os import tempfile +import pytest from numpy.testing import assert_almost_equal from easydiffraction import Experiment @@ -11,6 +12,7 @@ TEMP_DIR = tempfile.gettempdir() +@pytest.mark.fast def test_joint_fit_split_dataset_neutron_pd_cwl_pbso4() -> None: # Set sample model model = SampleModel('pbso4') @@ -27,7 +29,7 @@ def test_joint_fit_split_dataset_neutron_pd_cwl_pbso4() -> None: # Set experiments data_file = 'd1a_pbso4_first-half.dat' download_from_repository(data_file, destination=TEMP_DIR) - expt1 = Experiment('npd1', data_path=os.path.join(TEMP_DIR, data_file)) + expt1 = Experiment(name='npd1', data_path=os.path.join(TEMP_DIR, data_file)) expt1.instrument.setup_wavelength = 1.91 expt1.instrument.calib_twotheta_offset = -0.1406 expt1.peak.broad_gauss_u = 0.139 @@ -51,7 +53,7 @@ def test_joint_fit_split_dataset_neutron_pd_cwl_pbso4() -> None: data_file = 'd1a_pbso4_second-half.dat' download_from_repository(data_file, destination=TEMP_DIR) - expt2 = Experiment('npd2', data_path=os.path.join(TEMP_DIR, data_file)) + expt2 = Experiment(name='npd2', data_path=os.path.join(TEMP_DIR, data_file)) expt2.instrument.setup_wavelength = 1.91 expt2.instrument.calib_twotheta_offset = -0.1406 expt2.peak.broad_gauss_u = 0.139 @@ -96,6 +98,7 @@ def test_joint_fit_split_dataset_neutron_pd_cwl_pbso4() -> None: assert_almost_equal(project.analysis.fit_results.reduced_chi_square, desired=4.66, decimal=1) +@pytest.mark.fast def test_joint_fit_neutron_xray_pd_cwl_pbso4() -> None: # Set sample model model = SampleModel('pbso4') @@ -112,7 +115,11 @@ def test_joint_fit_neutron_xray_pd_cwl_pbso4() -> None: # Set experiments data_file = 'd1a_pbso4.dat' download_from_repository(data_file, destination=TEMP_DIR) - expt1 = Experiment('npd', radiation_probe='neutron', data_path=os.path.join(TEMP_DIR, data_file)) + expt1 = Experiment( + name='npd', + data_path=os.path.join(TEMP_DIR, data_file), + radiation_probe='neutron', + ) expt1.instrument.setup_wavelength = 1.91 expt1.instrument.calib_twotheta_offset = -0.1406 expt1.peak.broad_gauss_u = 0.139 @@ -135,7 +142,11 @@ def test_joint_fit_neutron_xray_pd_cwl_pbso4() -> None: data_file = 'lab_pbso4.dat' download_from_repository(data_file, destination=TEMP_DIR) - expt2 = Experiment('xrd', radiation_probe='xray', data_path=os.path.join(TEMP_DIR, data_file)) + expt2 = Experiment( + name='xrd', + data_path=os.path.join(TEMP_DIR, data_file), + radiation_probe='xray', + ) expt2.instrument.setup_wavelength = 1.540567 expt2.instrument.calib_twotheta_offset = -0.05181 expt2.peak.broad_gauss_u = 0.304138 diff --git a/tests/functional_tests/fitting/test_powder-diffraction_multiphase.py b/tests/functional/fitting/test_powder-diffraction_multiphase.py similarity index 96% rename from tests/functional_tests/fitting/test_powder-diffraction_multiphase.py rename to tests/functional/fitting/test_powder-diffraction_multiphase.py index 20e42fcf..c75bc110 100644 --- a/tests/functional_tests/fitting/test_powder-diffraction_multiphase.py +++ b/tests/functional/fitting/test_powder-diffraction_multiphase.py @@ -31,7 +31,11 @@ def test_single_fit_neutron_pd_tof_mcstas_lbco_si() -> None: # Set experiment data_file = 'mcstas_lbco-si.xys' download_from_repository(data_file, destination=TEMP_DIR) - expt = Experiment('mcstas', beam_mode='time-of-flight', data_path=os.path.join(TEMP_DIR, data_file)) + expt = Experiment( + name='mcstas', + data_path=os.path.join(TEMP_DIR, data_file), + beam_mode='time-of-flight', + ) expt.instrument.setup_twotheta_bank = 94.90931761529106 expt.instrument.calib_d_to_tof_offset = 0.0 expt.instrument.calib_d_to_tof_linear = 58724.76869981215 diff --git a/tests/functional_tests/fitting/test_powder-diffraction_time-of-flight.py b/tests/functional/fitting/test_powder-diffraction_time-of-flight.py similarity index 94% rename from tests/functional_tests/fitting/test_powder-diffraction_time-of-flight.py rename to tests/functional/fitting/test_powder-diffraction_time-of-flight.py index 22451122..f77fba0a 100644 --- a/tests/functional_tests/fitting/test_powder-diffraction_time-of-flight.py +++ b/tests/functional/fitting/test_powder-diffraction_time-of-flight.py @@ -22,7 +22,11 @@ def test_single_fit_neutron_pd_tof_si() -> None: # Set experiment data_file = 'sepd_si.xye' download_from_repository(data_file, destination=TEMP_DIR) - expt = Experiment('sepd', beam_mode='time-of-flight', data_path=os.path.join(TEMP_DIR, data_file)) + expt = Experiment( + name='sepd', + data_path=os.path.join(TEMP_DIR, data_file), + beam_mode='time-of-flight', + ) expt.instrument.setup_twotheta_bank = 144.845 expt.instrument.calib_d_to_tof_offset = -9.29 expt.instrument.calib_d_to_tof_linear = 7476.91 @@ -80,7 +84,11 @@ def test_single_fit_neutron_pd_tof_ncaf() -> None: # Set experiment data_file = 'wish_ncaf.xye' download_from_repository(data_file, destination=TEMP_DIR) - expt = Experiment('wish', beam_mode='time-of-flight', data_path=os.path.join(TEMP_DIR, data_file)) + expt = Experiment( + name='wish', + data_path=os.path.join(TEMP_DIR, data_file), + beam_mode='time-of-flight', + ) expt.instrument.setup_twotheta_bank = 152.827 expt.instrument.calib_d_to_tof_offset = -13.7123 expt.instrument.calib_d_to_tof_linear = 20773.1 diff --git a/tests/unit_tests/analysis/calculators/test_calculator_base.py b/tests/unit/analysis/calculators/test_calculator_base.py similarity index 100% rename from tests/unit_tests/analysis/calculators/test_calculator_base.py rename to tests/unit/analysis/calculators/test_calculator_base.py diff --git a/tests/unit_tests/analysis/calculators/test_calculator_cryspy.py b/tests/unit/analysis/calculators/test_calculator_cryspy.py similarity index 100% rename from tests/unit_tests/analysis/calculators/test_calculator_cryspy.py rename to tests/unit/analysis/calculators/test_calculator_cryspy.py diff --git a/tests/unit_tests/analysis/calculators/test_calculator_factory.py b/tests/unit/analysis/calculators/test_calculator_factory.py similarity index 100% rename from tests/unit_tests/analysis/calculators/test_calculator_factory.py rename to tests/unit/analysis/calculators/test_calculator_factory.py diff --git a/tests/unit_tests/analysis/collections/test_joint_fit_experiment.py b/tests/unit/analysis/collections/test_joint_fit_experiment.py similarity index 100% rename from tests/unit_tests/analysis/collections/test_joint_fit_experiment.py rename to tests/unit/analysis/collections/test_joint_fit_experiment.py diff --git a/tests/unit_tests/analysis/minimizers/test_fitting_progress_tracker.py b/tests/unit/analysis/minimizers/test_fitting_progress_tracker.py similarity index 100% rename from tests/unit_tests/analysis/minimizers/test_fitting_progress_tracker.py rename to tests/unit/analysis/minimizers/test_fitting_progress_tracker.py diff --git a/tests/unit_tests/analysis/minimizers/test_minimizer_base.py b/tests/unit/analysis/minimizers/test_minimizer_base.py similarity index 100% rename from tests/unit_tests/analysis/minimizers/test_minimizer_base.py rename to tests/unit/analysis/minimizers/test_minimizer_base.py diff --git a/tests/unit_tests/analysis/minimizers/test_minimizer_dfols.py b/tests/unit/analysis/minimizers/test_minimizer_dfols.py similarity index 100% rename from tests/unit_tests/analysis/minimizers/test_minimizer_dfols.py rename to tests/unit/analysis/minimizers/test_minimizer_dfols.py diff --git a/tests/unit_tests/analysis/minimizers/test_minimizer_factory.py b/tests/unit/analysis/minimizers/test_minimizer_factory.py similarity index 100% rename from tests/unit_tests/analysis/minimizers/test_minimizer_factory.py rename to tests/unit/analysis/minimizers/test_minimizer_factory.py diff --git a/tests/unit_tests/analysis/minimizers/test_minimizer_lmfit.py b/tests/unit/analysis/minimizers/test_minimizer_lmfit.py similarity index 100% rename from tests/unit_tests/analysis/minimizers/test_minimizer_lmfit.py rename to tests/unit/analysis/minimizers/test_minimizer_lmfit.py diff --git a/tests/unit_tests/analysis/test_analysis.py b/tests/unit/analysis/test_analysis.py similarity index 100% rename from tests/unit_tests/analysis/test_analysis.py rename to tests/unit/analysis/test_analysis.py diff --git a/tests/unit_tests/analysis/test_minimization.py b/tests/unit/analysis/test_minimization.py similarity index 100% rename from tests/unit_tests/analysis/test_minimization.py rename to tests/unit/analysis/test_minimization.py diff --git a/tests/unit_tests/analysis/test_reliability_factors.py b/tests/unit/analysis/test_reliability_factors.py similarity index 100% rename from tests/unit_tests/analysis/test_reliability_factors.py rename to tests/unit/analysis/test_reliability_factors.py diff --git a/tests/unit_tests/core/test_objects.py b/tests/unit/core/test_objects.py similarity index 100% rename from tests/unit_tests/core/test_objects.py rename to tests/unit/core/test_objects.py diff --git a/tests/unit_tests/core/test_singletons.py b/tests/unit/core/test_singletons.py similarity index 100% rename from tests/unit_tests/core/test_singletons.py rename to tests/unit/core/test_singletons.py diff --git a/tests/unit_tests/experiments/collections/test_background.py b/tests/unit/experiments/collections/test_background.py similarity index 100% rename from tests/unit_tests/experiments/collections/test_background.py rename to tests/unit/experiments/collections/test_background.py diff --git a/tests/unit_tests/experiments/collections/test_datastore.py b/tests/unit/experiments/collections/test_datastore.py similarity index 100% rename from tests/unit_tests/experiments/collections/test_datastore.py rename to tests/unit/experiments/collections/test_datastore.py diff --git a/tests/unit_tests/experiments/collections/test_linked_phases.py b/tests/unit/experiments/collections/test_linked_phases.py similarity index 100% rename from tests/unit_tests/experiments/collections/test_linked_phases.py rename to tests/unit/experiments/collections/test_linked_phases.py diff --git a/tests/unit_tests/experiments/components/test_experiment_type.py b/tests/unit/experiments/components/test_experiment_type.py similarity index 100% rename from tests/unit_tests/experiments/components/test_experiment_type.py rename to tests/unit/experiments/components/test_experiment_type.py diff --git a/tests/unit_tests/experiments/components/test_instrument.py b/tests/unit/experiments/components/test_instrument.py similarity index 100% rename from tests/unit_tests/experiments/components/test_instrument.py rename to tests/unit/experiments/components/test_instrument.py diff --git a/tests/unit_tests/experiments/components/test_peak.py b/tests/unit/experiments/components/test_peak.py similarity index 100% rename from tests/unit_tests/experiments/components/test_peak.py rename to tests/unit/experiments/components/test_peak.py diff --git a/tests/unit_tests/experiments/test_experiment.py b/tests/unit/experiments/test_experiment.py similarity index 80% rename from tests/unit_tests/experiments/test_experiment.py rename to tests/unit/experiments/test_experiment.py index d075d9d1..c5978703 100644 --- a/tests/unit_tests/experiments/test_experiment.py +++ b/tests/unit/experiments/test_experiment.py @@ -120,3 +120,32 @@ def test_experiment_method(): assert np.array_equal(experiment.datastore.pattern.x, mock_data[:, 0]) assert np.array_equal(experiment.datastore.pattern.meas, mock_data[:, 1]) assert np.array_equal(experiment.datastore.pattern.meas_su, mock_data[:, 2]) + + +def test_experiment_factory_invalid_args_missing_required(): + # Missing required 'name' + with pytest.raises(ValueError, match='Invalid argument combination'): + ExperimentFactory.create( + sample_form='powder', + beam_mode=DEFAULT_BEAM_MODE, + radiation_probe=DEFAULT_RADIATION_PROBE, + scattering_type=DEFAULT_SCATTERING_TYPE, + ) + + +def test_experiment_factory_conflicting_args_cif_and_name(): + # Conflicting: 'cif_path' with 'name' + with pytest.raises(ValueError, match='Invalid argument combination'): + ExperimentFactory.create(name='ConflictTest', cif_path='path/to/file.cif') + + +def test_experiment_factory_conflicting_args_data_and_cif(): + # Conflicting: multiple conflicting input sources + with pytest.raises(ValueError, match='Invalid argument combination'): + ExperimentFactory.create(name='ConflictTest', data_path='mock_path', cif_str='cif content') + + +def test_experiment_factory_invalid_args_unsupported_key(): + # Unsupported keyword + with pytest.raises(ValueError, match='Invalid argument combination'): + ExperimentFactory.create(foo='bar') diff --git a/tests/unit_tests/experiments/test_experiments.py b/tests/unit/experiments/test_experiments.py similarity index 84% rename from tests/unit_tests/experiments/test_experiments.py rename to tests/unit/experiments/test_experiments.py index 93cfa0d6..949c8747 100644 --- a/tests/unit_tests/experiments/test_experiments.py +++ b/tests/unit/experiments/test_experiments.py @@ -1,8 +1,6 @@ from unittest.mock import MagicMock from unittest.mock import patch -import pytest - from easydiffraction.experiments.experiment import BaseExperiment from easydiffraction.experiments.experiments import Experiments @@ -39,24 +37,16 @@ def test_experiments_add_from_data_path(): mock_experiment.name = 'TestExperiment' with patch('easydiffraction.experiments.experiment.ExperimentFactory.create', return_value=mock_experiment): - experiments.add( + experiments.add_from_data_path( name='TestExperiment', sample_form='powder', - beam_mode='default', + beam_mode='constant wavelength', radiation_probe='x-ray', data_path='mock_path', ) assert 'TestExperiment' in experiments.ids - assert experiments._experiments['TestExperiment'] == mock_experiment - mock_experiment._load_ascii_data_to_experiment.assert_called_once_with('mock_path') - - -def test_experiments_add_invalid_input(): - experiments = Experiments() - - with pytest.raises(ValueError, match='Provide either experiment, type parameters, cif_path, cif_str, or data_path'): - experiments.add() + assert experiments['TestExperiment'] == mock_experiment def test_experiments_remove(): diff --git a/tests/unit_tests/sample_models/collections/test_atom_sites.py b/tests/unit/sample_models/collections/test_atom_sites.py similarity index 100% rename from tests/unit_tests/sample_models/collections/test_atom_sites.py rename to tests/unit/sample_models/collections/test_atom_sites.py diff --git a/tests/unit_tests/sample_models/components/test_cell.py b/tests/unit/sample_models/components/test_cell.py similarity index 100% rename from tests/unit_tests/sample_models/components/test_cell.py rename to tests/unit/sample_models/components/test_cell.py diff --git a/tests/unit_tests/sample_models/components/test_space_group.py b/tests/unit/sample_models/components/test_space_group.py similarity index 100% rename from tests/unit_tests/sample_models/components/test_space_group.py rename to tests/unit/sample_models/components/test_space_group.py diff --git a/tests/unit_tests/sample_models/test_sample_models.py b/tests/unit/sample_models/test_sample_models.py similarity index 100% rename from tests/unit_tests/sample_models/test_sample_models.py rename to tests/unit/sample_models/test_sample_models.py diff --git a/tests/unit_tests/test_project.py b/tests/unit/test_project.py similarity index 100% rename from tests/unit_tests/test_project.py rename to tests/unit/test_project.py diff --git a/tests/unit_tests/test_symmetry_lookup_table.py b/tests/unit/test_symmetry_lookup_table.py similarity index 100% rename from tests/unit_tests/test_symmetry_lookup_table.py rename to tests/unit/test_symmetry_lookup_table.py diff --git a/tutorials/advanced_joint-fit_pd-neut-xray-cwl_PbSO4.py b/tutorials/advanced_joint-fit_pd-neut-xray-cwl_PbSO4.py index a1327c82..d6b51d33 100644 --- a/tutorials/advanced_joint-fit_pd-neut-xray-cwl_PbSO4.py +++ b/tutorials/advanced_joint-fit_pd-neut-xray-cwl_PbSO4.py @@ -71,7 +71,11 @@ # #### Create Experiment # %% -expt1 = Experiment('npd', radiation_probe='neutron', data_path='data/d1a_pbso4.dat') +expt1 = Experiment( + name='npd', + data_path='data/d1a_pbso4.dat', + radiation_probe='neutron', +) # %% [markdown] # #### Set Instrument @@ -133,7 +137,11 @@ # #### Create Experiment # %% -expt2 = Experiment('xrd', radiation_probe='xray', data_path='data/lab_pbso4.dat') +expt2 = Experiment( + name='xrd', + data_path='data/lab_pbso4.dat', + radiation_probe='xray', +) # %% [markdown] # #### Set Instrument diff --git a/tutorials/basic_single-fit_pd-neut-cwl_LBCO-HRPT.py b/tutorials/basic_single-fit_pd-neut-cwl_LBCO-HRPT.py index ca885349..f3fdbf7d 100644 --- a/tutorials/basic_single-fit_pd-neut-cwl_LBCO-HRPT.py +++ b/tutorials/basic_single-fit_pd-neut-cwl_LBCO-HRPT.py @@ -209,12 +209,12 @@ # #### Add Diffraction Experiment # %% -project.experiments.add( +project.experiments.add_from_data_path( name='hrpt', + data_path='data/hrpt_lbco.xye', sample_form='powder', beam_mode='constant wavelength', radiation_probe='neutron', - data_path='data/hrpt_lbco.xye', ) # %% [markdown] diff --git a/tutorials/cryst-struct_pd-neut-cwl_CoSiO4-D20.py b/tutorials/cryst-struct_pd-neut-cwl_CoSiO4-D20.py index b366548c..8bd7461d 100644 --- a/tutorials/cryst-struct_pd-neut-cwl_CoSiO4-D20.py +++ b/tutorials/cryst-struct_pd-neut-cwl_CoSiO4-D20.py @@ -84,7 +84,7 @@ # #### Create Experiment # %% -expt = Experiment('d20', data_path='data/co2sio4_d20.xye') +expt = Experiment(name='d20', data_path='data/co2sio4_d20.xye') # %% [markdown] # #### Set Instrument diff --git a/tutorials/cryst-struct_pd-neut-tof_Si-SEPD.py b/tutorials/cryst-struct_pd-neut-tof_Si-SEPD.py index db37839d..5693c18e 100644 --- a/tutorials/cryst-struct_pd-neut-tof_Si-SEPD.py +++ b/tutorials/cryst-struct_pd-neut-tof_Si-SEPD.py @@ -57,7 +57,7 @@ # #### Create Experiment # %% -expt = Experiment('sepd', beam_mode='time-of-flight', data_path='data/sepd_si.xye') +expt = Experiment(name='sepd', data_path='data/sepd_si.xye', beam_mode='time-of-flight') # %% [markdown] # #### Set Instrument diff --git a/tutorials/cryst-struct_pd-neut-tof_multidata_NCAF-WISH.py b/tutorials/cryst-struct_pd-neut-tof_multidata_NCAF-WISH.py index 8c9ac9c4..50e5669c 100644 --- a/tutorials/cryst-struct_pd-neut-tof_multidata_NCAF-WISH.py +++ b/tutorials/cryst-struct_pd-neut-tof_multidata_NCAF-WISH.py @@ -75,16 +75,16 @@ # %% expt56 = Experiment( - 'wish_5_6', - beam_mode='time-of-flight', + name='wish_5_6', data_path='data/wish_ncaf_5_6.xys', + beam_mode='time-of-flight', ) # %% expt47 = Experiment( - 'wish_4_7', - beam_mode='time-of-flight', + name='wish_4_7', data_path='data/wish_ncaf_4_7.xys', + beam_mode='time-of-flight', ) # %% [markdown] diff --git a/tutorials/cryst-struct_pd-neut-tof_multiphase-LBCO-Si_McStas.py b/tutorials/cryst-struct_pd-neut-tof_multiphase-LBCO-Si_McStas.py index a81d3699..d5885ae9 100644 --- a/tutorials/cryst-struct_pd-neut-tof_multiphase-LBCO-Si_McStas.py +++ b/tutorials/cryst-struct_pd-neut-tof_multiphase-LBCO-Si_McStas.py @@ -129,12 +129,12 @@ # %% experiment = Experiment( - 'mcstas', + name='mcstas', + data_path='data/mcstas_lbco-si.xye', sample_form='powder', beam_mode='time-of-flight', radiation_probe='neutron', scattering_type='bragg', - data_path='data/mcstas_lbco-si.xye', ) # %% [markdown] diff --git a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py index de53449e..182bea30 100644 --- a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py +++ b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py @@ -111,12 +111,12 @@ # for more details about different types of experiments. # %% -project_1.experiments.add( +project_1.experiments.add_from_data_path( name='sim_si', + data_path=si_xye_path, sample_form='powder', beam_mode='time-of-flight', radiation_probe='neutron', - data_path=si_xye_path, ) # %% [markdown] @@ -707,12 +707,12 @@ # Uncomment the following line if your data reduction failed and the reduced data file is missing. ed.download_from_repository(file_name, destination=dir_path) -project_2.experiments.add( +project_2.experiments.add_from_data_path( name='sim_lbco', + data_path=lbco_xye_path, sample_form='powder', beam_mode='time-of-flight', radiation_probe='neutron', - data_path=lbco_xye_path, ) # %% [markdown] diff --git a/tutorials/pdf_pd-neut-cwl_Ni.py b/tutorials/pdf_pd-neut-cwl_Ni.py index daa4e5ef..049aeaae 100644 --- a/tutorials/pdf_pd-neut-cwl_Ni.py +++ b/tutorials/pdf_pd-neut-cwl_Ni.py @@ -47,13 +47,13 @@ ed.download_from_repository('ni-q27r100-neutron_from-2.gr', destination='data') # %% -project.experiments.add( +project.experiments.add_from_data_path( name='pdf', + data_path='data/ni-q27r100-neutron_from-2.gr', sample_form='powder', beam_mode='constant wavelength', radiation_probe='neutron', scattering_type='total', - data_path='data/ni-q27r100-neutron_from-2.gr', ) # %% diff --git a/tutorials/pdf_pd-neut-tof_Si-NOMAD.py b/tutorials/pdf_pd-neut-tof_Si-NOMAD.py index 9658cbf8..62d5a7ca 100644 --- a/tutorials/pdf_pd-neut-tof_Si-NOMAD.py +++ b/tutorials/pdf_pd-neut-tof_Si-NOMAD.py @@ -44,13 +44,13 @@ ed.download_from_repository('NOM_9999_Si_640g_PAC_50_ff_ftfrgr_up-to-50.gr', destination='data') # %% -project.experiments.add( +project.experiments.add_from_data_path( name='nomad', + data_path='data/NOM_9999_Si_640g_PAC_50_ff_ftfrgr_up-to-50.gr', sample_form='powder', beam_mode='time-of-flight', radiation_probe='neutron', scattering_type='total', - data_path='data/NOM_9999_Si_640g_PAC_50_ff_ftfrgr_up-to-50.gr', ) # %% diff --git a/tutorials/pdf_pd-xray_NaCl.py b/tutorials/pdf_pd-xray_NaCl.py index 6e91063a..e83ba4e2 100644 --- a/tutorials/pdf_pd-xray_NaCl.py +++ b/tutorials/pdf_pd-xray_NaCl.py @@ -51,13 +51,13 @@ ed.download_from_repository('NaCl.gr', destination='data') # %% -project.experiments.add( +project.experiments.add_from_data_path( name='xray_pdf', + data_path='data/NaCl.gr', sample_form='powder', beam_mode='constant wavelength', radiation_probe='xray', scattering_type='total', - data_path='data/NaCl.gr', ) # %% diff --git a/tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.py b/tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.py index 24fd0c4a..fb8b29d1 100644 --- a/tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.py +++ b/tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.py @@ -57,12 +57,12 @@ ed.download_from_repository('hrpt_lbco.xye', destination='data') # %% -project.experiments.add( +project.experiments.add_from_data_path( name='hrpt', + data_path='data/hrpt_lbco.xye', sample_form='powder', beam_mode='constant wavelength', radiation_probe='neutron', - data_path='data/hrpt_lbco.xye', ) # %% From 48538a35696ec1af54d41e5e77d613f497169db4 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Fri, 5 Sep 2025 10:58:45 +0200 Subject: [PATCH 2/8] Refactor Datastore: Cleaner design with experiment-specific subclasses and CIF conversion (#88) * Refactor ExperimentFactory and Experiments classes for improved argument handling and creation methods * Refactor Experiment initialization across tutorials to follow new API * Refactor functional tests to follow new API * Refactor unit tests to follow new API * Remove unused pytest import * Prevents building font cache info in docs build * Refines workflow name for clarity * Renames workflow for clarity and purpose * Removes Pixi validation workflow. The user specific validation is in another workflow. * More fixes for the functional tests * Automates tutorial script conversion and deployment * Update checkout action to version 5 in GitHub workflows * Updates release workflow to use enhanced actions * Enhances checkout action for full history fetching * Streamlines GitHub Actions YAML syntax * Removes push and pull_request triggers * Removes feature branch from CI config * Adds ID to draft release notes step * Refines experiment documentation to follow new API * Adds manual trigger to draft release notes workflow * Restricts GitHub Actions to master and develop branches * Simplifies experiment doc headings and clarifications * Refactors test workflow and adds cron trigger * Enables GitHub token for tutorial scripts * Removes branch-specific logic from workflows * Refactors datastore system simplifying access * Refactors CIF mapping logic in Datastore classes * Refactors datastore module structure * Enhances Datastore and adds type enforcement * Bumps dependencies --- pixi.lock | 644 ++++++++++-------- .../analysis/calculators/calculator_base.py | 6 +- .../calculators/calculator_crysfml.py | 4 +- .../analysis/calculators/calculator_cryspy.py | 6 +- .../analysis/calculators/calculator_pdffit.py | 5 +- src/easydiffraction/analysis/minimization.py | 4 +- .../analysis/reliability_factors.py | 4 +- .../experiments/collections/datastore.py | 126 ---- .../collections/excluded_regions.py | 13 +- src/easydiffraction/experiments/datastore.py | 250 +++++++ src/easydiffraction/experiments/experiment.py | 49 +- src/easydiffraction/project.py | 20 +- src/easydiffraction/utils/decorators.py | 47 +- src/easydiffraction/utils/utils.py | 5 +- .../calculators/test_calculator_base.py | 10 +- .../calculators/test_calculator_cryspy.py | 6 +- tests/unit/analysis/test_minimization.py | 92 ++- .../unit/analysis/test_reliability_factors.py | 8 +- .../experiments/collections/test_datastore.py | 288 ++++---- .../collections/test_linked_phases.py | 169 +---- tests/unit/experiments/test_experiment.py | 18 +- 21 files changed, 964 insertions(+), 810 deletions(-) delete mode 100644 src/easydiffraction/experiments/collections/datastore.py create mode 100644 src/easydiffraction/experiments/datastore.py diff --git a/pixi.lock b/pixi.lock index 082cc218..33a3fca1 100644 --- a/pixi.lock +++ b/pixi.lock @@ -138,7 +138,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -155,7 +155,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py313h07c4f96_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py313h736c1ce_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/b8/9e7175e1fa0ac8e56baa83bf3c214823ce250d0028955dfb23f43d5e61fd/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -360,8 +361,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_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/pyobjc-core-11.1-py313h6971d95_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h19a8f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py313h6971d95_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h55ae1d7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -389,7 +390,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py313h585f44e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py313h585f44e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -406,7 +407,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py313h585f44e_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py313h4b03fa9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/2a/7495a81e39a998e400f3ecdd44a62107254803d1681d9189be5c2e4530cd/aiohttp-3.12.15-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 @@ -611,8 +613,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_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/pyobjc-core-11.1-py313had225c5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313hb6afeec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py313had225c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313h4e140e3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -640,7 +642,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -657,7 +659,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py313hcdf3177_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py313hff09f02_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/fc/a9576ab4be2dcbd0f73ee8675d16c707cfc12d5ee80ccf4015ba543480c9/aiohttp-3.12.15-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -891,7 +894,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -913,7 +916,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py313h5ea7bf4_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py313hcdcf24b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1b/8e/78ee35774201f38d5e1ba079c9958f7629b1fd079459aea9467441dbfbf5/aiohttp-3.12.15-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -1156,7 +1160,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py311h49ec1c0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py311h49ec1c0_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -1174,7 +1178,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h49ec1c0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py311h4854a17_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/82/1ddf0ea4f2f3afe79dffed5e8a246737cff6cbe781887a6a170299e33204/aiohttp-3.12.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -1356,8 +1361,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_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/pyobjc-core-11.1-py311h2f44256_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py311hfbc4093_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py311h2f44256_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py311hbc8e8a3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.13-h9ccd52b_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -1384,7 +1389,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py311h13e5629_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py311h13e5629_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -1402,7 +1407,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py311h13e5629_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py311h3c2bd5d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/f9/0a31fcb1a7d4629ac9d8f01f1cb9242e2f9943f47f5d03215af91c3c1a26/aiohttp-3.12.15-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 @@ -1584,8 +1590,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_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/pyobjc-core-11.1-py311hf0763de_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py311hab620ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py311hf0763de_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py311hc5b188e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -1612,7 +1618,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py311h3696347_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py311h3696347_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -1630,7 +1636,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py311h3696347_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py311hcb74504_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/6c/94846f576f1d11df0c2e41d3001000527c0fdf63fce7e69b3927a731325d/aiohttp-3.12.15-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -1841,7 +1848,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py311h3485c13_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py311h3485c13_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -1864,7 +1871,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py311h3485c13_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py311h2d646e2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/97/ad2b18700708452400278039272032170246a1bf8ec5d832772372c71f1a/aiohttp-3.12.15-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -2090,7 +2098,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py312h4c3975b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -2108,7 +2116,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h4c3975b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py312h3fa7853_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.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/5e/3bf5acea47a96a28c121b167f5ef659cf71208b19e52a88cdfa5c37f1fcc/aiohttp-3.12.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -2292,8 +2301,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_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/pyobjc-core-11.1-py312h3f2cce9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py312h2365019_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py312h3f2cce9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py312h1cc0658_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.11-h9ccd52b_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -2321,7 +2330,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py312h2f459f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py312h2f459f6_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -2339,7 +2348,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py312h2f459f6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py312hcfdedb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/6d/0544e6b08b748682c30b9f65640d006e51f90763b41d7c546693bc22900d/aiohttp-3.12.15-cp312-cp312-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -2523,8 +2533,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_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/pyobjc-core-11.1-py312h4c66426_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py312hb9d441b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py312h4c66426_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py312h3964663_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.11-hc22306f_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -2552,7 +2562,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py312h163523d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py312h163523d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -2570,7 +2580,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h163523d_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py312h26de6b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/1d/c8c40e611e5094330284b1aea8a4b02ca0858f8458614fa35754cab42b9c/aiohttp-3.12.15-cp312-cp312-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -2783,7 +2794,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py312he06e257_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py312he06e257_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -2806,7 +2817,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py312he06e257_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py312ha680012_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2b/d8/fa65d2a349fe938b76d309db1a56a75c4fb8cc7b17a398b698488a939903/aiohttp-3.12.15-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -3031,7 +3043,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -3048,7 +3060,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py313h07c4f96_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py313h736c1ce_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/b8/9e7175e1fa0ac8e56baa83bf3c214823ce250d0028955dfb23f43d5e61fd/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -3233,8 +3246,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_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/pyobjc-core-11.1-py313h6971d95_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h19a8f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py313h6971d95_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h55ae1d7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -3262,7 +3275,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py313h585f44e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py313h585f44e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -3279,7 +3292,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py313h585f44e_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py313h4b03fa9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/2a/7495a81e39a998e400f3ecdd44a62107254803d1681d9189be5c2e4530cd/aiohttp-3.12.15-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 @@ -3464,8 +3478,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_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/pyobjc-core-11.1-py313had225c5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313hb6afeec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py313had225c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313h4e140e3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -3493,7 +3507,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -3510,7 +3524,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py313hcdf3177_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py313hff09f02_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/fc/a9576ab4be2dcbd0f73ee8675d16c707cfc12d5ee80ccf4015ba543480c9/aiohttp-3.12.15-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -3724,7 +3739,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -3746,7 +3761,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py313h5ea7bf4_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py313hcdcf24b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1b/8e/78ee35774201f38d5e1ba079c9958f7629b1fd079459aea9467441dbfbf5/aiohttp-3.12.15-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -3968,7 +3984,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -3984,7 +4000,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py313h07c4f96_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py313h736c1ce_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/b8/9e7175e1fa0ac8e56baa83bf3c214823ce250d0028955dfb23f43d5e61fd/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -4186,8 +4203,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_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/pyobjc-core-11.1-py313h6971d95_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h19a8f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py313h6971d95_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h55ae1d7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -4215,7 +4232,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py313h585f44e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py313h585f44e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -4231,7 +4248,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py313h585f44e_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py313h4b03fa9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/2a/7495a81e39a998e400f3ecdd44a62107254803d1681d9189be5c2e4530cd/aiohttp-3.12.15-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 @@ -4434,8 +4452,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_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/pyobjc-core-11.1-py313had225c5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313hb6afeec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py313had225c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313h4e140e3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -4463,7 +4481,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -4479,7 +4497,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py313hcdf3177_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py313hff09f02_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/fc/a9576ab4be2dcbd0f73ee8675d16c707cfc12d5ee80ccf4015ba543480c9/aiohttp-3.12.15-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -4712,7 +4731,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -4734,7 +4753,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py313h5ea7bf4_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py313hcdcf24b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1b/8e/78ee35774201f38d5e1ba079c9958f7629b1fd079459aea9467441dbfbf5/aiohttp-3.12.15-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -4976,7 +4996,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -4992,7 +5012,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py313h07c4f96_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py313h736c1ce_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/b8/9e7175e1fa0ac8e56baa83bf3c214823ce250d0028955dfb23f43d5e61fd/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -5174,8 +5195,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_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/pyobjc-core-11.1-py313h6971d95_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h19a8f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py313h6971d95_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h55ae1d7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -5203,7 +5224,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py313h585f44e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py313h585f44e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -5219,7 +5240,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py313h585f44e_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py313h4b03fa9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/2a/7495a81e39a998e400f3ecdd44a62107254803d1681d9189be5c2e4530cd/aiohttp-3.12.15-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 @@ -5402,8 +5424,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_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/pyobjc-core-11.1-py313had225c5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313hb6afeec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py313had225c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313h4e140e3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -5431,7 +5453,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -5447,7 +5469,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py313hcdf3177_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py313hff09f02_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/fc/a9576ab4be2dcbd0f73ee8675d16c707cfc12d5ee80ccf4015ba543480c9/aiohttp-3.12.15-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -5660,7 +5683,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250822-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -5682,7 +5705,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py313h5ea7bf4_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py313hcdcf24b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1b/8e/78ee35774201f38d5e1ba079c9958f7629b1fd079459aea9467441dbfbf5/aiohttp-3.12.15-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl @@ -7824,7 +7848,7 @@ packages: editable: true - pypi: ./ name: easydiffraction - version: 0.7.1+d26 + version: 0.7.1+d31 sha256: 46fc86fb1a4bfe96069b3bc7724859ee328306bd671558c80d11a3675e9d074e requires_dist: - asciichartpy @@ -13806,9 +13830,9 @@ packages: - pyyaml - pygments>=2.19.1 ; extra == 'extra' requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py311h2f44256_0.conda - sha256: 1124855261a8ddbe89d3d3d9bff81baa367d2f8b8300d0d94bb0db011f34e07c - md5: 9ed5f7f859b030414087e221e6881fe1 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py311h2f44256_1.conda + sha256: d0800d251981e3d124bd960e799dd0c56e8b16cd1c6fb99a32990d62f492d754 + md5: 840b246b6b86c37321e79ca56518273f depends: - __osx >=10.13 - libffi >=3.4.6,<3.5.0a0 @@ -13819,11 +13843,11 @@ packages: license_family: MIT purls: - pkg:pypi/pyobjc-core?source=hash-mapping - size: 486545 - timestamp: 1750207980507 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py312h3f2cce9_0.conda - sha256: d4376eba59828c0134a439d5c82ee1d7a2dcd4f7c80878859b363865979b3f56 - md5: 5cdd230ab8467ca37570cd09a3977e17 + size: 486295 + timestamp: 1756813198835 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py312h3f2cce9_1.conda + sha256: 3d0fcfd9c76655fd8766a6ba9a6f9d1960754010da89077941e89b672fa4eab0 + md5: ac538df964f7be2c95a150e965322366 depends: - __osx >=10.13 - libffi >=3.4.6,<3.5.0a0 @@ -13834,11 +13858,11 @@ packages: license_family: MIT purls: - pkg:pypi/pyobjc-core?source=hash-mapping - size: 484609 - timestamp: 1750207854345 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py313h6971d95_0.conda - sha256: 17d1aeea68b091508e2bc8e58023788dcd7592143c909ede5b634d059d930f30 - md5: 6b77cb82a5311aa457295cec63adbbc8 + size: 485378 + timestamp: 1756813418705 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py313h6971d95_1.conda + sha256: b71f6977e3dab2220530b15c8567da173db739be24badc2144d7da4d1755ca9c + md5: c6a63b6715af2ba52cc730a77f79e946 depends: - __osx >=10.13 - libffi >=3.4.6,<3.5.0a0 @@ -13849,11 +13873,11 @@ packages: license_family: MIT purls: - pkg:pypi/pyobjc-core?source=hash-mapping - size: 488220 - timestamp: 1750207845515 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py311hf0763de_0.conda - sha256: ae4d7acab635209c88586849e1023892fc3242b0540567178efc17546eb33586 - md5: bff41faa73404184a27ec3903bc1baf2 + size: 488771 + timestamp: 1756813420666 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py311hf0763de_1.conda + sha256: c5cbb88710d690ae2f571037708026abb8f15de1a4d764e4b825aaad6c4549c8 + md5: 8c42827190081e9c29a1007454890067 depends: - __osx >=11.0 - libffi >=3.4.6,<3.5.0a0 @@ -13865,11 +13889,11 @@ packages: license_family: MIT purls: - pkg:pypi/pyobjc-core?source=hash-mapping - size: 476864 - timestamp: 1750208146293 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py312h4c66426_0.conda - sha256: d4b1ae7f925720c1a6643c03199c6a47ba6a536bfd630f522baa5fe6ebf4a786 - md5: 02247b8a9ba52a15a53edd6d4cf9dac4 + size: 477833 + timestamp: 1756813465248 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py312h4c66426_1.conda + sha256: d681491154780f106cdecda4c03b2952ced102013a9c1631d21baa6500e9d335 + md5: 443e404c3d27e6c7925dd5e4a9672c5e depends: - __osx >=11.0 - libffi >=3.4.6,<3.5.0a0 @@ -13880,12 +13904,12 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pyobjc-core?source=hash-mapping - size: 474838 - timestamp: 1750207878592 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py313had225c5_0.conda - sha256: 93fcab93a20f8776fb9340d19098f12a27c01283c0c96caac49dbeba27dd9652 - md5: 4f7ff79ebe0f28877b62adced9e49acb + - pkg:pypi/pyobjc-core?source=compressed-mapping + size: 474222 + timestamp: 1756813261461 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py313had225c5_1.conda + sha256: 9d4d32942bb2b11141836dadcebd7f54b60837447bc7eef3a9ad01a8adc11547 + md5: 60277e90c6cd9972a9e53f812e5ce83f depends: - __osx >=11.0 - libffi >=3.4.6,<3.5.0a0 @@ -13897,11 +13921,11 @@ packages: license_family: MIT purls: - pkg:pypi/pyobjc-core?source=hash-mapping - size: 478833 - timestamp: 1750208041268 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py311hfbc4093_0.conda - sha256: f8055dedb38952114787e56cf56827108daff2b9c1e340e0fe1e45164eef3825 - md5: 1ea1af1e872c875b1532c6b5c562a0ee + size: 478509 + timestamp: 1756813300773 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py311hbc8e8a3_1.conda + sha256: 71394c6e3f77898e856dab863f283e92f65b03e02e12fcf228bd3715a3459431 + md5: ab2c871073a077d149d6da6d03d10e44 depends: - __osx >=10.13 - libffi >=3.4.6,<3.5.0a0 @@ -13909,14 +13933,13 @@ packages: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: MIT - license_family: MIT purls: - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping - size: 384309 - timestamp: 1750225386024 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py312h2365019_0.conda - sha256: df309c1fd5a015d92c687200a10661a63955387620f61b1dd17a151d4a6ad4d1 - md5: dc83fce82c147af35c199348ce4938a6 + size: 385837 + timestamp: 1756824131805 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py312h1cc0658_1.conda + sha256: 6a43204f0413f9a3242cb77e160cb53aba9de4cb548932af1d0870b4d49c9b68 + md5: 50f1edf10246ee8f9ec72c5fe877f8ff depends: - __osx >=10.13 - libffi >=3.4.6,<3.5.0a0 @@ -13924,14 +13947,13 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: MIT - license_family: MIT purls: - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping - size: 380589 - timestamp: 1750225380233 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h19a8f7f_0.conda - sha256: f370c937cf20d0ef198f9ce1870ed61e6384d0fe4e85a01853d866ba86eb58ab - md5: f9b008619c45d0381e0900912c4ff554 + size: 380330 + timestamp: 1756824056502 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h55ae1d7_1.conda + sha256: 1ae4eb045d62e94e842b803d7d1c1da0ac08cc0b14aeda96196b2f820fcba511 + md5: 15f9b82c8a6cbbf05e136adca38864b0 depends: - __osx >=10.13 - libffi >=3.4.6,<3.5.0a0 @@ -13939,14 +13961,13 @@ packages: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: MIT - license_family: MIT purls: - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping - size: 382930 - timestamp: 1750225358268 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py311hab620ed_0.conda - sha256: 78d7e37661a41f18190a9b51c74712e69f7fdc2505fb2d5866d1d1843acb98e3 - md5: 1cdf530164d41cf7424e28f39562fe83 + size: 382649 + timestamp: 1756824068318 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py311hc5b188e_1.conda + sha256: 62db0aa2d3a23ae2ca2c28f2c462e63c0911903169c72a139a9e659e3ed02b19 + md5: ee9a511c6ffa04ac806bd2987b2b093d depends: - __osx >=11.0 - libffi >=3.4.6,<3.5.0a0 @@ -13955,14 +13976,13 @@ packages: - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: MIT - license_family: MIT purls: - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping - size: 390526 - timestamp: 1750225447749 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py312hb9d441b_0.conda - sha256: a6f262fe5706c73dce7ca7fbec9a055fc225422ad8d7fc45dd66ad9dddb0afe3 - md5: 5b7a58b273bca2c67dd8ddaea92e404e + size: 387176 + timestamp: 1756824223349 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py312h3964663_1.conda + sha256: f4f6ef1261080336fa3c37cb1a853fcd5119845f8a91d3f3cadec40ea39dbbd6 + md5: bf1e3e9543301d705427a763a92eb2ef depends: - __osx >=11.0 - libffi >=3.4.6,<3.5.0a0 @@ -13971,14 +13991,13 @@ packages: - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: MIT - license_family: MIT purls: - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping - size: 386128 - timestamp: 1750225477437 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313hb6afeec_0.conda - sha256: e2c40cc492a5e213b94e580ad8afd988ed4e4fb652046b3d65235e255a23b708 - md5: 9b7a787178df2ffe1f0e4fee33b66045 + size: 382439 + timestamp: 1756824097019 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313h4e140e3_1.conda + sha256: 139322c875d35199836802fc545b814ffb2001af2cee956b9da4d2fc7d3aec45 + md5: 1057463a9f16501716f978534aa2d838 depends: - __osx >=11.0 - libffi >=3.4.6,<3.5.0a0 @@ -13987,11 +14006,10 @@ packages: - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: MIT - license_family: MIT purls: - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping - size: 385067 - timestamp: 1750225411095 + size: 381682 + timestamp: 1756824258635 - pypi: https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl name: pyparsing version: 3.2.3 @@ -16489,9 +16507,9 @@ packages: - pkg:pypi/tomli?source=compressed-mapping size: 21238 timestamp: 1753796677376 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py311h49ec1c0_0.conda - sha256: 99b43e96b71271bf906d87d9dceeb1b5d7f79d56d2cd58374e528b56830c99af - md5: 8e82bf1a7614ac43096a5c8d726030a3 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py311h49ec1c0_1.conda + sha256: b1d686806d6b913e42aadb052b12d9cc91aae295640df3acfef645142fc33b3d + md5: 18a98f4444036100d78b230c94453ff4 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -16501,11 +16519,11 @@ packages: license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping - size: 869655 - timestamp: 1754732128935 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py312h4c3975b_0.conda - sha256: 891965f8e495ad5cef399db03a13df48df7add06ae131f4b77a88749c74b2060 - md5: 82dacd4832dcde0c2b7888248a3b3d7c + size: 868049 + timestamp: 1756855060036 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py312h4c3975b_1.conda + sha256: 7cd30a558a00293a33ab9bfe0e174311546f0a1573c9f6908553ecd9a9bc417b + md5: 66b988f7f1dc9fcc9541483cb0ab985b depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -16514,12 +16532,12 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado?source=compressed-mapping - size: 850503 - timestamp: 1754732194289 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_0.conda - sha256: bc4df522f933ea8829334d79732d828880bb976ed03a1f68f0826b91eaaee0b1 - md5: 01082edc358a2285f6480b918e35e1af + - pkg:pypi/tornado?source=hash-mapping + size: 850925 + timestamp: 1756855054247 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_1.conda + sha256: c8bfe883aa2d5b59cb1d962729a12b3191518f7decbe9e3505c2aacccb218692 + md5: 45821154b9cb2fb63c2b354c76086954 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -16529,11 +16547,11 @@ packages: license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping - size: 878421 - timestamp: 1754732125966 -- conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py311h13e5629_0.conda - sha256: a93bef1cc950c77c043c450a6740c81b583d196780a11fcd0b95300e23acb0be - md5: 7edf47f4bdc8f6934c558c35036fda91 + size: 877215 + timestamp: 1756855010312 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py311h13e5629_1.conda + sha256: 397226b6314aec2b076294816c941c1e9b7e3bbcf7a2e9dc9ba08f3ac10b0590 + md5: 06fd6a712ee16b3e7998e8ee2e7fc8b1 depends: - __osx >=10.13 - python >=3.11,<3.12.0a0 @@ -16541,12 +16559,12 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado?source=hash-mapping - size: 869677 - timestamp: 1754732189934 -- conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py312h2f459f6_0.conda - sha256: 93ab198aa2f4dc4edf0f34bb58daabe62cbbd13c164eba8319f9bc197e2b613a - md5: 45295c7a0d78367b40351370cd8fd8a6 + - pkg:pypi/tornado?source=compressed-mapping + size: 869912 + timestamp: 1756855230920 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py312h2f459f6_1.conda + sha256: 7951611120eb3d97d58a23bace89a88381792bbb23e7233c77163a86a5b058dc + md5: 10c40fc904bbfd1d4f1f90b3f159b777 depends: - __osx >=10.13 - python >=3.12,<3.13.0a0 @@ -16554,12 +16572,12 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado?source=hash-mapping - size: 849962 - timestamp: 1754732232519 -- conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py313h585f44e_0.conda - sha256: 6703359f10133da77905743c287735177bb7f074b68b289c41e72c4756da586d - md5: 80dbd1e0d4eb09da8a97b3315a26d904 + - pkg:pypi/tornado?source=compressed-mapping + size: 850711 + timestamp: 1756855239163 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py313h585f44e_1.conda + sha256: 530ac0f1864dcdb81a3c802d2b01cd83ec9a288f01dc6404b3f538b2ec84c3b6 + md5: 3fa5548d42d026657a1cd8e4305cee9d depends: - __osx >=10.13 - python >=3.13,<3.14.0a0 @@ -16568,11 +16586,11 @@ packages: license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping - size: 876047 - timestamp: 1754732200371 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py311h3696347_0.conda - sha256: e174acd73e641bc71673b9d4793a2c0321206baafd7a76e92b011fdc85a67908 - md5: cb8f3a7aa93ebc21113e2f6266d66c9c + size: 873301 + timestamp: 1756855040989 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py311h3696347_1.conda + sha256: 4941963a1f0046b2813bfbe4c2ded15cb0b0048436fe62237d69467e8c0e1692 + md5: 25833dd6cb94341239aec42dd5370c33 depends: - __osx >=11.0 - python >=3.11,<3.12.0a0 @@ -16582,11 +16600,11 @@ packages: license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping - size: 871796 - timestamp: 1754732249406 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py312h163523d_0.conda - sha256: 82ceea2527ac484f5c8d7dee95033935b7fecb0b42afb2d9538f7397404aa6d8 - md5: 181a5ca410bad66be792da0e11038016 + size: 870380 + timestamp: 1756855179889 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py312h163523d_1.conda + sha256: 00e9adcab3564cc579af09c6089c60e5abf5b1fbdca5e4f0fa7299d90f35dc13 + md5: e5f3e0a27abcae26a90645dfff8d68a4 depends: - __osx >=11.0 - python >=3.12,<3.13.0a0 @@ -16596,11 +16614,11 @@ packages: license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping - size: 853490 - timestamp: 1754732280524 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_0.conda - sha256: e687a470c8cea7815da666493cb6161948a7a1ae118237624db7689612732a04 - md5: d086389c0d48b2751361720665321eeb + size: 850838 + timestamp: 1756855106235 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_1.conda + sha256: 30fbb92cc119595e4ac7691789d45d367f5d6850103b97ca4a130d98e8ec27f0 + md5: 728311ebaa740a1efa6fab80bbcdf335 depends: - __osx >=11.0 - python >=3.13,<3.14.0a0 @@ -16610,11 +16628,11 @@ packages: license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping - size: 875854 - timestamp: 1754732465438 -- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py311h3485c13_0.conda - sha256: 288fc2b231d4b9895fefb50066881531a8d148f5cb01aa99eb9d335bf00b6447 - md5: 4f7ddc08f9282d519d5c1316e540d4ad + size: 874955 + timestamp: 1756855212446 +- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py311h3485c13_1.conda + sha256: 87527996d1297442bbc432369a5791af740762c1dda642d52cd55d32d5577937 + md5: ec9179a7226659bd15d8085c8de15360 depends: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 @@ -16624,12 +16642,12 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado?source=hash-mapping - size: 874287 - timestamp: 1754732248470 -- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py312he06e257_0.conda - sha256: bc5f5b20aa13e3ba343685c54d75a02c737ae6a5fe778908caf563d9f2273cb2 - md5: ef13034aef592637ce6e2dc1ca126bca + - pkg:pypi/tornado?source=compressed-mapping + size: 871179 + timestamp: 1756855104869 +- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py312he06e257_1.conda + sha256: 67f4c82c7cf49701fce306a8e208817e815e7819c85b17e37a2b1e77b128f9b8 + md5: 62097a4eaf874377d299ff2719a2b70a depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 @@ -16640,11 +16658,11 @@ packages: license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping - size: 855809 - timestamp: 1754732413384 -- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_0.conda - sha256: 6a461f7ffba2f0d90bca775fc95f58840c9b3ed3d6002659f4979a4a7b7ed344 - md5: 57756431d27f6043d8bc1e78eb8b3c7b + size: 852255 + timestamp: 1756855420837 +- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_1.conda + sha256: ec4d9ef994018acc59d83e1024f7b08a3e8f2d917ec42d6db873aaf6102fec3c + md5: ae40ad307ecb3181694714a40002af6c depends: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 @@ -16654,9 +16672,9 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado?source=hash-mapping - size: 878818 - timestamp: 1754732227288 + - pkg:pypi/tornado?source=compressed-mapping + size: 876511 + timestamp: 1756855260509 - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 md5: 019a7385be9af33791c989871317e1ed @@ -17233,141 +17251,150 @@ packages: purls: [] size: 77606 timestamp: 1727963209370 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h49ec1c0_3.conda - sha256: 2d2adc6539abbab7a599357b73faf8e3d8c9fc40f31d9fdf2e2927c315f02a6a - md5: 493d5b49a7b416746b2fe41c82e27dce +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py311h4854a17_1.conda + sha256: 0c13155c0eaeda24d1b208a4e9af28db025fd3388eca05fec872ce8d155d4e26 + md5: d0d623c1cd5a9515de1b2260d21a92aa depends: - __glibc >=2.17,<3.0.a0 - cffi >=1.11 - libgcc >=14 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 + - zstd >=1.5.7,<1.5.8.0a0 + - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause - license_family: BSD purls: - - pkg:pypi/zstandard?source=hash-mapping - size: 487091 - timestamp: 1756075708517 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h4c3975b_3.conda - sha256: 40c76563f3a398f27b4036e468881a1f909a8c66d100a16a28c1379a0940a59c - md5: 7a2c6e25a4fabf9fab62ee1977beabe5 + - pkg:pypi/zstandard?source=compressed-mapping + size: 426304 + timestamp: 1756841168805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py312h3fa7853_1.conda + sha256: 0c9a5cd2a38361af58d29351dcaa9b16f45784b885562875ed96be315d025439 + md5: e14ae4525748c648ba9cc6b6116349b6 depends: - __glibc >=2.17,<3.0.a0 - cffi >=1.11 - libgcc >=14 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + - zstd >=1.5.7,<1.5.8.0a0 + - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause - license_family: BSD purls: - - pkg:pypi/zstandard?source=hash-mapping - size: 488806 - timestamp: 1756075707087 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py313h07c4f96_3.conda - sha256: a2e3a0f646bc2f33fd87de332f73b88b7c3efb7b693e06a920f6aaa0d2f49231 - md5: 0720da5e63f3c93647350cc217fdf2bc + - pkg:pypi/zstandard?source=compressed-mapping + size: 424205 + timestamp: 1756841111538 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py313h736c1ce_1.conda + sha256: 5a148ac6fc01e41e635e1e5ac4a0fb834e29599a737cd5dddec98ae393bf9efc + md5: 2ca7715c89929da3d648144f8b34cf99 depends: - __glibc >=2.17,<3.0.a0 - cffi >=1.11 - libgcc >=14 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 + - zstd >=1.5.7,<1.5.8.0a0 + - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping - size: 492832 - timestamp: 1756075709448 -- conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py311h13e5629_3.conda - sha256: f9ba764da274ef483d9f943fb92bcbfdf1ad5e01099518e679d983791d807401 - md5: 23e7e8be78fa6414ef2569e1a53dfd24 + size: 428554 + timestamp: 1756841112889 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py311h3c2bd5d_1.conda + sha256: 2bcb6564f92d0fc0213e2bc2bac1c62405f147cf8013a26f9a8a5d7616d6a0bc + md5: 06fa60b2027ccd1792955c45d858e498 depends: - __osx >=10.13 - cffi >=1.11 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 + - zstd >=1.5.7,<1.5.8.0a0 + - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping - size: 645137 - timestamp: 1756075756331 -- conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py312h2f459f6_3.conda - sha256: ae6a6f87f27270d3c58c826ba3e344780816793af7586fe7f3fa4d4b07c9e274 - md5: f53fa375c2e4a2e42a64578db302145d + size: 414439 + timestamp: 1756841405143 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py312hcfdedb4_1.conda + sha256: ae6d18b775162cfbe2f7034b4375179005e91f2958ca1df71d53e419a3a4a32b + md5: c1653a4efc423de95c9326f55829197e depends: - __osx >=10.13 - cffi >=1.11 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + - zstd >=1.5.7,<1.5.8.0a0 + - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause - license_family: BSD purls: - - pkg:pypi/zstandard?source=hash-mapping - size: 644204 - timestamp: 1756075773049 -- conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py313h585f44e_3.conda - sha256: e747c88492fea02af89ecfd0c861dfce9e4dae2cc7654b1b47149e28020dcaa6 - md5: f18c1c08e948da397136badfa69ad82d + - pkg:pypi/zstandard?source=compressed-mapping + size: 414810 + timestamp: 1756841333043 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py313h4b03fa9_1.conda + sha256: f674b7fcf016a63018cbe35b1e489d9ee66ec75ce26a118a3451584f496fc923 + md5: 5d19d0e2227af7e02e5475c76260ec18 depends: - __osx >=10.13 - cffi >=1.11 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 + - zstd >=1.5.7,<1.5.8.0a0 + - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping - size: 648827 - timestamp: 1756075802303 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py311h3696347_3.conda - sha256: 392bdd0a344705dbdf14b5f6a083f67367a3fa333b10d56b56591d462c7c1631 - md5: 94f5136be6b59888a143f3be16f06ff5 + size: 419581 + timestamp: 1756841309712 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py311hcb74504_1.conda + sha256: adaa5348098ffbeff7b4010fa0e40014c5ae4ddf516dfbb614d94aba250f0ab1 + md5: 7f37b0e6bdd383990452506ba9b924a9 depends: - __osx >=11.0 - cffi >=1.11 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 + - zstd >=1.5.7,<1.5.8.0a0 + - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause - license_family: BSD purls: - - pkg:pypi/zstandard?source=hash-mapping - size: 510335 - timestamp: 1756075846880 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h163523d_3.conda - sha256: dd4bc79229fb401a856eff02c392d3e6cfa5da9a2becb5077f5eb89c315b40eb - md5: 718b0aa0e2a3bb6f5e2dcc168f9e2ac3 + - pkg:pypi/zstandard?source=compressed-mapping + size: 345126 + timestamp: 1756841297012 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py312h26de6b3_1.conda + sha256: d84e71855f8f0168e0e6f2b9c8eefc36d4df5b95f6f3e85ae85bd3c3e5132fc1 + md5: 1c7500a891878a61a136605b711af46b depends: - __osx >=11.0 - cffi >=1.11 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 + - zstd >=1.5.7,<1.5.8.0a0 + - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause - license_family: BSD purls: - - pkg:pypi/zstandard?source=hash-mapping - size: 511025 - timestamp: 1756075793991 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py313hcdf3177_3.conda - sha256: 1504af74fe125281735e28bed7cb505c9ab77ca0604de95769248016e438b1c8 - md5: 2c20f2bf641dd839f6f9b7c057196a68 + - pkg:pypi/zstandard?source=compressed-mapping + size: 345168 + timestamp: 1756841514802 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py313hff09f02_1.conda + sha256: 5e5a6f0fb2d1c08a72918b5d2d97dff2692327b772f48445d27e440d1ef69a6a + md5: 43b6a7c0b0ae0baa7937a769b74ca2f6 depends: - __osx >=11.0 - cffi >=1.11 - python >=3.13,<3.14.0a0 - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 + - zstd >=1.5.7,<1.5.8.0a0 + - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping - size: 516638 - timestamp: 1756075906716 -- conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py311h3485c13_3.conda - sha256: 5b3a2666e21723b96b3637aef4d108c2996979efe5719998649184f01b20ed7e - md5: 8265296d9de69a925580b651c0c717ae + size: 349620 + timestamp: 1756841373649 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py311h2d646e2_1.conda + sha256: 56c740d7efb0ca64be620ee8fe9a9e632fcd4cd10e18bb4aa09c24847819c526 + md5: c4567a485e5f58b12cacefe3e1a4b208 depends: - cffi >=1.11 - python >=3.11,<3.12.0a0 @@ -17375,15 +17402,16 @@ packages: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.5.8.0a0 + - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause - license_family: BSD purls: - - pkg:pypi/zstandard?source=hash-mapping - size: 343300 - timestamp: 1756075846831 -- conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py312he06e257_3.conda - sha256: 13f43231e22173473ba300d9a128caf386ec73a18a5b9b192858ba18ea2e78f1 - md5: e23097165ce8ba29c30854c2a9e84449 + - pkg:pypi/zstandard?source=compressed-mapping + size: 348398 + timestamp: 1756841352904 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py312ha680012_1.conda + sha256: d700928eee50c6df515d21303f7efc731a14c02978f0712a23579e86be52e3d1 + md5: 2af048668bbb6802972d469bd038110b depends: - cffi >=1.11 - python >=3.12,<3.13.0a0 @@ -17391,15 +17419,16 @@ packages: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.5.8.0a0 + - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping - size: 342842 - timestamp: 1756075919270 -- conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py313h5ea7bf4_3.conda - sha256: fd446ae9142ddcaf123de7997dbded7aee88c333ab4dfd7bf3cfca4c2041aca1 - md5: 884170f85de370eb45d5c4edab147861 + size: 346385 + timestamp: 1756841280773 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py313hcdcf24b_1.conda + sha256: 4a2f488f8df9b19c14f7b66b55431146d18f8070bd722f1760713e28a0c3e9ec + md5: b35c9d56c92c2d3846908b87e4d40ede depends: - cffi >=1.11 - python >=3.13,<3.14.0a0 @@ -17407,9 +17436,58 @@ packages: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.5.8.0a0 + - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping - size: 347160 - timestamp: 1756075776191 + size: 351525 + timestamp: 1756841550515 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 567578 + timestamp: 1742433379869 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda + sha256: c171c43d0c47eed45085112cb00c8c7d4f0caa5a32d47f2daca727e45fb98dca + md5: cd60a4a5a8d6a476b30d8aa4bb49251a + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 485754 + timestamp: 1742433356230 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + sha256: 0d02046f57f7a1a3feae3e9d1aa2113788311f3cf37a3244c71e61a93177ba67 + md5: e6f69c7bcccdefa417f056fa593b40f0 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 399979 + timestamp: 1742433432699 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda + sha256: bc64864377d809b904e877a98d0584f43836c9f2ef27d3d2a1421fa6eae7ca04 + md5: 21f56217d6125fb30c3c3f10c786d751 + depends: + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 354697 + timestamp: 1742433568506 diff --git a/src/easydiffraction/analysis/calculators/calculator_base.py b/src/easydiffraction/analysis/calculators/calculator_base.py index 2577266c..901be9e3 100644 --- a/src/easydiffraction/analysis/calculators/calculator_base.py +++ b/src/easydiffraction/analysis/calculators/calculator_base.py @@ -57,7 +57,7 @@ def calculate_pattern( Returns: The calculated diffraction pattern as a NumPy array. """ - x_data = experiment.datastore.pattern.x + x_data = experiment.datastore.x y_calc_zeros = np.zeros_like(x_data) valid_linked_phases = self._get_valid_linked_phases(sample_models, experiment) @@ -89,11 +89,11 @@ def calculate_pattern( y_bkg = np.zeros_like(x_data) if hasattr(experiment, 'background'): y_bkg = experiment.background.calculate(x_data) - experiment.datastore.pattern.bkg = y_bkg + experiment.datastore.bkg = y_bkg # Calculate total pattern y_calc_total = y_calc_scaled + y_bkg - experiment.datastore.pattern.calc = y_calc_total + experiment.datastore.calc = y_calc_total return y_calc_total diff --git a/src/easydiffraction/analysis/calculators/calculator_crysfml.py b/src/easydiffraction/analysis/calculators/calculator_crysfml.py index c95734fe..93fe4aab 100644 --- a/src/easydiffraction/analysis/calculators/calculator_crysfml.py +++ b/src/easydiffraction/analysis/calculators/calculator_crysfml.py @@ -71,7 +71,7 @@ def _calculate_single_model_pattern( crysfml_dict = self._crysfml_dict(sample_model, experiment) try: _, y = cfml_py_utilities.cw_powder_pattern_from_dict(crysfml_dict) - y = self._adjust_pattern_length(y, len(experiment.datastore.pattern.x)) + y = self._adjust_pattern_length(y, len(experiment.datastore.x)) except KeyError: print('[CrysfmlCalculator] Error: No calculated data') y = [] @@ -177,7 +177,7 @@ def _convert_experiment_to_dict( instrument = getattr(experiment, 'instrument', None) peak = getattr(experiment, 'peak', None) - x_data = experiment.datastore.pattern.x + x_data = experiment.datastore.x twotheta_min = float(x_data.min()) twotheta_max = float(x_data.max()) diff --git a/src/easydiffraction/analysis/calculators/calculator_cryspy.py b/src/easydiffraction/analysis/calculators/calculator_cryspy.py index 5154daaf..ce62aa86 100644 --- a/src/easydiffraction/analysis/calculators/calculator_cryspy.py +++ b/src/easydiffraction/analysis/calculators/calculator_cryspy.py @@ -328,7 +328,7 @@ def _convert_experiment_to_cryspy_cif( attr_value = getattr(peak, local_attr_name).value cif_lines.append(f'{engine_key_name} {attr_value}') - x_data = experiment.datastore.pattern.x + x_data = experiment.datastore.x twotheta_min = float(x_data.min()) twotheta_max = float(x_data.max()) cif_lines.append('') @@ -373,8 +373,8 @@ def _convert_experiment_to_cryspy_cif( cif_lines.append('_tof_meas_intensity') cif_lines.append('_tof_meas_intensity_sigma') - y_data = experiment.datastore.pattern.meas - sy_data = experiment.datastore.pattern.meas_su + y_data = experiment.datastore.meas + sy_data = experiment.datastore.meas_su for x_val, y_val, sy_val in zip(x_data, y_data, sy_data): cif_lines.append(f' {x_val:.5f} {y_val:.5f} {sy_val:.5f}') diff --git a/src/easydiffraction/analysis/calculators/calculator_pdffit.py b/src/easydiffraction/analysis/calculators/calculator_pdffit.py index 239e936c..2897b66b 100644 --- a/src/easydiffraction/analysis/calculators/calculator_pdffit.py +++ b/src/easydiffraction/analysis/calculators/calculator_pdffit.py @@ -81,9 +81,8 @@ def _calculate_single_model_pattern( calculator.setvar('spdiameter', experiment.peak.damp_particle_diameter.value) # Data - pattern = experiment.datastore.pattern - x = list(pattern.x) - y_noise = list(np.zeros_like(pattern.x)) + x = list(experiment.datastore.x) + y_noise = list(np.zeros_like(x)) # Assign the data to the PDFfit calculator calculator.read_data_lists( diff --git a/src/easydiffraction/analysis/minimization.py b/src/easydiffraction/analysis/minimization.py index 706c3403..624c8584 100644 --- a/src/easydiffraction/analysis/minimization.py +++ b/src/easydiffraction/analysis/minimization.py @@ -173,8 +173,8 @@ def _residual_function( experiment, called_by_minimizer=True, ) - y_meas: np.ndarray = experiment.datastore.pattern.meas - y_meas_su: np.ndarray = experiment.datastore.pattern.meas_su + y_meas: np.ndarray = experiment.datastore.meas + y_meas_su: np.ndarray = experiment.datastore.meas_su diff = (y_meas - y_calc) / y_meas_su # Residuals are squared before going into reduced chi-squared diff --git a/src/easydiffraction/analysis/reliability_factors.py b/src/easydiffraction/analysis/reliability_factors.py index 69b52559..a9a25f56 100644 --- a/src/easydiffraction/analysis/reliability_factors.py +++ b/src/easydiffraction/analysis/reliability_factors.py @@ -143,8 +143,8 @@ def get_reliability_inputs( y_err_all = [] for expt_name, experiment in experiments._items.items(): y_calc = calculator.calculate_pattern(sample_models, experiment) - y_meas = experiment.datastore.pattern.meas - y_meas_su = experiment.datastore.pattern.meas_su + y_meas = experiment.datastore.meas + y_meas_su = experiment.datastore.meas_su if y_meas is not None and y_calc is not None: # If standard uncertainty is not provided, use ones diff --git a/src/easydiffraction/experiments/collections/datastore.py b/src/easydiffraction/experiments/collections/datastore.py deleted file mode 100644 index 1749bca0..00000000 --- a/src/easydiffraction/experiments/collections/datastore.py +++ /dev/null @@ -1,126 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2025 EasyDiffraction Python Library contributors -# SPDX-License-Identifier: BSD-3-Clause - -from __future__ import annotations - -from typing import TYPE_CHECKING -from typing import Optional - -if TYPE_CHECKING: - from ..experiment import Experiment # adjust path if needed - -import numpy as np - - -class Pattern: - """ - Base pattern class for both powder and single crystal experiments. - Stores x, measured intensities, uncertainties, background, and calculated intensities. - """ - - def __init__(self, experiment: Experiment) -> None: - self.experiment = experiment - - # Data arrays - self.x: Optional[np.ndarray] = None - self.d: Optional[np.ndarray] = None - self.meas: Optional[np.ndarray] = None - self.meas_su: Optional[np.ndarray] = None - self.bkg: Optional[np.ndarray] = None - self.excluded: Optional[np.ndarray] = None # Flags for excluded points - self._calc: Optional[np.ndarray] = None # Cached calculated intensities - - @property - def calc(self) -> Optional[np.ndarray]: - """Access calculated intensities. Should be updated via external calculation.""" - return self._calc - - @calc.setter - def calc(self, values: np.ndarray) -> None: - """Set calculated intensities (from Analysis.calculate_pattern()).""" - self._calc = values - - -class PowderPattern(Pattern): - """ - Specialized pattern for powder diffraction (can be extended in the future). - """ - - # TODO: Check if this class is needed or if it can be merged with Pattern - def __init__(self, experiment: Experiment) -> None: - super().__init__(experiment) - # Additional powder-specific initialization if needed - - -class Datastore: - """ - Stores pattern data (measured and calculated) for an experiment. - """ - - def __init__(self, sample_form: str, experiment: Experiment) -> None: - self.sample_form: str = sample_form - - if sample_form == 'powder': - self.pattern: Pattern = PowderPattern(experiment) - elif sample_form == 'single_crystal': - self.pattern: Pattern = Pattern(experiment) # TODO: Find better name for single crystal pattern - else: - raise ValueError(f"Unknown sample form '{sample_form}'") - - def load_measured_data(self, file_path: str) -> None: - """Load measured data from an ASCII file.""" - # TODO: Check if this method is used... - # Looks like _load_ascii_data_to_experiment from experiments.py is used instead - print(f'Loading measured data for {self.sample_form} diffraction from {file_path}') - - try: - data: np.ndarray = np.loadtxt(file_path) - except Exception as e: - print(f'Failed to load data: {e}') - return - - if data.shape[1] < 2: - raise ValueError('Data file must have at least two columns (x and y).') - - x: np.ndarray = data[:, 0] - y: np.ndarray = data[:, 1] - sy: np.ndarray = data[:, 2] if data.shape[1] > 2 else np.sqrt(np.abs(y)) - - self.pattern.x = x - self.pattern.meas = y - self.pattern.meas_su = sy - self.pattern.excluded = np.full(x.shape, fill_value=False, dtype=bool) # No excluded points by default - - print(f"Loaded {len(x)} points for experiment '{self.pattern.experiment.name}'.") - - def show_measured_data(self) -> None: - """Display measured data in console.""" - print(f'\nMeasured data ({self.sample_form}):') - print(f'x: {self.pattern.x}') - print(f'meas: {self.pattern.meas}') - print(f'meas_su: {self.pattern.meas_su}') - - def show_calculated_data(self) -> None: - """Display calculated data in console.""" - print(f'\nCalculated data ({self.sample_form}):') - print(f'calc: {self.pattern.calc}') - - -class DatastoreFactory: - """ - Factory to dynamically create appropriate datastore instances (SC/Powder). - """ - - @staticmethod - def create(sample_form: str, experiment: Experiment) -> Datastore: - """ - Create a datastore object depending on the sample form. - - Args: - sample_form: The form of the sample ("powder" or "single_crystal"). - experiment: The experiment object. - - Returns: - A new Datastore instance appropriate for the sample form. - """ - return Datastore(sample_form, experiment) diff --git a/src/easydiffraction/experiments/collections/excluded_regions.py b/src/easydiffraction/experiments/collections/excluded_regions.py index 5808cf85..81a8d555 100644 --- a/src/easydiffraction/experiments/collections/excluded_regions.py +++ b/src/easydiffraction/experiments/collections/excluded_regions.py @@ -61,19 +61,18 @@ def on_item_added(self, item: ExcludedRegion) -> None: """ Mark excluded points in the experiment pattern when a new region is added. """ - experiment = self._parent - pattern = experiment.datastore.pattern + datastore = self._parent.datastore # Boolean mask for points within the new excluded region - in_region = (pattern.full_x >= item.start.value) & (pattern.full_x <= item.end.value) + in_region = (datastore.full_x >= item.start.value) & (datastore.full_x <= item.end.value) # Update the exclusion mask - pattern.excluded[in_region] = True + datastore.excluded[in_region] = True # Update the excluded points in the datastore - pattern.x = pattern.full_x[~pattern.excluded] - pattern.meas = pattern.full_meas[~pattern.excluded] - pattern.meas_su = pattern.full_meas_su[~pattern.excluded] + datastore.x = datastore.full_x[~datastore.excluded] + datastore.meas = datastore.full_meas[~datastore.excluded] + datastore.meas_su = datastore.full_meas_su[~datastore.excluded] def show(self) -> None: # TODO: Consider moving this to the base class diff --git a/src/easydiffraction/experiments/datastore.py b/src/easydiffraction/experiments/datastore.py new file mode 100644 index 00000000..5392df08 --- /dev/null +++ b/src/easydiffraction/experiments/datastore.py @@ -0,0 +1,250 @@ +# SPDX-FileCopyrightText: 2021-2025 EasyDiffraction Python Library contributors +# SPDX-License-Identifier: BSD-3-Clause + +from __future__ import annotations + +from abc import abstractmethod +from typing import Optional + +import numpy as np + +from easydiffraction.core.constants import DEFAULT_BEAM_MODE +from easydiffraction.core.constants import DEFAULT_SAMPLE_FORM +from easydiffraction.utils.decorators import enforce_type + + +class BaseDatastore: + """ + Base class for all data stores. + + Attributes + ---------- + meas : Optional[np.ndarray] + Measured intensities. + meas_su : Optional[np.ndarray] + Standard uncertainties of measured intensities. + excluded : Optional[np.ndarray] + Flags for excluded points. + _calc : Optional[np.ndarray] + Stored calculated intensities. + """ + + def __init__(self) -> None: + self.meas: Optional[np.ndarray] = None + self.meas_su: Optional[np.ndarray] = None + self.excluded: Optional[np.ndarray] = None + self._calc: Optional[np.ndarray] = None + + @property + def calc(self) -> Optional[np.ndarray]: + """Access calculated intensities. Should be updated via external calculation. + + Returns: + Optional[np.ndarray]: Calculated intensities array or None if not set. + """ + return self._calc + + @calc.setter + @enforce_type + def calc(self, values: np.ndarray) -> None: + """Set calculated intensities (from Analysis.calculate_pattern()). + + Args: + values (np.ndarray): Array of calculated intensities. + """ + self._calc = values + + @abstractmethod + def _cif_mapping(self) -> dict[str, str]: + """ + Must be implemented in subclasses to return a mapping from attribute + names to CIF tags. + + Returns: + dict[str, str]: Mapping from attribute names to CIF tags. + """ + pass + + def as_cif(self, max_points: Optional[int] = None) -> str: + """ + Generate a CIF-formatted string representing the datastore data. + + Args: + max_points (Optional[int]): Maximum number of points to include + from start and end. + If the total points exceed twice this number, data in the middle + is truncated with '...'. + + Returns: + str: CIF-formatted string of the data. Empty string if no data available. + """ + cif_lines = ['loop_'] + + # Add CIF tags from mapping + mapping = self._cif_mapping() + for cif_key in mapping.values(): + cif_lines.append(cif_key) + + # Collect data arrays according to mapping keys + data_arrays = [] + for attr_name in mapping.keys(): + attr_array = getattr(self, attr_name, None) + if attr_array is None: + data_arrays.append(np.array([])) + else: + data_arrays.append(attr_array) + + # Return empty string if no data + if not data_arrays or not data_arrays[0].size: + return '' + + # Determine number of points in the first data array + n_points = len(data_arrays[0]) + + # Function to format a single row of data + def _format_row(i: int) -> str: + return ' '.join(str(data_arrays[j][i]) for j in range(len(data_arrays))) + + # Add data lines, applying max_points truncation if needed + if max_points is not None and n_points > 2 * max_points: + for i in range(max_points): + cif_lines.append(_format_row(i)) + cif_lines.append('...') + for i in range(-max_points, 0): + cif_lines.append(_format_row(i)) + else: + for i in range(n_points): + cif_lines.append(_format_row(i)) + + cif_str = '\n'.join(cif_lines) + + return cif_str + + +class PowderDatastore(BaseDatastore): + """Class for powder diffraction data. + + Attributes + ---------- + x : Optional[np.ndarray] + Scan variable (e.g. 2ΞΈ or time-of-flight values). + d : Optional[np.ndarray] + d-spacing values. + bkg : Optional[np.ndarray] + Background values. + """ + + def __init__(self, beam_mode: str = DEFAULT_BEAM_MODE) -> None: + """ + Initialize PowderDatastore. + + Args: + beam_mode (str): Beam mode, e.g. 'time-of-flight' or 'constant wavelength'. + """ + super().__init__() + self.beam_mode = beam_mode + self.x: Optional[np.ndarray] = None + self.d: Optional[np.ndarray] = None + self.bkg: Optional[np.ndarray] = None + + def _cif_mapping(self) -> dict[str, str]: + """ + Return mapping from attribute names to CIF tags based on beam mode. + + Returns: + dict[str, str]: Mapping dictionary. + """ + # TODO: Decide where to have validation for beam_mode, + # here or in Experiment class or somewhere else. + return { + 'time-of-flight': { + 'x': '_pd_meas.time_of_flight', + 'meas': '_pd_meas.intensity_total', + 'meas_su': '_pd_meas.intensity_total_su', + }, + 'constant wavelength': { + 'x': '_pd_meas.2theta_scan', + 'meas': '_pd_meas.intensity_total', + 'meas_su': '_pd_meas.intensity_total_su', + }, + }[self.beam_mode] + + +class SingleCrystalDatastore(BaseDatastore): + """Class for single crystal diffraction data. + + Attributes + ---------- + sin_theta_over_lambda : Optional[np.ndarray] + sin(ΞΈ)/Ξ» values. + index_h : Optional[np.ndarray] + Miller index h. + index_k : Optional[np.ndarray] + Miller index k. + index_l : Optional[np.ndarray] + Miller index l. + """ + + def __init__(self) -> None: + """ + Initialize SingleCrystalDatastore. + """ + super().__init__() + self.sin_theta_over_lambda: Optional[np.ndarray] = None + self.index_h: Optional[np.ndarray] = None + self.index_k: Optional[np.ndarray] = None + self.index_l: Optional[np.ndarray] = None + + def _cif_mapping(self) -> dict[str, str]: + """ + Return mapping from attribute names to CIF tags for single crystal data. + + Returns: + dict[str, str]: Mapping dictionary. + """ + return { + 'index_h': '_refln.index_h', + 'index_k': '_refln.index_k', + 'index_l': '_refln.index_l', + 'meas': '_refln.intensity_meas', + 'meas_su': '_refln.intensity_meas_su', + } + + +class DatastoreFactory: + _supported = { + 'powder': PowderDatastore, + 'single crystal': SingleCrystalDatastore, + } + + @classmethod + def create( + cls, + sample_form: str = DEFAULT_SAMPLE_FORM, + beam_mode: str = DEFAULT_BEAM_MODE, + ) -> BaseDatastore: + """ + Create and return a datastore object for the given sample form. + + Args: + sample_form (str): Sample form type, e.g. 'powder' or 'single crystal'. + beam_mode (str): Beam mode for powder sample form. + + Returns: + BaseDatastore: Instance of a datastore class corresponding to sample form. + """ + supported_sample_forms = list(cls._supported.keys()) + if sample_form not in supported_sample_forms: + raise ValueError(f"Unsupported sample form: '{sample_form}'.\nSupported sample forms: {supported_sample_forms}") + + supported_beam_modes = ['time-of-flight', 'constant wavelength'] + if beam_mode not in supported_beam_modes: + raise ValueError(f"Unsupported beam mode: '{beam_mode}'.\nSupported beam modes: {supported_beam_modes}") + + datastore_class = cls._supported[sample_form] + if sample_form == 'powder': + datastore_obj = datastore_class(beam_mode=beam_mode) + else: + datastore_obj = datastore_class() + + return datastore_obj diff --git a/src/easydiffraction/experiments/experiment.py b/src/easydiffraction/experiments/experiment.py index d1a5bd1d..6f722402 100644 --- a/src/easydiffraction/experiments/experiment.py +++ b/src/easydiffraction/experiments/experiment.py @@ -15,13 +15,13 @@ from easydiffraction.core.constants import DEFAULT_SCATTERING_TYPE from easydiffraction.core.objects import Datablock from easydiffraction.experiments.collections.background import BackgroundFactory -from easydiffraction.experiments.collections.datastore import DatastoreFactory from easydiffraction.experiments.collections.excluded_regions import ExcludedRegions from easydiffraction.experiments.collections.linked_phases import LinkedPhases from easydiffraction.experiments.components.experiment_type import ExperimentType from easydiffraction.experiments.components.instrument import InstrumentBase from easydiffraction.experiments.components.instrument import InstrumentFactory from easydiffraction.experiments.components.peak import PeakFactory +from easydiffraction.experiments.datastore import DatastoreFactory from easydiffraction.utils.decorators import enforce_type from easydiffraction.utils.formatting import paragraph from easydiffraction.utils.formatting import warning @@ -62,7 +62,7 @@ def __init__(self, name: str, type: ExperimentType): self.type = type self.datastore = DatastoreFactory.create( sample_form=self.type.sample_form.value, - experiment=self, + beam_mode=self.type.beam_mode.value, ) # --------------------------- @@ -135,29 +135,8 @@ def as_cif( cif_lines += ['', self.excluded_regions.as_cif()] # Measured data - if hasattr(self, 'datastore') and hasattr(self.datastore, 'pattern'): - cif_lines.append('') - cif_lines.append('loop_') - category = '_pd_meas' # TODO: Add category to pattern component - attributes = ('2theta_scan', 'intensity_total', 'intensity_total_su') - for attribute in attributes: - cif_lines.append(f'{category}.{attribute}') - pattern = self.datastore.pattern - if max_points is not None and len(pattern.x) > 2 * max_points: - for i in range(max_points): - x = pattern.x[i] - meas = pattern.meas[i] - meas_su = pattern.meas_su[i] - cif_lines.append(f'{x} {meas} {meas_su}') - cif_lines.append('...') - for i in range(-max_points, 0): - x = pattern.x[i] - meas = pattern.meas[i] - meas_su = pattern.meas_su[i] - cif_lines.append(f'{x} {meas} {meas_su}') - else: - for x, meas, meas_su in zip(pattern.x, pattern.meas, pattern.meas_su): - cif_lines.append(f'{x} {meas} {meas_su}') + if hasattr(self, 'datastore'): + cif_lines += ['', self.datastore.as_cif(max_points=max_points)] return '\n'.join(cif_lines) @@ -293,19 +272,19 @@ def _load_ascii_data_to_experiment(self, data_path: str) -> None: # Attach the data to the experiment's datastore # The full pattern data - self.datastore.pattern.full_x = x - self.datastore.pattern.full_meas = y - self.datastore.pattern.full_meas_su = sy + self.datastore.full_x = x + self.datastore.full_meas = y + self.datastore.full_meas_su = sy # The pattern data used for fitting (without excluded points) # This is the same as full_x, full_meas, full_meas_su by default - self.datastore.pattern.x = x - self.datastore.pattern.meas = y - self.datastore.pattern.meas_su = sy + self.datastore.x = x + self.datastore.meas = y + self.datastore.meas_su = sy # Excluded mask # No excluded points by default - self.datastore.pattern.excluded = np.full(x.shape, fill_value=False, dtype=bool) + self.datastore.excluded = np.full(x.shape, fill_value=False, dtype=bool) print(paragraph('Data loaded successfully')) print(f"Experiment πŸ”¬ '{self.name}'. Number of data points: {len(x)}") @@ -392,9 +371,9 @@ def _load_ascii_data_to_experiment(self, data_path): sy = data[:, 2] if data.shape[1] > 2 else np.full_like(y, fill_value=default_sy) # Attach the data to the experiment's datastore - self.datastore.pattern.x = x - self.datastore.pattern.meas = y - self.datastore.pattern.meas_su = sy + self.datastore.x = x + self.datastore.meas = y + self.datastore.meas_su = sy print(paragraph('Data loaded successfully')) print(f"Experiment πŸ”¬ '{self.name}'. Number of data points: {len(x)}") diff --git a/src/easydiffraction/project.py b/src/easydiffraction/project.py index b51fc5c1..5b569624 100644 --- a/src/easydiffraction/project.py +++ b/src/easydiffraction/project.py @@ -252,7 +252,7 @@ def plot_meas( d_spacing=False, ): experiment = self.experiments[expt_name] - pattern = experiment.datastore.pattern + datastore = experiment.datastore expt_type = experiment.type # Update d-spacing if necessary @@ -265,7 +265,7 @@ def plot_meas( # Plot measured pattern self.plotter.plot_meas( - pattern, + datastore, expt_name, expt_type, x_min=x_min, @@ -282,7 +282,7 @@ def plot_calc( ): self.analysis.calculate_pattern(expt_name) # Recalculate pattern experiment = self.experiments[expt_name] - pattern = experiment.datastore.pattern + datastore = experiment.datastore expt_type = experiment.type # Update d-spacing if necessary @@ -295,7 +295,7 @@ def plot_calc( # Plot calculated pattern self.plotter.plot_calc( - pattern, + datastore, expt_name, expt_type, x_min=x_min, @@ -313,7 +313,7 @@ def plot_meas_vs_calc( ): self.analysis.calculate_pattern(expt_name) # Recalculate pattern experiment = self.experiments[expt_name] - pattern = experiment.datastore.pattern + datastore = experiment.datastore expt_type = experiment.type # Update d-spacing if necessary @@ -326,7 +326,7 @@ def plot_meas_vs_calc( # Plot measured vs calculated self.plotter.plot_meas_vs_calc( - pattern, + datastore, expt_name, expt_type, x_min=x_min, @@ -340,18 +340,18 @@ def update_pattern_d_spacing(self, expt_name: str) -> None: Update the pattern's d-spacing based on the experiment's beam mode. """ experiment = self.experiments[expt_name] - pattern = experiment.datastore.pattern + datastore = experiment.datastore expt_type = experiment.type beam_mode = expt_type.beam_mode.value if beam_mode == 'time-of-flight': - pattern.d = tof_to_d( - pattern.x, + datastore.d = tof_to_d( + datastore.x, experiment.instrument.calib_d_to_tof_offset.value, experiment.instrument.calib_d_to_tof_linear.value, experiment.instrument.calib_d_to_tof_quad.value, ) elif beam_mode == 'constant wavelength': - pattern.d = twotheta_to_d(pattern.x, experiment.instrument.setup_wavelength.value) + datastore.d = twotheta_to_d(datastore.x, experiment.instrument.setup_wavelength.value) else: print(error(f'Unsupported beam mode: {beam_mode} for d-spacing update.')) diff --git a/src/easydiffraction/utils/decorators.py b/src/easydiffraction/utils/decorators.py index 5b690a11..824c0780 100644 --- a/src/easydiffraction/utils/decorators.py +++ b/src/easydiffraction/utils/decorators.py @@ -2,25 +2,44 @@ # SPDX-License-Identifier: BSD-3-Clause import inspect +import typing + +import numpy as np def enforce_type(func): sig = inspect.signature(func) - params = list(sig.parameters.items()) - # Find the first argument that isn't 'self' - for name, param in params: - if name != 'self': - expected_type = param.annotation + def wrapper(self, *args, **kwargs): + bound_args = sig.bind(self, *args, **kwargs) + bound_args.apply_defaults() + + for name, value in list(bound_args.arguments.items())[1:]: # skip 'self' + expected_type = sig.parameters[name].annotation if expected_type is inspect._empty: - raise TypeError(f"Missing type annotation for parameter '{name}' in {func.__qualname__}") - break - else: - raise TypeError(f'No annotated parameter found in {func.__qualname__}') - - def wrapper(self, value): - if not isinstance(value, expected_type): - raise TypeError(f'Expected {expected_type.__name__}, got {type(value).__name__}.') - return func(self, value) + continue # no annotation, skip + + origin = typing.get_origin(expected_type) + if origin is not None: + args_types = typing.get_args(expected_type) + valid_types = tuple(t for t in args_types if isinstance(t, type)) + if not any(isinstance(value, t) for t in valid_types): + raise TypeError(f"Parameter '{name}': expected {expected_type}, got {type(value).__name__}.") + else: + if isinstance(expected_type, type): + if not isinstance(value, expected_type): + raise TypeError(f"Parameter '{name}': expected {expected_type.__name__}, got {type(value).__name__}.") + elif isinstance(expected_type, str) and expected_type == 'np.ndarray': + if not isinstance(value, np.ndarray): + raise TypeError(f"Parameter '{name}': expected np.ndarray, got {type(value).__name__}.") + else: + if hasattr(expected_type, '__name__'): + if type(value).__name__ != expected_type.__name__: + raise TypeError(f"Parameter '{name}': expected {expected_type}, got {type(value).__name__}.") + else: + if type(value).__name__ != str(expected_type): + raise TypeError(f"Parameter '{name}': expected {expected_type}, got {type(value).__name__}.") + + return func(self, *args, **kwargs) return wrapper diff --git a/src/easydiffraction/utils/utils.py b/src/easydiffraction/utils/utils.py index 2aa4f59e..3474ec5e 100644 --- a/src/easydiffraction/utils/utils.py +++ b/src/easydiffraction/utils/utils.py @@ -358,10 +358,9 @@ def is_notebook() -> bool: """ if IPython is None: return False - if is_pycharm(): # Running inside PyCharm - return True - elif is_colab(): # Running inside Google Colab + return False + if is_colab(): # Running inside Google Colab return True try: diff --git a/tests/unit/analysis/calculators/test_calculator_base.py b/tests/unit/analysis/calculators/test_calculator_base.py index 990197fc..ba11e9e1 100644 --- a/tests/unit/analysis/calculators/test_calculator_base.py +++ b/tests/unit/analysis/calculators/test_calculator_base.py @@ -36,9 +36,9 @@ def mock_sample_models(): @pytest.fixture def mock_experiment(): experiment = MagicMock() - experiment.datastore.pattern.x = np.array([1.0, 2.0, 3.0]) - experiment.datastore.pattern.bkg = None - experiment.datastore.pattern.calc = None + experiment.datastore.x = np.array([1.0, 2.0, 3.0]) + experiment.datastore.bkg = None + experiment.datastore.calc = None experiment.linked_phases = [ MagicMock(_entry_id='phase1', scale=MagicMock(value=2.0)), MagicMock(_entry_id='phase2', scale=MagicMock(value=1.5)), @@ -57,8 +57,8 @@ def test_calculate_pattern(mock_constraints_handler, mock_sample_models, mock_ex # Assertions assert np.allclose(result, np.array([3.6, 7.2, 10.8])) mock_constraints_handler.return_value.apply.assert_called_once_with() - assert mock_experiment.datastore.pattern.bkg is not None - assert mock_experiment.datastore.pattern.calc is not None + assert mock_experiment.datastore.bkg is not None + assert mock_experiment.datastore.calc is not None def test_get_valid_linked_phases(mock_sample_models, mock_experiment): diff --git a/tests/unit/analysis/calculators/test_calculator_cryspy.py b/tests/unit/analysis/calculators/test_calculator_cryspy.py index 086ba171..1d611854 100644 --- a/tests/unit/analysis/calculators/test_calculator_cryspy.py +++ b/tests/unit/analysis/calculators/test_calculator_cryspy.py @@ -34,9 +34,9 @@ def mock_experiment(): experiment = MagicMock() experiment.name = 'experiment1' experiment.type.beam_mode.value = 'constant wavelength' - experiment.datastore.pattern.x = np.array([1.0, 2.0, 3.0]) - experiment.datastore.pattern.meas = np.array([10.0, 20.0, 30.0]) - experiment.datastore.pattern.meas_su = np.array([0.1, 0.2, 0.3]) + experiment.datastore.x = np.array([1.0, 2.0, 3.0]) + experiment.datastore.meas = np.array([10.0, 20.0, 30.0]) + experiment.datastore.meas_su = np.array([0.1, 0.2, 0.3]) experiment.instrument.calib_twotheta_offset.value = 0.0 experiment.instrument.setup_wavelength.value = 1.54 experiment.peak.broad_gauss_u.value = 0.1 diff --git a/tests/unit/analysis/test_minimization.py b/tests/unit/analysis/test_minimization.py index 9fe3ac51..23514f5f 100644 --- a/tests/unit/analysis/test_minimization.py +++ b/tests/unit/analysis/test_minimization.py @@ -57,23 +57,42 @@ def mock_minimizer(): @pytest.fixture def diffraction_minimizer(mock_minimizer): with patch( - 'easydiffraction.analysis.minimizers.minimizer_factory.MinimizerFactory.create_minimizer', return_value=mock_minimizer + 'easydiffraction.analysis.minimizers.minimizer_factory.MinimizerFactory.create_minimizer', + return_value=mock_minimizer, ): return DiffractionMinimizer(selection='lmfit (leastsq)') -def test_fit_no_params(diffraction_minimizer, mock_sample_models, mock_experiments, mock_calculator): +def test_fit_no_params( + diffraction_minimizer, + mock_sample_models, + mock_experiments, + mock_calculator, +): mock_sample_models.get_free_params.return_value = [] mock_experiments.get_free_params.return_value = [] - result = diffraction_minimizer.fit(mock_sample_models, mock_experiments, mock_calculator) + result = diffraction_minimizer.fit( + mock_sample_models, + mock_experiments, + mock_calculator, + ) # Assertions assert result is None -def test_fit_with_params(diffraction_minimizer, mock_sample_models, mock_experiments, mock_calculator): - diffraction_minimizer.fit(mock_sample_models, mock_experiments, mock_calculator) +def test_fit_with_params( + diffraction_minimizer, + mock_sample_models, + mock_experiments, + mock_calculator, +): + diffraction_minimizer.fit( + mock_sample_models, + mock_experiments, + mock_calculator, + ) # Assertions assert diffraction_minimizer.results.success is True @@ -82,7 +101,12 @@ def test_fit_with_params(diffraction_minimizer, mock_sample_models, mock_experim assert mock_experiments.get_free_params.called -def test_residual_function(diffraction_minimizer, mock_sample_models, mock_experiments, mock_calculator): +def test_residual_function( + diffraction_minimizer, + mock_sample_models, + mock_experiments, + mock_calculator, +): parameters = mock_sample_models.get_free_params() + mock_experiments.get_free_params() engine_params = MagicMock() @@ -101,27 +125,35 @@ def test_residual_function(diffraction_minimizer, mock_sample_models, mock_exper assert diffraction_minimizer.minimizer._sync_result_to_parameters.called -@patch( - 'easydiffraction.analysis.reliability_factors.get_reliability_inputs', - return_value=(np.array([10.0]), np.array([9.0]), np.array([1.0])), -) -def test_process_fit_results( - mock_get_reliability_inputs, diffraction_minimizer, mock_sample_models, mock_experiments, mock_calculator -): - diffraction_minimizer.results = MagicMock() - diffraction_minimizer._process_fit_results(mock_sample_models, mock_experiments, mock_calculator) - - # Assertions - # mock_get_reliability_inputs.assert_called_once_with(mock_sample_models, mock_experiments, mock_calculator) - - # Extract the arguments passed to `display_results` - _, kwargs = diffraction_minimizer.results.display_results.call_args - - # Assertions for arrays - np.testing.assert_array_equal(kwargs['y_calc'], np.array([9.0, 19.0, 29.0])) - np.testing.assert_array_equal(kwargs['y_err'], np.array([1.0, 1.0, 1.0])) - np.testing.assert_array_equal(kwargs['y_obs'], np.array([10.0, 20.0, 30.0])) - - # Assertions for other arguments - assert kwargs['f_obs'] is None - assert kwargs['f_calc'] is None +# @patch( +# 'easydiffraction.analysis.reliability_factors.get_reliability_inputs', +# return_value=(np.array([10.0]), np.array([9.0]), np.array([1.0])), +# ) +# def test_process_fit_results( +# mock_get_reliability_inputs, +# diffraction_minimizer, +# mock_sample_models, +# mock_experiments, +# mock_calculator, +# ): +# diffraction_minimizer.results = MagicMock() +# diffraction_minimizer._process_fit_results( +# mock_sample_models, +# mock_experiments, +# mock_calculator, +# ) +# +# # Assertions +# # mock_get_reliability_inputs.assert_called_once_with(mock_sample_models, mock_experiments, mock_calculator) +# +# # Extract the arguments passed to `display_results` +# _, kwargs = diffraction_minimizer.results.display_results.call_args +# +# # Assertions for arrays +# np.testing.assert_array_equal(kwargs['y_calc'], np.array([9.0, 19.0, 29.0])) +# np.testing.assert_array_equal(kwargs['y_err'], np.array([1.0, 1.0, 1.0])) +# np.testing.assert_array_equal(kwargs['y_obs'], np.array([10.0, 20.0, 30.0])) +# +# # Assertions for other arguments +# assert kwargs['f_obs'] is None +# assert kwargs['f_calc'] is None diff --git a/tests/unit/analysis/test_reliability_factors.py b/tests/unit/analysis/test_reliability_factors.py index a352f1e8..97da023d 100644 --- a/tests/unit/analysis/test_reliability_factors.py +++ b/tests/unit/analysis/test_reliability_factors.py @@ -90,11 +90,9 @@ def test_get_reliability_inputs(): experiments._items = { 'experiment1': Mock( datastore=Mock( - pattern=Mock( - meas=np.array([10.0, 20.0, 30.0]), - meas_su=np.array([1.0, 1.0, 1.0]), - excluded=np.array([False, False, False]), - ) + meas=np.array([10.0, 20.0, 30.0]), + meas_su=np.array([1.0, 1.0, 1.0]), + excluded=np.array([False, False, False]), ) ) } diff --git a/tests/unit/experiments/collections/test_datastore.py b/tests/unit/experiments/collections/test_datastore.py index 97d0e6d0..ab1b870a 100644 --- a/tests/unit/experiments/collections/test_datastore.py +++ b/tests/unit/experiments/collections/test_datastore.py @@ -1,151 +1,181 @@ -from unittest.mock import MagicMock -from unittest.mock import patch - import numpy as np import pytest -from easydiffraction.experiments.collections.datastore import Datastore -from easydiffraction.experiments.collections.datastore import DatastoreFactory -from easydiffraction.experiments.collections.datastore import Pattern -from easydiffraction.experiments.collections.datastore import PowderPattern - - -def test_pattern_initialization(): - mock_experiment = MagicMock() - pattern = Pattern(experiment=mock_experiment) - - assert pattern.experiment == mock_experiment - assert pattern.x is None - assert pattern.meas is None - assert pattern.meas_su is None - assert pattern.bkg is None - assert pattern.calc is None - - -def test_pattern_calc_property(): - mock_experiment = MagicMock() - pattern = Pattern(experiment=mock_experiment) - - # Test calc setter and getter - pattern.calc = [1, 2, 3] - assert pattern.calc == [1, 2, 3] - - -def test_powder_pattern_initialization(): - mock_experiment = MagicMock() - powder_pattern = PowderPattern(experiment=mock_experiment) - - assert powder_pattern.experiment == mock_experiment - assert isinstance(powder_pattern, Pattern) - - -def test_datastore_initialization_powder(): - mock_experiment = MagicMock() - datastore = Datastore(sample_form='powder', experiment=mock_experiment) - - assert datastore.sample_form == 'powder' - assert isinstance(datastore.pattern, PowderPattern) - - -def test_datastore_initialization_single_crystal(): - mock_experiment = MagicMock() - datastore = Datastore(sample_form='single_crystal', experiment=mock_experiment) - - assert datastore.sample_form == 'single_crystal' - assert isinstance(datastore.pattern, Pattern) - +from easydiffraction.experiments.datastore import DatastoreFactory +from easydiffraction.experiments.datastore import PowderDatastore +from easydiffraction.experiments.datastore import SingleCrystalDatastore -def test_datastore_initialization_invalid_sample_form(): - mock_experiment = MagicMock() - with pytest.raises(ValueError, match="Unknown sample form 'invalid'"): - Datastore(sample_form='invalid', experiment=mock_experiment) +def test_powder_datastore_init(): + ds = PowderDatastore(beam_mode='constant wavelength') + assert ds.meas is None + assert ds.meas_su is None + assert ds.calc is None -def test_datastore_load_measured_data_valid(): - mock_experiment = MagicMock() - mock_experiment.name = 'TestExperiment' - datastore = Datastore(sample_form='powder', experiment=mock_experiment) + assert ds.beam_mode == 'constant wavelength' + assert ds.x is None + assert ds.d is None + assert ds.bkg is None - mock_data = np.array([[1.0, 2.0, 0.1], [2.0, 3.0, 0.2]]) - with patch('numpy.loadtxt', return_value=mock_data): - datastore.load_measured_data('mock_path') - assert np.array_equal(datastore.pattern.x, mock_data[:, 0]) - assert np.array_equal(datastore.pattern.meas, mock_data[:, 1]) - assert np.array_equal(datastore.pattern.meas_su, mock_data[:, 2]) +def test_powder_datastore_calc(): + ds = PowderDatastore() + with pytest.raises(TypeError): + ds.calc = [1, 2, 3] # Should raise TypeError because list is not allowed + arr = np.array([1, 2, 3]) + ds.calc = arr + assert np.array_equal(ds.calc, arr) -def test_datastore_load_measured_data_no_uncertainty(): - mock_experiment = MagicMock() - mock_experiment.name = 'TestExperiment' - datastore = Datastore(sample_form='powder', experiment=mock_experiment) +def test_single_crystal_datastore_init(): + ds = SingleCrystalDatastore() + assert ds.meas is None + assert ds.meas_su is None + assert ds.calc is None - mock_data = np.array([[1.0, 2.0], [2.0, 3.0]]) - with patch('numpy.loadtxt', return_value=mock_data): - datastore.load_measured_data('mock_path') + assert ds.sin_theta_over_lambda is None + assert ds.index_h is None + assert ds.index_k is None + assert ds.index_l is None - assert np.array_equal(datastore.pattern.x, mock_data[:, 0]) - assert np.array_equal(datastore.pattern.meas, mock_data[:, 1]) - assert np.array_equal(datastore.pattern.meas_su, np.sqrt(np.abs(mock_data[:, 1]))) - -def test_datastore_load_measured_data_invalid_file(): - mock_experiment = MagicMock() - datastore = Datastore(sample_form='powder', experiment=mock_experiment) - - with patch('numpy.loadtxt', side_effect=Exception('File not found')): - datastore.load_measured_data('invalid_path') - - -def test_datastore_show_measured_data(capsys): - mock_experiment = MagicMock() - datastore = Datastore(sample_form='powder', experiment=mock_experiment) - - datastore.pattern.x = [1.0, 2.0, 3.0] - datastore.pattern.meas = [10.0, 20.0, 30.0] - datastore.pattern.meas_su = [0.1, 0.2, 0.3] - - datastore.show_measured_data() - captured = capsys.readouterr() - - assert 'Measured data (powder):' in captured.out - assert 'x: [1.0, 2.0, 3.0]' in captured.out - assert 'meas: [10.0, 20.0, 30.0]' in captured.out - assert 'meas_su: [0.1, 0.2, 0.3]' in captured.out - - -def test_datastore_show_calculated_data(capsys): - mock_experiment = MagicMock() - datastore = Datastore(sample_form='powder', experiment=mock_experiment) - - datastore.pattern.calc = [100.0, 200.0, 300.0] - - datastore.show_calculated_data() - captured = capsys.readouterr() - - assert 'Calculated data (powder):' in captured.out - assert 'calc: [100.0, 200.0, 300.0]' in captured.out +def test_datastore_factory_create_powder(): + ds = DatastoreFactory.create(sample_form='powder') + assert isinstance(ds, PowderDatastore) -def test_datastore_factory_create_powder(): - mock_experiment = MagicMock() - datastore = DatastoreFactory.create(sample_form='powder', experiment=mock_experiment) +def test_datastore_factory_create_single_crystal(): + ds = DatastoreFactory.create(sample_form='single crystal') + assert isinstance(ds, SingleCrystalDatastore) - assert isinstance(datastore, Datastore) - assert datastore.sample_form == 'powder' - assert isinstance(datastore.pattern, PowderPattern) +def test_datastore_factory_create_powder_time_of_flight(): + ds = DatastoreFactory.create(sample_form='powder', beam_mode='time-of-flight') + assert isinstance(ds, PowderDatastore) + assert ds.beam_mode == 'time-of-flight' -def test_datastore_factory_create_single_crystal(): - mock_experiment = MagicMock() - datastore = DatastoreFactory.create(sample_form='single_crystal', experiment=mock_experiment) - assert isinstance(datastore, Datastore) - assert datastore.sample_form == 'single_crystal' - assert isinstance(datastore.pattern, Pattern) +def test_datastore_factory_create_powder_constant_wavelength(): + ds = DatastoreFactory.create(sample_form='powder', beam_mode='constant wavelength') + assert isinstance(ds, PowderDatastore) + assert ds.beam_mode == 'constant wavelength' def test_datastore_factory_create_invalid_sample_form(): - mock_experiment = MagicMock() - with pytest.raises(ValueError, match="Unknown sample form 'invalid'"): - DatastoreFactory.create(sample_form='invalid', experiment=mock_experiment) + with pytest.raises(ValueError, match="Unsupported sample form: 'invalid'"): + DatastoreFactory.create(sample_form='invalid') + + +def test_datastore_factory_create_invalid_beam_mode(): + with pytest.raises(ValueError, match="Unsupported beam mode: 'invalid'"): + DatastoreFactory.create(beam_mode='invalid') + + +def test_datastore_factory_cif_mapping_powder_time_of_flight(): + ds = DatastoreFactory.create( + sample_form='powder', + beam_mode='time-of-flight', + ) + desired = { + 'x': '_pd_meas.time_of_flight', + 'meas': '_pd_meas.intensity_total', + 'meas_su': '_pd_meas.intensity_total_su', + } + actual = ds._cif_mapping() + assert actual == desired + + +def test_datastore_factory_cif_mapping_powder_constant_wavelength(): + ds = DatastoreFactory.create( + sample_form='powder', + beam_mode='constant wavelength', + ) + desired = { + 'x': '_pd_meas.2theta_scan', + 'meas': '_pd_meas.intensity_total', + 'meas_su': '_pd_meas.intensity_total_su', + } + actual = ds._cif_mapping() + assert actual == desired + + +def test_datastore_factory_cif_mapping_single_crystal(): + ds = DatastoreFactory.create( + sample_form='single crystal', + beam_mode='constant wavelength', + ) + desired = { + 'index_h': '_refln.index_h', + 'index_k': '_refln.index_k', + 'index_l': '_refln.index_l', + 'meas': '_refln.intensity_meas', + 'meas_su': '_refln.intensity_meas_su', + } + actual = ds._cif_mapping() + assert actual == desired + + +def test_powder_as_cif_constant_wavelength(): + ds = PowderDatastore(beam_mode='constant wavelength') + ds.x = np.array([1.0, 2.0, 3.0]) + ds.meas = np.array([10.0, 20.0, 30.0]) + ds.meas_su = np.array([0.1, 0.2, 0.3]) + ds.bkg = np.array([0.5, 0.5, 0.5]) + cif = ds.as_cif() + assert '_pd_meas.2theta_scan' in cif + assert '_pd_meas.intensity_total' in cif + assert '_pd_meas.intensity_total_su' in cif + + +def test_powder_as_cif_time_of_flight(): + ds = PowderDatastore(beam_mode='time-of-flight') + ds.x = np.array([0.5, 1.0, 1.5]) + ds.meas = np.array([15.0, 25.0, 35.0]) + ds.meas_su = np.array([0.15, 0.25, 0.35]) + ds.bkg = np.array([0.4, 0.4, 0.4]) + cif = ds.as_cif() + assert '_pd_meas.time_of_flight' in cif + assert '_pd_meas.intensity_total' in cif + assert '_pd_meas.intensity_total_su' in cif + + +def test_single_crystal_as_cif(): + ds = SingleCrystalDatastore() + ds.sin_theta_over_lambda = np.array([0.1, 0.2]) + ds.index_h = np.array([1, 0]) + ds.index_k = np.array([0, 1]) + ds.index_l = np.array([0, 0]) + ds.meas = np.array([100, 200]) + ds.meas_su = np.array([10, 20]) + cif = ds.as_cif() + assert '_refln.index_h' in cif + assert '_refln.index_k' in cif + assert '_refln.index_l' in cif + assert '_refln.intensity_meas' in cif + assert '_refln.intensity_meas_su' in cif + + +def test_as_cif_truncation(): + ds = PowderDatastore() + ds.x = np.arange(10) + ds.meas = np.arange(10) * 10 + ds.meas_su = np.arange(10) * 0.1 + ds.bkg = np.arange(10) * 0.5 + + cif = ds.as_cif(max_points=2) + + # It should contain CIF headers + assert '_pd_meas.2theta_scan' in cif + assert '_pd_meas.intensity_total' in cif + assert '_pd_meas.intensity_total_su' in cif + + # It should contain first 2 and last 2 rows, but not the middle + assert '0 0 0.0' in cif + assert '1 10 0.1' in cif + assert '3 20 0.2' not in cif + assert '7 70 0.7' not in cif + assert '8 80 0.8' in cif + assert '9 90 0.9' in cif + + # Ellipsis should indicate truncation + assert '...' in cif diff --git a/tests/unit/experiments/collections/test_linked_phases.py b/tests/unit/experiments/collections/test_linked_phases.py index 97d0e6d0..367e083f 100644 --- a/tests/unit/experiments/collections/test_linked_phases.py +++ b/tests/unit/experiments/collections/test_linked_phases.py @@ -1,151 +1,46 @@ -from unittest.mock import MagicMock -from unittest.mock import patch +from easydiffraction.experiments.collections.linked_phases import LinkedPhase +from easydiffraction.experiments.collections.linked_phases import LinkedPhases -import numpy as np -import pytest -from easydiffraction.experiments.collections.datastore import Datastore -from easydiffraction.experiments.collections.datastore import DatastoreFactory -from easydiffraction.experiments.collections.datastore import Pattern -from easydiffraction.experiments.collections.datastore import PowderPattern +def test_linked_phase_category_key(): + lp = LinkedPhase(id='phase1', scale=1.0) + assert lp.category_key == 'linked_phases' -def test_pattern_initialization(): - mock_experiment = MagicMock() - pattern = Pattern(experiment=mock_experiment) +def test_linked_phase_cif_category_key(): + lp = LinkedPhase(id='phase1', scale=1.0) + assert lp.cif_category_key == 'pd_phase_block' - assert pattern.experiment == mock_experiment - assert pattern.x is None - assert pattern.meas is None - assert pattern.meas_su is None - assert pattern.bkg is None - assert pattern.calc is None +def test_linked_phase_init(): + lp = LinkedPhase(id='phase1', scale=1.23) + assert lp.id.value == 'phase1' + assert lp.id.name == 'id' + assert lp.id.cif_name == 'id' + assert lp.scale.value == 1.23 + assert lp.scale.name == 'scale' + assert lp.scale.cif_name == 'scale' -def test_pattern_calc_property(): - mock_experiment = MagicMock() - pattern = Pattern(experiment=mock_experiment) - # Test calc setter and getter - pattern.calc = [1, 2, 3] - assert pattern.calc == [1, 2, 3] +def test_linked_phases_type(): + lps = LinkedPhases() + assert lps._type == 'category' -def test_powder_pattern_initialization(): - mock_experiment = MagicMock() - powder_pattern = PowderPattern(experiment=mock_experiment) +def test_linked_phases_child_class(): + lps = LinkedPhases() + assert lps._child_class is LinkedPhase - assert powder_pattern.experiment == mock_experiment - assert isinstance(powder_pattern, Pattern) +def test_linked_phases_init_empty(): + lps = LinkedPhases() + assert len(lps._items) == 0 -def test_datastore_initialization_powder(): - mock_experiment = MagicMock() - datastore = Datastore(sample_form='powder', experiment=mock_experiment) - assert datastore.sample_form == 'powder' - assert isinstance(datastore.pattern, PowderPattern) - - -def test_datastore_initialization_single_crystal(): - mock_experiment = MagicMock() - datastore = Datastore(sample_form='single_crystal', experiment=mock_experiment) - - assert datastore.sample_form == 'single_crystal' - assert isinstance(datastore.pattern, Pattern) - - -def test_datastore_initialization_invalid_sample_form(): - mock_experiment = MagicMock() - with pytest.raises(ValueError, match="Unknown sample form 'invalid'"): - Datastore(sample_form='invalid', experiment=mock_experiment) - - -def test_datastore_load_measured_data_valid(): - mock_experiment = MagicMock() - mock_experiment.name = 'TestExperiment' - datastore = Datastore(sample_form='powder', experiment=mock_experiment) - - mock_data = np.array([[1.0, 2.0, 0.1], [2.0, 3.0, 0.2]]) - with patch('numpy.loadtxt', return_value=mock_data): - datastore.load_measured_data('mock_path') - - assert np.array_equal(datastore.pattern.x, mock_data[:, 0]) - assert np.array_equal(datastore.pattern.meas, mock_data[:, 1]) - assert np.array_equal(datastore.pattern.meas_su, mock_data[:, 2]) - - -def test_datastore_load_measured_data_no_uncertainty(): - mock_experiment = MagicMock() - mock_experiment.name = 'TestExperiment' - datastore = Datastore(sample_form='powder', experiment=mock_experiment) - - mock_data = np.array([[1.0, 2.0], [2.0, 3.0]]) - with patch('numpy.loadtxt', return_value=mock_data): - datastore.load_measured_data('mock_path') - - assert np.array_equal(datastore.pattern.x, mock_data[:, 0]) - assert np.array_equal(datastore.pattern.meas, mock_data[:, 1]) - assert np.array_equal(datastore.pattern.meas_su, np.sqrt(np.abs(mock_data[:, 1]))) - - -def test_datastore_load_measured_data_invalid_file(): - mock_experiment = MagicMock() - datastore = Datastore(sample_form='powder', experiment=mock_experiment) - - with patch('numpy.loadtxt', side_effect=Exception('File not found')): - datastore.load_measured_data('invalid_path') - - -def test_datastore_show_measured_data(capsys): - mock_experiment = MagicMock() - datastore = Datastore(sample_form='powder', experiment=mock_experiment) - - datastore.pattern.x = [1.0, 2.0, 3.0] - datastore.pattern.meas = [10.0, 20.0, 30.0] - datastore.pattern.meas_su = [0.1, 0.2, 0.3] - - datastore.show_measured_data() - captured = capsys.readouterr() - - assert 'Measured data (powder):' in captured.out - assert 'x: [1.0, 2.0, 3.0]' in captured.out - assert 'meas: [10.0, 20.0, 30.0]' in captured.out - assert 'meas_su: [0.1, 0.2, 0.3]' in captured.out - - -def test_datastore_show_calculated_data(capsys): - mock_experiment = MagicMock() - datastore = Datastore(sample_form='powder', experiment=mock_experiment) - - datastore.pattern.calc = [100.0, 200.0, 300.0] - - datastore.show_calculated_data() - captured = capsys.readouterr() - - assert 'Calculated data (powder):' in captured.out - assert 'calc: [100.0, 200.0, 300.0]' in captured.out - - -def test_datastore_factory_create_powder(): - mock_experiment = MagicMock() - datastore = DatastoreFactory.create(sample_form='powder', experiment=mock_experiment) - - assert isinstance(datastore, Datastore) - assert datastore.sample_form == 'powder' - assert isinstance(datastore.pattern, PowderPattern) - - -def test_datastore_factory_create_single_crystal(): - mock_experiment = MagicMock() - datastore = DatastoreFactory.create(sample_form='single_crystal', experiment=mock_experiment) - - assert isinstance(datastore, Datastore) - assert datastore.sample_form == 'single_crystal' - assert isinstance(datastore.pattern, Pattern) - - -def test_datastore_factory_create_invalid_sample_form(): - mock_experiment = MagicMock() - with pytest.raises(ValueError, match="Unknown sample form 'invalid'"): - DatastoreFactory.create(sample_form='invalid', experiment=mock_experiment) +def test_linked_phases_add(): + lps = LinkedPhases() + lps.add(id='phase1', scale=1.0) + lps.add(id='phase2', scale=2.0) + assert len(lps._items) == 2 + assert lps['phase1'].scale.value == 1.0 + assert lps['phase2'].scale.value == 2.0 diff --git a/tests/unit/experiments/test_experiment.py b/tests/unit/experiments/test_experiment.py index c5978703..1007e53f 100644 --- a/tests/unit/experiments/test_experiment.py +++ b/tests/unit/experiments/test_experiment.py @@ -19,7 +19,10 @@ @pytest.fixture def expt_type(): return ExperimentType( - sample_form=DEFAULT_SAMPLE_FORM, beam_mode=DEFAULT_BEAM_MODE, radiation_probe='xray', scattering_type='bragg' + sample_form=DEFAULT_SAMPLE_FORM, + beam_mode=DEFAULT_BEAM_MODE, + radiation_probe='xray', + scattering_type='bragg', ) @@ -58,13 +61,12 @@ def test_powder_experiment_initialization(expt_type): def test_powder_experiment_load_ascii_data(expt_type): experiment = PowderExperiment(name='PowderTest', type=expt_type) experiment.datastore = MagicMock() - experiment.datastore.pattern = MagicMock() mock_data = np.array([[1.0, 2.0, 0.1], [2.0, 3.0, 0.2]]) with patch('numpy.loadtxt', return_value=mock_data): experiment._load_ascii_data_to_experiment('mock_path') - assert np.array_equal(experiment.datastore.pattern.x, mock_data[:, 0]) - assert np.array_equal(experiment.datastore.pattern.meas, mock_data[:, 1]) - assert np.array_equal(experiment.datastore.pattern.meas_su, mock_data[:, 2]) + assert np.array_equal(experiment.datastore.x, mock_data[:, 0]) + assert np.array_equal(experiment.datastore.meas, mock_data[:, 1]) + assert np.array_equal(experiment.datastore.meas_su, mock_data[:, 2]) def test_single_crystal_experiment_initialization(expt_type): @@ -117,9 +119,9 @@ def test_experiment_method(): ) assert isinstance(experiment, PowderExperiment) assert experiment.name == 'ExperimentTest' - assert np.array_equal(experiment.datastore.pattern.x, mock_data[:, 0]) - assert np.array_equal(experiment.datastore.pattern.meas, mock_data[:, 1]) - assert np.array_equal(experiment.datastore.pattern.meas_su, mock_data[:, 2]) + assert np.array_equal(experiment.datastore.x, mock_data[:, 0]) + assert np.array_equal(experiment.datastore.meas, mock_data[:, 1]) + assert np.array_equal(experiment.datastore.meas_su, mock_data[:, 2]) def test_experiment_factory_invalid_args_missing_required(): From ec73133deeba0dc21b113e23ce325bcb498ece3e Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Fri, 5 Sep 2025 17:06:20 +0200 Subject: [PATCH 3/8] =?UTF-8?q?Improve=20documentation=20build=20workflow?= =?UTF-8?q?=20with=20clearer=20job=20separation,=20artifact=20handling,=20?= =?UTF-8?q?and=20automated=20release=20PR=20creation=20(develop=20?= =?UTF-8?q?=E2=86=92=20master)=20(#93)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Restructures documentation build and deployment workflow * WIP on update-docs-build-workflow * Automates release PR creation workflow * Update .github/workflows/build-docs.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update .github/workflows/build-docs.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update .github/workflows/build-docs.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Refines line breaking for condition in YAML * Updates build workflow to trigger on branch pushes only * Fixes CI branch condition syntax in GitHub Actions * Updates branch condition check for CI trigger * Remove trailing whitespace from workflow * Enhances environment setup in pixi.toml * Bump deps * Refines non-Python formatting command * Refines CI branch testing logic * Fixes syntax error in nonpy-format-fix-modified command --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/build-docs.yml | 87 ++- .github/workflows/create-release-pr.yml | 35 + .github/workflows/test-code.yaml | 10 +- .github/workflows/verify-pr-labels.yml | 2 +- pixi.lock | 863 +++++++++++------------- pixi.toml | 56 +- 6 files changed, 515 insertions(+), 538 deletions(-) create mode 100644 .github/workflows/create-release-pr.yml diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 899c3b50..e8cd50d4 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -1,10 +1,30 @@ +# This workflow builds and deploys documentation for the project. +# +# Steps overview: +# Job 1: build-docs +# - Builds documentation (including running Jupyter notebooks to generate output cells). +# - Uploads the built site as a Pages artifact. +# Job 2: deploy-dev +# - Deploys the built site to GitHub Pages for development (pushes to develop/master). +# Job 3: deploy-prod +# - Deploys the built site to gh_pages branch for production (release tags starting with v*). +# - This triggers deployment to a custom domain via webhook. +# +# The action summary page will contain links to the built artifact for downloading +# and inspecting, as well as links to both the development and production versions of +# the deployed documentation site. + name: Build and deploy docs on: + # Trigger the workflow on pull request + pull_request: + # Selected branches + branches: [master, develop] # Trigger the workflow on push push: # Selected branches - branches: [master, develop, docs, patch] + branches: [master, develop] # Runs on creating a new tag starting with 'v', e.g. 'v1.0.3' tags: ['v*'] # Allows you to run this workflow manually from the Actions tab @@ -126,26 +146,15 @@ jobs: # Upload the static files from the site/ directory to be used in the next job # This artifact is named github-pages and is a single gzip archive containing a single tar file # The artifact is then used in the next job by actions/deploy-pages to deploy the static files to GitHub Pages - # Unfortunately, the artifact is not available for download, so extra steps below are needed to do similar things - - name: Upload built site as artifact for DEV deployment (all branches) + # It can also be downloaded using the actions/download-artifact, as the current upload-pages-artifact + # is a wrapper which triggers the actions/upload-artifact. + - name: Upload built site as artifact uses: actions/upload-pages-artifact@v3 with: path: site/ - # Upload the static files from the site/ directory to be used in the next job - # This artifact is only uploaded on tagged releases (tags starting with 'v', e.g., v1.0.3) - # and is used to push content to gh_pages for custom domain deployment. - - name: Upload built site as artifact for PROD deployment (tagged release) - if: startsWith(github.ref, 'refs/tags/v') - uses: actions/upload-artifact@v4 - with: - name: artifact # name of the artifact (without the extension zip) - path: site/ - if-no-files-found: 'error' - compression-level: 0 - - # Job 2: Deploy the static files - deploy-docs: + # Job 2: Deploy the built static files to GitHub Pages (DEV deployment) + deploy-dev: needs: build-docs # previous job 'build-docs' need to be finished first # Grant GITHUB_TOKEN the permissions required to make a Pages deployment @@ -157,38 +166,59 @@ jobs: # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: - group: 'pages' + group: 'pages-dev' cancel-in-progress: false # Deploy to the github-pages environment environment: - name: github-pages # Artifact name + name: github-pages # Environment name url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest + # Triggered on push to develop or master branch only + if: ${{ github.ref_name == 'develop' || github.ref_name == 'master' }} + steps: # Deploy the static files created in the previous job to GitHub Pages # To allow the deployment of the static files to GitHub Pages, no # restrictions on the branch name need to be set for desired branches on # https://github.com/easyscience/diffraction-lib/settings/environments # Deployed pages are available at https://easyscience.github.io/diffraction-lib - - name: DEV deployment (all branches) + - name: DEV deployment uses: actions/deploy-pages@v4 - - name: Show DEV deployment url (all branches) + - name: Add DEV deployment url to summary run: echo "πŸ”— DEV deployment url [${{ env.DEV_DEPLOYMENT_URL }}](${{ env.DEV_DEPLOYMENT_URL }})" >> $GITHUB_STEP_SUMMARY + # Job 3: Deploy the built static files to GitHub Pages (PROD deployment) + deploy-prod: + needs: deploy-dev # previous job 'deploy-dev' needs to be finished first + + # Grant GITHUB_TOKEN the permissions required to make a Pages deployment + permissions: + contents: read + + # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. + # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. + concurrency: + group: 'pages-prod' + cancel-in-progress: false + + runs-on: ubuntu-latest + + # Triggered on tagged releases only (tags starting with 'v', e.g., v1.0.3) + if: startsWith(github.ref, 'refs/tags/v') + + steps: # Download built site as artifact from a previous job for gh_pages (tagged release) - # This artifact is only downloaded on tagged releases (tags starting with 'v', e.g., v1.0.3) - # and is used to push content to gh_pages for custom domain deployment. - - name: Download built site from previous job (tagged release) - if: startsWith(github.ref, 'refs/tags/v') + # This artifact is used to push its content to gh_pages branch for custom domain deployment. + - name: Download built site from previous job uses: actions/download-artifact@v4 with: # name or path are taken from the upload step of the previous job - name: artifact + name: github-pages path: site/ # directory to extract downloaded zipped artifacts # Push the site files created in the previous job to the gh_pages branch @@ -201,8 +231,7 @@ jobs: # Then the gh_pages branch is used to deploy the site to the custom domain. # Deploying is done with a webhook added via: # https://github.com/easyscience/diffraction-lib/settings/hooks - - name: PROD deployment to gh_pages for custom domain (tagged release) - if: startsWith(github.ref, 'refs/tags/v') + - name: PROD deployment to gh_pages for custom domain uses: s0/git-publish-subdir-action@develop env: GITHUB_TOKEN: ${{ secrets.GH_API_PERSONAL_ACCSESS_TOKEN }} @@ -210,7 +239,7 @@ jobs: BRANCH: gh_pages FOLDER: site - - name: Show PROD deployment url (tagged release) + - name: Show PROD deployment url if: startsWith(github.ref, 'refs/tags/v') run: echo "πŸ”— PROD deployment url [${{ env.PROD_DEPLOYMENT_URL }}](${{ diff --git a/.github/workflows/create-release-pr.yml b/.github/workflows/create-release-pr.yml new file mode 100644 index 00000000..7a0e09fd --- /dev/null +++ b/.github/workflows/create-release-pr.yml @@ -0,0 +1,35 @@ +# This workflow creates an automated release PR from `develop` into `master`. +# +# Usage: +# - Triggered manually via workflow_dispatch. +# - Creates a PR titled "Release: merge develop into master". +# - Adds the label "[maintainer] release" so it is excluded from changelogs. +# - The PR body makes clear that this is automation only (no review needed). + +name: Create release PR + +on: + workflow_dispatch: # manual trigger only + +jobs: + create-pr: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Create PR from develop to master + uses: peter-evans/create-pull-request@v6 + with: + token: ${{ secrets.GITHUB_TOKEN }} + branch: develop + base: master + title: 'Release: merge develop into master' + body: | + This pull request is created automatically to trigger the release + pipeline. It merges the accumulated changes from `develop` into + `master`. + + ⚠️ Note: This PR is labeled **[maintainer] release** and is excluded + from release notes and version bump logic. + labels: '[maintainer] release' + draft: false diff --git a/.github/workflows/test-code.yaml b/.github/workflows/test-code.yaml index b83b9b3d..6b651e61 100644 --- a/.github/workflows/test-code.yaml +++ b/.github/workflows/test-code.yaml @@ -58,13 +58,15 @@ jobs: pytest-marks: ${{ steps.set-mark.outputs.pytest_marks }} steps: + # Determine if functional tests should be run fully or only the fast ones + # (to save time on branches other than master and develop) - name: Set mark for functional tests id: set-mark run: | - if [[ "${{ env.CI_BRANCH }}" != "master" && "${{ env.CI_BRANCH }}" != "develop" ]]; then - echo "pytest_marks=-m 'fast'" >> $GITHUB_OUTPUT - else + if [[ "${{ env.CI_BRANCH }}" == "master" || "${{ env.CI_BRANCH }}" == "develop" ]]; then echo "pytest_marks=" >> $GITHUB_OUTPUT + else + echo "pytest_marks=-m 'fast'" >> $GITHUB_OUTPUT fi - name: Checkout repository @@ -225,7 +227,7 @@ jobs: # Job 3: Test the package test-package: - needs: test-source # the previous job needs to be finished first + needs: [code-quality, test-source] # depend on both previous jobs strategy: fail-fast: false diff --git a/.github/workflows/verify-pr-labels.yml b/.github/workflows/verify-pr-labels.yml index 37fd01f4..c4a59f64 100644 --- a/.github/workflows/verify-pr-labels.yml +++ b/.github/workflows/verify-pr-labels.yml @@ -19,6 +19,6 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} valid-labels: '[scope] bug, [scope] documentation, [scope] enhancement, [scope] - maintenance, [scope] significant' + maintenance, [scope] significant, [maintainer] release' pull-request-number: ${{ github.event.pull_request.number }} disable-reviews: false diff --git a/pixi.lock b/pixi.lock index 33a3fca1..a74c81ce 100644 --- a/pixi.lock +++ b/pixi.lock @@ -30,7 +30,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hf01b4d8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -63,7 +63,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -73,15 +73,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.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.20-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda @@ -112,10 +112,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.7-h2b335a9_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -152,7 +152,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3989a48_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py313h736c1ce_1.conda @@ -163,7 +163,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/3f/d0/7b958df957e4827837b590944008f0b28078f552b451f7407b4b3d54f574/asciichartpy-1.5.25-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/13/ac/19dbba27e891f39feb4170b884da449ee2699ef4ebb88eefeda364bbbbcf/asteval-1.0.6-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/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-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/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 @@ -184,31 +183,17 @@ environments: - pypi: https://files.pythonhosted.org/packages/f2/9f/bf231c2a3fac99d1d7f1d89c76594f158693f981a4aa02be406e9f036832/fonttools-4.59.2-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/72/31/bc8c5c99c7818293458fe745dab4fd5730ff49697ccc82b554eb69f16a24/frozenlist-1.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/9e/024450978a674b2f021aa1f46b6fa73823713c7fe8b5d713fbd6defdb157/gemmi-0.7.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.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/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/aa/8c/b7cfdd8dfe48f6b09f7353323732e1a290c388bd14f216947928dc85f904/griffe-1.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/ec/86f59025306dcc6deee5fda54d980d077075b8d9889aac80f158bd585f1b/h5py-3.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.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/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-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/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.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/e5/b8/9eea6630198cb303d131d95d285a024b3b8645b1763a2916fddb44ca8760/matplotlib-3.10.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.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/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/71/26/4d39d52ea2219604053a4d05b98e90d6a335511cc01806436ec4886b1028/mkdocs_autorefs-1.2.0-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/22/0b/545a4f8d4f9057e77f1d99640eb09aaae40c4f9034707f25636caf716ff9/mkdocs_material-9.6.18-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/cd/10/4c27c3063c2b3681a4b7942f8dbdeb4fa34fecb2c19b594e7345ebf4f86f/mkdocstrings-0.27.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/23/d02d86553327296c3bf369d444194ea83410cce8f0e690565264f37f3261/mkdocstrings_python-1.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/b7/339b9ed180c28418f3c5c425f341759ce3722b61cc54f8c20918a034a1d5/mpld3-0.5.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9d/87/bc14f49bc95c4cb0dd0a8c56028a67c014ee7e6818ccdce74a4862af259b/msgspec-0.19.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl @@ -218,9 +203,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1d/0f/571b2c7a3833ae419fe69ff7b479a78d313581785203cc70a8db90121b9a/numpy-2.3.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.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/8f/52/0634adaace9be2d8cac9ef78f05c47f3a675882e068438b9d7ec7ef0c13f/pandas-2.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_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/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5a/16/41f6c2e5227999a0e501d59024f3d51ab956a5a304208151a37f3c9e141c/pixi_kernel-0.6.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/a9/12e2dc726ba1ba775a2c6922d5d5b4488ad60bdab0888c337c194c8e6de8/plotly-6.3.0-py3-none-any.whl @@ -233,18 +216,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/5c/a5/a8c7562ec39f2647245b52ea4aeb13b5b125b3f48c0c152e9ebce7047a0a/pycifrw-5.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/78/3c/2a612b95ddbb9a6bdcb47b7a93c4884f74c6ff22356b2f7b213b16e65c35/pycifstar-0.3.0.tar.gz - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-py3-none-any.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/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/80/22/3c6cef96627f89b344c933781ed38329bfb87737aa438f15da95907cbfd5/ruff-0.12.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/53/06/8deb52d48a9a624fd37390555d9589e719eac568c020b27e96eed671f25f/ruff-0.12.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e4/82/08e4076df538fb56caa1d489588d880ec7c52d8273a606bb54d660528f7c/scipy-1.16.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -259,7 +240,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/29/f9/cc7f78679fdee256e3aaa9e0c431f930142dc0824f999bb7edf4b22387fb/varname-0.15.0-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/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/8b/7ec325b4e9e78beefc2d025b01ee8a2fde771ef7c957c3bff99b9e1fbffa/xraydb-4.5.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/44/46407d7f7a56e9a85a4c207724c9f2c545c060380718eea9088f222ba697/yarl-1.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl @@ -287,7 +267,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313he20ea1e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -320,7 +300,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda @@ -364,10 +344,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py313h6971d95_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h55ae1d7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.7-h5eba815_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -404,7 +384,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h5137e6a_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py313h4b03fa9_1.conda @@ -415,7 +395,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/3f/d0/7b958df957e4827837b590944008f0b28078f552b451f7407b4b3d54f574/asciichartpy-1.5.25-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/13/ac/19dbba27e891f39feb4170b884da449ee2699ef4ebb88eefeda364bbbbcf/asteval-1.0.6-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/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-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/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 @@ -436,31 +415,17 @@ environments: - pypi: https://files.pythonhosted.org/packages/76/be/fc5fe58dd76af7127b769b68071dbc32d4b95adc8b58d1d28d42d93c90f2/fonttools-4.59.2-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/83/2e/5b70b6a3325363293fe5fc3ae74cdcbc3e996c2a11dde2fd9f1fb0776d19/frozenlist-1.7.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/93/e2/c45cd48ec7cc0f49e182d8a736355a61edf0fc2ac060b90fc822c4fca067/gemmi-0.7.3-cp313-cp313-macosx_10_14_x86_64.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/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl - - pypi: https://files.pythonhosted.org/packages/aa/8c/b7cfdd8dfe48f6b09f7353323732e1a290c388bd14f216947928dc85f904/griffe-1.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6c/c2/7efe82d09ca10afd77cd7c286e42342d520c049a8c43650194928bcc635c/h5py-3.14.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.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/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-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/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.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/a0/db/18380e788bb837e724358287b08e223b32bc8dccb3b0c12fa8ca20bc7f3b/matplotlib-3.10.6-cp313-cp313-macosx_10_13_x86_64.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/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/71/26/4d39d52ea2219604053a4d05b98e90d6a335511cc01806436ec4886b1028/mkdocs_autorefs-1.2.0-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/22/0b/545a4f8d4f9057e77f1d99640eb09aaae40c4f9034707f25636caf716ff9/mkdocs_material-9.6.18-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/cd/10/4c27c3063c2b3681a4b7942f8dbdeb4fa34fecb2c19b594e7345ebf4f86f/mkdocstrings-0.27.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/23/d02d86553327296c3bf369d444194ea83410cce8f0e690565264f37f3261/mkdocstrings_python-1.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/b7/339b9ed180c28418f3c5c425f341759ce3722b61cc54f8c20918a034a1d5/mpld3-0.5.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/cb/2842c312bbe618d8fefc8b9cedce37f773cdc8fa453306546dba2c21fd98/msgspec-0.19.0-cp313-cp313-macosx_10_13_x86_64.whl @@ -470,9 +435,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1c/c0/c6bb172c916b00700ed3bf71cb56175fd1f7dbecebf8353545d0b5519f6c/numpy-2.3.2-cp313-cp313-macosx_10_13_x86_64.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/27/64/a2f7bf678af502e16b472527735d168b22b7824e45a4d7e96a4fbb634b59/pandas-2.3.2-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/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5a/16/41f6c2e5227999a0e501d59024f3d51ab956a5a304208151a37f3c9e141c/pixi_kernel-0.6.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/a9/12e2dc726ba1ba775a2c6922d5d5b4488ad60bdab0888c337c194c8e6de8/plotly-6.3.0-py3-none-any.whl @@ -485,18 +448,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/87/0d/6af0bb9a45c771ffccd5c4c035c57ac9005e711b1191ddad1dd954187cfe/pycifrw-5.0.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/78/3c/2a612b95ddbb9a6bdcb47b7a93c4884f74c6ff22356b2f7b213b16e65c35/pycifstar-0.3.0.tar.gz - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-py3-none-any.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/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/e4/235ad6d1785a2012d3ded2350fd9bc5c5af8c6f56820e696b0118dfe7d24/ruff-0.12.11-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c3/c3/6e599657fe192462f94861a09aae935b869aea8a1da07f47d6eae471397c/ruff-0.12.12-py3-none-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/93/0b/b5c99382b839854a71ca9482c684e3472badc62620287cbbdab499b75ce6/scipy-1.16.1-cp313-cp313-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -511,7 +472,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/29/f9/cc7f78679fdee256e3aaa9e0c431f930142dc0824f999bb7edf4b22387fb/varname-0.15.0-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/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/8b/7ec325b4e9e78beefc2d025b01ee8a2fde771ef7c957c3bff99b9e1fbffa/xraydb-4.5.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/27/584394e1cb76fb771371770eccad35de400e7b434ce3142c2dd27392c968/yarl-1.20.1-cp313-cp313-macosx_10_13_x86_64.whl @@ -539,7 +499,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313h755b2b2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -572,7 +532,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda @@ -616,10 +576,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py313had225c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313h4e140e3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.7-h5c937ed_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -656,7 +616,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc0cf3cd_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py313hff09f02_1.conda @@ -667,7 +627,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/3f/d0/7b958df957e4827837b590944008f0b28078f552b451f7407b4b3d54f574/asciichartpy-1.5.25-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/13/ac/19dbba27e891f39feb4170b884da449ee2699ef4ebb88eefeda364bbbbcf/asteval-1.0.6-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/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-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/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 @@ -688,30 +647,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/13/7b/d0d3b9431642947b5805201fbbbe938a47b70c76685ef1f0cb5f5d7140d6/fonttools-4.59.2-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/f4/25/a0895c99270ca6966110f4ad98e87e5662eab416a17e7fd53c364bf8b954/frozenlist-1.7.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/06/6e3a083a02d2a1b7da69dce5538d51b4a83dc308e3ea9e21edcf324e10de/gemmi-0.7.3-cp313-cp313-macosx_11_0_arm64.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/aa/8c/b7cfdd8dfe48f6b09f7353323732e1a290c388bd14f216947928dc85f904/griffe-1.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/31/f570fab1239b0d9441024b92b6ad03bb414ffa69101a985e4c83d37608bd/h5py-3.14.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.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/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-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/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.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/d3/0f/38dd49445b297e0d4f12a322c30779df0d43cb5873c7847df8a82e82ec67/matplotlib-3.10.6-cp313-cp313-macosx_11_0_arm64.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/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/71/26/4d39d52ea2219604053a4d05b98e90d6a335511cc01806436ec4886b1028/mkdocs_autorefs-1.2.0-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/22/0b/545a4f8d4f9057e77f1d99640eb09aaae40c4f9034707f25636caf716ff9/mkdocs_material-9.6.18-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/cd/10/4c27c3063c2b3681a4b7942f8dbdeb4fa34fecb2c19b594e7345ebf4f86f/mkdocstrings-0.27.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/23/d02d86553327296c3bf369d444194ea83410cce8f0e690565264f37f3261/mkdocstrings_python-1.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/b7/339b9ed180c28418f3c5c425f341759ce3722b61cc54f8c20918a034a1d5/mpld3-0.5.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/58/95/c40b01b93465e1a5f3b6c7d91b10fb574818163740cc3acbe722d1e0e7e4/msgspec-0.19.0-cp313-cp313-macosx_11_0_arm64.whl @@ -721,9 +666,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/4e/c116466d22acaf4573e58421c956c6076dc526e24a6be0903219775d862e/numpy-2.3.2-cp313-cp313-macosx_11_0_arm64.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/54/4c/c3d21b2b7769ef2f4c2b9299fcadd601efa6729f1357a8dbce8dd949ed70/pandas-2.3.2-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/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/5a/16/41f6c2e5227999a0e501d59024f3d51ab956a5a304208151a37f3c9e141c/pixi_kernel-0.6.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/a9/12e2dc726ba1ba775a2c6922d5d5b4488ad60bdab0888c337c194c8e6de8/plotly-6.3.0-py3-none-any.whl @@ -736,18 +679,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/83/81/bdd4bfabe70b7c9a8c0716a722ced4ebd27311afd1f4800cd405d3229c1b/pycifrw-5.0.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/78/3c/2a612b95ddbb9a6bdcb47b7a93c4884f74c6ff22356b2f7b213b16e65c35/pycifstar-0.3.0.tar.gz - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-py3-none-any.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/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2c/0d/15b72c5fe6b1e402a543aa9d8960e0a7e19dfb079f5b0b424db48b7febab/ruff-0.12.11-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e8/d2/9e3e40d399abc95336b1843f52fc0daaceb672d0e3c9290a28ff1a96f79d/ruff-0.12.12-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/eb/e5/69ab2771062c91e23e07c12e7d5033a6b9b80b0903ee709c3c36b3eb520c/scipy-1.16.1-cp313-cp313-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -762,7 +703,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/29/f9/cc7f78679fdee256e3aaa9e0c431f930142dc0824f999bb7edf4b22387fb/varname-0.15.0-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/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/8b/7ec325b4e9e78beefc2d025b01ee8a2fde771ef7c957c3bff99b9e1fbffa/xraydb-4.5.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/9a/3246ae92d4049099f52d9b0fe3486e3b500e29b7ea872d0f152966fc209d/yarl-1.20.1-cp313-cp313-macosx_11_0_arm64.whl @@ -790,7 +730,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -822,13 +762,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h88281d1_1000.conda @@ -866,10 +806,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.7-hdf00ec1_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -914,7 +854,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-haa12f20_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py313hcdcf24b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda @@ -924,7 +864,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/3f/d0/7b958df957e4827837b590944008f0b28078f552b451f7407b4b3d54f574/asciichartpy-1.5.25-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/13/ac/19dbba27e891f39feb4170b884da449ee2699ef4ebb88eefeda364bbbbcf/asteval-1.0.6-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/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-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/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 @@ -944,31 +883,17 @@ environments: - pypi: https://files.pythonhosted.org/packages/ea/a9/be7219fc64a6026cc0aded17fa3720f9277001c185434230bd351bf678e6/fonttools-4.59.2-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/35/89/a487a98d94205d85745080a37860ff5744b9820a2c9acbcdd9440bfddf98/frozenlist-1.7.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/28/38/c5c1b52c16ef70b9e7e0392f6298b93dd17783c3c34a92512825b1617841/gemmi-0.7.3-cp313-cp313-win_amd64.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/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/aa/8c/b7cfdd8dfe48f6b09f7353323732e1a290c388bd14f216947928dc85f904/griffe-1.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/6d/0084ed0b78d4fd3e7530c32491f2884140d9b06365dac8a08de726421d4a/h5py-3.14.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.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/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-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/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.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/ff/1d/70c28528794f6410ee2856cd729fa1f1756498b8d3126443b0a94e1a8695/matplotlib-3.10.6-cp313-cp313-win_amd64.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/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/71/26/4d39d52ea2219604053a4d05b98e90d6a335511cc01806436ec4886b1028/mkdocs_autorefs-1.2.0-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/22/0b/545a4f8d4f9057e77f1d99640eb09aaae40c4f9034707f25636caf716ff9/mkdocs_material-9.6.18-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/cd/10/4c27c3063c2b3681a4b7942f8dbdeb4fa34fecb2c19b594e7345ebf4f86f/mkdocstrings-0.27.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/23/d02d86553327296c3bf369d444194ea83410cce8f0e690565264f37f3261/mkdocstrings_python-1.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/b7/339b9ed180c28418f3c5c425f341759ce3722b61cc54f8c20918a034a1d5/mpld3-0.5.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/d8/f15b40611c2d5753d1abb0ca0da0c75348daf1252220e5dda2867bd81062/msgspec-0.19.0-cp313-cp313-win_amd64.whl @@ -978,9 +903,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/28/88/4789719fbbe166d12d345b3ac66b96105f10001b16e00a9765ba29261a21/nbqa-1.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/91/93b459c456b0e4389b2b3ddb3b82cd401d022691334a0f06e92c2046e780/nbstripout-0.8.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/aa/6f/a428fd1cb7ed39b4280d057720fed5121b0d7754fd2a9768640160f5517b/numpy-2.3.2-cp313-cp313-win_amd64.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/22/3c/f2af1ce8840ef648584a6156489636b5692c162771918aa95707c165ad2b/pandas-2.3.2-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/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/5a/16/41f6c2e5227999a0e501d59024f3d51ab956a5a304208151a37f3c9e141c/pixi_kernel-0.6.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/a9/12e2dc726ba1ba775a2c6922d5d5b4488ad60bdab0888c337c194c8e6de8/plotly-6.3.0-py3-none-any.whl @@ -993,18 +916,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/9f/9b/50835e8fd86073fa7aa921df61b4cebc1f0ff400e4338541675cb72b5507/pycifrw-5.0.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/78/3c/2a612b95ddbb9a6bdcb47b7a93c4884f74c6ff22356b2f7b213b16e65c35/pycifstar-0.3.0.tar.gz - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-py3-none-any.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/57/4d/a7545bf6c62b0dbe5795f22ea9e88cc070fdced5c34663ebc5bed2f610c0/returns-0.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/a5/34276984705bfe069cd383101c45077ee029c3fe3b28225bf67aa35f0647/ruff-0.12.11-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/85/60/d1e335417804df452589271818749d061b22772b87efda88354cf35cdb7a/ruff-0.12.12-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/21/12/c0efd2941f01940119b5305c375ae5c0fcb7ec193f806bd8f158b73a1782/scipy-1.16.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -1019,7 +940,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/29/f9/cc7f78679fdee256e3aaa9e0c431f930142dc0824f999bb7edf4b22387fb/varname-0.15.0-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/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/8b/7ec325b4e9e78beefc2d025b01ee8a2fde771ef7c957c3bff99b9e1fbffa/xraydb-4.5.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/ba/39b1ecbf51620b40ab402b0fc817f0ff750f6d92712b44689c2c215be89d/yarl-1.20.1-cp313-cp313-win_amd64.whl @@ -1085,7 +1005,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -1095,15 +1015,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.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/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda @@ -1175,7 +1095,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3989a48_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py311h4854a17_1.conda @@ -1241,14 +1161,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/80/22/3c6cef96627f89b344c933781ed38329bfb87737aa438f15da95907cbfd5/ruff-0.12.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/53/06/8deb52d48a9a624fd37390555d9589e719eac568c020b27e96eed671f25f/ruff-0.12.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/bb/ba/63f402e74875486b87ec6506a4f93f6d8a0d94d10467280f3d9d7837ce3a/scipy-1.16.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -1321,7 +1241,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda @@ -1404,7 +1324,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h5137e6a_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py311h3c2bd5d_1.conda @@ -1470,14 +1390,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/e4/235ad6d1785a2012d3ded2350fd9bc5c5af8c6f56820e696b0118dfe7d24/ruff-0.12.11-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c3/c3/6e599657fe192462f94861a09aae935b869aea8a1da07f47d6eae471397c/ruff-0.12.12-py3-none-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/da/91/812adc6f74409b461e3a5fa97f4f74c769016919203138a3bf6fc24ba4c5/scipy-1.16.1-cp311-cp311-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -1550,7 +1470,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda @@ -1633,7 +1553,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc0cf3cd_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py311hcb74504_1.conda @@ -1698,14 +1618,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2c/0d/15b72c5fe6b1e402a543aa9d8960e0a7e19dfb079f5b0b424db48b7febab/ruff-0.12.11-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e8/d2/9e3e40d399abc95336b1843f52fc0daaceb672d0e3c9290a28ff1a96f79d/ruff-0.12.12-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/47/18/8e355edcf3b71418d9e9f9acd2708cc3a6c27e8f98fde0ac34b8a0b45407/scipy-1.16.1-cp311-cp311-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -1778,13 +1698,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h88281d1_1000.conda @@ -1869,7 +1789,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-haa12f20_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py311h2d646e2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda @@ -1933,14 +1853,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/a5/34276984705bfe069cd383101c45077ee029c3fe3b28225bf67aa35f0647/ruff-0.12.11-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/85/60/d1e335417804df452589271818749d061b22772b87efda88354cf35cdb7a/ruff-0.12.12-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c4/94/994369978509f227cba7dfb9e623254d0d5559506fe994aef4bea3ed469c/scipy-1.16.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -2022,7 +1942,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -2032,15 +1952,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.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/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda @@ -2113,7 +2033,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3989a48_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py312h3fa7853_1.conda @@ -2179,14 +2099,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/80/22/3c6cef96627f89b344c933781ed38329bfb87737aa438f15da95907cbfd5/ruff-0.12.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/53/06/8deb52d48a9a624fd37390555d9589e719eac568c020b27e96eed671f25f/ruff-0.12.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/51/1e/79023ca3bbb13a015d7d2757ecca3b81293c663694c35d6541b4dca53e98/scipy-1.16.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -2261,7 +2181,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda @@ -2345,7 +2265,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h5137e6a_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py312hcfdedb4_1.conda @@ -2411,14 +2331,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/e4/235ad6d1785a2012d3ded2350fd9bc5c5af8c6f56820e696b0118dfe7d24/ruff-0.12.11-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c3/c3/6e599657fe192462f94861a09aae935b869aea8a1da07f47d6eae471397c/ruff-0.12.12-py3-none-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f8/d9/ec4864f5896232133f51382b54a08de91a9d1af7a76dfa372894026dfee2/scipy-1.16.1-cp312-cp312-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -2493,7 +2413,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda @@ -2577,7 +2497,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc0cf3cd_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py312h26de6b3_1.conda @@ -2642,14 +2562,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2c/0d/15b72c5fe6b1e402a543aa9d8960e0a7e19dfb079f5b0b424db48b7febab/ruff-0.12.11-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e8/d2/9e3e40d399abc95336b1843f52fc0daaceb672d0e3c9290a28ff1a96f79d/ruff-0.12.12-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/5c/6d/40e81ecfb688e9d25d34a847dca361982a6addf8e31f0957b1a54fbfa994/scipy-1.16.1-cp312-cp312-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -2723,13 +2643,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h88281d1_1000.conda @@ -2815,7 +2735,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-haa12f20_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py312ha680012_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda @@ -2879,14 +2799,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/a5/34276984705bfe069cd383101c45077ee029c3fe3b28225bf67aa35f0647/ruff-0.12.11-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/85/60/d1e335417804df452589271818749d061b22772b87efda88354cf35cdb7a/ruff-0.12.12-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/14/c3/61f273ae550fbf1667675701112e380881905e28448c080b23b5a181df7c/scipy-1.16.1-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -2935,7 +2855,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hf01b4d8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -2968,7 +2888,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -2978,15 +2898,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.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.20-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda @@ -3017,10 +2937,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.7-h2b335a9_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -3057,7 +2977,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3989a48_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py313h736c1ce_1.conda @@ -3123,14 +3043,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/80/22/3c6cef96627f89b344c933781ed38329bfb87737aa438f15da95907cbfd5/ruff-0.12.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/53/06/8deb52d48a9a624fd37390555d9589e719eac568c020b27e96eed671f25f/ruff-0.12.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e4/82/08e4076df538fb56caa1d489588d880ec7c52d8273a606bb54d660528f7c/scipy-1.16.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -3172,7 +3092,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313he20ea1e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -3205,7 +3125,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda @@ -3249,10 +3169,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py313h6971d95_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h55ae1d7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.7-h5eba815_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -3289,7 +3209,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h5137e6a_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py313h4b03fa9_1.conda @@ -3355,14 +3275,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/e4/235ad6d1785a2012d3ded2350fd9bc5c5af8c6f56820e696b0118dfe7d24/ruff-0.12.11-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c3/c3/6e599657fe192462f94861a09aae935b869aea8a1da07f47d6eae471397c/ruff-0.12.12-py3-none-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/93/0b/b5c99382b839854a71ca9482c684e3472badc62620287cbbdab499b75ce6/scipy-1.16.1-cp313-cp313-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -3404,7 +3324,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313h755b2b2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -3437,7 +3357,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda @@ -3481,10 +3401,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py313had225c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313h4e140e3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.7-h5c937ed_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -3521,7 +3441,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc0cf3cd_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py313hff09f02_1.conda @@ -3586,14 +3506,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2c/0d/15b72c5fe6b1e402a543aa9d8960e0a7e19dfb079f5b0b424db48b7febab/ruff-0.12.11-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e8/d2/9e3e40d399abc95336b1843f52fc0daaceb672d0e3c9290a28ff1a96f79d/ruff-0.12.12-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/eb/e5/69ab2771062c91e23e07c12e7d5033a6b9b80b0903ee709c3c36b3eb520c/scipy-1.16.1-cp313-cp313-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -3635,7 +3555,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -3667,13 +3587,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h88281d1_1000.conda @@ -3711,10 +3631,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.7-hdf00ec1_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -3759,7 +3679,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-haa12f20_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py313hcdcf24b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda @@ -3823,14 +3743,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/a5/34276984705bfe069cd383101c45077ee029c3fe3b28225bf67aa35f0647/ruff-0.12.11-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/85/60/d1e335417804df452589271818749d061b22772b87efda88354cf35cdb7a/ruff-0.12.12-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/21/12/c0efd2941f01940119b5305c375ae5c0fcb7ec193f806bd8f158b73a1782/scipy-1.16.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -3879,7 +3799,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hf01b4d8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -3911,7 +3831,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -3921,15 +3841,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.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.20-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda @@ -3958,10 +3878,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.7-h2b335a9_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -3998,7 +3918,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3989a48_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py313h736c1ce_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda @@ -4038,7 +3958,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-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/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-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/e5/b8/9eea6630198cb303d131d95d285a024b3b8645b1763a2916fddb44ca8760/matplotlib-3.10.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl @@ -4081,7 +4001,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl @@ -4089,7 +4009,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/80/22/3c6cef96627f89b344c933781ed38329bfb87737aa438f15da95907cbfd5/ruff-0.12.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/53/06/8deb52d48a9a624fd37390555d9589e719eac568c020b27e96eed671f25f/ruff-0.12.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e4/82/08e4076df538fb56caa1d489588d880ec7c52d8273a606bb54d660528f7c/scipy-1.16.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -4132,7 +4052,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313he20ea1e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -4164,7 +4084,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda @@ -4206,10 +4126,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py313h6971d95_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h55ae1d7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.7-h5eba815_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -4246,7 +4166,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h5137e6a_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py313h4b03fa9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda @@ -4286,7 +4206,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-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/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-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/a0/db/18380e788bb837e724358287b08e223b32bc8dccb3b0c12fa8ca20bc7f3b/matplotlib-3.10.6-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl @@ -4329,7 +4249,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl @@ -4337,7 +4257,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/e4/235ad6d1785a2012d3ded2350fd9bc5c5af8c6f56820e696b0118dfe7d24/ruff-0.12.11-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c3/c3/6e599657fe192462f94861a09aae935b869aea8a1da07f47d6eae471397c/ruff-0.12.12-py3-none-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/93/0b/b5c99382b839854a71ca9482c684e3472badc62620287cbbdab499b75ce6/scipy-1.16.1-cp313-cp313-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -4380,7 +4300,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313h755b2b2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -4413,7 +4333,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda @@ -4455,10 +4375,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py313had225c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313h4e140e3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.7-h5c937ed_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -4495,7 +4415,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc0cf3cd_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py313hff09f02_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda @@ -4534,7 +4454,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-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/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-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/d3/0f/38dd49445b297e0d4f12a322c30779df0d43cb5873c7847df8a82e82ec67/matplotlib-3.10.6-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl @@ -4577,7 +4497,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl @@ -4585,7 +4505,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2c/0d/15b72c5fe6b1e402a543aa9d8960e0a7e19dfb079f5b0b424db48b7febab/ruff-0.12.11-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e8/d2/9e3e40d399abc95336b1843f52fc0daaceb672d0e3c9290a28ff1a96f79d/ruff-0.12.12-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/eb/e5/69ab2771062c91e23e07c12e7d5033a6b9b80b0903ee709c3c36b3eb520c/scipy-1.16.1-cp313-cp313-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -4628,7 +4548,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -4660,13 +4580,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h88281d1_1000.conda @@ -4703,10 +4623,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.7-hdf00ec1_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -4751,7 +4671,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-haa12f20_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py313hcdcf24b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda @@ -4790,7 +4710,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-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/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-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/ff/1d/70c28528794f6410ee2856cd729fa1f1756498b8d3126443b0a94e1a8695/matplotlib-3.10.6-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl @@ -4833,7 +4753,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl @@ -4841,7 +4761,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/a5/34276984705bfe069cd383101c45077ee029c3fe3b28225bf67aa35f0647/ruff-0.12.11-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/85/60/d1e335417804df452589271818749d061b22772b87efda88354cf35cdb7a/ruff-0.12.12-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/21/12/c0efd2941f01940119b5305c375ae5c0fcb7ec193f806bd8f158b73a1782/scipy-1.16.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -4891,7 +4811,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py313hf01b4d8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py313h5d5ffb9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -4923,7 +4843,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -4933,15 +4853,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.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.20-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda @@ -4970,10 +4890,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.7-h2b335a9_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -5010,7 +4930,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3989a48_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py313h736c1ce_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda @@ -5076,14 +4996,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/80/22/3c6cef96627f89b344c933781ed38329bfb87737aa438f15da95907cbfd5/ruff-0.12.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/53/06/8deb52d48a9a624fd37390555d9589e719eac568c020b27e96eed671f25f/ruff-0.12.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e4/82/08e4076df538fb56caa1d489588d880ec7c52d8273a606bb54d660528f7c/scipy-1.16.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -5124,7 +5044,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py313he20ea1e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py313h03db916_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -5156,7 +5076,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda @@ -5198,10 +5118,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py313h6971d95_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py313h55ae1d7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.7-h5eba815_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -5238,7 +5158,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h5137e6a_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.24.0-py313h4b03fa9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda @@ -5304,14 +5224,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/e4/235ad6d1785a2012d3ded2350fd9bc5c5af8c6f56820e696b0118dfe7d24/ruff-0.12.11-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c3/c3/6e599657fe192462f94861a09aae935b869aea8a1da07f47d6eae471397c/ruff-0.12.12-py3-none-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/93/0b/b5c99382b839854a71ca9482c684e3472badc62620287cbbdab499b75ce6/scipy-1.16.1-cp313-cp313-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -5352,7 +5272,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313h755b2b2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py313hab38a8b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -5385,7 +5305,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda @@ -5427,10 +5347,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py313had225c5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py313h4e140e3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.7-h5c937ed_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -5467,7 +5387,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc0cf3cd_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.24.0-py313hff09f02_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda @@ -5532,14 +5452,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2c/0d/15b72c5fe6b1e402a543aa9d8960e0a7e19dfb079f5b0b424db48b7febab/ruff-0.12.11-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e8/d2/9e3e40d399abc95336b1843f52fc0daaceb672d0e3c9290a28ff1a96f79d/ruff-0.12.12-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/eb/e5/69ab2771062c91e23e07c12e7d5033a6b9b80b0903ee709c3c36b3eb520c/scipy-1.16.1-cp313-cp313-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -5580,7 +5500,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.16-py313h927ade5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 @@ -5612,13 +5532,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h88281d1_1000.conda @@ -5655,10 +5575,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.7-hdf00ec1_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -5703,7 +5623,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-haa12f20_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.24.0-py313hcdcf24b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda @@ -5768,14 +5688,14 @@ 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/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-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/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-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/0c/fa/df59acedf7bbb937f69174d00f921a7b93aa5a5f5c17d05296c814fff6fc/python_engineio-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-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/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/a5/34276984705bfe069cd383101c45077ee029c3fe3b28225bf67aa35f0647/ruff-0.12.11-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/85/60/d1e335417804df452589271818749d061b22772b87efda88354cf35cdb7a/ruff-0.12.12-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/21/12/c0efd2941f01940119b5305c375ae5c0fcb7ec193f806bd8f158b73a1782/scipy-1.16.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl @@ -6758,6 +6678,7 @@ packages: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: MIT + license_family: MIT purls: - pkg:pypi/cffi?source=compressed-mapping size: 303055 @@ -6773,6 +6694,7 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: MIT + license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 295227 @@ -6788,6 +6710,7 @@ packages: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: MIT + license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 297231 @@ -6802,6 +6725,7 @@ packages: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: MIT + license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 294021 @@ -6816,6 +6740,7 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: MIT + license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 288317 @@ -6830,6 +6755,7 @@ packages: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: MIT + license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 289490 @@ -6845,6 +6771,7 @@ packages: - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: MIT + license_family: MIT purls: - pkg:pypi/cffi?source=compressed-mapping size: 293204 @@ -6860,6 +6787,7 @@ packages: - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: MIT + license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 287170 @@ -6875,6 +6803,7 @@ packages: - 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: 289263 @@ -6890,6 +6819,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT + license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 296743 @@ -6905,6 +6835,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT + license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 291041 @@ -6920,6 +6851,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT + license_family: MIT purls: - pkg:pypi/cffi?source=hash-mapping size: 290632 @@ -7376,17 +7308,17 @@ packages: purls: [] size: 45852 timestamp: 1749047748072 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.5-py313hd8ed1ab_102.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.7-py313hd8ed1ab_100.conda noarch: generic - sha256: 058c8156ff880b1180a36b94307baad91f9130d0e3019ad8c7ade035852016fb - md5: 0401f31e3c9e48cebf215472aa3e7104 + sha256: e9ac20662d1c97ef96e44751a78c0057ec308f7cc208ef1fbdc868993c9f5eb3 + md5: c5623ddbd37c5dafa7754a83f97de01e depends: - python >=3.13,<3.14.0a0 - python_abi * *_cp313 license: Python-2.0 purls: [] - size: 47560 - timestamp: 1750062514868 + size: 48174 + timestamp: 1756909387263 - pypi: https://files.pythonhosted.org/packages/fc/2f/27f1f4b79d968bb6d3a3b61e0679ddfb7c583c7654e14ddfa2ec9e07ddcf/cryspy-0.7.8-py3-none-any.whl name: cryspy version: 0.7.8 @@ -7799,56 +7731,7 @@ packages: requires_python: '>=3.11,<3.14' - pypi: ./ name: easydiffraction - version: 0.7.1+d26 - sha256: 46fc86fb1a4bfe96069b3bc7724859ee328306bd671558c80d11a3675e9d074e - requires_dist: - - asciichartpy - - asteval - - bumps - - colorama - - cryspy - - dfo-ls - - diffpy-pdffit2 - - diffpy-utils - - gemmi - - lmfit - - pooch - - rich - - scipy - - sympy - - tabulate - - typer - - varname - - build ; extra == 'dev' - - jinja2 ; extra == 'dev' - - jupyterquiz ; extra == 'dev' - - jupytext ; extra == 'dev' - - nbmake ; extra == 'dev' - - nbqa ; extra == 'dev' - - nbstripout ; extra == 'dev' - - pytest ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - pytest-xdist ; extra == 'dev' - - ruff ; extra == 'dev' - - validate-pyproject[all] ; extra == 'dev' - - versioningit ; extra == 'dev' - - mkdocs ; extra == 'docs' - - mkdocs-autorefs<1.3.0 ; extra == 'docs' - - mkdocs-jupyter ; extra == 'docs' - - mkdocs-markdownextradata-plugin ; extra == 'docs' - - mkdocs-material ; extra == 'docs' - - mkdocs-plugin-inline-svg ; extra == 'docs' - - mkdocstrings-python ; extra == 'docs' - - pyyaml ; extra == 'docs' - - darkdetect ; extra == 'visualization' - - pandas ; extra == 'visualization' - - plotly ; extra == 'visualization' - - py3dmol ; extra == 'visualization' - requires_python: '>=3.11,<3.14' - editable: true -- pypi: ./ - name: easydiffraction - version: 0.7.1+d31 + version: 0.7.1+d15 sha256: 46fc86fb1a4bfe96069b3bc7724859ee328306bd671558c80d11a3675e9d074e requires_dist: - asciichartpy @@ -8995,6 +8878,7 @@ packages: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping size: 18368 @@ -9006,6 +8890,7 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping size: 17957 @@ -9017,6 +8902,7 @@ packages: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping size: 18143 @@ -9028,6 +8914,7 @@ packages: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping size: 18407 @@ -9039,6 +8926,7 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping size: 18062 @@ -9050,6 +8938,7 @@ packages: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping size: 18208 @@ -9062,6 +8951,7 @@ packages: - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping size: 18716 @@ -9074,6 +8964,7 @@ packages: - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping size: 18540 @@ -9086,6 +8977,7 @@ packages: - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping size: 18604 @@ -9097,6 +8989,7 @@ packages: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping size: 43432 @@ -9108,6 +9001,7 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping size: 43140 @@ -9119,6 +9013,7 @@ packages: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/jsonpointer?source=hash-mapping size: 43276 @@ -9294,9 +9189,9 @@ packages: - pkg:pypi/jupyter-server-terminals?source=hash-mapping size: 19711 timestamp: 1733428049134 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.6-pyhd8ed1ab_0.conda - sha256: c3558f1c2a5977799ce425f1f7c8d8d1cae3408da41ec4f5c3771a21e673d465 - md5: 70cb2903114eafc6ed5d70ca91ba6545 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.7-pyhd8ed1ab_0.conda + sha256: 042bdb981ad5394530bee8329a10c76b9e17c12651d15a885d68e2cbbfef6869 + md5: 460d51bb21b7a4c4b6e100c824405fbb depends: - async-lru >=1.0.0 - httpx >=0.25.0,<1 @@ -9309,7 +9204,7 @@ packages: - jupyterlab_server >=2.27.1,<3 - notebook-shim >=0.2 - packaging - - python >=3.9 + - python >=3.10 - setuptools >=41.1.0 - tomli >=1.2.2 - tornado >=6.2.0 @@ -9318,8 +9213,8 @@ packages: license_family: BSD purls: - pkg:pypi/jupyterlab?source=compressed-mapping - size: 8408461 - timestamp: 1755263247917 + size: 8479512 + timestamp: 1756911706349 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0 md5: fd312693df06da3578383232528c468d @@ -9584,37 +9479,37 @@ packages: purls: [] size: 676044 timestamp: 1752032747103 -- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda - build_number: 34 - sha256: d7865fcc7d29b22e4111ababec49083851a84bb3025748eed65184be765b6e7d - md5: a64dcde5f27b8e0e413ddfc56151664c +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + build_number: 35 + sha256: 4180e7ab27ed03ddf01d7e599002fcba1b32dcb68214ee25da823bac371ed362 + md5: 45d98af023f8b4a7640b1f713ce6b602 depends: - mkl >=2024.2.2,<2025.0a0 constrains: - - libcblas 3.9.0 34*_mkl - - liblapacke 3.9.0 34*_mkl - - blas 2.134 mkl - - liblapack 3.9.0 34*_mkl + - blas 2.135 mkl + - liblapack 3.9.0 35*_mkl + - libcblas 3.9.0 35*_mkl + - liblapacke 3.9.0 35*_mkl license: BSD-3-Clause license_family: BSD purls: [] - size: 70548 - timestamp: 1754682440057 -- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda - build_number: 34 - sha256: e9f31d44e668822f6420bfaeda4aa74cd6c60d3671cf0b00262867f36ad5a8c1 - md5: 25a019872ff471af70fd76d9aaaf1313 - depends: - - libblas 3.9.0 34_h5709861_mkl + size: 66044 + timestamp: 1757003486248 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda + build_number: 35 + sha256: 88939f6c1b5da75bd26ce663aa437e1224b26ee0dab5e60cecc77600975f397e + md5: 9639091d266e92438582d0cc4cfc8350 + depends: + - libblas 3.9.0 35_h5709861_mkl constrains: - - liblapacke 3.9.0 34*_mkl - - blas 2.134 mkl - - liblapack 3.9.0 34*_mkl + - blas 2.135 mkl + - liblapack 3.9.0 35*_mkl + - liblapacke 3.9.0 35*_mkl license: BSD-3-Clause license_family: BSD purls: [] - size: 70700 - timestamp: 1754682490395 + size: 66398 + timestamp: 1757003514529 - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.0-h3d58e20_1.conda sha256: ff2c82c14232cc0ff8038b3d43dace4a792c05a9b01465448445ac52539dee40 md5: d5bb255dcf8d208f30089a5969a0314b @@ -9766,40 +9661,40 @@ packages: purls: [] size: 44978 timestamp: 1743435053850 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda - sha256: 144e35c1c2840f2dc202f6915fc41879c19eddbb8fa524e3ca4aa0d14018b26f - md5: f406dcbb2e7bef90d793e50e79a2882b +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + sha256: 0caed73aac3966bfbf5710e06c728a24c6c138605121a3dacb2e03440e8baa6a + md5: 264fbfba7fb20acf3b29cde153e345ce depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 constrains: - - libgcc-ng ==15.1.0=*_4 - - libgomp 15.1.0 h767d61c_4 + - libgomp 15.1.0 h767d61c_5 + - libgcc-ng ==15.1.0=*_5 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 824153 - timestamp: 1753903866511 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda - sha256: 76ceac93ed98f208363d6e9c75011b0ff7b97b20f003f06461a619557e726637 - md5: 28771437ffcd9f3417c66012dc49a3be + size: 824191 + timestamp: 1757042543820 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + sha256: f54bb9c3be12b24be327f4c1afccc2969712e0b091cdfbd1d763fb3e61cda03f + md5: 069afdf8ea72504e48d23ae1171d951c depends: - - libgcc 15.1.0 h767d61c_4 + - libgcc 15.1.0 h767d61c_5 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 29249 - timestamp: 1753903872571 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda - sha256: e0487a8fec78802ac04da0ac1139c3510992bc58a58cde66619dde3b363c2933 - md5: 3baf8976c96134738bba224e9ef6b1e5 + size: 29187 + timestamp: 1757042549554 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda + sha256: 125051d51a8c04694d0830f6343af78b556dd88cc249dfec5a97703ebfb1832d + md5: dcd5ff1940cd38f6df777cac86819d60 depends: - __glibc >=2.17,<3.0.a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 447289 - timestamp: 1753903801049 + size: 447215 + timestamp: 1757042483384 - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h88281d1_1000.conda sha256: 2fb437b82912c74b4869b66c601d52c77bb3ee8cb4812eab346d379f1c823225 md5: e6298294e7612eccf57376a0683ddc80 @@ -10007,27 +9902,27 @@ packages: purls: [] size: 1288499 timestamp: 1753948889360 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda - sha256: b5b239e5fca53ff90669af1686c86282c970dd8204ebf477cf679872eb6d48ac - md5: 3c376af8888c386b9d3d1c2701e2f3ab +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + sha256: 0f5f61cab229b6043541c13538d75ce11bd96fb2db76f94ecf81997b1fde6408 + md5: 4e02a49aaa9d5190cb630fa43528fbe6 depends: - __glibc >=2.17,<3.0.a0 - - libgcc 15.1.0 h767d61c_4 + - libgcc 15.1.0 h767d61c_5 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 3903453 - timestamp: 1753903894186 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda - sha256: 81c841c1cf4c0d06414aaa38a249f9fdd390554943065c3a0b18a9fb7e8cc495 - md5: 2d34729cbc1da0ec988e57b13b712067 + size: 3896432 + timestamp: 1757042571458 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda + sha256: 7b8cabbf0ab4fe3581ca28fe8ca319f964078578a51dd2ca3f703c1d21ba23ff + md5: 8bba50c7f4679f08c861b597ad2bda6b depends: - - libstdcxx 15.1.0 h8f9b012_4 + - libstdcxx 15.1.0 h8f9b012_5 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 29317 - timestamp: 1753903924491 + size: 29233 + timestamp: 1757042603319 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 md5: 40b61aab5c7ba9ff276c41cfffe6b80b @@ -10205,10 +10100,10 @@ packages: - pytest-cov ; extra == 'test' - lmfit[dev,doc,test] ; extra == 'all' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-py3-none-any.whl name: markdown - version: 3.8.2 - sha256: 5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24 + version: '3.9' + sha256: 9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280 requires_dist: - importlib-metadata>=4.4 ; python_full_version < '3.10' - coverage ; extra == 'testing' @@ -13933,6 +13828,7 @@ packages: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 license: MIT + license_family: MIT purls: - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping size: 385837 @@ -13947,6 +13843,7 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: MIT + license_family: MIT purls: - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping size: 380330 @@ -13961,6 +13858,7 @@ packages: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 license: MIT + license_family: MIT purls: - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping size: 382649 @@ -13976,6 +13874,7 @@ packages: - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 license: MIT + license_family: MIT purls: - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping size: 387176 @@ -13991,6 +13890,7 @@ packages: - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: MIT + license_family: MIT purls: - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping size: 382439 @@ -14006,6 +13906,7 @@ packages: - python >=3.13,<3.14.0a0 *_cp313 - python_abi 3.13.* *_cp313 license: MIT + license_family: MIT purls: - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping size: 381682 @@ -14048,10 +13949,10 @@ packages: - pkg:pypi/pysocks?source=hash-mapping size: 21085 timestamp: 1733217331982 -- pypi: https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl name: pytest - version: 8.4.1 - sha256: 539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7 + version: 8.4.2 + sha256: 872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79 requires_dist: - colorama>=0.4 ; sys_platform == 'win32' - exceptiongroup>=1 ; python_full_version < '3.11' @@ -14147,32 +14048,32 @@ packages: purls: [] size: 31445023 timestamp: 1749050216615 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda - build_number: 102 - sha256: c2cdcc98ea3cbf78240624e4077e164dc9d5588eefb044b4097c3df54d24d504 - md5: 89e07d92cf50743886f41638d58c4328 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.7-h2b335a9_100_cp313.conda + build_number: 100 + sha256: 16cc30a5854f31ca6c3688337d34e37a79cdc518a06375fe3482ea8e2d6b34c8 + md5: 724dcf9960e933838247971da07fe5cf depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.7.0,<3.0a0 + - libexpat >=2.7.1,<3.0a0 - libffi >=3.4.6,<3.5.0a0 - - libgcc >=13 + - libgcc >=14 - liblzma >=5.8.1,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.1,<4.0a0 + - libsqlite >=3.50.4,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.0,<4.0a0 + - openssl >=3.5.2,<4.0a0 - python_abi 3.13.* *_cp313 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata license: Python-2.0 purls: [] - size: 33273132 - timestamp: 1750064035176 + size: 33583088 + timestamp: 1756911465277 python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.13-h9ccd52b_0_cpython.conda sha256: d8e15db837c10242658979bc475298059bd6615524f2f71365ab8e54fbfea43c @@ -14218,29 +14119,29 @@ packages: purls: [] size: 13571569 timestamp: 1749049058713 -- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda - build_number: 102 - sha256: 8b2f14010eb0baf04ed1eb3908c9e184cd14512c4d64c43f313251b90e75b345 - md5: afa9492a7d31f6f7189ca8f08aceadac +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.7-h5eba815_100_cp313.conda + build_number: 100 + sha256: 581e4db7462c383fbb64d295a99a3db73217f8c24781cbe7ab583ff9d0305968 + md5: 1759e1c9591755521bd50489756a599d depends: - __osx >=10.13 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.0,<3.0a0 + - libexpat >=2.7.1,<3.0a0 - libffi >=3.4.6,<3.5.0a0 - liblzma >=5.8.1,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.1,<4.0a0 + - libsqlite >=3.50.4,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.0,<4.0a0 + - openssl >=3.5.2,<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: 13955531 - timestamp: 1750063132430 + size: 12575616 + timestamp: 1756911460182 python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda sha256: 2c966293ef9e97e66b55747c7a97bc95ba0311ac1cf0d04be4a51aafac60dcb1 @@ -14286,29 +14187,29 @@ packages: purls: [] size: 13009234 timestamp: 1749048134449 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda - build_number: 102 - sha256: ee1b09fb5563be8509bb9b29b2b436a0af75488b5f1fa6bcd93fe0fba597d13f - md5: 123b7f04e7b8d6fc206cf2d3466f8a4b +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.7-h5c937ed_100_cp313.conda + build_number: 100 + sha256: b9776cc330fa4836171a42e0e9d9d3da145d7702ba6ef9fad45e94f0f016eaef + md5: 445d057271904b0e21e14b1fa1d07ba5 depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.0,<3.0a0 + - libexpat >=2.7.1,<3.0a0 - libffi >=3.4.6,<3.5.0a0 - liblzma >=5.8.1,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.1,<4.0a0 + - libsqlite >=3.50.4,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.0,<4.0a0 + - openssl >=3.5.2,<4.0a0 - python_abi 3.13.* *_cp313 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata license: Python-2.0 purls: [] - size: 12931515 - timestamp: 1750062475020 + size: 11926240 + timestamp: 1756909724811 python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.13-h3f84c4b_0_cpython.conda sha256: 723dbca1384f30bd2070f77dd83eefd0e8d7e4dda96ac3332fbf8fe5573a8abb @@ -14354,29 +14255,29 @@ packages: purls: [] size: 15829289 timestamp: 1749047682640 -- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda - build_number: 102 - sha256: 3de2b9f89b220cb779f6947cf87b328f73d54eed4f7e75a3f9337caeb4443910 - md5: a9a4658f751155c819d6cd4c47f0a4d2 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.7-hdf00ec1_100_cp313.conda + build_number: 100 + sha256: b86b5b3a960de2fff0bb7e0932b50846b22b75659576a257b1872177aab444cd + md5: 7cd6ebd1a32d4a5d99f8f8300c2029d5 depends: - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.0,<3.0a0 + - libexpat >=2.7.1,<3.0a0 - libffi >=3.4.6,<3.5.0a0 - liblzma >=5.8.1,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.1,<4.0a0 + - libsqlite >=3.50.4,<4.0a0 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.0,<4.0a0 + - openssl >=3.5.2,<4.0a0 - python_abi 3.13.* *_cp313 - tk >=8.6.13,<8.7.0a0 - tzdata - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: Python-2.0 purls: [] - size: 16825621 - timestamp: 1750062318985 + size: 16386672 + timestamp: 1756909324921 python_site_packages_path: Lib/site-packages - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 @@ -14424,16 +14325,16 @@ packages: purls: [] size: 45836 timestamp: 1749047798827 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.5-h4df99d1_102.conda - sha256: ac6cf618100c2e0cad1cabfe2c44bf4a944aa07bb1dc43abff73373351a7d079 - md5: 2eabcede0db21acee23c181db58b4128 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.7-h4df99d1_100.conda + sha256: 109794a80cf31450903522e2613b6d760ae4655e65d6fff68467934fbe297ea1 + md5: 47a123ca8e727d886a2c6d0c71658f8c depends: - - cpython 3.13.5.* + - cpython 3.13.7.* - python_abi * *_cp313 license: Python-2.0 purls: [] - size: 47572 - timestamp: 1750062593102 + size: 48178 + timestamp: 1756909461701 - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca md5: a61bf9ec79426938ff785eb69dbb1960 @@ -15243,25 +15144,25 @@ packages: - pkg:pypi/rpds-py?source=hash-mapping size: 250236 timestamp: 1756737484957 -- pypi: https://files.pythonhosted.org/packages/08/a5/34276984705bfe069cd383101c45077ee029c3fe3b28225bf67aa35f0647/ruff-0.12.11-py3-none-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/53/06/8deb52d48a9a624fd37390555d9589e719eac568c020b27e96eed671f25f/ruff-0.12.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: ruff - version: 0.12.11 - sha256: a3283325960307915b6deb3576b96919ee89432ebd9c48771ca12ee8afe4a0fd + version: 0.12.12 + sha256: 2afc2fa864197634e549d87fb1e7b6feb01df0a80fd510d6489e1ce8c0b1cc45 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/2c/0d/15b72c5fe6b1e402a543aa9d8960e0a7e19dfb079f5b0b424db48b7febab/ruff-0.12.11-py3-none-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/85/60/d1e335417804df452589271818749d061b22772b87efda88354cf35cdb7a/ruff-0.12.12-py3-none-win_amd64.whl name: ruff - version: 0.12.11 - sha256: d69fb9d4937aa19adb2e9f058bc4fbfe986c2040acb1a4a9747734834eaa0bfd + version: 0.12.12 + sha256: e99620bf01884e5f38611934c09dd194eb665b0109104acae3ba6102b600fd0d requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/76/e4/235ad6d1785a2012d3ded2350fd9bc5c5af8c6f56820e696b0118dfe7d24/ruff-0.12.11-py3-none-macosx_10_12_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/c3/c3/6e599657fe192462f94861a09aae935b869aea8a1da07f47d6eae471397c/ruff-0.12.12-py3-none-macosx_10_12_x86_64.whl name: ruff - version: 0.12.11 - sha256: b8e33ac7b28c772440afa80cebb972ffd823621ded90404f29e5ab6d1e2d4b93 + version: 0.12.12 + sha256: 7acd6045e87fac75a0b0cdedacf9ab3e1ad9d929d149785903cff9bb69ad9727 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/80/22/3c6cef96627f89b344c933781ed38329bfb87737aa438f15da95907cbfd5/ruff-0.12.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/e8/d2/9e3e40d399abc95336b1843f52fc0daaceb672d0e3c9290a28ff1a96f79d/ruff-0.12.12-py3-none-macosx_11_0_arm64.whl name: ruff - version: 0.12.11 - sha256: 4fc58f9266d62c6eccc75261a665f26b4ef64840887fc6cbc552ce5b29f96cc8 + version: 0.12.12 + sha256: abf4073688d7d6da16611f2f126be86523a8ec4343d15d276c614bda8ec44edb requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/14/c3/61f273ae550fbf1667675701112e380881905e28448c080b23b5a181df7c/scipy-1.16.1-cp312-cp312-win_amd64.whl name: scipy @@ -17152,60 +17053,64 @@ packages: - multidict>=4.0 - propcache>=0.2.1 requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 - md5: 3947a35e916fcc6b9825449affbf4214 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3989a48_8.conda + sha256: 7e6c633537f4d80a57ad959eeddeef28ff731c96712e151b0160cff04beec72f + md5: f181964ddc6cf678a478e782043598c2 depends: + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 - __glibc >=2.17,<3.0.a0 - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - libsodium >=1.0.20,<1.0.21.0a0 - - libstdcxx >=13 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 335400 - timestamp: 1731585026517 -- conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda - sha256: b932dce8c9de9a8ffbf0db0365d29677636e599f7763ca51e554c43a0c5f8389 - md5: 6a0a76cd2b3d575e1b7aaeb283b9c3ed + size: 309341 + timestamp: 1757042827773 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h5137e6a_8.conda + sha256: 6ef94f4b80f99b6271fc864a24518b2e78f6ba63d4a1363aa6b85a7872d690c4 + md5: 651b3c98e5ec65d15e7a82486f2a1a5e depends: - __osx >=10.13 - - krb5 >=1.21.3,<1.22.0a0 - - libcxx >=18 + - libcxx >=19 - libsodium >=1.0.20,<1.0.21.0a0 + - krb5 >=1.21.3,<1.22.0a0 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 292112 - timestamp: 1731585246902 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda - sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a - md5: f7e6b65943cb73bce0143737fded08f1 + size: 257825 + timestamp: 1757042903029 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc0cf3cd_8.conda + sha256: f6472d0e300256702a5911de5e83e0f714ccf449c63b7d11a6de2fff7496ab8e + md5: 51521e723a51751a032f8f3797101093 depends: - __osx >=11.0 + - libcxx >=19 - krb5 >=1.21.3,<1.22.0a0 - - libcxx >=18 - libsodium >=1.0.20,<1.0.21.0a0 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 281565 - timestamp: 1731585108039 -- conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda - sha256: 15cc8e2162d0a33ffeb3f7b7c7883fd830c54a4b1be6a4b8c7ee1f4fef0088fb - md5: e03f2c245a5ee6055752465519363b1c + size: 243880 + timestamp: 1757042936223 +- conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-haa12f20_8.conda + sha256: 306f90cb93c2aae9d113076f980e9fc76546e8988ecb512ab7ed6639a949b85e + md5: 58ea3f42500daad62ddcfb844baeae06 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 - krb5 >=1.21.3,<1.22.0a0 - libsodium >=1.0.20,<1.0.21.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 2527503 - timestamp: 1731585151036 + size: 263697 + timestamp: 1757042820528 - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda sha256: 7560d21e1b021fd40b65bfb72f67945a3fcb83d78ad7ccf37b8b3165ec3b68ad md5: df5e78d904988eb55042c0c97446079f @@ -17263,6 +17168,7 @@ packages: - zstd >=1.5.7,<1.5.8.0a0 - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/zstandard?source=compressed-mapping size: 426304 @@ -17279,6 +17185,7 @@ packages: - zstd >=1.5.7,<1.5.8.0a0 - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/zstandard?source=compressed-mapping size: 424205 @@ -17295,6 +17202,7 @@ packages: - zstd >=1.5.7,<1.5.8.0a0 - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 428554 @@ -17310,6 +17218,7 @@ packages: - zstd >=1.5.7,<1.5.8.0a0 - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 414439 @@ -17325,6 +17234,7 @@ packages: - zstd >=1.5.7,<1.5.8.0a0 - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/zstandard?source=compressed-mapping size: 414810 @@ -17340,6 +17250,7 @@ packages: - zstd >=1.5.7,<1.5.8.0a0 - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 419581 @@ -17356,6 +17267,7 @@ packages: - zstd >=1.5.7,<1.5.8.0a0 - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/zstandard?source=compressed-mapping size: 345126 @@ -17372,6 +17284,7 @@ packages: - zstd >=1.5.7,<1.5.8.0a0 - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/zstandard?source=compressed-mapping size: 345168 @@ -17388,6 +17301,7 @@ packages: - zstd >=1.5.7,<1.5.8.0a0 - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 349620 @@ -17405,6 +17319,7 @@ packages: - zstd >=1.5.7,<1.5.8.0a0 - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/zstandard?source=compressed-mapping size: 348398 @@ -17422,6 +17337,7 @@ packages: - zstd >=1.5.7,<1.5.8.0a0 - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 346385 @@ -17439,6 +17355,7 @@ packages: - zstd >=1.5.7,<1.5.8.0a0 - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/zstandard?source=hash-mapping size: 351525 diff --git a/pixi.toml b/pixi.toml index caadd8fe..487cab29 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,8 +1,16 @@ +[activation.env] +PYTHONIOENCODING = "utf-8" +# The following is needed to resolve issues installing easydiffraction +# from a local path in editable mode in the default environment. With src/ +# included in PYTHONPATH, we use the source code directly in the first place, +# instead of the installed package. +PYTHONPATH = "$(pwd)/src${PYTHONPATH:+:$PYTHONPATH}" + [workspace] -# Platforms supported for lock file (pixi.lock) +# Platforms supported for the lock file (pixi.lock) platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] -# Channels used to fetch the packages from +# Channels used to fetch packages channels = ["conda-forge"] ########## @@ -12,18 +20,18 @@ channels = ["conda-forge"] # Default feature configuration [dependencies] # == [feature.default.dependencies] -pip = "*" # Needed to install from PyPI +pip = "*" # Required to install from PyPI jupyterlab = "*" # JupyterLab for notebooks [target.win-64.dependencies] -libcblas = "*" # CBLAS library for linear algebra. Needed for pdffit2 on Windows +libcblas = "*" # CBLAS library for linear algebra. Required for pdffit2. [pypi-dependencies] # == [feature.default.pypi-dependencies] pixi-kernel = "*" # Pixi Jupyter kernel integration # Extra features for different Python versions -# These features are used to specify the Python version for the environment. +# These features specify the Python version for the environment. # Each feature corresponds to a specific Python version. [feature.py311.dependencies] @@ -35,30 +43,15 @@ python = "3.12.*" [feature.py313.dependencies] python = "3.13.*" -# This feature is used for local development with editable installation of -# easydiffraction. Effectively, the source code defined in the pyproject.toml -# will be used directly without installing the package. The changes are -# reflected immediately without needing to reinstall the package. -# This feature should be deleted in CI, because otherwise the pixi lock file -# created locally will be considered as outdated in CI. - -[feature.ed-local-editable.pypi-dependencies] -easydiffraction = { editable = true, path = ".", extras = [ - "dev", - "visualization", - "docs", -] } - -# This feature is used for development in CI, where the easydiffraction -# is installed from the local source code defined in the pyproject.toml, but -# not in editable mode. This ensures that the lock file update locally will -# work in CI. +# This feature is for development in CI, where easydiffraction +# is installed from the local source code defined in pyproject.toml. +# This ensures that local lock file updates work in CI. [feature.ed-local.pypi-dependencies] easydiffraction = { path = ".", extras = ["dev", "visualization"] } -# This feature is used to build the documentation, where the package is -# installed from PyPI with the additional dependencies needed for building +# This feature is used to build documentation, where the package is +# installed from PyPI with additional dependencies needed for building # the docs. [feature.ed-local-with-docs.pypi-dependencies] @@ -69,11 +62,11 @@ easydiffraction = { path = ".", extras = ["dev", "visualization", "docs"] } [feature.ed-pypi.pypi-dependencies] easydiffraction = { version = "*", extras = ["dev", "visualization"] } -# This feature is used to install Node.js and Prettier for formatting +# This feature installs Node.js and Prettier for formatting # non-Python files. [feature.nodejs.dependencies] -nodejs = ">=20,<21" # Needed for prettier; pin to a stable LTS +nodejs = ">=20,<21" # Required for prettier; pinned to a stable LTS ############## # ENVIRONMENTS @@ -81,10 +74,10 @@ nodejs = ">=20,<21" # Needed for prettier; pin to a stable LTS [environments] -# The `default` environment is always included in the lock file, so there is no -# need to specify it explicitly in the environments section. +# The `default` environment is always included in the lock file, so it does not +# need to be specified explicitly in the environments section. -default = { features = ["py313", "ed-local-editable", "nodejs"] } +default = { features = ["py313", "ed-local", "nodejs"] } py311-dev = { features = ["py311", "ed-local", "nodejs"] } py312-dev = { features = ["py312", "ed-local", "nodejs"] } @@ -121,13 +114,14 @@ notebook-format-check = 'nbqa ruff tutorials/' py-lint-fix = "python -m ruff check . --fix" py-format-fix = "python -m ruff format ." nonpy-format-fix = "npx prettier . --list-different --write --config=prettierrc.toml" +nonpy-format-fix-modified = "npx prettier $(git diff --name-only HEAD | grep -E '\\.(json|ya?ml|toml|md|css|html)$' || echo .) --list-different --write --config=prettierrc.toml" notebook-format-fix = 'nbqa ruff tutorials/ --fix' code-quality = { depends-on = [ "pyproject-check", "py-lint-fix", "py-format-fix", - "nonpy-format-fix", + "nonpy-format-fix-modified", ] } # πŸ““ Notebook Management From df880a415e34622276a08237087fd35421a3a1be Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Fri, 5 Sep 2025 20:22:54 +0200 Subject: [PATCH 4/8] Remove unused register method from CalculatorFactory --- .../calculators/calculator_factory.py | 28 ------------------- .../calculators/test_calculator_factory.py | 14 ---------- 2 files changed, 42 deletions(-) diff --git a/src/easydiffraction/analysis/calculators/calculator_factory.py b/src/easydiffraction/analysis/calculators/calculator_factory.py index 840cf796..be542fb6 100644 --- a/src/easydiffraction/analysis/calculators/calculator_factory.py +++ b/src/easydiffraction/analysis/calculators/calculator_factory.py @@ -1,7 +1,6 @@ # SPDX-FileCopyrightText: 2021-2025 EasyDiffraction Python Library contributors # SPDX-License-Identifier: BSD-3-Clause -from typing import Any from typing import Dict from typing import List from typing import Optional @@ -71,30 +70,3 @@ def create_calculator(cls, calculator_name: str) -> Optional[CalculatorBase]: return None return config['class']() - - @classmethod - def register_calculator( - cls, - calculator_type: str, - calculator_cls: Type[CalculatorBase], - description: str = 'No description provided.', - ) -> None: - cls._potential_calculators[calculator_type] = { - 'class': calculator_cls, - 'description': description, - } - - @classmethod - def register_minimizer( - cls, - name: str, - minimizer_cls: Type[Any], - method: Optional[str] = None, - description: str = 'No description provided.', - ) -> None: - cls._available_minimizers[name] = { - 'engine': name, - 'method': method, - 'description': description, - 'class': minimizer_cls, - } diff --git a/tests/unit/analysis/calculators/test_calculator_factory.py b/tests/unit/analysis/calculators/test_calculator_factory.py index c7d5ff8c..2a35d0b1 100644 --- a/tests/unit/analysis/calculators/test_calculator_factory.py +++ b/tests/unit/analysis/calculators/test_calculator_factory.py @@ -63,17 +63,3 @@ def test_create_calculator_unknown(mock_calculators): # Assertions assert unknown_calculator is None - - -def no_test_register_calculator(): - class MockCalculator: - engine_imported = True - - CalculatorFactory.register_calculator('mock_calculator', MockCalculator, description='Mock calculator for testing') - - supported = CalculatorFactory._supported_calculators() - - # Assertions - assert 'mock_calculator' in CalculatorFactory._potential_calculators - assert supported['mock_calculator']['description'] == 'Mock calculator for testing' - assert supported['mock_calculator']['class'] == MockCalculator From 83488841632501ae8bfa71f15dab0c388136a1fd Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Fri, 5 Sep 2025 20:54:23 +0200 Subject: [PATCH 5/8] Remove redundant return value from calculate_pattern (#91) * Refactors pattern calculation to avoid redundant returns * Fixes unit tests for non-returning calculate pattern * Removes unused numpy imports --- pixi.lock | 68 +++++++++---------- src/easydiffraction/analysis/analysis.py | 9 ++- src/easydiffraction/analysis/calculation.py | 9 ++- .../analysis/calculators/calculator_base.py | 7 +- src/easydiffraction/analysis/minimization.py | 3 +- .../analysis/reliability_factors.py | 3 +- .../calculators/test_calculator_base.py | 3 +- tests/unit/analysis/test_minimization.py | 6 +- .../unit/analysis/test_reliability_factors.py | 6 +- 9 files changed, 61 insertions(+), 53 deletions(-) diff --git a/pixi.lock b/pixi.lock index a74c81ce..8fe0b35a 100644 --- a/pixi.lock +++ b/pixi.lock @@ -234,7 +234,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -466,7 +466,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -697,7 +697,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -934,7 +934,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -1177,7 +1177,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -1406,7 +1406,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -1634,7 +1634,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -1869,7 +1869,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -2115,7 +2115,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -2347,7 +2347,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -2578,7 +2578,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -2815,7 +2815,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -3059,7 +3059,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -3291,7 +3291,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -3522,7 +3522,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -3759,7 +3759,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -3951,7 +3951,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/db/9e/024450978a674b2f021aa1f46b6fa73823713c7fe8b5d713fbd6defdb157/gemmi-0.7.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.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/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/aa/8c/b7cfdd8dfe48f6b09f7353323732e1a290c388bd14f216947928dc85f904/griffe-1.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/ec/86f59025306dcc6deee5fda54d980d077075b8d9889aac80f158bd585f1b/h5py-3.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl @@ -4018,7 +4018,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -4199,7 +4199,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/93/e2/c45cd48ec7cc0f49e182d8a736355a61edf0fc2ac060b90fc822c4fca067/gemmi-0.7.3-cp313-cp313-macosx_10_14_x86_64.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/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl - - pypi: https://files.pythonhosted.org/packages/aa/8c/b7cfdd8dfe48f6b09f7353323732e1a290c388bd14f216947928dc85f904/griffe-1.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6c/c2/7efe82d09ca10afd77cd7c286e42342d520c049a8c43650194928bcc635c/h5py-3.14.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl @@ -4266,7 +4266,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -4447,7 +4447,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f4/25/a0895c99270ca6966110f4ad98e87e5662eab416a17e7fd53c364bf8b954/frozenlist-1.7.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/06/6e3a083a02d2a1b7da69dce5538d51b4a83dc308e3ea9e21edcf324e10de/gemmi-0.7.3-cp313-cp313-macosx_11_0_arm64.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/aa/8c/b7cfdd8dfe48f6b09f7353323732e1a290c388bd14f216947928dc85f904/griffe-1.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/31/f570fab1239b0d9441024b92b6ad03bb414ffa69101a985e4c83d37608bd/h5py-3.14.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl @@ -4514,7 +4514,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -4703,7 +4703,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/28/38/c5c1b52c16ef70b9e7e0392f6298b93dd17783c3c34a92512825b1617841/gemmi-0.7.3-cp313-cp313-win_amd64.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/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/aa/8c/b7cfdd8dfe48f6b09f7353323732e1a290c388bd14f216947928dc85f904/griffe-1.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/6d/0084ed0b78d4fd3e7530c32491f2884140d9b06365dac8a08de726421d4a/h5py-3.14.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/5a/488f492b49b712ca38326e12c78d0d48ab6be682a2989ce533f0f2c4dfd2/jupyterquiz-2.9.6.2-py2.py3-none-any.whl @@ -4770,7 +4770,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -5012,7 +5012,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -5240,7 +5240,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -5468,7 +5468,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -5704,7 +5704,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.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/4a/40/d54944eeb5646fb4b1c98d4601fe5e0812dd2e7c0aa94d53fc46457effc8/trove_classifiers-2025.8.26.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-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/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl @@ -8458,10 +8458,10 @@ packages: - psutil ; extra == 'test' - setuptools ; extra == 'test' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/aa/8c/b7cfdd8dfe48f6b09f7353323732e1a290c388bd14f216947928dc85f904/griffe-1.13.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl name: griffe - version: 1.13.0 - sha256: 470fde5b735625ac0a36296cd194617f039e9e83e301fcbd493e2b58382d0559 + version: 1.14.0 + sha256: 0e9d52832cccf0f7188cfe585ba962d2674b241c01916d780925df34873bceb0 requires_dist: - colorama>=0.4 requires_python: '>=3.9' @@ -16591,10 +16591,10 @@ packages: name: trove-classifiers version: 2025.8.26.11 sha256: 887fb0a402bdbecd4415a52c06e6728f8bdaa506a7143372d2b893e2c5e2d859 -- pypi: https://files.pythonhosted.org/packages/ca/e8/b3d537470e8404659a6335e7af868e90657efb73916ef31ddf3d8b9cb237/typer-0.17.3-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-py3-none-any.whl name: typer - version: 0.17.3 - sha256: 643919a79182ab7ac7581056d93c6a2b865b026adf2872c4d02c72758e6f095b + version: 0.17.4 + sha256: 015534a6edaa450e7007eba705d5c18c3349dcea50a6ad79a5ed530967575824 requires_dist: - click>=8.0.0 - typing-extensions>=3.7.4.3 diff --git a/src/easydiffraction/analysis/analysis.py b/src/easydiffraction/analysis/analysis.py index 8a3cd958..ff646a42 100644 --- a/src/easydiffraction/analysis/analysis.py +++ b/src/easydiffraction/analysis/analysis.py @@ -5,7 +5,6 @@ from typing import Optional from typing import Union -import numpy as np import pandas as pd from easydiffraction.core.objects import Descriptor @@ -362,20 +361,20 @@ def show_current_fit_mode(self) -> None: print(paragraph('Current fit mode')) print(self.fit_mode) - def calculate_pattern(self, expt_name: str) -> Optional[np.ndarray]: + def calculate_pattern(self, expt_name: str) -> None: """ Calculate the diffraction pattern for a given experiment. + The calculated pattern is stored within the experiment's datastore. Args: expt_name: The name of the experiment. Returns: - The calculated pattern as a pandas DataFrame. + None. """ experiment = self.project.experiments[expt_name] sample_models = self.project.sample_models - calculated_pattern = self.calculator.calculate_pattern(sample_models, experiment) - return calculated_pattern + self.calculator.calculate_pattern(sample_models, experiment) def show_constraints(self) -> None: constraints_dict = self.constraints._items diff --git a/src/easydiffraction/analysis/calculation.py b/src/easydiffraction/analysis/calculation.py index 2c2407df..4a079db9 100644 --- a/src/easydiffraction/analysis/calculation.py +++ b/src/easydiffraction/analysis/calculation.py @@ -5,8 +5,6 @@ from typing import List from typing import Optional -import numpy as np - from easydiffraction.experiments.experiment import Experiment from easydiffraction.experiments.experiments import Experiments from easydiffraction.sample_models.sample_models import SampleModels @@ -61,15 +59,16 @@ def calculate_pattern( self, sample_models: SampleModels, experiment: Experiment, - ) -> np.ndarray: + ) -> None: """ Calculate diffraction pattern based on sample models and experiment. + The calculated pattern is stored within the experiment's datastore. Args: sample_models: Collection of sample models. experiment: A single experiment object. Returns: - Diffraction pattern calculated by the backend calculator. + None. """ - return self._calculator.calculate_pattern(sample_models, experiment) + self._calculator.calculate_pattern(sample_models, experiment) diff --git a/src/easydiffraction/analysis/calculators/calculator_base.py b/src/easydiffraction/analysis/calculators/calculator_base.py index 901be9e3..136240c1 100644 --- a/src/easydiffraction/analysis/calculators/calculator_base.py +++ b/src/easydiffraction/analysis/calculators/calculator_base.py @@ -45,9 +45,10 @@ def calculate_pattern( sample_models: SampleModels, experiment: Experiment, called_by_minimizer: bool = False, - ) -> np.ndarray: + ) -> None: """ Calculate the diffraction pattern for multiple sample models and a single experiment. + The calculated pattern is stored within the experiment's datastore. Args: sample_models: Collection of sample models. @@ -55,7 +56,7 @@ def calculate_pattern( called_by_minimizer: Whether the calculation is called by a minimizer. Returns: - The calculated diffraction pattern as a NumPy array. + None. """ x_data = experiment.datastore.x y_calc_zeros = np.zeros_like(x_data) @@ -95,8 +96,6 @@ def calculate_pattern( y_calc_total = y_calc_scaled + y_bkg experiment.datastore.calc = y_calc_total - return y_calc_total - @abstractmethod def _calculate_single_model_pattern( self, diff --git a/src/easydiffraction/analysis/minimization.py b/src/easydiffraction/analysis/minimization.py index 624c8584..554ac5e1 100644 --- a/src/easydiffraction/analysis/minimization.py +++ b/src/easydiffraction/analysis/minimization.py @@ -168,11 +168,12 @@ def _residual_function( for (expt_id, experiment), weight in zip(experiments._items.items(), _weights): # Calculate the difference between measured and calculated patterns - y_calc: np.ndarray = calculator.calculate_pattern( + calculator.calculate_pattern( sample_models, experiment, called_by_minimizer=True, ) + y_calc: np.ndarray = experiment.datastore.calc y_meas: np.ndarray = experiment.datastore.meas y_meas_su: np.ndarray = experiment.datastore.meas_su diff = (y_meas - y_calc) / y_meas_su diff --git a/src/easydiffraction/analysis/reliability_factors.py b/src/easydiffraction/analysis/reliability_factors.py index a9a25f56..9c103ac3 100644 --- a/src/easydiffraction/analysis/reliability_factors.py +++ b/src/easydiffraction/analysis/reliability_factors.py @@ -142,7 +142,8 @@ def get_reliability_inputs( y_calc_all = [] y_err_all = [] for expt_name, experiment in experiments._items.items(): - y_calc = calculator.calculate_pattern(sample_models, experiment) + calculator.calculate_pattern(sample_models, experiment) + y_calc = experiment.datastore.calc y_meas = experiment.datastore.meas y_meas_su = experiment.datastore.meas_su diff --git a/tests/unit/analysis/calculators/test_calculator_base.py b/tests/unit/analysis/calculators/test_calculator_base.py index ba11e9e1..7c9df501 100644 --- a/tests/unit/analysis/calculators/test_calculator_base.py +++ b/tests/unit/analysis/calculators/test_calculator_base.py @@ -52,7 +52,8 @@ def test_calculate_pattern(mock_constraints_handler, mock_sample_models, mock_ex mock_constraints_handler.return_value.apply = MagicMock() calculator = MockCalculator() - result = calculator.calculate_pattern(mock_sample_models, mock_experiment) + calculator.calculate_pattern(mock_sample_models, mock_experiment) + result = mock_experiment.datastore.calc # Assertions assert np.allclose(result, np.array([3.6, 7.2, 10.8])) diff --git a/tests/unit/analysis/test_minimization.py b/tests/unit/analysis/test_minimization.py index 23514f5f..90e39c3f 100644 --- a/tests/unit/analysis/test_minimization.py +++ b/tests/unit/analysis/test_minimization.py @@ -41,7 +41,11 @@ def mock_experiments(): @pytest.fixture def mock_calculator(): calculator = MagicMock() - calculator.calculate_pattern.return_value = np.array([9.0, 19.0, 29.0]) + + def mock_calculate_pattern(sample_models, experiment, **kwargs): + experiment.datastore.calc = np.array([9.0, 19.0, 29.0]) + + calculator.calculate_pattern.side_effect = mock_calculate_pattern return calculator diff --git a/tests/unit/analysis/test_reliability_factors.py b/tests/unit/analysis/test_reliability_factors.py index 97da023d..d674103c 100644 --- a/tests/unit/analysis/test_reliability_factors.py +++ b/tests/unit/analysis/test_reliability_factors.py @@ -96,7 +96,11 @@ def test_get_reliability_inputs(): ) ) } - calculator.calculate_pattern.return_value = np.array([9.0, 19.0, 29.0]) + + def mock_calculate_pattern(sample_models, experiment, **kwargs): + experiment.datastore.calc = np.array([9.0, 19.0, 29.0]) + + calculator.calculate_pattern.side_effect = mock_calculate_pattern y_obs, y_calc, y_err = get_reliability_inputs(sample_models, experiments, calculator) From c280be5cecd52393fca50bcfb29dc91fa544e0bd Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Fri, 5 Sep 2025 21:19:56 +0200 Subject: [PATCH 6/8] Refactor default constants: replace strings with enums, and relocate into relevant classes (#92) * Refactors background type handling using Enum * Refactors sample form handling using Enum * Rename enums for clarity and consistency * Refactors scattering type constants with enum * Refactors SampleForm usage to use SampleFormEnum * Removes invalid linked phases test module * Refactors default radiation probe using Enum * Refactors beam mode using Enum * Refactors peak profile type using Enum * Refactors peak profile description handling * Refactors axes label handling by using Enum * Enhances type checking and import structure --- pixi.lock | 4 +- pyproject.toml | 1 + .../analysis/calculators/calculator_base.py | 3 + .../analysis/calculators/calculator_cryspy.py | 24 +++-- src/easydiffraction/analysis/minimization.py | 5 +- src/easydiffraction/core/constants.py | 30 ------ .../experiments/collections/background.py | 28 ++++-- .../experiments/components/experiment_type.py | 62 ++++++++++++ .../experiments/components/instrument.py | 14 +-- .../experiments/components/peak.py | 97 ++++++++++++------- src/easydiffraction/experiments/datastore.py | 10 +- src/easydiffraction/experiments/experiment.py | 80 +++++++++------ .../experiments/experiments.py | 24 ++--- .../plotting/plotters/plotter_base.py | 10 ++ src/easydiffraction/plotting/plotting.py | 54 +++++++++-- src/easydiffraction/project.py | 10 +- .../components/test_experiment_type.py | 21 +++- tests/unit/experiments/test_experiment.py | 38 ++++---- tests/unit/experiments/test_experiments.py | 2 +- 19 files changed, 347 insertions(+), 170 deletions(-) delete mode 100644 src/easydiffraction/core/constants.py diff --git a/pixi.lock b/pixi.lock index 8fe0b35a..cc034d4b 100644 --- a/pixi.lock +++ b/pixi.lock @@ -7731,8 +7731,8 @@ packages: requires_python: '>=3.11,<3.14' - pypi: ./ name: easydiffraction - version: 0.7.1+d15 - sha256: 46fc86fb1a4bfe96069b3bc7724859ee328306bd671558c80d11a3675e9d074e + version: 0.7.1+d16 + sha256: d90638afd66acf6463904cab6b63a081786ef93672553c1055b569e92188f0d1 requires_dist: - asciichartpy - asteval diff --git a/pyproject.toml b/pyproject.toml index 22760c35..1a61caca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -151,6 +151,7 @@ select = [ '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) + 'TCH', # Type checking issues (e.g., incompatible types, missing type annotations) ] [tool.ruff.lint.isort] diff --git a/src/easydiffraction/analysis/calculators/calculator_base.py b/src/easydiffraction/analysis/calculators/calculator_base.py index 136240c1..05324e70 100644 --- a/src/easydiffraction/analysis/calculators/calculator_base.py +++ b/src/easydiffraction/analysis/calculators/calculator_base.py @@ -83,6 +83,9 @@ def calculate_pattern( called_by_minimizer=called_by_minimizer, ) + # if not sample_model_y_calc: + # return np.ndarray([]) + sample_model_y_calc_scaled = sample_model_scale * sample_model_y_calc y_calc_scaled += sample_model_y_calc_scaled diff --git a/src/easydiffraction/analysis/calculators/calculator_cryspy.py b/src/easydiffraction/analysis/calculators/calculator_cryspy.py index ce62aa86..933593f1 100644 --- a/src/easydiffraction/analysis/calculators/calculator_cryspy.py +++ b/src/easydiffraction/analysis/calculators/calculator_cryspy.py @@ -11,6 +11,7 @@ import numpy as np +from easydiffraction.experiments.components.experiment_type import BeamModeEnum from easydiffraction.experiments.experiment import Experiment from easydiffraction.sample_models.sample_model import SampleModel @@ -111,7 +112,10 @@ def _calculate_single_model_pattern( flag_calc_analytical_derivatives=False, ) - prefixes = {'constant wavelength': 'pd', 'time-of-flight': 'tof'} + prefixes = { + BeamModeEnum.CONSTANT_WAVELENGTH: 'pd', + BeamModeEnum.TIME_OF_FLIGHT: 'tof', + } beam_mode = experiment.type.beam_mode.value if beam_mode in prefixes.keys(): cryspy_block_name = f'{prefixes[beam_mode]}_{experiment.name}' @@ -177,7 +181,7 @@ def _recreate_cryspy_dict( cryspy_biso[idx] = atom_site.b_iso.value # ---------- Update experiment parameters ---------- - if experiment.type.beam_mode.value == 'constant wavelength': + if experiment.type.beam_mode.value == BeamModeEnum.CONSTANT_WAVELENGTH: cryspy_expt_name = f'pd_{experiment.name}' cryspy_expt_dict = cryspy_dict[cryspy_expt_name] # Instrument @@ -191,7 +195,7 @@ def _recreate_cryspy_dict( cryspy_resolution[3] = experiment.peak.broad_lorentz_x.value cryspy_resolution[4] = experiment.peak.broad_lorentz_y.value - elif experiment.type.beam_mode.value == 'time-of-flight': + elif experiment.type.beam_mode.value == BeamModeEnum.TIME_OF_FLIGHT: cryspy_expt_name = f'tof_{experiment.name}' cryspy_expt_dict = cryspy_dict[cryspy_expt_name] # Instrument @@ -321,7 +325,7 @@ def _convert_experiment_to_cryspy_cif( 'asym_alpha_1': '_tof_profile_alpha1', } cif_lines.append('') - if expt_type.beam_mode.value == 'time-of-flight': + if expt_type.beam_mode.value == BeamModeEnum.TIME_OF_FLIGHT: cif_lines.append('_tof_profile_peak_shape Gauss') for local_attr_name, engine_key_name in peak_mapping.items(): if hasattr(peak, local_attr_name): @@ -332,10 +336,10 @@ def _convert_experiment_to_cryspy_cif( twotheta_min = float(x_data.min()) twotheta_max = float(x_data.max()) cif_lines.append('') - if expt_type.beam_mode.value == 'constant wavelength': + if expt_type.beam_mode.value == BeamModeEnum.CONSTANT_WAVELENGTH: cif_lines.append(f'_range_2theta_min {twotheta_min}') cif_lines.append(f'_range_2theta_max {twotheta_max}') - elif expt_type.beam_mode.value == 'time-of-flight': + elif expt_type.beam_mode.value == BeamModeEnum.TIME_OF_FLIGHT: cif_lines.append(f'_range_time_min {twotheta_min}') cif_lines.append(f'_range_time_max {twotheta_max}') @@ -345,14 +349,14 @@ def _convert_experiment_to_cryspy_cif( cif_lines.append('_phase_scale') cif_lines.append(f'{linked_phase.name} 1.0') - if expt_type.beam_mode.value == 'constant wavelength': + if expt_type.beam_mode.value == BeamModeEnum.CONSTANT_WAVELENGTH: cif_lines.append('') cif_lines.append('loop_') cif_lines.append('_pd_background_2theta') cif_lines.append('_pd_background_intensity') cif_lines.append(f'{twotheta_min} 0.0') cif_lines.append(f'{twotheta_max} 0.0') - elif expt_type.beam_mode.value == 'time-of-flight': + elif expt_type.beam_mode.value == BeamModeEnum.TIME_OF_FLIGHT: cif_lines.append('') cif_lines.append('loop_') cif_lines.append('_tof_backgroundpoint_time') @@ -360,13 +364,13 @@ def _convert_experiment_to_cryspy_cif( cif_lines.append(f'{twotheta_min} 0.0') cif_lines.append(f'{twotheta_max} 0.0') - if expt_type.beam_mode.value == 'constant wavelength': + if expt_type.beam_mode.value == BeamModeEnum.CONSTANT_WAVELENGTH: cif_lines.append('') cif_lines.append('loop_') cif_lines.append('_pd_meas_2theta') cif_lines.append('_pd_meas_intensity') cif_lines.append('_pd_meas_intensity_sigma') - elif expt_type.beam_mode.value == 'time-of-flight': + elif expt_type.beam_mode.value == BeamModeEnum.TIME_OF_FLIGHT: cif_lines.append('') cif_lines.append('loop_') cif_lines.append('_tof_meas_time') diff --git a/src/easydiffraction/analysis/minimization.py b/src/easydiffraction/analysis/minimization.py index 554ac5e1..35339cbc 100644 --- a/src/easydiffraction/analysis/minimization.py +++ b/src/easydiffraction/analysis/minimization.py @@ -1,6 +1,7 @@ # SPDX-FileCopyrightText: 2021-2025 EasyDiffraction Python Library contributors # SPDX-License-Identifier: BSD-3-Clause +from typing import TYPE_CHECKING from typing import Any from typing import Dict from typing import List @@ -14,7 +15,9 @@ from easydiffraction.sample_models.sample_models import SampleModels from ..analysis.reliability_factors import get_reliability_inputs -from .minimizers.minimizer_base import FitResults + +if TYPE_CHECKING: + from .minimizers.minimizer_base import FitResults from .minimizers.minimizer_factory import MinimizerFactory diff --git a/src/easydiffraction/core/constants.py b/src/easydiffraction/core/constants.py deleted file mode 100644 index f5db04aa..00000000 --- a/src/easydiffraction/core/constants.py +++ /dev/null @@ -1,30 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2025 EasyDiffraction Python Library contributors -# SPDX-License-Identifier: BSD-3-Clause - -# TODO: Change to use enum for these constants -DEFAULT_SAMPLE_FORM = 'powder' -DEFAULT_BEAM_MODE = 'constant wavelength' -DEFAULT_RADIATION_PROBE = 'neutron' -DEFAULT_BACKGROUND_TYPE = 'line-segment' -DEFAULT_SCATTERING_TYPE = 'bragg' -DEFAULT_PEAK_PROFILE_TYPE = { - 'bragg': { - 'constant wavelength': 'pseudo-voigt', - 'time-of-flight': 'pseudo-voigt * ikeda-carpenter', - }, - 'total': { - 'constant wavelength': 'gaussian-damped-sinc', - 'time-of-flight': 'gaussian-damped-sinc', - }, -} -DEFAULT_AXES_LABELS = { - 'bragg': { - 'constant wavelength': ['2ΞΈ (degree)', 'Intensity (arb. units)'], - 'time-of-flight': ['TOF (Β΅s)', 'Intensity (arb. units)'], - 'd-spacing': ['d (Γ…)', 'Intensity (arb. units)'], - }, - 'total': { - 'constant wavelength': ['r (β„«)', 'G(r) (β„«)'], - 'time-of-flight': ['r (β„«)', 'G(r) (β„«)'], - }, -} diff --git a/src/easydiffraction/experiments/collections/background.py b/src/easydiffraction/experiments/collections/background.py index b9a18a6b..0fb2907a 100644 --- a/src/easydiffraction/experiments/collections/background.py +++ b/src/easydiffraction/experiments/collections/background.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: BSD-3-Clause from abc import abstractmethod +from enum import Enum from typing import Dict from typing import List from typing import Type @@ -11,7 +12,6 @@ from numpy.polynomial.chebyshev import chebval from scipy.interpolate import interp1d -from easydiffraction.core.constants import DEFAULT_BACKGROUND_TYPE from easydiffraction.core.objects import Collection from easydiffraction.core.objects import Component from easydiffraction.core.objects import Descriptor @@ -190,22 +190,38 @@ def show(self) -> None: ) +class BackgroundTypeEnum(str, Enum): + LINE_SEGMENT = 'line-segment' + CHEBYSHEV = 'chebyshev polynomial' + + @classmethod + def default(cls) -> 'BackgroundTypeEnum': + return cls.LINE_SEGMENT + + def description(self) -> str: + if self is BackgroundTypeEnum.LINE_SEGMENT: + return 'Linear interpolation between points' + elif self is BackgroundTypeEnum.CHEBYSHEV: + return 'Chebyshev polynomial background' + + class BackgroundFactory: - _supported: Dict[str, Type[BackgroundBase]] = { - 'line-segment': LineSegmentBackground, - 'chebyshev polynomial': ChebyshevPolynomialBackground, + _supported: Dict[BackgroundTypeEnum, Type[BackgroundBase]] = { + BackgroundTypeEnum.LINE_SEGMENT: LineSegmentBackground, + BackgroundTypeEnum.CHEBYSHEV: ChebyshevPolynomialBackground, } @classmethod def create( cls, - background_type: str = DEFAULT_BACKGROUND_TYPE, + background_type: BackgroundTypeEnum = BackgroundTypeEnum.default(), ) -> BackgroundBase: if background_type not in cls._supported: supported_types = list(cls._supported.keys()) raise ValueError( - f"Unsupported background type: '{background_type}'.\n Supported background types: {supported_types}" + f"Unsupported background type: '{background_type}'.\n" + f' Supported background types: {[bt.value for bt in supported_types]}' ) background_class = cls._supported[background_type] diff --git a/src/easydiffraction/experiments/components/experiment_type.py b/src/easydiffraction/experiments/components/experiment_type.py index 59ba74bf..308c6bdc 100644 --- a/src/easydiffraction/experiments/components/experiment_type.py +++ b/src/easydiffraction/experiments/components/experiment_type.py @@ -1,10 +1,72 @@ # SPDX-FileCopyrightText: 2021-2025 EasyDiffraction Python Library contributors # SPDX-License-Identifier: BSD-3-Clause +from enum import Enum + from easydiffraction.core.objects import Component from easydiffraction.core.objects import Descriptor +class SampleFormEnum(str, Enum): + POWDER = 'powder' + SINGLE_CRYSTAL = 'single crystal' + + @classmethod + def default(cls) -> 'SampleFormEnum': + return cls.POWDER + + def description(self) -> str: + if self is SampleFormEnum.POWDER: + return 'Powdered or polycrystalline sample.' + elif self is SampleFormEnum.SINGLE_CRYSTAL: + return 'Single crystal sample.' + + +class ScatteringTypeEnum(str, Enum): + BRAGG = 'bragg' + TOTAL = 'total' + + @classmethod + def default(cls) -> 'ScatteringTypeEnum': + return cls.BRAGG + + def description(self) -> str: + if self is ScatteringTypeEnum.BRAGG: + return 'Bragg diffraction for conventional structure refinement.' + elif self is ScatteringTypeEnum.TOTAL: + return 'Total scattering for pair distribution function analysis (PDF).' + + +class RadiationProbeEnum(str, Enum): + NEUTRON = 'neutron' + XRAY = 'xray' + + @classmethod + def default(cls) -> 'RadiationProbeEnum': + return cls.NEUTRON + + def description(self) -> str: + if self is RadiationProbeEnum.NEUTRON: + return 'Neutron diffraction.' + elif self is RadiationProbeEnum.XRAY: + return 'X-ray diffraction.' + + +class BeamModeEnum(str, Enum): + CONSTANT_WAVELENGTH = 'constant wavelength' + TIME_OF_FLIGHT = 'time-of-flight' + + @classmethod + def default(cls) -> 'BeamModeEnum': + return cls.CONSTANT_WAVELENGTH + + def description(self) -> str: + if self is BeamModeEnum.CONSTANT_WAVELENGTH: + return 'Constant wavelength (CW) diffraction.' + elif self is BeamModeEnum.TIME_OF_FLIGHT: + return 'Time-of-flight (TOF) diffraction.' + + class ExperimentType(Component): @property def cif_category_key(self) -> str: diff --git a/src/easydiffraction/experiments/components/instrument.py b/src/easydiffraction/experiments/components/instrument.py index 6aa6ad2f..d592ae54 100644 --- a/src/easydiffraction/experiments/components/instrument.py +++ b/src/easydiffraction/experiments/components/instrument.py @@ -1,10 +1,10 @@ # SPDX-FileCopyrightText: 2021-2025 EasyDiffraction Python Library contributors # SPDX-License-Identifier: BSD-3-Clause -from easydiffraction.core.constants import DEFAULT_BEAM_MODE -from easydiffraction.core.constants import DEFAULT_SCATTERING_TYPE from easydiffraction.core.objects import Component from easydiffraction.core.objects import Parameter +from easydiffraction.experiments.components.experiment_type import BeamModeEnum +from easydiffraction.experiments.components.experiment_type import ScatteringTypeEnum class InstrumentBase(Component): @@ -99,17 +99,17 @@ def __init__( class InstrumentFactory: _supported = { - 'bragg': { - 'constant wavelength': ConstantWavelengthInstrument, - 'time-of-flight': TimeOfFlightInstrument, + ScatteringTypeEnum.BRAGG: { + BeamModeEnum.CONSTANT_WAVELENGTH: ConstantWavelengthInstrument, + BeamModeEnum.TIME_OF_FLIGHT: TimeOfFlightInstrument, } } @classmethod def create( cls, - scattering_type=DEFAULT_SCATTERING_TYPE, - beam_mode=DEFAULT_BEAM_MODE, + scattering_type=ScatteringTypeEnum.default(), + beam_mode=BeamModeEnum.default(), ): supported_scattering_types = list(cls._supported.keys()) if scattering_type not in supported_scattering_types: diff --git a/src/easydiffraction/experiments/components/peak.py b/src/easydiffraction/experiments/components/peak.py index 28a81cd3..49bef09d 100644 --- a/src/easydiffraction/experiments/components/peak.py +++ b/src/easydiffraction/experiments/components/peak.py @@ -1,11 +1,52 @@ # SPDX-FileCopyrightText: 2021-2025 EasyDiffraction Python Library contributors # SPDX-License-Identifier: BSD-3-Clause +from enum import Enum -from easydiffraction.core.constants import DEFAULT_BEAM_MODE -from easydiffraction.core.constants import DEFAULT_PEAK_PROFILE_TYPE -from easydiffraction.core.constants import DEFAULT_SCATTERING_TYPE from easydiffraction.core.objects import Component from easydiffraction.core.objects import Parameter +from easydiffraction.experiments.components.experiment_type import BeamModeEnum +from easydiffraction.experiments.components.experiment_type import ScatteringTypeEnum + + +class PeakProfileTypeEnum(str, Enum): + PSEUDO_VOIGT = 'pseudo-voigt' + SPLIT_PSEUDO_VOIGT = 'split pseudo-voigt' + THOMPSON_COX_HASTINGS = 'thompson-cox-hastings' + PSEUDO_VOIGT_IKEDA_CARPENTER = 'pseudo-voigt * ikeda-carpenter' + PSEUDO_VOIGT_BACK_TO_BACK = 'pseudo-voigt * back-to-back' + GAUSSIAN_DAMPED_SINC = 'gaussian-damped-sinc' + + @classmethod + def default( + cls, + scattering_type: ScatteringTypeEnum | None = None, + beam_mode: BeamModeEnum | None = None, + ) -> 'PeakProfileTypeEnum': + if scattering_type is None: + scattering_type = ScatteringTypeEnum.default() + if beam_mode is None: + beam_mode = BeamModeEnum.default() + + return { + (ScatteringTypeEnum.BRAGG, BeamModeEnum.CONSTANT_WAVELENGTH): cls.PSEUDO_VOIGT, + (ScatteringTypeEnum.BRAGG, BeamModeEnum.TIME_OF_FLIGHT): cls.PSEUDO_VOIGT_IKEDA_CARPENTER, + (ScatteringTypeEnum.TOTAL, BeamModeEnum.CONSTANT_WAVELENGTH): cls.GAUSSIAN_DAMPED_SINC, + (ScatteringTypeEnum.TOTAL, BeamModeEnum.TIME_OF_FLIGHT): cls.GAUSSIAN_DAMPED_SINC, + }[(scattering_type, beam_mode)] + + def description(self) -> str: + if self is PeakProfileTypeEnum.PSEUDO_VOIGT: + return 'Pseudo-Voigt profile' + elif self is PeakProfileTypeEnum.SPLIT_PSEUDO_VOIGT: + return 'Split pseudo-Voigt profile with empirical asymmetry correction.' + elif self is PeakProfileTypeEnum.THOMPSON_COX_HASTINGS: + return 'Thompson-Cox-Hastings profile with FCJ asymmetry correction.' + elif self is PeakProfileTypeEnum.PSEUDO_VOIGT_IKEDA_CARPENTER: + return 'Pseudo-Voigt profile with Ikeda-Carpenter asymmetry correction.' + elif self is PeakProfileTypeEnum.PSEUDO_VOIGT_BACK_TO_BACK: + return 'Pseudo-Voigt profile with Back-to-Back Exponential asymmetry correction.' + elif self is PeakProfileTypeEnum.GAUSSIAN_DAMPED_SINC: + return 'Gaussian-damped sinc profile for pair distribution function (PDF) analysis.' # --- Mixins --- @@ -238,8 +279,6 @@ class ConstantWavelengthPseudoVoigt( PeakBase, ConstantWavelengthBroadeningMixin, ): - _description: str = 'Pseudo-Voigt profile' - def __init__(self) -> None: super().__init__() @@ -255,8 +294,6 @@ class ConstantWavelengthSplitPseudoVoigt( ConstantWavelengthBroadeningMixin, EmpiricalAsymmetryMixin, ): - _description: str = 'Split pseudo-Voigt profile' - def __init__(self) -> None: super().__init__() @@ -273,8 +310,6 @@ class ConstantWavelengthThompsonCoxHastings( ConstantWavelengthBroadeningMixin, FcjAsymmetryMixin, ): - _description: str = 'Thompson-Cox-Hastings profile' - def __init__(self) -> None: super().__init__() @@ -290,8 +325,6 @@ class TimeOfFlightPseudoVoigt( PeakBase, TimeOfFlightBroadeningMixin, ): - _description: str = 'Pseudo-Voigt profile' - def __init__(self) -> None: super().__init__() @@ -307,8 +340,6 @@ class TimeOfFlightPseudoVoigtIkedaCarpenter( TimeOfFlightBroadeningMixin, IkedaCarpenterAsymmetryMixin, ): - _description: str = 'Pseudo-Voigt * Ikeda-Carpenter profile' - def __init__(self) -> None: super().__init__() @@ -325,8 +356,6 @@ class TimeOfFlightPseudoVoigtBackToBackExponential( TimeOfFlightBroadeningMixin, IkedaCarpenterAsymmetryMixin, ): - _description: str = 'Pseudo-Voigt * Back-to-Back Exponential profile' - def __init__(self) -> None: super().__init__() @@ -342,8 +371,6 @@ class PairDistributionFunctionGaussianDampedSinc( PeakBase, PairDistributionFunctionBroadeningMixin, ): - _description = 'Gaussian-damped sinc PDF profile' - def __init__(self): super().__init__() self._add_pair_distribution_function_broadening() @@ -353,24 +380,24 @@ def __init__(self): # --- Peak factory --- class PeakFactory: _supported = { - 'bragg': { - 'constant wavelength': { - 'pseudo-voigt': ConstantWavelengthPseudoVoigt, - 'split pseudo-voigt': ConstantWavelengthSplitPseudoVoigt, - 'thompson-cox-hastings': ConstantWavelengthThompsonCoxHastings, + ScatteringTypeEnum.BRAGG: { + BeamModeEnum.CONSTANT_WAVELENGTH: { + PeakProfileTypeEnum.PSEUDO_VOIGT: ConstantWavelengthPseudoVoigt, + PeakProfileTypeEnum.SPLIT_PSEUDO_VOIGT: ConstantWavelengthSplitPseudoVoigt, + PeakProfileTypeEnum.THOMPSON_COX_HASTINGS: ConstantWavelengthThompsonCoxHastings, }, - 'time-of-flight': { - 'pseudo-voigt': TimeOfFlightPseudoVoigt, - 'pseudo-voigt * ikeda-carpenter': TimeOfFlightPseudoVoigtIkedaCarpenter, - 'pseudo-voigt * back-to-back': TimeOfFlightPseudoVoigtBackToBackExponential, + BeamModeEnum.TIME_OF_FLIGHT: { + PeakProfileTypeEnum.PSEUDO_VOIGT: TimeOfFlightPseudoVoigt, + PeakProfileTypeEnum.PSEUDO_VOIGT_IKEDA_CARPENTER: TimeOfFlightPseudoVoigtIkedaCarpenter, + PeakProfileTypeEnum.PSEUDO_VOIGT_BACK_TO_BACK: TimeOfFlightPseudoVoigtBackToBackExponential, }, }, - 'total': { - 'constant wavelength': { - 'gaussian-damped-sinc': PairDistributionFunctionGaussianDampedSinc, + ScatteringTypeEnum.TOTAL: { + BeamModeEnum.CONSTANT_WAVELENGTH: { + PeakProfileTypeEnum.GAUSSIAN_DAMPED_SINC: PairDistributionFunctionGaussianDampedSinc, }, - 'time-of-flight': { - 'gaussian-damped-sinc': PairDistributionFunctionGaussianDampedSinc, + BeamModeEnum.TIME_OF_FLIGHT: { + PeakProfileTypeEnum.GAUSSIAN_DAMPED_SINC: PairDistributionFunctionGaussianDampedSinc, }, }, } @@ -378,14 +405,14 @@ class PeakFactory: @classmethod def create( cls, - scattering_type=DEFAULT_SCATTERING_TYPE, - beam_mode=DEFAULT_BEAM_MODE, - profile_type=DEFAULT_PEAK_PROFILE_TYPE[DEFAULT_SCATTERING_TYPE][DEFAULT_BEAM_MODE], + scattering_type=ScatteringTypeEnum.default(), + beam_mode=BeamModeEnum.default(), + profile_type=PeakProfileTypeEnum.default(ScatteringTypeEnum.default(), BeamModeEnum.default()), ): supported_scattering_types = list(cls._supported.keys()) if scattering_type not in supported_scattering_types: raise ValueError( - f"Unsupported scattering type: '{scattering_type}'.\n Supported scattering types: {supported_scattering_types}" + f"Unsupported scattering type: '{scattering_type}'.\nSupported scattering types: {supported_scattering_types}" ) supported_beam_modes = list(cls._supported[scattering_type].keys()) diff --git a/src/easydiffraction/experiments/datastore.py b/src/easydiffraction/experiments/datastore.py index 5392df08..afcc002e 100644 --- a/src/easydiffraction/experiments/datastore.py +++ b/src/easydiffraction/experiments/datastore.py @@ -8,8 +8,8 @@ import numpy as np -from easydiffraction.core.constants import DEFAULT_BEAM_MODE -from easydiffraction.core.constants import DEFAULT_SAMPLE_FORM +from easydiffraction.experiments.components.experiment_type import BeamModeEnum +from easydiffraction.experiments.components.experiment_type import SampleFormEnum from easydiffraction.utils.decorators import enforce_type @@ -134,7 +134,7 @@ class PowderDatastore(BaseDatastore): Background values. """ - def __init__(self, beam_mode: str = DEFAULT_BEAM_MODE) -> None: + def __init__(self, beam_mode: BeamModeEnum = BeamModeEnum.default()) -> None: """ Initialize PowderDatastore. @@ -220,8 +220,8 @@ class DatastoreFactory: @classmethod def create( cls, - sample_form: str = DEFAULT_SAMPLE_FORM, - beam_mode: str = DEFAULT_BEAM_MODE, + sample_form: str = SampleFormEnum.default(), + beam_mode: str = BeamModeEnum.default(), ) -> BaseDatastore: """ Create and return a datastore object for the given sample form. diff --git a/src/easydiffraction/experiments/experiment.py b/src/easydiffraction/experiments/experiment.py index 6f722402..0b1ceffb 100644 --- a/src/easydiffraction/experiments/experiment.py +++ b/src/easydiffraction/experiments/experiment.py @@ -7,20 +7,20 @@ import numpy as np -from easydiffraction.core.constants import DEFAULT_BACKGROUND_TYPE -from easydiffraction.core.constants import DEFAULT_BEAM_MODE -from easydiffraction.core.constants import DEFAULT_PEAK_PROFILE_TYPE -from easydiffraction.core.constants import DEFAULT_RADIATION_PROBE -from easydiffraction.core.constants import DEFAULT_SAMPLE_FORM -from easydiffraction.core.constants import DEFAULT_SCATTERING_TYPE from easydiffraction.core.objects import Datablock from easydiffraction.experiments.collections.background import BackgroundFactory +from easydiffraction.experiments.collections.background import BackgroundTypeEnum from easydiffraction.experiments.collections.excluded_regions import ExcludedRegions from easydiffraction.experiments.collections.linked_phases import LinkedPhases +from easydiffraction.experiments.components.experiment_type import BeamModeEnum from easydiffraction.experiments.components.experiment_type import ExperimentType +from easydiffraction.experiments.components.experiment_type import RadiationProbeEnum +from easydiffraction.experiments.components.experiment_type import SampleFormEnum +from easydiffraction.experiments.components.experiment_type import ScatteringTypeEnum from easydiffraction.experiments.components.instrument import InstrumentBase from easydiffraction.experiments.components.instrument import InstrumentFactory from easydiffraction.experiments.components.peak import PeakFactory +from easydiffraction.experiments.components.peak import PeakProfileTypeEnum from easydiffraction.experiments.datastore import DatastoreFactory from easydiffraction.utils.decorators import enforce_type from easydiffraction.utils.formatting import paragraph @@ -162,7 +162,10 @@ def __init__( ) -> None: super().__init__(name=name, type=type) - self._peak_profile_type: str = DEFAULT_PEAK_PROFILE_TYPE[self.type.scattering_type.value][self.type.beam_mode.value] + self._peak_profile_type: str = PeakProfileTypeEnum.default( + self.type.scattering_type.value, + self.type.beam_mode.value, + ).value self.peak = PeakFactory.create( scattering_type=self.type.scattering_type.value, beam_mode=self.type.beam_mode.value, @@ -189,7 +192,9 @@ def peak_profile_type(self, new_type: str): print("For more information, use 'show_supported_peak_profile_types()'") return self.peak = PeakFactory.create( - scattering_type=self.type.scattering_type.value, beam_mode=self.type.beam_mode.value, profile_type=new_type + scattering_type=self.type.scattering_type.value, + beam_mode=self.type.beam_mode.value, + profile_type=new_type, ) self._peak_profile_type = new_type print(paragraph(f"Peak profile type for experiment '{self.name}' changed to")) @@ -199,12 +204,19 @@ def show_supported_peak_profile_types(self): columns_headers = ['Peak profile type', 'Description'] columns_alignment = ['left', 'left'] columns_data = [] - for name, config in PeakFactory._supported[self.type.scattering_type.value][self.type.beam_mode.value].items(): - description = getattr(config, '_description', 'No description provided.') - columns_data.append([name, description]) + + scattering_type = self.type.scattering_type.value + beam_mode = self.type.beam_mode.value + + for profile_type in PeakFactory._supported[scattering_type][beam_mode].keys(): + columns_data.append([profile_type.value, profile_type.description()]) print(paragraph('Supported peak profile types')) - render_table(columns_headers=columns_headers, columns_alignment=columns_alignment, columns_data=columns_data) + render_table( + columns_headers=columns_headers, + columns_alignment=columns_alignment, + columns_data=columns_data, + ) def show_current_peak_profile_type(self): print(paragraph('Current peak profile type')) @@ -227,7 +239,7 @@ def __init__( ) -> None: super().__init__(name=name, type=type) - self._background_type: str = DEFAULT_BACKGROUND_TYPE + self._background_type: BackgroundTypeEnum = BackgroundTypeEnum.default() self.background = BackgroundFactory.create(background_type=self.background_type) # ------------- @@ -310,12 +322,15 @@ def show_supported_background_types(self): columns_headers = ['Background type', 'Description'] columns_alignment = ['left', 'left'] columns_data = [] - for name, config in BackgroundFactory._supported.items(): - description = getattr(config, '_description', 'No description provided.') - columns_data.append([name, description]) + for bt, cls in BackgroundFactory._supported.items(): + columns_data.append([bt.value, bt.description()]) print(paragraph('Supported background types')) - render_table(columns_headers=columns_headers, columns_alignment=columns_alignment, columns_data=columns_data) + render_table( + columns_headers=columns_headers, + columns_alignment=columns_alignment, + columns_data=columns_data, + ) def show_current_background_type(self): print(paragraph('Current background type')) @@ -430,12 +445,12 @@ class ExperimentFactory: ] _supported = { - 'bragg': { - 'powder': PowderExperiment, - 'single crystal': SingleCrystalExperiment, + ScatteringTypeEnum.BRAGG: { + SampleFormEnum.POWDER: PowderExperiment, + SampleFormEnum.SINGLE_CRYSTAL: SingleCrystalExperiment, }, - 'total': { - 'powder': PairDistributionFunctionExperiment, + ScatteringTypeEnum.TOTAL: { + SampleFormEnum.POWDER: PairDistributionFunctionExperiment, }, } @@ -446,10 +461,22 @@ def create(cls, **kwargs): Validates argument combinations and dispatches to the appropriate creation method. Raises ValueError if arguments are invalid or no valid dispatch is found. """ + # Check for valid argument combinations user_args = [k for k, v in kwargs.items() if v is not None] if not cls.is_valid_args(user_args): raise ValueError(f'Invalid argument combination: {user_args}') + # Validate enum arguments if provided + if 'sample_form' in kwargs: + SampleFormEnum(kwargs['sample_form']) + if 'beam_mode' in kwargs: + BeamModeEnum(kwargs['beam_mode']) + if 'radiation_probe' in kwargs: + RadiationProbeEnum(kwargs['radiation_probe']) + if 'scattering_type' in kwargs: + ScatteringTypeEnum(kwargs['scattering_type']) + + # Dispatch to the appropriate creation method if 'cif_path' in kwargs: return cls._create_from_cif_path(kwargs) elif 'cif_str' in kwargs: @@ -458,7 +485,6 @@ def create(cls, **kwargs): return cls._create_from_data_path(kwargs) elif 'name' in kwargs: return cls._create_without_data(kwargs) - raise ValueError('No valid argument combination found for experiment creation.') @staticmethod def _create_from_cif_path(cif_path): @@ -514,10 +540,10 @@ def _make_experiment_type(cls, kwargs): Helper to construct an ExperimentType from keyword arguments, using defaults as needed. """ return ExperimentType( - sample_form=kwargs.get('sample_form', DEFAULT_SAMPLE_FORM), - beam_mode=kwargs.get('beam_mode', DEFAULT_BEAM_MODE), - radiation_probe=kwargs.get('radiation_probe', DEFAULT_RADIATION_PROBE), - scattering_type=kwargs.get('scattering_type', DEFAULT_SCATTERING_TYPE), + sample_form=kwargs.get('sample_form', SampleFormEnum.default()), + beam_mode=kwargs.get('beam_mode', BeamModeEnum.default()), + radiation_probe=kwargs.get('radiation_probe', RadiationProbeEnum.default()), + scattering_type=kwargs.get('scattering_type', ScatteringTypeEnum.default()), ) @staticmethod diff --git a/src/easydiffraction/experiments/experiments.py b/src/easydiffraction/experiments/experiments.py index 01c6e6e9..b083bc9b 100644 --- a/src/easydiffraction/experiments/experiments.py +++ b/src/easydiffraction/experiments/experiments.py @@ -4,11 +4,11 @@ from typing import Dict from typing import List -from easydiffraction.core.constants import DEFAULT_BEAM_MODE -from easydiffraction.core.constants import DEFAULT_RADIATION_PROBE -from easydiffraction.core.constants import DEFAULT_SAMPLE_FORM -from easydiffraction.core.constants import DEFAULT_SCATTERING_TYPE from easydiffraction.core.objects import Collection +from easydiffraction.experiments.components.experiment_type import BeamModeEnum +from easydiffraction.experiments.components.experiment_type import RadiationProbeEnum +from easydiffraction.experiments.components.experiment_type import SampleFormEnum +from easydiffraction.experiments.components.experiment_type import ScatteringTypeEnum from easydiffraction.experiments.experiment import BaseExperiment from easydiffraction.experiments.experiment import Experiment from easydiffraction.utils.decorators import enforce_type @@ -52,10 +52,10 @@ def add_from_data_path( self, name: str, data_path: str, - sample_form: str = DEFAULT_SAMPLE_FORM, - beam_mode: str = DEFAULT_BEAM_MODE, - radiation_probe: str = DEFAULT_RADIATION_PROBE, - scattering_type: str = DEFAULT_SCATTERING_TYPE, + sample_form: str = SampleFormEnum.default().value, + beam_mode: str = BeamModeEnum.default().value, + radiation_probe: str = RadiationProbeEnum.default().value, + scattering_type: str = ScatteringTypeEnum.default().value, ): """ Add a new experiment from a data file path. @@ -73,10 +73,10 @@ def add_from_data_path( def add_without_data( self, name: str, - sample_form: str = DEFAULT_SAMPLE_FORM, - beam_mode: str = DEFAULT_BEAM_MODE, - radiation_probe: str = DEFAULT_RADIATION_PROBE, - scattering_type: str = DEFAULT_SCATTERING_TYPE, + sample_form: str = SampleFormEnum.default().value, + beam_mode: str = BeamModeEnum.default().value, + radiation_probe: str = RadiationProbeEnum.default().value, + scattering_type: str = ScatteringTypeEnum.default().value, ): """ Add a new experiment without any data file. diff --git a/src/easydiffraction/plotting/plotters/plotter_base.py b/src/easydiffraction/plotting/plotters/plotter_base.py index ceb81e7f..0885af00 100644 --- a/src/easydiffraction/plotting/plotters/plotter_base.py +++ b/src/easydiffraction/plotting/plotters/plotter_base.py @@ -6,6 +6,8 @@ import numpy as np +from easydiffraction.experiments.components.experiment_type import BeamModeEnum +from easydiffraction.experiments.components.experiment_type import ScatteringTypeEnum from easydiffraction.utils.utils import is_notebook DEFAULT_ENGINE = 'plotly' if is_notebook() else 'asciichartpy' @@ -13,6 +15,14 @@ DEFAULT_MIN = -np.inf DEFAULT_MAX = np.inf +DEFAULT_AXES_LABELS = { + (ScatteringTypeEnum.BRAGG, BeamModeEnum.CONSTANT_WAVELENGTH): ['2ΞΈ (degree)', 'Intensity (arb. units)'], + (ScatteringTypeEnum.BRAGG, BeamModeEnum.TIME_OF_FLIGHT): ['TOF (Β΅s)', 'Intensity (arb. units)'], + (ScatteringTypeEnum.BRAGG, 'd-spacing'): ['d (Γ…)', 'Intensity (arb. units)'], + (ScatteringTypeEnum.TOTAL, BeamModeEnum.CONSTANT_WAVELENGTH): ['r (β„«)', 'G(r) (β„«)'], + (ScatteringTypeEnum.TOTAL, BeamModeEnum.TIME_OF_FLIGHT): ['r (β„«)', 'G(r) (β„«)'], +} + SERIES_CONFIG = dict( calc=dict( mode='lines', diff --git a/src/easydiffraction/plotting/plotting.py b/src/easydiffraction/plotting/plotting.py index ba73b701..d1fc7fea 100644 --- a/src/easydiffraction/plotting/plotting.py +++ b/src/easydiffraction/plotting/plotting.py @@ -1,8 +1,8 @@ # SPDX-FileCopyrightText: 2021-2025 EasyDiffraction Python Library contributors # SPDX-License-Identifier: BSD-3-Clause -from easydiffraction.core.constants import DEFAULT_AXES_LABELS from easydiffraction.plotting.plotters.plotter_ascii import AsciiPlotter +from easydiffraction.plotting.plotters.plotter_base import DEFAULT_AXES_LABELS from easydiffraction.plotting.plotters.plotter_base import DEFAULT_ENGINE from easydiffraction.plotting.plotters.plotter_base import DEFAULT_HEIGHT from easydiffraction.plotting.plotters.plotter_base import DEFAULT_MAX @@ -120,7 +120,15 @@ def show_supported_engines(self): columns_data=columns_data, ) - def plot_meas(self, pattern, expt_name, expt_type, x_min=None, x_max=None, d_spacing=False): + def plot_meas( + self, + pattern, + expt_name, + expt_type, + x_min=None, + x_max=None, + d_spacing=False, + ): if pattern.x is None: error(f'No data available for experiment {expt_name}') return @@ -149,9 +157,19 @@ def plot_meas(self, pattern, expt_name, expt_type, x_min=None, x_max=None, d_spa y_labels = ['meas'] if d_spacing: - axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value]['d-spacing'] + axes_labels = DEFAULT_AXES_LABELS[ + ( + expt_type.scattering_type.value, + 'd-spacing', + ) + ] else: - axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value][expt_type.beam_mode.value] + axes_labels = DEFAULT_AXES_LABELS[ + ( + expt_type.scattering_type.value, + expt_type.beam_mode.value, + ) + ] self._plotter.plot( x=x, @@ -199,9 +217,19 @@ def plot_calc( y_labels = ['calc'] if d_spacing: - axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value]['d-spacing'] + axes_labels = DEFAULT_AXES_LABELS[ + ( + expt_type.scattering_type.value, + 'd-spacing', + ) + ] else: - axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value][expt_type.beam_mode.value] + axes_labels = DEFAULT_AXES_LABELS[ + ( + expt_type.scattering_type.value, + expt_type.beam_mode.value, + ) + ] self._plotter.plot( x=x, @@ -259,9 +287,19 @@ def plot_meas_vs_calc( y_labels = ['meas', 'calc'] if d_spacing: - axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value]['d-spacing'] + axes_labels = DEFAULT_AXES_LABELS[ + ( + expt_type.scattering_type.value, + 'd-spacing', + ) + ] else: - axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value][expt_type.beam_mode.value] + axes_labels = DEFAULT_AXES_LABELS[ + ( + expt_type.scattering_type.value, + expt_type.beam_mode.value, + ) + ] if show_residual: y_resid = y_meas - y_calc diff --git a/src/easydiffraction/project.py b/src/easydiffraction/project.py index 5b569624..65207918 100644 --- a/src/easydiffraction/project.py +++ b/src/easydiffraction/project.py @@ -10,6 +10,7 @@ from varname import varname from easydiffraction.analysis.analysis import Analysis +from easydiffraction.experiments.components.experiment_type import BeamModeEnum from easydiffraction.experiments.experiments import Experiments from easydiffraction.plotting.plotting import Plotter from easydiffraction.sample_models.sample_models import SampleModels @@ -344,14 +345,17 @@ def update_pattern_d_spacing(self, expt_name: str) -> None: expt_type = experiment.type beam_mode = expt_type.beam_mode.value - if beam_mode == 'time-of-flight': + if beam_mode == BeamModeEnum.TIME_OF_FLIGHT: datastore.d = tof_to_d( datastore.x, experiment.instrument.calib_d_to_tof_offset.value, experiment.instrument.calib_d_to_tof_linear.value, experiment.instrument.calib_d_to_tof_quad.value, ) - elif beam_mode == 'constant wavelength': - datastore.d = twotheta_to_d(datastore.x, experiment.instrument.setup_wavelength.value) + elif beam_mode == BeamModeEnum.CONSTANT_WAVELENGTH: + datastore.d = twotheta_to_d( + datastore.x, + experiment.instrument.setup_wavelength.value, + ) else: print(error(f'Unsupported beam mode: {beam_mode} for d-spacing update.')) diff --git a/tests/unit/experiments/components/test_experiment_type.py b/tests/unit/experiments/components/test_experiment_type.py index ca7ceae7..68fac38f 100644 --- a/tests/unit/experiments/components/test_experiment_type.py +++ b/tests/unit/experiments/components/test_experiment_type.py @@ -3,7 +3,12 @@ def test_experiment_type_initialization(): - experiment_type = ExperimentType(sample_form='powder', beam_mode='CW', radiation_probe='neutron', scattering_type='bragg') + experiment_type = ExperimentType( + sample_form='powder', + beam_mode='constant wavelength', + radiation_probe='neutron', + scattering_type='bragg', + ) assert isinstance(experiment_type.sample_form, Descriptor) assert experiment_type.sample_form.value == 'powder' @@ -11,7 +16,7 @@ def test_experiment_type_initialization(): assert experiment_type.sample_form.cif_name == 'sample_form' assert isinstance(experiment_type.beam_mode, Descriptor) - assert experiment_type.beam_mode.value == 'CW' + assert experiment_type.beam_mode.value == 'constant wavelength' assert experiment_type.beam_mode.name == 'beam_mode' assert experiment_type.beam_mode.cif_name == 'beam_mode' @@ -23,7 +28,10 @@ def test_experiment_type_initialization(): def test_experiment_type_properties(): experiment_type = ExperimentType( - sample_form='single_crystal', beam_mode='TOF', radiation_probe='x-ray', scattering_type='bragg' + sample_form='single crystal', + beam_mode='time-of-flight', + radiation_probe='xray', + scattering_type='bragg', ) assert experiment_type.category_key == 'expt_type' @@ -35,7 +43,12 @@ def test_experiment_type_properties(): def no_test_experiment_type_locking_attributes(): # TODO: hmm this doesn't work as expected. - experiment_type = ExperimentType(sample_form='powder', beam_mode='CW', radiation_probe='neutron', scattering_type='bragg') + experiment_type = ExperimentType( + sample_form='powder', + beam_mode='constant wavelength', + radiation_probe='neutron', + scattering_type='bragg', + ) experiment_type._locked = True # Disallow adding new attributes experiment_type.new_attribute = 'value' assert not hasattr(experiment_type, 'new_attribute') diff --git a/tests/unit/experiments/test_experiment.py b/tests/unit/experiments/test_experiment.py index 1007e53f..36dbc334 100644 --- a/tests/unit/experiments/test_experiment.py +++ b/tests/unit/experiments/test_experiment.py @@ -4,11 +4,11 @@ import numpy as np import pytest -from easydiffraction.core.constants import DEFAULT_BEAM_MODE -from easydiffraction.core.constants import DEFAULT_RADIATION_PROBE -from easydiffraction.core.constants import DEFAULT_SAMPLE_FORM -from easydiffraction.core.constants import DEFAULT_SCATTERING_TYPE +from easydiffraction.experiments.components.experiment_type import BeamModeEnum from easydiffraction.experiments.components.experiment_type import ExperimentType +from easydiffraction.experiments.components.experiment_type import RadiationProbeEnum +from easydiffraction.experiments.components.experiment_type import SampleFormEnum +from easydiffraction.experiments.components.experiment_type import ScatteringTypeEnum from easydiffraction.experiments.experiment import BaseExperiment from easydiffraction.experiments.experiment import Experiment from easydiffraction.experiments.experiment import ExperimentFactory @@ -19,8 +19,8 @@ @pytest.fixture def expt_type(): return ExperimentType( - sample_form=DEFAULT_SAMPLE_FORM, - beam_mode=DEFAULT_BEAM_MODE, + sample_form=SampleFormEnum.default(), + beam_mode=BeamModeEnum.default(), radiation_probe='xray', scattering_type='bragg', ) @@ -86,10 +86,10 @@ def test_single_crystal_experiment_show_meas_chart(expt_type): def test_experiment_factory_create_powder(): experiment = ExperimentFactory.create( name='PowderTest', - sample_form='powder', - beam_mode=DEFAULT_BEAM_MODE, - radiation_probe=DEFAULT_RADIATION_PROBE, - scattering_type=DEFAULT_SCATTERING_TYPE, + sample_form=SampleFormEnum.POWDER.value, + beam_mode=BeamModeEnum.default().value, + radiation_probe=RadiationProbeEnum.default().value, + scattering_type=ScatteringTypeEnum.default().value, ) assert isinstance(experiment, PowderExperiment) assert experiment.name == 'PowderTest' @@ -99,9 +99,9 @@ def test_experiment_factory_create_powder(): def no_test_experiment_factory_create_single_crystal(): experiment = ExperimentFactory.create( name='SingleCrystalTest', - sample_form='single crystal', - beam_mode=DEFAULT_BEAM_MODE, - radiation_probe=DEFAULT_RADIATION_PROBE, + sample_form=SampleFormEnum.SINGLE_CRYSTAL.value, + beam_mode=BeamModeEnum.default().value, + radiation_probe=RadiationProbeEnum.default().value, ) assert isinstance(experiment, SingleCrystalExperiment) assert experiment.name == 'SingleCrystalTest' @@ -113,8 +113,8 @@ def test_experiment_method(): experiment = Experiment( name='ExperimentTest', sample_form='powder', - beam_mode=DEFAULT_BEAM_MODE, - radiation_probe=DEFAULT_RADIATION_PROBE, + beam_mode=BeamModeEnum.default().value, + radiation_probe=RadiationProbeEnum.default().value, data_path='mock_path', ) assert isinstance(experiment, PowderExperiment) @@ -128,10 +128,10 @@ def test_experiment_factory_invalid_args_missing_required(): # Missing required 'name' with pytest.raises(ValueError, match='Invalid argument combination'): ExperimentFactory.create( - sample_form='powder', - beam_mode=DEFAULT_BEAM_MODE, - radiation_probe=DEFAULT_RADIATION_PROBE, - scattering_type=DEFAULT_SCATTERING_TYPE, + sample_form=SampleFormEnum.POWDER.value, + beam_mode=BeamModeEnum.default().value, + radiation_probe=RadiationProbeEnum.default().value, + scattering_type=ScatteringTypeEnum.default().value, ) diff --git a/tests/unit/experiments/test_experiments.py b/tests/unit/experiments/test_experiments.py index 949c8747..7c346d0a 100644 --- a/tests/unit/experiments/test_experiments.py +++ b/tests/unit/experiments/test_experiments.py @@ -41,7 +41,7 @@ def test_experiments_add_from_data_path(): name='TestExperiment', sample_form='powder', beam_mode='constant wavelength', - radiation_probe='x-ray', + radiation_probe='xray', data_path='mock_path', ) From 77e249303754f15638c99bc36e1e3243e9f283db Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 9 Sep 2025 10:47:25 +0200 Subject: [PATCH 7/8] Restructure fitting components into dedicated analysis/fitting module (#89) * Create a new fitting module directory * Reorganizes fitting tracker module structure * Refactors minimizer structure and imports * Refactors reliability factors into metrics module * Reorganizes import statements for clarity * Enforces absolute imports for consistency * Updates pixi.lock * Pins dependencies in pixi.toml * Reorganizes import statements in minimization module --- pixi.lock | 4 +- pixi.toml | 6 +- pyproject.toml | 24 ++-- src/easydiffraction/analysis/analysis.py | 13 +- src/easydiffraction/analysis/calculation.py | 3 +- .../calculators/calculator_crysfml.py | 3 +- .../analysis/calculators/calculator_cryspy.py | 3 +- .../calculators/calculator_factory.py | 9 +- .../analysis/calculators/calculator_pdffit.py | 3 +- .../analysis/fitting/__init__.py | 3 + .../metrics.py} | 0 .../progress_tracker.py} | 2 +- .../analysis/fitting/results.py | 126 ++++++++++++++++++ src/easydiffraction/analysis/minimization.py | 7 +- .../analysis/minimizers/minimizer_base.py | 126 +----------------- .../analysis/minimizers/minimizer_dfols.py | 2 +- .../analysis/minimizers/minimizer_factory.py | 7 +- .../analysis/minimizers/minimizer_lmfit.py | 2 +- .../plotting/plotters/plotter_ascii.py | 7 +- .../plotting/plotters/plotter_plotly.py | 5 +- .../test_fitting_progress_tracker.py | 6 +- .../minimizers/test_minimizer_base.py | 4 +- .../unit/analysis/test_reliability_factors.py | 12 +- 23 files changed, 189 insertions(+), 188 deletions(-) create mode 100644 src/easydiffraction/analysis/fitting/__init__.py rename src/easydiffraction/analysis/{reliability_factors.py => fitting/metrics.py} (100%) rename src/easydiffraction/analysis/{minimizers/fitting_progress_tracker.py => fitting/progress_tracker.py} (98%) create mode 100644 src/easydiffraction/analysis/fitting/results.py diff --git a/pixi.lock b/pixi.lock index cc034d4b..566c7637 100644 --- a/pixi.lock +++ b/pixi.lock @@ -7731,8 +7731,8 @@ packages: requires_python: '>=3.11,<3.14' - pypi: ./ name: easydiffraction - version: 0.7.1+d16 - sha256: d90638afd66acf6463904cab6b63a081786ef93672553c1055b569e92188f0d1 + version: 0.7.1+d15 + sha256: d8b9e41b221fb60b18f3a1f6a7a553b16c255795865702a7718bb4b93f5b16b2 requires_dist: - asciichartpy - asteval diff --git a/pixi.toml b/pixi.toml index 487cab29..9fde17c4 100644 --- a/pixi.toml +++ b/pixi.toml @@ -20,14 +20,14 @@ channels = ["conda-forge"] # Default feature configuration [dependencies] # == [feature.default.dependencies] -pip = "*" # Required to install from PyPI -jupyterlab = "*" # JupyterLab for notebooks +pip = ">=25.2,<26" # Required to install from PyPI +jupyterlab = ">=4.4.7,<5" # JupyterLab for notebooks [target.win-64.dependencies] libcblas = "*" # CBLAS library for linear algebra. Required for pdffit2. [pypi-dependencies] # == [feature.default.pypi-dependencies] -pixi-kernel = "*" # Pixi Jupyter kernel integration +pixi-kernel = ">=0.6.6, <0.7" # Pixi Jupyter kernel integration # Extra features for different Python versions diff --git a/pyproject.toml b/pyproject.toml index 1a61caca..89a74679 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -142,18 +142,22 @@ line-length = 127 [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) - 'TCH', # Type checking issues (e.g., incompatible types, missing type annotations) + '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) + 'TCH', # Type checking issues (e.g., incompatible types, missing type annotations) + 'TID252', # Enforces absolute imports over relative imports ] +[tool.ruff.lint.flake8-tidy-imports] +ban-relative-imports = 'all' + [tool.ruff.lint.isort] force-single-line = true diff --git a/src/easydiffraction/analysis/analysis.py b/src/easydiffraction/analysis/analysis.py index ff646a42..7f3ccbb1 100644 --- a/src/easydiffraction/analysis/analysis.py +++ b/src/easydiffraction/analysis/analysis.py @@ -7,6 +7,12 @@ import pandas as pd +from easydiffraction.analysis.calculators.calculator_factory import CalculatorFactory +from easydiffraction.analysis.collections.aliases import Aliases +from easydiffraction.analysis.collections.constraints import Constraints +from easydiffraction.analysis.collections.joint_fit_experiments import JointFitExperiments +from easydiffraction.analysis.minimization import DiffractionMinimizer +from easydiffraction.analysis.minimizers.minimizer_factory import MinimizerFactory from easydiffraction.core.objects import Descriptor from easydiffraction.core.objects import Parameter from easydiffraction.core.singletons import ConstraintsHandler @@ -16,13 +22,6 @@ from easydiffraction.utils.utils import render_cif from easydiffraction.utils.utils import render_table -from .calculators.calculator_factory import CalculatorFactory -from .collections.aliases import Aliases -from .collections.constraints import Constraints -from .collections.joint_fit_experiments import JointFitExperiments -from .minimization import DiffractionMinimizer -from .minimizers.minimizer_factory import MinimizerFactory - class Analysis: _calculator = CalculatorFactory.create_calculator('cryspy') diff --git a/src/easydiffraction/analysis/calculation.py b/src/easydiffraction/analysis/calculation.py index 4a079db9..32d97b98 100644 --- a/src/easydiffraction/analysis/calculation.py +++ b/src/easydiffraction/analysis/calculation.py @@ -5,12 +5,11 @@ from typing import List from typing import Optional +from easydiffraction.analysis.calculators.calculator_factory import CalculatorFactory from easydiffraction.experiments.experiment import Experiment from easydiffraction.experiments.experiments import Experiments from easydiffraction.sample_models.sample_models import SampleModels -from .calculators.calculator_factory import CalculatorFactory - class DiffractionCalculator: """ diff --git a/src/easydiffraction/analysis/calculators/calculator_crysfml.py b/src/easydiffraction/analysis/calculators/calculator_crysfml.py index 93fe4aab..47939915 100644 --- a/src/easydiffraction/analysis/calculators/calculator_crysfml.py +++ b/src/easydiffraction/analysis/calculators/calculator_crysfml.py @@ -8,13 +8,12 @@ import numpy as np +from easydiffraction.analysis.calculators.calculator_base import CalculatorBase from easydiffraction.experiments.experiment import Experiment from easydiffraction.experiments.experiments import Experiments from easydiffraction.sample_models.sample_models import SampleModel from easydiffraction.sample_models.sample_models import SampleModels -from .calculator_base import CalculatorBase - try: from pycrysfml import cfml_py_utilities diff --git a/src/easydiffraction/analysis/calculators/calculator_cryspy.py b/src/easydiffraction/analysis/calculators/calculator_cryspy.py index 933593f1..85812e72 100644 --- a/src/easydiffraction/analysis/calculators/calculator_cryspy.py +++ b/src/easydiffraction/analysis/calculators/calculator_cryspy.py @@ -11,12 +11,11 @@ import numpy as np +from easydiffraction.analysis.calculators.calculator_base import CalculatorBase from easydiffraction.experiments.components.experiment_type import BeamModeEnum from easydiffraction.experiments.experiment import Experiment from easydiffraction.sample_models.sample_model import SampleModel -from .calculator_base import CalculatorBase - try: import cryspy from cryspy.H_functions_global.function_1_cryspy_objects import str_to_globaln diff --git a/src/easydiffraction/analysis/calculators/calculator_factory.py b/src/easydiffraction/analysis/calculators/calculator_factory.py index be542fb6..2d9e097e 100644 --- a/src/easydiffraction/analysis/calculators/calculator_factory.py +++ b/src/easydiffraction/analysis/calculators/calculator_factory.py @@ -7,15 +7,14 @@ from typing import Type from typing import Union +from easydiffraction.analysis.calculators.calculator_base import CalculatorBase +from easydiffraction.analysis.calculators.calculator_crysfml import CrysfmlCalculator +from easydiffraction.analysis.calculators.calculator_cryspy import CryspyCalculator +from easydiffraction.analysis.calculators.calculator_pdffit import PdffitCalculator from easydiffraction.utils.formatting import error from easydiffraction.utils.formatting import paragraph from easydiffraction.utils.utils import render_table -from .calculator_base import CalculatorBase -from .calculator_crysfml import CrysfmlCalculator -from .calculator_cryspy import CryspyCalculator -from .calculator_pdffit import PdffitCalculator - class CalculatorFactory: _potential_calculators: Dict[str, Dict[str, Union[str, Type[CalculatorBase]]]] = { diff --git a/src/easydiffraction/analysis/calculators/calculator_pdffit.py b/src/easydiffraction/analysis/calculators/calculator_pdffit.py index 2897b66b..c0a275f7 100644 --- a/src/easydiffraction/analysis/calculators/calculator_pdffit.py +++ b/src/easydiffraction/analysis/calculators/calculator_pdffit.py @@ -6,11 +6,10 @@ import numpy as np +from easydiffraction.analysis.calculators.calculator_base import CalculatorBase from easydiffraction.experiments.experiment import Experiment from easydiffraction.sample_models.sample_model import SampleModel -from .calculator_base import CalculatorBase - try: from diffpy.pdffit2 import PdfFit as pdffit from diffpy.pdffit2 import redirect_stdout diff --git a/src/easydiffraction/analysis/fitting/__init__.py b/src/easydiffraction/analysis/fitting/__init__.py new file mode 100644 index 00000000..6c98b2a1 --- /dev/null +++ b/src/easydiffraction/analysis/fitting/__init__.py @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2021-2025 EasyDiffraction Python Library contributors +# SPDX-License-Identifier: BSD-3-Clause + diff --git a/src/easydiffraction/analysis/reliability_factors.py b/src/easydiffraction/analysis/fitting/metrics.py similarity index 100% rename from src/easydiffraction/analysis/reliability_factors.py rename to src/easydiffraction/analysis/fitting/metrics.py diff --git a/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py b/src/easydiffraction/analysis/fitting/progress_tracker.py similarity index 98% rename from src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py rename to src/easydiffraction/analysis/fitting/progress_tracker.py index 97bec672..efb13f26 100644 --- a/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py +++ b/src/easydiffraction/analysis/fitting/progress_tracker.py @@ -15,7 +15,7 @@ display = None clear_output = None -from easydiffraction.analysis.reliability_factors import calculate_reduced_chi_square +from easydiffraction.analysis.fitting.metrics import calculate_reduced_chi_square from easydiffraction.utils.utils import is_notebook from easydiffraction.utils.utils import render_table diff --git a/src/easydiffraction/analysis/fitting/results.py b/src/easydiffraction/analysis/fitting/results.py new file mode 100644 index 00000000..112a5607 --- /dev/null +++ b/src/easydiffraction/analysis/fitting/results.py @@ -0,0 +1,126 @@ +from typing import Any +from typing import List +from typing import Optional + +from easydiffraction import paragraph +from easydiffraction.analysis.fitting.metrics import calculate_r_factor +from easydiffraction.analysis.fitting.metrics import calculate_r_factor_squared +from easydiffraction.analysis.fitting.metrics import calculate_rb_factor +from easydiffraction.analysis.fitting.metrics import calculate_weighted_r_factor +from easydiffraction.utils.utils import render_table + + +class FitResults: + def __init__( + self, + success: bool = False, + parameters: Optional[List[Any]] = None, + chi_square: Optional[float] = None, + reduced_chi_square: Optional[float] = None, + message: str = '', + iterations: int = 0, + engine_result: Optional[Any] = None, + starting_parameters: Optional[List[Any]] = None, + fitting_time: Optional[float] = None, + **kwargs: Any, + ) -> None: + self.success: bool = success + self.parameters: List[Any] = parameters if parameters is not None else [] + self.chi_square: Optional[float] = chi_square + self.reduced_chi_square: Optional[float] = reduced_chi_square + self.message: str = message + self.iterations: int = iterations + self.engine_result: Optional[Any] = engine_result + self.result: Optional[Any] = None + self.starting_parameters: List[Any] = starting_parameters if starting_parameters is not None else [] + self.fitting_time: Optional[float] = fitting_time + + if 'redchi' in kwargs and self.reduced_chi_square is None: + self.reduced_chi_square = kwargs.get('redchi') + + for key, value in kwargs.items(): + setattr(self, key, value) + + def display_results( + self, + y_obs: Optional[List[float]] = None, + y_calc: Optional[List[float]] = None, + y_err: Optional[List[float]] = None, + f_obs: Optional[List[float]] = None, + f_calc: Optional[List[float]] = None, + ) -> None: + status_icon = 'βœ…' if self.success else '❌' + rf = rf2 = wr = br = None + if y_obs is not None and y_calc is not None: + rf = calculate_r_factor(y_obs, y_calc) * 100 + rf2 = calculate_r_factor_squared(y_obs, y_calc) * 100 + if y_obs is not None and y_calc is not None and y_err is not None: + wr = calculate_weighted_r_factor(y_obs, y_calc, y_err) * 100 + if f_obs is not None and f_calc is not None: + br = calculate_rb_factor(f_obs, f_calc) * 100 + + print(paragraph('Fit results')) + print(f'{status_icon} Success: {self.success}') + print(f'⏱️ Fitting time: {self.fitting_time:.2f} seconds') + print(f'πŸ“ Goodness-of-fit (reduced χ²): {self.reduced_chi_square:.2f}') + if rf is not None: + print(f'πŸ“ R-factor (Rf): {rf:.2f}%') + if rf2 is not None: + print(f'πŸ“ R-factor squared (RfΒ²): {rf2:.2f}%') + if wr is not None: + print(f'πŸ“ Weighted R-factor (wR): {wr:.2f}%') + if br is not None: + print(f'πŸ“ Bragg R-factor (BR): {br:.2f}%') + print('πŸ“ˆ Fitted parameters:') + + headers = [ + 'datablock', + 'category', + 'entry', + 'parameter', + 'start', + 'fitted', + 'uncertainty', + 'units', + 'change', + ] + alignments = [ + 'left', + 'left', + 'left', + 'left', + 'right', + 'right', + 'right', + 'left', + 'right', + ] + + rows = [] + for param in self.parameters: + datablock_id = getattr(param, 'datablock_id', 'N/A') + category_key = getattr(param, 'category_key', 'N/A') + collection_entry_id = getattr(param, 'collection_entry_id', 'N/A') + name = getattr(param, 'name', 'N/A') + start = f'{getattr(param, "start_value", "N/A"):.4f}' if param.start_value is not None else 'N/A' + fitted = f'{param.value:.4f}' if param.value is not None else 'N/A' + uncertainty = f'{param.uncertainty:.4f}' if param.uncertainty is not None else 'N/A' + units = getattr(param, 'units', 'N/A') + + if param.start_value and param.value: + change = ((param.value - param.start_value) / param.start_value) * 100 + arrow = '↑' if change > 0 else '↓' + relative_change = f'{abs(change):.2f} % {arrow}' + else: + relative_change = 'N/A' + + rows.append( + [datablock_id, category_key, collection_entry_id, name, start, fitted, uncertainty, units, relative_change] + ) + + render_table( + columns_headers=headers, + columns_alignment=alignments, + columns_data=rows, + show_index=True, + ) diff --git a/src/easydiffraction/analysis/minimization.py b/src/easydiffraction/analysis/minimization.py index 35339cbc..6bc46763 100644 --- a/src/easydiffraction/analysis/minimization.py +++ b/src/easydiffraction/analysis/minimization.py @@ -10,15 +10,14 @@ import numpy as np from easydiffraction.analysis.calculators.calculator_base import CalculatorBase +from easydiffraction.analysis.fitting.metrics import get_reliability_inputs +from easydiffraction.analysis.minimizers.minimizer_factory import MinimizerFactory from easydiffraction.core.objects import Parameter from easydiffraction.experiments.experiments import Experiments from easydiffraction.sample_models.sample_models import SampleModels -from ..analysis.reliability_factors import get_reliability_inputs - if TYPE_CHECKING: - from .minimizers.minimizer_base import FitResults -from .minimizers.minimizer_factory import MinimizerFactory + from easydiffraction.analysis.fitting.results import FitResults class DiffractionMinimizer: diff --git a/src/easydiffraction/analysis/minimizers/minimizer_base.py b/src/easydiffraction/analysis/minimizers/minimizer_base.py index 2c0f3e66..4042ad6f 100644 --- a/src/easydiffraction/analysis/minimizers/minimizer_base.py +++ b/src/easydiffraction/analysis/minimizers/minimizer_base.py @@ -11,130 +11,8 @@ import numpy as np -from easydiffraction.utils.formatting import paragraph -from easydiffraction.utils.utils import render_table - -from ..reliability_factors import calculate_r_factor -from ..reliability_factors import calculate_r_factor_squared -from ..reliability_factors import calculate_rb_factor -from ..reliability_factors import calculate_weighted_r_factor -from .fitting_progress_tracker import FittingProgressTracker - - -class FitResults: - def __init__( - self, - success: bool = False, - parameters: Optional[List[Any]] = None, - chi_square: Optional[float] = None, - reduced_chi_square: Optional[float] = None, - message: str = '', - iterations: int = 0, - engine_result: Optional[Any] = None, - starting_parameters: Optional[List[Any]] = None, - fitting_time: Optional[float] = None, - **kwargs: Any, - ) -> None: - self.success: bool = success - self.parameters: List[Any] = parameters if parameters is not None else [] - self.chi_square: Optional[float] = chi_square - self.reduced_chi_square: Optional[float] = reduced_chi_square - self.message: str = message - self.iterations: int = iterations - self.engine_result: Optional[Any] = engine_result - self.result: Optional[Any] = None - self.starting_parameters: List[Any] = starting_parameters if starting_parameters is not None else [] - self.fitting_time: Optional[float] = fitting_time - - if 'redchi' in kwargs and self.reduced_chi_square is None: - self.reduced_chi_square = kwargs.get('redchi') - - for key, value in kwargs.items(): - setattr(self, key, value) - - def display_results( - self, - y_obs: Optional[List[float]] = None, - y_calc: Optional[List[float]] = None, - y_err: Optional[List[float]] = None, - f_obs: Optional[List[float]] = None, - f_calc: Optional[List[float]] = None, - ) -> None: - status_icon = 'βœ…' if self.success else '❌' - rf = rf2 = wr = br = None - if y_obs is not None and y_calc is not None: - rf = calculate_r_factor(y_obs, y_calc) * 100 - rf2 = calculate_r_factor_squared(y_obs, y_calc) * 100 - if y_obs is not None and y_calc is not None and y_err is not None: - wr = calculate_weighted_r_factor(y_obs, y_calc, y_err) * 100 - if f_obs is not None and f_calc is not None: - br = calculate_rb_factor(f_obs, f_calc) * 100 - - print(paragraph('Fit results')) - print(f'{status_icon} Success: {self.success}') - print(f'⏱️ Fitting time: {self.fitting_time:.2f} seconds') - print(f'πŸ“ Goodness-of-fit (reduced χ²): {self.reduced_chi_square:.2f}') - if rf is not None: - print(f'πŸ“ R-factor (Rf): {rf:.2f}%') - if rf2 is not None: - print(f'πŸ“ R-factor squared (RfΒ²): {rf2:.2f}%') - if wr is not None: - print(f'πŸ“ Weighted R-factor (wR): {wr:.2f}%') - if br is not None: - print(f'πŸ“ Bragg R-factor (BR): {br:.2f}%') - print('πŸ“ˆ Fitted parameters:') - - headers = [ - 'datablock', - 'category', - 'entry', - 'parameter', - 'start', - 'fitted', - 'uncertainty', - 'units', - 'change', - ] - alignments = [ - 'left', - 'left', - 'left', - 'left', - 'right', - 'right', - 'right', - 'left', - 'right', - ] - - rows = [] - for param in self.parameters: - datablock_id = getattr(param, 'datablock_id', 'N/A') - category_key = getattr(param, 'category_key', 'N/A') - collection_entry_id = getattr(param, 'collection_entry_id', 'N/A') - name = getattr(param, 'name', 'N/A') - start = f'{getattr(param, "start_value", "N/A"):.4f}' if param.start_value is not None else 'N/A' - fitted = f'{param.value:.4f}' if param.value is not None else 'N/A' - uncertainty = f'{param.uncertainty:.4f}' if param.uncertainty is not None else 'N/A' - units = getattr(param, 'units', 'N/A') - - if param.start_value and param.value: - change = ((param.value - param.start_value) / param.start_value) * 100 - arrow = '↑' if change > 0 else '↓' - relative_change = f'{abs(change):.2f} % {arrow}' - else: - relative_change = 'N/A' - - rows.append( - [datablock_id, category_key, collection_entry_id, name, start, fitted, uncertainty, units, relative_change] - ) - - render_table( - columns_headers=headers, - columns_alignment=alignments, - columns_data=rows, - show_index=True, - ) +from easydiffraction.analysis.fitting.progress_tracker import FittingProgressTracker +from easydiffraction.analysis.fitting.results import FitResults class MinimizerBase(ABC): diff --git a/src/easydiffraction/analysis/minimizers/minimizer_dfols.py b/src/easydiffraction/analysis/minimizers/minimizer_dfols.py index 85b35d13..03354bae 100644 --- a/src/easydiffraction/analysis/minimizers/minimizer_dfols.py +++ b/src/easydiffraction/analysis/minimizers/minimizer_dfols.py @@ -8,7 +8,7 @@ import numpy as np from dfols import solve -from .minimizer_base import MinimizerBase +from easydiffraction.analysis.minimizers.minimizer_base import MinimizerBase DEFAULT_MAX_ITERATIONS = 1000 diff --git a/src/easydiffraction/analysis/minimizers/minimizer_factory.py b/src/easydiffraction/analysis/minimizers/minimizer_factory.py index fa4ee6ef..a12a2f79 100644 --- a/src/easydiffraction/analysis/minimizers/minimizer_factory.py +++ b/src/easydiffraction/analysis/minimizers/minimizer_factory.py @@ -7,13 +7,12 @@ from typing import Optional from typing import Type +from easydiffraction.analysis.minimizers.minimizer_base import MinimizerBase +from easydiffraction.analysis.minimizers.minimizer_dfols import DfolsMinimizer +from easydiffraction.analysis.minimizers.minimizer_lmfit import LmfitMinimizer from easydiffraction.utils.formatting import paragraph from easydiffraction.utils.utils import render_table -from .minimizer_base import MinimizerBase -from .minimizer_dfols import DfolsMinimizer -from .minimizer_lmfit import LmfitMinimizer - class MinimizerFactory: _available_minimizers: Dict[str, Dict[str, Any]] = { diff --git a/src/easydiffraction/analysis/minimizers/minimizer_lmfit.py b/src/easydiffraction/analysis/minimizers/minimizer_lmfit.py index 325d6fb1..77ca5f91 100644 --- a/src/easydiffraction/analysis/minimizers/minimizer_lmfit.py +++ b/src/easydiffraction/analysis/minimizers/minimizer_lmfit.py @@ -7,7 +7,7 @@ import lmfit -from .minimizer_base import MinimizerBase +from easydiffraction.analysis.minimizers.minimizer_base import MinimizerBase DEFAULT_METHOD = 'leastsq' DEFAULT_MAX_ITERATIONS = 1000 diff --git a/src/easydiffraction/plotting/plotters/plotter_ascii.py b/src/easydiffraction/plotting/plotters/plotter_ascii.py index eca0327e..344fc091 100644 --- a/src/easydiffraction/plotting/plotters/plotter_ascii.py +++ b/src/easydiffraction/plotting/plotters/plotter_ascii.py @@ -3,12 +3,11 @@ import asciichartpy +from easydiffraction.plotting.plotters.plotter_base import DEFAULT_HEIGHT +from easydiffraction.plotting.plotters.plotter_base import SERIES_CONFIG +from easydiffraction.plotting.plotters.plotter_base import PlotterBase from easydiffraction.utils.formatting import paragraph -from .plotter_base import DEFAULT_HEIGHT -from .plotter_base import SERIES_CONFIG -from .plotter_base import PlotterBase - DEFAULT_COLORS = { 'meas': asciichartpy.blue, 'calc': asciichartpy.red, diff --git a/src/easydiffraction/plotting/plotters/plotter_plotly.py b/src/easydiffraction/plotting/plotters/plotter_plotly.py index ef397b5e..87eb1a84 100644 --- a/src/easydiffraction/plotting/plotters/plotter_plotly.py +++ b/src/easydiffraction/plotting/plotters/plotter_plotly.py @@ -12,11 +12,10 @@ display = None HTML = None +from easydiffraction.plotting.plotters.plotter_base import SERIES_CONFIG +from easydiffraction.plotting.plotters.plotter_base import PlotterBase from easydiffraction.utils.utils import is_pycharm -from .plotter_base import SERIES_CONFIG -from .plotter_base import PlotterBase - DEFAULT_COLORS = { 'meas': 'rgb(31, 119, 180)', 'calc': 'rgb(214, 39, 40)', diff --git a/tests/unit/analysis/minimizers/test_fitting_progress_tracker.py b/tests/unit/analysis/minimizers/test_fitting_progress_tracker.py index 25afe741..c82f6e49 100644 --- a/tests/unit/analysis/minimizers/test_fitting_progress_tracker.py +++ b/tests/unit/analysis/minimizers/test_fitting_progress_tracker.py @@ -3,8 +3,8 @@ import numpy as np import pytest -from easydiffraction.analysis.minimizers.fitting_progress_tracker import FittingProgressTracker -from easydiffraction.analysis.minimizers.fitting_progress_tracker import format_cell +from easydiffraction.analysis.fitting.progress_tracker import FittingProgressTracker +from easydiffraction.analysis.fitting.progress_tracker import format_cell def test_format_cell(): @@ -68,7 +68,7 @@ def test_reset(tracker): assert tracker._previous_chi2 is None -@patch('easydiffraction.analysis.reliability_factors.calculate_reduced_chi_square', return_value=1.23) +@patch('easydiffraction.analysis.fitting.metrics.calculate_reduced_chi_square', return_value=1.23) @patch('builtins.print') def test_track(mock_print, mock_calculate_chi2, tracker): residuals = np.array([1.1, 2.1, 3.1, 4.1, 5.1]) diff --git a/tests/unit/analysis/minimizers/test_minimizer_base.py b/tests/unit/analysis/minimizers/test_minimizer_base.py index 52f9b2b9..be613c05 100644 --- a/tests/unit/analysis/minimizers/test_minimizer_base.py +++ b/tests/unit/analysis/minimizers/test_minimizer_base.py @@ -3,7 +3,7 @@ import pytest -from easydiffraction.analysis.minimizers.minimizer_base import FitResults +from easydiffraction.analysis.fitting.results import FitResults from easydiffraction.analysis.minimizers.minimizer_base import MinimizerBase @@ -90,7 +90,7 @@ def test_finalize_fit(mock_minimizer, mock_parameters): assert result.parameters == mock_parameters -@patch('easydiffraction.analysis.minimizers.fitting_progress_tracker.FittingProgressTracker') +@patch('easydiffraction.analysis.fitting.progress_tracker.FittingProgressTracker') def test_fit(mock_tracker, mock_minimizer, mock_parameters, mock_objective_function): mock_minimizer.tracker.finish_tracking = MagicMock() result = mock_minimizer.fit(mock_parameters, mock_objective_function) diff --git a/tests/unit/analysis/test_reliability_factors.py b/tests/unit/analysis/test_reliability_factors.py index d674103c..9f326b55 100644 --- a/tests/unit/analysis/test_reliability_factors.py +++ b/tests/unit/analysis/test_reliability_factors.py @@ -2,12 +2,12 @@ import numpy as np -from easydiffraction.analysis.reliability_factors import calculate_r_factor -from easydiffraction.analysis.reliability_factors import calculate_r_factor_squared -from easydiffraction.analysis.reliability_factors import calculate_rb_factor -from easydiffraction.analysis.reliability_factors import calculate_reduced_chi_square -from easydiffraction.analysis.reliability_factors import calculate_weighted_r_factor -from easydiffraction.analysis.reliability_factors import get_reliability_inputs +from easydiffraction.analysis.fitting.metrics import calculate_r_factor +from easydiffraction.analysis.fitting.metrics import calculate_r_factor_squared +from easydiffraction.analysis.fitting.metrics import calculate_rb_factor +from easydiffraction.analysis.fitting.metrics import calculate_reduced_chi_square +from easydiffraction.analysis.fitting.metrics import calculate_weighted_r_factor +from easydiffraction.analysis.fitting.metrics import get_reliability_inputs def test_calculate_r_factor(): From 63f88173c41b812c20a482cc44e8331aad624123 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 9 Sep 2025 11:28:30 +0200 Subject: [PATCH 8/8] Complete the description attribute for all parameters (#95) * Create a new fitting module directory * Reorganizes fitting tracker module structure * Refactors minimizer structure and imports * Refactors reliability factors into metrics module * Reorganizes import statements for clarity * Enforces absolute imports for consistency * Updates pixi.lock * Pins dependencies in pixi.toml * Reorganizes import statements in minimization module * Adds descriptions to parameters and descriptors --- .../experiments/collections/background.py | 12 ++++++++++-- .../experiments/collections/excluded_regions.py | 8 +++++++- .../experiments/collections/linked_phases.py | 8 +++++++- .../sample_models/collections/atom_sites.py | 9 +++++++++ src/easydiffraction/sample_models/components/cell.py | 6 ++++++ .../sample_models/components/space_group.py | 2 ++ 6 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/easydiffraction/experiments/collections/background.py b/src/easydiffraction/experiments/collections/background.py index 0fb2907a..a46f2579 100644 --- a/src/easydiffraction/experiments/collections/background.py +++ b/src/easydiffraction/experiments/collections/background.py @@ -31,7 +31,11 @@ def category_key(self) -> str: def cif_category_key(self) -> str: return 'pd_background' - def __init__(self, x: float, y: float): + def __init__( + self, + x: float, + y: float, + ): super().__init__() self.x = Descriptor( @@ -69,7 +73,11 @@ def category_key(self) -> str: def cif_category_key(self): return 'pd_background' - def __init__(self, order: int, coef: float) -> None: + def __init__( + self, + order: int, + coef: float, + ) -> None: super().__init__() self.order = Descriptor( diff --git a/src/easydiffraction/experiments/collections/excluded_regions.py b/src/easydiffraction/experiments/collections/excluded_regions.py index 81a8d555..9e490dde 100644 --- a/src/easydiffraction/experiments/collections/excluded_regions.py +++ b/src/easydiffraction/experiments/collections/excluded_regions.py @@ -21,18 +21,24 @@ def category_key(self) -> str: def cif_category_key(self) -> str: return 'excluded_region' - def __init__(self, start: float, end: float): + def __init__( + self, + start: float, + end: float, + ): super().__init__() self.start = Descriptor( value=start, name='start', cif_name='start', + description='Start of the excluded region.', ) self.end = Parameter( value=end, name='end', cif_name='end', + description='End of the excluded region.', ) # Select which of the input parameters is used for the diff --git a/src/easydiffraction/experiments/collections/linked_phases.py b/src/easydiffraction/experiments/collections/linked_phases.py index 386c7771..183c531b 100644 --- a/src/easydiffraction/experiments/collections/linked_phases.py +++ b/src/easydiffraction/experiments/collections/linked_phases.py @@ -18,18 +18,24 @@ def category_key(self) -> str: def cif_category_key(self) -> str: return 'pd_phase_block' - def __init__(self, id: str, scale: float): + def __init__( + self, + id: str, + scale: float, + ): super().__init__() self.id = Descriptor( value=id, name='id', cif_name='id', + description='Identifier of the linked phase.', ) self.scale = Parameter( value=scale, name='scale', cif_name='scale', + description='Scale factor of the linked phase.', ) # Select which of the input parameters is used for the diff --git a/src/easydiffraction/sample_models/collections/atom_sites.py b/src/easydiffraction/sample_models/collections/atom_sites.py index 0ace4e82..c7ffc700 100644 --- a/src/easydiffraction/sample_models/collections/atom_sites.py +++ b/src/easydiffraction/sample_models/collections/atom_sites.py @@ -38,47 +38,56 @@ def __init__( value=label, name='label', cif_name='label', + description='Unique identifier for the atom site.', ) self.type_symbol = Descriptor( value=type_symbol, name='type_symbol', cif_name='type_symbol', + description='Chemical symbol of the atom at this site.', ) self.adp_type = Descriptor( value=adp_type, name='adp_type', cif_name='ADP_type', + description='Type of atomic displacement parameter (ADP) used (e.g., Biso, Uiso, Uani, Bani).', ) self.wyckoff_letter = Descriptor( value=wyckoff_letter, name='wyckoff_letter', cif_name='Wyckoff_letter', + description='Wyckoff letter indicating the symmetry of the atom site within the space group.', ) self.fract_x = Parameter( value=fract_x, name='fract_x', cif_name='fract_x', + description='Fractional x-coordinate of the atom site within the unit cell.', ) self.fract_y = Parameter( value=fract_y, name='fract_y', cif_name='fract_y', + description='Fractional y-coordinate of the atom site within the unit cell.', ) self.fract_z = Parameter( value=fract_z, name='fract_z', cif_name='fract_z', + description='Fractional z-coordinate of the atom site within the unit cell.', ) self.occupancy = Parameter( value=occupancy, name='occupancy', cif_name='occupancy', + description='Occupancy of the atom site, representing the fraction of the site occupied by the atom type.', ) self.b_iso = Parameter( value=b_iso, name='b_iso', units='Γ…Β²', cif_name='B_iso_or_equiv', + description='Isotropic atomic displacement parameter (ADP) for the atom site.', ) # Select which of the input parameters is used for the # as ID for the whole object diff --git a/src/easydiffraction/sample_models/components/cell.py b/src/easydiffraction/sample_models/components/cell.py index ffc6d187..cca64478 100644 --- a/src/easydiffraction/sample_models/components/cell.py +++ b/src/easydiffraction/sample_models/components/cell.py @@ -34,36 +34,42 @@ def __init__( name='length_a', cif_name='length_a', units='Γ…', + description='Length of the unit cell edge a.', ) self.length_b = Parameter( value=length_b, name='length_b', cif_name='length_b', units='Γ…', + description='Length of the unit cell edge b.', ) self.length_c = Parameter( value=length_c, name='length_c', cif_name='length_c', units='Γ…', + description='Length of the unit cell edge c.', ) self.angle_alpha = Parameter( value=angle_alpha, name='angle_alpha', cif_name='angle_alpha', units='deg', + description='Angle between edges b and c.', ) self.angle_beta = Parameter( value=angle_beta, name='angle_beta', cif_name='angle_beta', units='deg', + description='Angle between edges a and c.', ) self.angle_gamma = Parameter( value=angle_gamma, name='angle_gamma', cif_name='angle_gamma', units='deg', + description='Angle between edges a and b.', ) # Lock further attribute additions to prevent diff --git a/src/easydiffraction/sample_models/components/space_group.py b/src/easydiffraction/sample_models/components/space_group.py index 89e779df..0ce27922 100644 --- a/src/easydiffraction/sample_models/components/space_group.py +++ b/src/easydiffraction/sample_models/components/space_group.py @@ -31,11 +31,13 @@ def __init__( value=name_h_m, name='name_h_m', cif_name='name_H-M_alt', + description='Hermann-Mauguin symbol of the space group.', ) self.it_coordinate_system_code = Descriptor( value=it_coordinate_system_code, name='it_coordinate_system_code', cif_name='IT_coordinate_system_code', + description='A qualifier identifying which setting in IT is used.', ) # Lock further attribute additions to prevent