From 06b7324c954b22ce65c6bcfcb440cdfcd90c2a00 Mon Sep 17 00:00:00 2001
From: Andrew Sazonov
Date: Thu, 5 Mar 2026 01:35:35 +0100
Subject: [PATCH 01/16] Update pixi lock
---
pixi.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pixi.lock b/pixi.lock
index 1a38c4ea..7ffe17ef 100644
--- a/pixi.lock
+++ b/pixi.lock
@@ -4091,7 +4091,7 @@ packages:
requires_python: '>=3.5'
- pypi: ./
name: easydynamics
- version: 0.1.1+devdirty20
+ version: 0.1.1+dev9
sha256: de299c914d4a865b9e2fdefa5e3947f37b1f26f73ff9087f7918ee417f3dd288
requires_dist:
- darkdetect
From 0b6cd7658c2127a6174d8d57fc6a00526365c7b4 Mon Sep 17 00:00:00 2001
From: Andrew Sazonov
Date: Thu, 5 Mar 2026 01:44:00 +0100
Subject: [PATCH 02/16] Apply new templates
---
.copier-answers.yml | 6 +-
.github/actions/publish-to-pypi/action.yml | 14 -
.github/actions/setup-pixi/action.yml | 2 +-
.github/configs/pages-deployment.json | 6 +
.github/configs/rulesets-develop.json | 37 ++
.github/configs/rulesets-gh-pages.json | 19 +
.github/configs/rulesets-master.json | 30 ++
.github/scripts/backmerge-conflict-issue.js | 69 +++
.github/workflows/backmerge.yml | 101 +++--
.github/workflows/cleanup.yml | 7 +-
.github/workflows/dashboard.yml | 3 +
.github/workflows/docs.yml | 10 +-
.github/workflows/issues-labels.yml | 42 ++
.../{quality.yml => lint-format.yml} | 31 +-
.../workflows/{labels.yml => pr-labels.yml} | 18 +-
.github/workflows/pypi-publish.yml | 4 +-
.github/workflows/pypi-test.yml | 3 +
.github/workflows/release-pr.yml | 24 +-
.github/workflows/security.yml | 103 +++--
.github/workflows/test-trigger.yml | 3 +
.github/workflows/test.yml | 3 +-
.github/workflows/tutorial-tests-trigger.yml | 3 +
.github/workflows/tutorial-tests.yml | 5 +-
.gitignore | 14 +-
CONTRIBUTING.md | 407 ++++++++++++++++++
README.md | 40 +-
docs/docs/assets/javascripts/mathjax.js | 27 ++
docs/docs/index.md | 2 +-
docs/docs/installation-and-setup/index.md | 37 +-
docs/docs/introduction/index.md | 33 +-
docs/mkdocs.yml | 12 +-
pixi.toml | 42 +-
pyproject.toml | 57 ++-
tools/update_github_labels.py | 367 ++++++++++------
tools/update_spdx.py | 225 ++++++----
35 files changed, 1360 insertions(+), 446 deletions(-)
delete mode 100644 .github/actions/publish-to-pypi/action.yml
create mode 100644 .github/configs/pages-deployment.json
create mode 100644 .github/configs/rulesets-develop.json
create mode 100644 .github/configs/rulesets-gh-pages.json
create mode 100644 .github/configs/rulesets-master.json
create mode 100644 .github/scripts/backmerge-conflict-issue.js
create mode 100644 .github/workflows/issues-labels.yml
rename .github/workflows/{quality.yml => lint-format.yml} (84%)
rename .github/workflows/{labels.yml => pr-labels.yml} (71%)
create mode 100644 CONTRIBUTING.md
create mode 100644 docs/docs/assets/javascripts/mathjax.js
diff --git a/.copier-answers.yml b/.copier-answers.yml
index eeff466a..8e67fdfb 100644
--- a/.copier-answers.yml
+++ b/.copier-answers.yml
@@ -1,12 +1,14 @@
# WARNING: Do not edit this file manually.
# Any changes will be overwritten by Copier.
-_commit: v0.4.2
+_commit: v0.8.0-7-ge6d283b
_src_path: gh:easyscience/templates
app_docs_url: https://easyscience.github.io/dynamics-app
app_doi: 10.5281/zenodo.18163581
app_package_name: easydynamics_app
app_python: '3.12'
app_repo_name: dynamics-app
+home_page_url: https://easyscience.github.io/dynamics
+home_repo_name: dynamics
lib_docs_url: https://easyscience.github.io/dynamics-lib
lib_doi: 10.5281/zenodo.18163581
lib_package_name: easydynamics
@@ -16,9 +18,7 @@ lib_repo_name: dynamics-lib
project_contact_email: henrik.jacobsen@ess.eu
project_copyright_years: 2025-2026
project_extended_description: For plotting and fitting QENS and INS powder data
-project_homepage_url: https://easyscience.github.io/dynamics
project_name: EasyDynamics
-project_repo_name: dynamics
project_short_description: QENS data analysis
project_shortcut: EQ
project_type: both
diff --git a/.github/actions/publish-to-pypi/action.yml b/.github/actions/publish-to-pypi/action.yml
deleted file mode 100644
index 719928d9..00000000
--- a/.github/actions/publish-to-pypi/action.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-name: 'Publish to PyPI'
-description: 'Publish dist/ to PyPI via Trusted Publishing (OIDC)'
-inputs:
- packages_dir:
- description: 'Directory containing the built packages to upload'
- required: false
- default: 'dist'
-
-runs:
- using: 'composite'
- steps:
- - uses: pypa/gh-action-pypi-publish@release/v1
- with:
- packages-dir: ${{ inputs.packages_dir }}
diff --git a/.github/actions/setup-pixi/action.yml b/.github/actions/setup-pixi/action.yml
index eb891e1f..167ee623 100644
--- a/.github/actions/setup-pixi/action.yml
+++ b/.github/actions/setup-pixi/action.yml
@@ -33,7 +33,7 @@ inputs:
runs:
using: 'composite'
steps:
- - uses: prefix-dev/setup-pixi@v0.9.3
+ - uses: prefix-dev/setup-pixi@v0.9.4
with:
environments: ${{ inputs.environments }}
activate-environment: ${{ inputs.activate-environment }}
diff --git a/.github/configs/pages-deployment.json b/.github/configs/pages-deployment.json
new file mode 100644
index 00000000..c0d3fbee
--- /dev/null
+++ b/.github/configs/pages-deployment.json
@@ -0,0 +1,6 @@
+{
+ "source": {
+ "branch": "gh-pages",
+ "path": "/"
+ }
+}
diff --git a/.github/configs/rulesets-develop.json b/.github/configs/rulesets-develop.json
new file mode 100644
index 00000000..04489e52
--- /dev/null
+++ b/.github/configs/rulesets-develop.json
@@ -0,0 +1,37 @@
+{
+ "name": "develop branch",
+ "target": "branch",
+ "enforcement": "active",
+ "conditions": {
+ "ref_name": {
+ "include": ["refs/heads/develop"],
+ "exclude": []
+ }
+ },
+ "bypass_actors": [
+ {
+ "actor_id": 2476259,
+ "actor_type": "Integration",
+ "bypass_mode": "always"
+ }
+ ],
+ "rules": [
+ {
+ "type": "non_fast_forward"
+ },
+ {
+ "type": "deletion"
+ },
+ {
+ "type": "pull_request",
+ "parameters": {
+ "allowed_merge_methods": ["squash"],
+ "dismiss_stale_reviews_on_push": false,
+ "require_code_owner_review": false,
+ "require_last_push_approval": false,
+ "required_approving_review_count": 0,
+ "required_review_thread_resolution": false
+ }
+ }
+ ]
+}
diff --git a/.github/configs/rulesets-gh-pages.json b/.github/configs/rulesets-gh-pages.json
new file mode 100644
index 00000000..ebf38928
--- /dev/null
+++ b/.github/configs/rulesets-gh-pages.json
@@ -0,0 +1,19 @@
+{
+ "name": "gh-pages branch",
+ "target": "branch",
+ "enforcement": "active",
+ "conditions": {
+ "ref_name": {
+ "include": ["refs/heads/gh-pages"],
+ "exclude": []
+ }
+ },
+ "rules": [
+ {
+ "type": "non_fast_forward"
+ },
+ {
+ "type": "deletion"
+ }
+ ]
+}
diff --git a/.github/configs/rulesets-master.json b/.github/configs/rulesets-master.json
new file mode 100644
index 00000000..f658a5c6
--- /dev/null
+++ b/.github/configs/rulesets-master.json
@@ -0,0 +1,30 @@
+{
+ "name": "master branch",
+ "target": "branch",
+ "enforcement": "active",
+ "conditions": {
+ "ref_name": {
+ "include": ["~DEFAULT_BRANCH"],
+ "exclude": []
+ }
+ },
+ "rules": [
+ {
+ "type": "non_fast_forward"
+ },
+ {
+ "type": "deletion"
+ },
+ {
+ "type": "pull_request",
+ "parameters": {
+ "allowed_merge_methods": ["merge"],
+ "dismiss_stale_reviews_on_push": false,
+ "require_code_owner_review": false,
+ "require_last_push_approval": false,
+ "required_approving_review_count": 0,
+ "required_review_thread_resolution": false
+ }
+ }
+ ]
+}
diff --git a/.github/scripts/backmerge-conflict-issue.js b/.github/scripts/backmerge-conflict-issue.js
new file mode 100644
index 00000000..f6bd98b5
--- /dev/null
+++ b/.github/scripts/backmerge-conflict-issue.js
@@ -0,0 +1,69 @@
+module.exports = async ({ github, context, core }) => {
+ // Repo context
+ const owner = context.repo.owner
+ const repo = context.repo.repo
+
+ // Link to the exact workflow run that detected the conflict
+ const runUrl = `${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}`
+
+ // We use a *stable title* so we can find/reuse the same "conflict tracker" issue
+ // instead of creating a new issue on every failed run.
+ const title = 'Backmerge conflict: master β develop'
+
+ // Comment/issue body includes the run URL so maintainers can jump straight to logs.
+ const body = [
+ 'Automatic backmerge failed due to merge conflicts.',
+ '',
+ `Workflow run: ${runUrl}`,
+ '',
+ 'Manual resolution required.',
+ ].join('\n')
+
+ // Label applied to the tracker issue (assumed to already exist in the repo).
+ const label = '[bot] backmerge'
+
+ // Search issues by title across *open and closed* issues.
+ // Why: if the conflict was resolved previously and the issue was closed,
+ // we prefer to reopen it and append a new comment instead of creating duplicates.
+ const q = `repo:${owner}/${repo} is:issue in:title "${title}"`
+ const search = await github.rest.search.issuesAndPullRequests({
+ q,
+ per_page: 10,
+ })
+
+ // Pick the first exact-title match (search can return partial matches).
+ const existing = search.data.items.find((i) => i.title === title)
+
+ if (existing) {
+ // If a tracker issue exists, reuse it:
+ // - reopen it if needed
+ // - add a comment with the new run URL
+ if (existing.state === 'closed') {
+ await github.rest.issues.update({
+ owner,
+ repo,
+ issue_number: existing.number,
+ state: 'open',
+ })
+ }
+
+ await github.rest.issues.createComment({
+ owner,
+ repo,
+ issue_number: existing.number,
+ body,
+ })
+
+ core.notice(`Conflict issue updated: #${existing.number}`)
+ return
+ }
+
+ // No tracker issue exists yet -> create the first one.
+ await github.rest.issues.create({
+ owner,
+ repo,
+ title,
+ body,
+ labels: [label],
+ })
+}
diff --git a/.github/workflows/backmerge.yml b/.github/workflows/backmerge.yml
index abe0ef02..47b3384a 100644
--- a/.github/workflows/backmerge.yml
+++ b/.github/workflows/backmerge.yml
@@ -1,34 +1,29 @@
# This workflow automatically merges `master` into `develop` whenever a
-# new version tag is pushed (v*).
-#
-# Key points:
-# - Directly merges master into develop without creating a PR.
-# - Skips CI on the merge commit using [skip ci] in the commit message.
-# - The code being merged has already been tested as part of the release process.
-# - This ensures develop stays up-to-date with release changes (version bumps, etc.).
-#
-# Required organization config:
-# https://github.com/organizations/easyscience/settings/secrets/actions
-# https://github.com/organizations/easyscience/settings/variables/actions
-# - Actions secret: EASYSCIENCE_APP_KEY (GitHub App private key PEM)
-# - Actions variable: EASYSCIENCE_APP_ID (GitHub App ID)
-#
-# IMPORTANT:
-# The GitHub App must be added to the develop branch ruleset bypass list.
-
-name: Backmerge (master -> develop)
+# new version release with a tag is published. It can also be triggered
+# manually via workflow_dispatch for cases where an automatic backmerge
+# is needed outside of the standard release process.
+# If a merge conflict occurs, the workflow creates an issue to notify
+# maintainers for manual resolution.
+
+name: Backmerge (master β develop)
on:
- push:
- tags: ['v*']
+ release:
+ types: [published, prereleased]
workflow_dispatch:
permissions:
contents: write
+ issues: write
+
+concurrency:
+ group: backmerge-master-into-develop
+ cancel-in-progress: false
jobs:
backmerge:
runs-on: ubuntu-latest
+ timeout-minutes: 10
steps:
- name: Checkout repository (for local actions)
@@ -53,34 +48,62 @@ jobs:
git config user.name "easyscience[bot]"
git config user.email "${{ vars.EASYSCIENCE_APP_ID }}+easyscience[bot]@users.noreply.github.com"
- - name: Merge master into develop
+ - name: Set merge message
run: |
- set -euo pipefail
+ if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
+ MESSAGE="Backmerge: master into develop (manual) [skip ci]"
+ else
+ TAG="${{ github.event.release.tag_name }}"
+ MESSAGE="Backmerge: master (${TAG}) into develop [skip ci]"
+ fi
- echo "Fetching develop branch"
- git fetch origin develop:develop
+ echo "MESSAGE=$MESSAGE" >> "$GITHUB_ENV"
+ echo "message=$MESSAGE" >> "$GITHUB_OUTPUT"
+ echo "π Merge message: $MESSAGE" | tee -a "$GITHUB_STEP_SUMMARY"
- echo "Switching to develop branch"
- git checkout develop
+ - name: Prepare branches
+ run: |
+ git fetch origin master develop
+ git checkout -B develop origin/develop
- echo "Checking if already up-to-date"
+ - name: Check if develop is already up-to-date
+ id: up_to_date
+ run: |
if git merge-base --is-ancestor origin/master develop; then
- echo "βΉοΈ Develop is already up-to-date with master"
- exit 0
+ echo "value=true" >> "$GITHUB_OUTPUT"
+ echo "βΉοΈ Develop is already up-to-date with master" | tee -a "$GITHUB_STEP_SUMMARY"
+ else
+ echo "value=false" >> "$GITHUB_OUTPUT"
fi
- echo "Preparing merge message"
- if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
- MESSAGE="Backmerge: master into develop (manual) [skip ci]"
- else
- TAG="${{ github.ref_name }}"
- MESSAGE="Backmerge: ${TAG} from master into develop [skip ci]"
+ - name: Try merge master into develop
+ id: merge
+ if: steps.up_to_date.outputs.value == 'false'
+ continue-on-error: true
+ run: |
+ if ! git merge origin/master --no-ff -m "${MESSAGE}"; then
+ echo "conflict=true" >> "$GITHUB_OUTPUT"
+ echo "β Backmerge conflict detected." | tee -a "$GITHUB_STEP_SUMMARY"
+ git status --porcelain || true
+ exit 0
fi
- echo "Merging master into develop"
- git merge origin/master --no-ff -m "${MESSAGE}"
+ echo "conflict=false" >> "$GITHUB_OUTPUT"
+ echo "β
Merge commit created." | tee -a "$GITHUB_STEP_SUMMARY"
- echo "Pushing to develop"
+ - name: Push to develop (if merge succeeded)
+ if:
+ steps.up_to_date.outputs.value == 'false' && steps.merge.outputs.conflict ==
+ 'false'
+ run: |
git push origin develop
+ echo "π Backmerge successful: master β develop" | tee -a "$GITHUB_STEP_SUMMARY"
- echo "β
Successfully merged master into develop"
+ - name: Create issue (if merge failed with conflicts)
+ if: steps.merge.outputs.conflict == 'true'
+ uses: ./.github/actions/github-script
+ with:
+ github-token: ${{ steps.bot.outputs.token }}
+ script: |
+ const run = require('./.github/scripts/backmerge-conflict-issue.js')
+ await run({ github, context, core })
diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml
index 7d9d11e3..7305679b 100644
--- a/.github/workflows/cleanup.yml
+++ b/.github/workflows/cleanup.yml
@@ -53,8 +53,13 @@ on:
- skipped
- success
dry_run:
- description: 'Only log actions, do not perform any delete operations.'
+ description: 'Only log actions, do not perform any delete operations (dry run).'
required: false
+ default: 'false'
+ type: choice
+ options:
+ - 'false'
+ - 'true'
jobs:
del-runs:
diff --git a/.github/workflows/dashboard.yml b/.github/workflows/dashboard.yml
index f0178085..df89dfb7 100644
--- a/.github/workflows/dashboard.yml
+++ b/.github/workflows/dashboard.yml
@@ -4,6 +4,9 @@ on:
workflow_dispatch:
workflow_call:
+permissions:
+ contents: read
+
# Set the environment variables to be used in all jobs defined in this workflow
env:
CI_BRANCH: ${{ github.head_ref || github.ref_name }}
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 4056c1c0..52ccd8e2 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -14,16 +14,16 @@
name: Docs build and deployment
on:
- # Trigger the workflow on pull request
- pull_request:
- # Selected branches
- branches: [master, main, develop]
# Trigger the workflow on push
push:
# Selected branches
- branches: [master, main, develop]
+ branches: [develop] # master and main are already verified in PR
# Runs on creating a new tag starting with 'v', e.g. 'v1.0.3'
tags: ['v*']
+ # Trigger the workflow on pull request
+ pull_request:
+ # Selected branches
+ branches: [master, main, develop]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
diff --git a/.github/workflows/issues-labels.yml b/.github/workflows/issues-labels.yml
new file mode 100644
index 00000000..3a60cdd7
--- /dev/null
+++ b/.github/workflows/issues-labels.yml
@@ -0,0 +1,42 @@
+# Verifies if an issue has at least one of the `[scope]` and one of the
+# `[priority]` labels. If not, the bot adds labels with a warning emoji
+# to indicate that those labels need to be added.
+
+name: Issue labels check
+
+on:
+ issues:
+ types: [opened, labeled, unlabeled]
+
+permissions:
+ issues: write
+
+jobs:
+ check-labels:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Setup easyscience[bot]
+ id: bot
+ uses: ./.github/actions/setup-easyscience-bot
+ with:
+ app-id: ${{ vars.EASYSCIENCE_APP_ID }}
+ private-key: ${{ secrets.EASYSCIENCE_APP_KEY }}
+
+ - name: Check for required [scope] label
+ uses: trstringer/require-label-prefix@v1
+ with:
+ secret: ${{ steps.bot.outputs.token }}
+ prefix: '[scope]'
+ labelSeparator: ' '
+ addLabel: true
+ defaultLabel: '[scope] β οΈ label needed'
+
+ - name: Check for required [priority] label
+ uses: trstringer/require-label-prefix@v1
+ with:
+ secret: ${{ steps.bot.outputs.token }}
+ prefix: '[priority]'
+ labelSeparator: ' '
+ addLabel: true
+ defaultLabel: '[priority] β οΈ label needed'
diff --git a/.github/workflows/quality.yml b/.github/workflows/lint-format.yml
similarity index 84%
rename from .github/workflows/quality.yml
rename to .github/workflows/lint-format.yml
index 201dace4..6164b032 100644
--- a/.github/workflows/quality.yml
+++ b/.github/workflows/lint-format.yml
@@ -1,17 +1,16 @@
-# The workflow is divided into several steps to ensure code quality:
-# - Check the validity of pyproject.toml
-# - Check code linting
-# - Check code formatting
-# - Check formatting of docstrings in the code
-# - Check formatting of Markdown, YAML, TOML, etc. files
+# The workflow is divided into several steps:
+# - Check the validity of pyproject.toml
+# - Check code linting
+# - Check code formatting
+# - Check formatting of docstrings in the code
+# - Check formatting of Markdown, YAML, TOML, etc. files
-name: Code quality checks
+name: Lint and format checks
on:
# Trigger the workflow on push
push:
- # Every branch
- branches: ['**']
+ branches-ignore: [master, main] # Already verified in PR
# Do not run this workflow on creating a new tag starting with
# 'v', e.g. 'v1.0.3' (see publish-pypi.yml)
tags-ignore: ['v*']
@@ -26,12 +25,15 @@ concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
+permissions:
+ contents: read
+
# Set the environment variables to be used in all jobs defined in this workflow
env:
CI_BRANCH: ${{ github.head_ref || github.ref_name }}
jobs:
- code-quality:
+ lint-format:
runs-on: ubuntu-latest
steps:
@@ -79,14 +81,13 @@ jobs:
continue-on-error: true
shell: bash
run: pixi run nonpy-format-check
+
# Check formatting of Jupyter Notebooks in the tutorials folder
- name: Prepare notebooks and check formatting
id: check_notebooks_formatting
continue-on-error: true
shell: bash
- run: |
- pixi run notebook-prepare
- pixi run notebook-format-check
+ run: pixi run notebook-format-check
# Add summary
- name: Add quality checks summary
@@ -94,7 +95,7 @@ jobs:
shell: bash
run: |
{
- echo "## π§ͺ Code Quality Checks Summary"
+ echo "## π§ͺ Checks Summary"
echo ""
echo "| Check | Status |"
echo "|-------|--------|"
@@ -103,6 +104,7 @@ jobs:
echo "| py format | ${{ steps.check_code_formatting.outcome == 'success' && 'β
' || 'β' }} |"
echo "| docstring format | ${{ steps.check_docs_formatting.outcome == 'success' && 'β
' || 'β' }} |"
echo "| nonpy format | ${{ steps.check_others_formatting.outcome == 'success' && 'β
' || 'β' }} |"
+ echo "| notebooks format | ${{ steps.check_notebooks_formatting.outcome == 'success' && 'β
' || 'β' }} |"
} >> "$GITHUB_STEP_SUMMARY"
# Fail job if any check failed
@@ -113,5 +115,6 @@ jobs:
|| steps.check_code_formatting.outcome == 'failure'
|| steps.check_docs_formatting.outcome == 'failure'
|| steps.check_others_formatting.outcome == 'failure'
+ || steps.check_notebooks_formatting.outcome == 'failure'
shell: bash
run: exit 1
diff --git a/.github/workflows/labels.yml b/.github/workflows/pr-labels.yml
similarity index 71%
rename from .github/workflows/labels.yml
rename to .github/workflows/pr-labels.yml
index 4ea4e2fa..642cd318 100644
--- a/.github/workflows/labels.yml
+++ b/.github/workflows/pr-labels.yml
@@ -1,7 +1,16 @@
# Verifies if a pull request has at least one label from a set of valid
# labels before it can be merged.
+#
+# NOTE:
+# This workflow may be triggered twice in quick succession when a PR is
+# created:
+# 1) `opened` β when the pull request is initially created
+# 2) `labeled` β if labels are added immediately after creation
+# (e.g. by manual labeling, another workflow, or GitHub App).
+#
+# These are separate GitHub events, so two workflow runs can be started.
-name: PR label checks
+name: PR labels check
on:
pull_request_target:
@@ -11,16 +20,17 @@ permissions:
pull-requests: read
jobs:
- require-label:
+ check-labels:
runs-on: ubuntu-latest
+
steps:
- - name: Validate required labels
+ - name: Check for valid labels
run: |
PR_LABELS=$(echo '${{ toJson(github.event.pull_request.labels.*.name) }}' | jq -r '.[]')
echo "Current PR labels: $PR_LABELS"
VALID_LABELS=(
- "[bot] pull request"
+ "[bot] release"
"[scope] bug"
"[scope] documentation"
"[scope] enhancement"
diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/pypi-publish.yml
index 6e48e610..4839c4d1 100644
--- a/.github/workflows/pypi-publish.yml
+++ b/.github/workflows/pypi-publish.yml
@@ -41,4 +41,6 @@ jobs:
# Repository name: dynamics-lib
# Workflow name: pypi-publish.yml
- name: Publish to PyPI
- uses: ./.github/actions/publish-to-pypi
+ uses: pypa/gh-action-pypi-publish@release/v1
+ with:
+ packages-dir: 'dist'
diff --git a/.github/workflows/pypi-test.yml b/.github/workflows/pypi-test.yml
index 52e7f55a..117d24d6 100644
--- a/.github/workflows/pypi-test.yml
+++ b/.github/workflows/pypi-test.yml
@@ -13,6 +13,9 @@ concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
+permissions:
+ contents: read
+
# Set the environment variables to be used in all jobs defined in this workflow
env:
CI_BRANCH: ${{ github.head_ref || github.ref_name }}
diff --git a/.github/workflows/release-pr.yml b/.github/workflows/release-pr.yml
index e4b6a7e4..7e6fda49 100644
--- a/.github/workflows/release-pr.yml
+++ b/.github/workflows/release-pr.yml
@@ -1,21 +1,14 @@
-# This workflow creates an automated release PR from `develop` into `master`.
+# This workflow creates an automated release PR from a source branch into the default branch.
#
# Usage:
# - Triggered manually via workflow_dispatch.
-# - Creates a PR titled "Release: merge develop into master".
-# - Adds the label "[maintainer] auto-pull-request" so it is excluded from changelogs.
+# - Creates a PR titled "Release: merge into ".
+# - Adds the label "[bot] release" so it is excluded from changelogs.
# - The PR body makes clear that this is automation only (no review needed).
-#
-# Required repo config:
-# https://github.com/organizations/easyscience/settings/secrets/actions
-# https://github.com/organizations/easyscience/settings/variables/actions
-# - Actions secret: EASYSCIENCE_APP_KEY (GitHub App private key PEM)
-# - Actions variable: EASYSCIENCE_APP_ID (GitHub App ID)
-name: Release PR (develop/feature -> master)
+name: 'Release PR (develop β master)'
on:
- # Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
inputs:
source_branch:
@@ -28,7 +21,6 @@ permissions:
contents: read
pull-requests: write
-# Set the environment variables to be used in all jobs defined in this workflow
env:
DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
SOURCE_BRANCH: ${{ inputs.source_branch || 'develop' }}
@@ -50,14 +42,14 @@ jobs:
private-key: ${{ secrets.EASYSCIENCE_APP_KEY }}
- name: Create PR from ${{ env.SOURCE_BRANCH }} to ${{ env.DEFAULT_BRANCH }}
+ env:
+ GH_TOKEN: ${{ steps.bot.outputs.token }}
run: |
gh pr create \
--base ${{ env.DEFAULT_BRANCH }} \
--head ${{ env.SOURCE_BRANCH }} \
--title "Release: merge ${{ env.SOURCE_BRANCH }} into ${{ env.DEFAULT_BRANCH }}" \
- --label "[bot] pull request" \
+ --label "[bot] release" \
--body "This PR is created automatically to trigger the release pipeline. It merges the accumulated changes from \`${{ env.SOURCE_BRANCH }}\` into \`${{ env.DEFAULT_BRANCH }}\`.
- β οΈ It is labeled \`[bot] pull request\` and is excluded from release notes and version bump logic."
- env:
- GH_TOKEN: ${{ steps.bot.outputs.token }}
+ β οΈ It is labeled \`[bot] release\` and is excluded from release notes and version bump logic."
diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml
index 4bbb91fc..9b34cccf 100644
--- a/.github/workflows/security.yml
+++ b/.github/workflows/security.yml
@@ -1,40 +1,93 @@
-# Integrates a collection of open source static analysis tools with
-# GitHub code scanning.
-# https://github.com/github/ossar-action
+# Code scanning (CodeQL) for vulnerabilities and insecure coding patterns.
+#
+# What this workflow does
+# - Runs GitHub CodeQL analysis and uploads results to your repository's Security tab.
+# - Triggers on PRs (so findings appear as PR checks) and on pushes to `develop`.
+# - Runs on a weekly schedule.
+#
+# Where to find results on GitHub
+# - Repository β Security β Code scanning alerts
+# (You can filter by tool = CodeQL and by branch.)
+#
+# Where to configure on GitHub
+# - Repository β Settings β Advanced Security
+# Enable "GitHub Advanced Security" (if available) and configure CodeQL there.
+# - Repository β Security β Code scanning alerts
+# This page shows findings produced by this workflow.
+#
+# Notes about the scheduled run
+# - Scheduled workflows are triggered from the repository's *default branch*.
+# If your default branch is `master` but you want the scheduled scan to analyze
+# `develop`, this workflow checks out `develop` explicitly for scheduled runs.
+#
+# References
+# - CodeQL Action: https://github.com/github/codeql-action
+# - Advanced setup docs: https://docs.github.com/en/code-security/code-scanning
-name: Security scans
+name: Security scans with CodeQL
on:
- # Trigger the workflow on pull request
+ # Run on pull requests so results show up as PR checks and code
+ # scanning alerts.
pull_request:
+ branches: [master, main, develop]
- # Allows you to run this workflow manually from the Actions tab
- workflow_dispatch:
+ # Run on pushes (e.g., after merging PRs).
+ push:
+ branches: [master, main, develop]
+
+ # Run weekly. (Cron is in UTC.)
+ schedule:
+ - cron: '0 3 * * 1'
+
+permissions:
+ contents: read
+ security-events: write
jobs:
- scan-security-ossar:
- # OSSAR runs on windows-latest.
- # ubuntu-latest and macos-latest support coming soon
- runs-on: windows-latest
+ codeql:
+ name: Code scanning
+ runs-on: ubuntu-latest
+
+ strategy:
+ fail-fast: false
+ matrix:
+ # Keep this list tight to avoid noise and speed up runs.
+ language: [python, actions]
steps:
+ # Scheduled workflows run from the default branch.
+ # We explicitly analyze `develop` on the schedule to keep the scan
+ # focused on the active dev branch.
+ - name: Checkout repository (scheduled β develop)
+ if: ${{ github.event_name == 'schedule' }}
+ uses: actions/checkout@v5
+ with:
+ ref: develop
+
- name: Checkout repository
+ if: ${{ github.event_name != 'schedule' }}
uses: actions/checkout@v5
+
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v4
with:
- # We must fetch at least the immediate parents so that if this is
- # a pull request then we can checkout the head.
- fetch-depth: 2
+ languages: ${{ matrix.language }}
- # If this run was triggered by a pull request event, then checkout
- # the head of the pull request instead of the merge commit.
- - run: git checkout HEAD^2
- if: ${{ github.event_name == 'pull_request' }}
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v4
- - name: Run open source static analysis tools
- uses: github/ossar-action@main
- id: ossar
+ print-link:
+ name: Print results link
+ runs-on: ubuntu-latest
- - name: Upload results to Security tab
- uses: github/codeql-action/upload-sarif@v3
- with:
- sarif_file: ${{ steps.ossar.outputs.sarifFile }}
+ needs: codeql
+ permissions: {} # no special perms needed just to print links
+
+ steps:
+ - name: Add Code Scanning link to job summary
+ run: |
+ echo "## π CodeQL Results" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo "View Code Scanning alerts here:" >> $GITHUB_STEP_SUMMARY
+ echo "${{ github.server_url }}/${{ github.repository }}/security/code-scanning" >> $GITHUB_STEP_SUMMARY
diff --git a/.github/workflows/test-trigger.yml b/.github/workflows/test-trigger.yml
index a68e1faa..ecf6b40c 100644
--- a/.github/workflows/test-trigger.yml
+++ b/.github/workflows/test-trigger.yml
@@ -7,6 +7,9 @@ on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
+permissions:
+ contents: read
+
jobs:
code-tests-trigger:
runs-on: ubuntu-latest
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 6af99cb6..3d23363d 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -20,8 +20,7 @@ name: Code and package tests
on:
# Trigger the workflow on push
push:
- # Every branch
- branches: ['**']
+ branches-ignore: [master, main] # Already verified in PR
# But do not run this workflow on creating a new tag starting with
# 'v', e.g. 'v1.0.3' (see publish-pypi.yml)
tags-ignore: ['v*']
diff --git a/.github/workflows/tutorial-tests-trigger.yml b/.github/workflows/tutorial-tests-trigger.yml
index 4cbb8bb3..1bc27f4f 100644
--- a/.github/workflows/tutorial-tests-trigger.yml
+++ b/.github/workflows/tutorial-tests-trigger.yml
@@ -7,6 +7,9 @@ on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
+permissions:
+ contents: read
+
jobs:
tutorial-tests-trigger:
runs-on: ubuntu-latest
diff --git a/.github/workflows/tutorial-tests.yml b/.github/workflows/tutorial-tests.yml
index 55998847..4c9244d0 100644
--- a/.github/workflows/tutorial-tests.yml
+++ b/.github/workflows/tutorial-tests.yml
@@ -4,7 +4,7 @@ on:
# Trigger the workflow on push
push:
# Selected branches
- branches: [master, main, develop]
+ branches: [develop] # master and main are already verified in PR
# Trigger the workflow on pull request
pull_request:
branches: ['**']
@@ -15,6 +15,9 @@ on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
+permissions:
+ contents: read
+
# Allow only one concurrent workflow, skipping runs queued between the run
# in-progress and latest queued. And cancel in-progress runs.
concurrency:
diff --git a/.gitignore b/.gitignore
index f7ce4ac2..0500ede3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,10 @@
__pycache__/
.venv/
.coverage
+.pyc
+
+# Pixi
+.pixi/
# PyInstaller
dist/
@@ -19,16 +23,10 @@ node_modules/
# QtCreator
*.autosave
-
-# QtCreator Qml
*.qmlproject.user
*.qmlproject.user.*
-
-# QtCreator Python
*.pyproject.user
*.pyproject.user.*
-
-# QtCreator CMake
CMakeLists.txt.user*
# PyCharm
@@ -41,3 +39,7 @@ CMakeLists.txt.user*
.DS_Store
*.app
*.dmg
+
+# Misc
+*.log
+*.zip
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..0d54aaff
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,407 @@
+# Contributing to EasyDynamics
+
+Thank you for your interest in contributing to **EasyDynamics**!
+
+This guide explains how to:
+
+- Report issues
+- Contribute code
+- Improve documentation
+- Suggest enhancements
+- Interact with the EasyScience community
+
+Whether you are an experienced developer or contributing for the first
+time, this document walks you through the entire process step by step.
+
+Please make sure you follow the EasyScience organization-wide
+[Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md).
+
+---
+
+## Table of Contents
+
+- [How to Interact With This Project](#how-to-interact-with-this-project)
+- [1. Understanding the Development Model](#1-understanding-the-development-model)
+- [2. Getting the Code](#2-getting-the-code)
+- [3. Setting Up the Development Environment](#3-setting-up-the-development-environment)
+- [4. Creating a Branch](#4-creating-a-branch)
+- [5. Implementing Your Changes](#5-implementing-your-changes)
+- [6. Code Quality Checks](#6-code-quality-checks)
+- [7. Opening a Pull Request](#7-opening-a-pull-request)
+- [8. Continuous Integration (CI)](#8-continuous-integration-ci)
+- [9. Code Review](#9-code-review)
+- [10. Documentation Contributions](#10-documentation-contributions)
+- [11. Reporting Issues](#11-reporting-issues)
+- [12. Security Issues](#12-security-issues)
+- [13. Releases](#13-releases)
+
+---
+
+## How to Interact With This Project
+
+If you are not planning to modify the code, you may want to:
+
+- π Report a bug β see [Reporting Issues](#11-reporting-issues)
+- π‘ Report a security issue β
+ see [Security Issues](#12-security-issues)
+- π¬ Ask a question or start a discussion at
+ [Project Discussions](https://github.com/easyscience/dynamics-lib/discussions)
+
+If you plan to contribute code or documentation, continue below.
+
+---
+
+## 1. Understanding the Development Model
+
+Before you start coding, it is important to understand how development
+works in this project.
+
+### Branching Strategy
+
+We use the following branches:
+
+- `master` β stable releases only
+- `develop` β active development branch
+- Short-lived branches β one branch per contribution
+
+All normal contributions must target the `develop` branch.
+
+This means:
+
+- Do **not** open Pull Requests against `master`
+- Always create your branch from `develop`
+- Always target `develop` when opening a Pull Request
+
+See ADR easyscience/.github#12 for full details on the branching
+strategy.
+
+---
+
+## 2. Getting the Code
+
+### 2.1. If You Are an External Contributor
+
+If you are not a core maintainer of this repository, follow these steps.
+
+1. Open the repository page: `https://github.com/easyscience/dynamics-lib`
+
+2. Click the **Fork** button (top-right corner). This creates your own
+ copy of the repository.
+
+3. Clone your fork locally:
+
+ ```bash
+ git clone https://github.com//dynamics-lib.git
+ cd dynamics-lib
+ ```
+
+4. Add the original repository as `upstream`:
+
+ ```bash
+ git remote add upstream https://github.com/easyscience/dynamics-lib.git
+ ```
+
+5. Switch to the `develop` branch and update it:
+
+ ```bash
+ git fetch upstream
+ git checkout develop
+ git pull upstream develop
+ ```
+
+If you have contributed before, make sure your local `develop` branch is
+up to date before starting new work. You can update it with:
+
+```bash
+git fetch upstream
+git pull upstream develop
+```
+
+This ensures you are working on the latest version of the project.
+
+### 2.2. If You Are a Core Team Member
+
+Core team members do not need to fork the repository. You can create a
+new branch directly from `develop`, but the rest of the workflow remains
+the same.
+
+---
+
+## 3. Setting Up the Development Environment
+
+You need:
+
+- Git
+- Pixi
+
+EasyScience projects use **Pixi** to manage the development environment.
+
+To install Pixi, follow the official instructions:
+https://pixi.prefix.dev/latest/installation/
+
+You do **not** need to manually install Python. Pixi automatically:
+
+- Creates the correct Python environment
+- Installs all required dependencies
+- Installs development tools (linters, formatters, test tools)
+
+Set up the environment:
+
+```bash
+pixi install
+pixi run post-install
+```
+
+After this step, your development environment is ready.
+
+See ADR easyscience/.github#63 for more details about this decision.
+
+---
+
+## 4. Creating a Branch
+
+Never work directly on `develop`.
+
+Create a new branch:
+
+```bash
+git checkout -b my-change
+```
+
+Use a clear and descriptive name, for example:
+
+- `improve-solver-speed`
+- `fix-boundary-condition`
+- `add-tutorial-example`
+
+Clear branch names make reviews and history easier to understand.
+
+---
+
+## 5. Implementing Your Changes
+
+While developing:
+
+- Make small, logical commits
+- Write clear and descriptive commit messages
+- Follow the Google docstring convention
+- Add or update unit tests if behavior changes
+
+Example:
+
+```bash
+git add .
+git commit -m "Improve performance of time integrator for large systems"
+```
+
+Run tests locally:
+
+```bash
+pixi run unit-tests
+```
+
+Running tests frequently is strongly recommended.
+
+---
+
+## 6. Code Quality Checks
+
+Before opening a Pull Request, always run:
+
+```bash
+pixi run check
+```
+
+This command runs:
+
+- Formatting checks
+- Linting
+- Docstring validation
+- Notebook checks
+- Unit tests
+- Other project validations
+
+A successful run should look like this:
+
+```bash
+pixi run pyproject-check...................................Passed
+pixi run py-lint-check.....................................Passed
+pixi run py-format-check...................................Passed
+pixi run nonpy-format-check................................Passed
+pixi run docs-format-check.................................Passed
+pixi run notebook-format-check.............................Passed
+pixi run unit-tests........................................Passed
+```
+
+If something fails, read the error message carefully and fix the issue.
+
+You can run individual checks, for example:
+
+```bash
+pixi run py-lint-check
+```
+
+Some formatting issues can be fixed automatically:
+
+```bash
+pixi run fix
+```
+
+If everything is correctly formatted, you will see:
+
+```text
+β
All code auto-formatting steps have been applied.
+```
+
+This indicates that the auto-formatting pipeline completed successfully.
+If you do not see this message and no error messages appear, try running
+the command again.
+
+If errors are reported, resolve them and re-run:
+
+```bash
+pixi run check
+```
+
+All checks must pass before your Pull Request can be merged.
+
+If you are unsure how to fix an issue, ask for help in your Pull Request
+discussion.
+
+---
+
+## 7. Opening a Pull Request
+
+Push your branch:
+
+```bash
+git push origin my-change
+```
+
+On GitHub:
+
+- Click **Compare & Pull Request**
+- Ensure the base branch is `develop`
+- Write a clear and concise title
+- Add a description explaining what changed and why
+- Add the required `[scope]` label
+
+### Pull Request Title
+
+The PR title appears in release notes and changelogs. It should be
+concise and informative.
+
+Good examples:
+
+- Improve performance of time integrator for large systems
+- Fix incorrect boundary condition handling in solver
+- Add adaptive step-size control to ODE solver
+- Add tutorial for custom model configuration
+- Refactor solver API for improved readability
+
+### Required `[scope]` Label
+
+Each Pull Request must include one `[scope]` label:
+
+| Label | Description |
+| ----------------------- | ----------------------------------------------------------------------- |
+| `[scope] bug` | Bug report or fix (major.minor.**PATCH**) |
+| `[scope] documentation` | Documentation-only changes (major.minor.patch.**POST**) |
+| `[scope] enhancement` | Adds or improves features (major.**MINOR**.patch) |
+| `[scope] maintenance` | Code/tooling cleanup without feature or bug fix (major.minor.**PATCH**) |
+| `[scope] significant` | Breaking or major changes (**MAJOR**.minor.patch) |
+
+See ADR easyscience/.github#33 for full versioning rules.
+
+---
+
+## 8. Continuous Integration (CI)
+
+After opening a Pull Request:
+
+- Automated checks run automatically
+- You will see green checkmarks or red crosses
+
+If checks fail:
+
+1. Open the failing check
+2. Read the logs
+3. Fix the issue locally
+4. Run `pixi run check`
+5. Push your changes
+
+The Pull Request updates automatically.
+
+---
+
+## 9. Code Review
+
+All Pull Requests are reviewed by at least one core team member.
+
+Code review is collaborative and aims to improve quality.
+
+Do not take comments personally β they are meant to help.
+
+To update your PR:
+
+```bash
+git add .
+git commit -m "Address review comments"
+git push
+```
+
+---
+
+## 10. Documentation Contributions
+
+If your change affects users, update the documentation.
+
+This may include:
+
+- API documentation
+- Examples
+- Tutorials
+- Jupyter notebooks
+
+Preview documentation locally:
+
+```bash
+pixi run docs-serve
+```
+
+Open the URL shown in the terminal to review your changes.
+
+---
+
+## 11. Reporting Issues
+
+If you find a bug but do not want to fix it:
+
+- Search existing issues first
+- Provide clear reproduction steps
+- Include logs and environment details
+
+Clear issue reports help maintainers significantly.
+
+---
+
+## 12. Security Issues
+
+Do **not** report security vulnerabilities publicly.
+
+If you discover a potential vulnerability, contact the maintainers
+privately.
+
+---
+
+## 13. Releases
+
+Releases are created by merging `develop` into `master`.
+
+Once your contribution is merged into `develop`, it will be included in
+the next stable release.
+
+---
+
+Thank you for contributing to EasyDynamics and the EasyScience
+ecosystem!
diff --git a/README.md b/README.md
index 373d3828..0ebd5fd5 100644
--- a/README.md
+++ b/README.md
@@ -9,34 +9,38 @@
-**EasyDynamics** is a scientific software for plotting and fitting QENS
-and INS powder data.
+**EasyDynamics** is for plotting and fitting QENS and INS powder data.
-**EasyDynamics** is available both as a Python library and as a
+
+**EasyDynamics** is developed both as a Python library and as a
cross-platform desktop application.
Here, we focus on the Python library. For the graphical user interface
(GUI), please see the corresponding
[GUI resources](https://github.com/easyscience/dynamics-app).
+
+
+
+
+License: [BSD 3-Clause](https://github.com/easyscience/dynamics-lib/blob/master/LICENSE)
+
## Useful Links
+### For Users
+
- π [Documentation](https://easyscience.github.io/dynamics-lib/latest)
-- π
- [Getting Started](https://easyscience.github.io/dynamics-lib/latest/introduction)
-- π§ͺ
- [Tutorials](https://easyscience.github.io/dynamics-lib/latest/tutorials)
-- π¬
- [Get in Touch](https://easyscience.github.io/dynamics-lib/latest/introduction/#get-in-touch)
-- π§Ύ
- [Citation](https://easyscience.github.io/dynamics-lib/latest/introduction/#citation)
-- π€
- [Contributing](https://easyscience.github.io/dynamics-lib/latest/introduction/#contributing)
-- π [Issue Tracker](https://github.com/easyscience/dynamics-lib/issues)
-- π‘
- [Discussions](https://github.com/easyscience/dynamics-lib/discussions)
+- π [Getting Started](https://easyscience.github.io/dynamics-lib/latest/introduction)
+- π§ͺ [Tutorials](https://easyscience.github.io/dynamics-lib/latest/tutorials)
+- π¬ [Get in Touch](https://easyscience.github.io/dynamics-lib/latest/introduction/#get-in-touch)
+- π§Ύ [Citation](https://easyscience.github.io/dynamics-lib/latest/introduction/#citation)
+
+### For Contributors
+
- π§βπ» [Source Code](https://github.com/easyscience/dynamics-lib)
-- βοΈ
- [License](https://raw.githubusercontent.com/easyscience/dynamics-lib/refs/heads/master/LICENSE)
+- π [Issue Tracker](https://github.com/easyscience/dynamics-lib/issues)
+- π‘ [Discussions](https://github.com/easyscience/dynamics-lib/discussions)
+- π€ [Contributing Guide](https://github.com/easyscience/dynamics-lib/blob/master/CONTRIBUTING.md)
+- π‘ [Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md)
diff --git a/docs/docs/assets/javascripts/mathjax.js b/docs/docs/assets/javascripts/mathjax.js
new file mode 100644
index 00000000..a92ce69a
--- /dev/null
+++ b/docs/docs/assets/javascripts/mathjax.js
@@ -0,0 +1,27 @@
+window.MathJax = {
+ tex: {
+ //inlineMath: [['\\(', '\\)']],
+ //displayMath: [['\\[', '\\]']],
+ // Add support for $...$ and \(...\) delimiters
+ inlineMath: [['$', '$'], ['\\(', '\\)']],
+ // Add support for $$...$$ and \[...]\ delimiters
+ displayMath: [['$$', '$$'], ['\\[', '\\]']],
+ processEscapes: true,
+ processEnvironments: true
+ },
+ options: {
+ //ignoreHtmlClass: ".*|",
+ //processHtmlClass: "arithmatex"
+ // Skip code blocks only
+ skipHtmlTags: ['script','noscript','style','textarea','pre','code'],
+ // Only ignore explicit opt-out
+ ignoreHtmlClass: 'no-mathjax|tex2jax_ignore',
+ }
+};
+
+document$.subscribe(() => {
+ MathJax.startup.output.clearCache()
+ MathJax.typesetClear()
+ MathJax.texReset()
+ MathJax.typesetPromise()
+})
diff --git a/docs/docs/index.md b/docs/docs/index.md
index 735b0e57..d683b5b9 100644
--- a/docs/docs/index.md
+++ b/docs/docs/index.md
@@ -1,6 +1,6 @@

-# QENS data analysis library
+# QENS data analysis
Here is a brief overview of the main documentation sections:
diff --git a/docs/docs/installation-and-setup/index.md b/docs/docs/installation-and-setup/index.md
index 420ef07e..e587c850 100644
--- a/docs/docs/installation-and-setup/index.md
+++ b/docs/docs/installation-and-setup/index.md
@@ -11,7 +11,7 @@ To install and set up EasyDynamics, we recommend using
[**Pixi**](https://pixi.prefix.dev), a modern package manager for
Windows, macOS, and Linux.
-!!! note "Main benefits of using Pixi"
+??? note "Main benefits of using Pixi"
- **Ease of use**: Pixi simplifies the installation process, making it
accessible even for users with limited experience in package management.
@@ -37,6 +37,26 @@ This section describes the simplest way to set up EasyDynamics using
#### Setting up EasyDynamics with Pixi
+
+
+- Choose a project location (local drive recommended).
+
+ ??? warning ":fontawesome-brands-windows: Windows + OneDrive"
+
+ We **do not recommend creating a Pixi project inside OneDrive or other
+ synced folders**.
+
+ By default, Pixi creates the virtual environment inside the project
+ directory (in `.pixi/`). On Windows, synced folders such as OneDrive
+ may cause fileβsystem issues (e.g., path-length limitations or
+ restricted link operations), which can lead to unexpected install
+ errors or environments being recreated.
+
+ Instead, create your project in a **local directory on your drive**
+ where you have full write permissions.
+
+
+
- Initialize a new Pixi project and navigate into it:
```txt
pixi init easydynamics
@@ -75,19 +95,8 @@ This section describes the simplest way to set up EasyDynamics using
## Classical Installation
This section describes how to install EasyDynamics using the traditional
-method with **pip**. This approach is more flexible and suitable for
-users familiar with Python package management and virtual environments.
-
-!!! warning
-
- Currently, classical installation doesn't allow installing the
- GNU Scientific Library (GSL) dependency automatically. As a result,
- the calculation engine **pdffit2** will not be available. To make it
- work, ensure that GSL is installed on your system.
-
- Alternatively, consider using the **Pixi installation method** described
- in the [Installing with Pixi](#installing-with-pixi) section, which
- handles GSL installation automatically.
+method with **pip**. It is assumed that you are familiar with Python package
+management and virtual environments.
### Environment Setup optional { #environment-setup data-toc-label="Environment Setup" }
diff --git a/docs/docs/introduction/index.md b/docs/docs/introduction/index.md
index 740d4b0d..2058e9a5 100644
--- a/docs/docs/introduction/index.md
+++ b/docs/docs/introduction/index.md
@@ -6,18 +6,24 @@ icon: material/information-slab-circle
## Description
-**EasyDynamics** is a scientific software for plotting and fitting QENS
-and INS powder data.
+**EasyDynamics** is for plotting and fitting QENS and INS powder data.
-**EasyDynamics** is available both as a Python library and as a
+
+**EasyDynamics** is developed both as a Python library and as a
cross-platform desktop application.
Here, we focus on the Python library. For the graphical user interface
(GUI), please see the corresponding
[GUI resources](https://easyscience.github.io/dynamics-app).
+
+
+
+
+
## License
@@ -47,22 +53,23 @@ BibTeX, JSON) are available on the
## Contributing
-We welcome contributions from the community! **EasyDynamics** is
-intended to be a community-driven, open-source project supported by a
-diverse group of contributors.
+We welcome contributions of any kind!
+
+**EasyDynamics** is intended to be a community-driven, open-source
+project supported by a diverse group of contributors.
The project is maintained by the
[European Spallation Source (ESS)](https://ess.eu).
-To contribute, see our
+If you would like to report a bug or request a new feature, please use
+the [GitHub Issue Tracker](https://github.com/easyscience/dynamics-lib/issues)
+(A free GitHub account is required.)
+
+To contribute code, documentation, or tests, please see our
[:material-account-plus: Contributing Guidelines](https://github.com/easyscience/dynamics-lib/blob/master/CONTRIBUTING.md)
-on GitHub.
+for detailed development instructions.
## Get in Touch
-For general questions or feedback, contact us at
+For general questions or feedback, please contact us at
[henrik.jacobsen@ess.eu](mailto:henrik.jacobsen@ess.eu).
-
-To report bugs or request features, please use the
-[GitHub Issue Tracker](https://github.com/easyscience/dynamics-lib/issues)
-(free registration required).
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
index b0b2fd61..c17c5579 100644
--- a/docs/mkdocs.yml
+++ b/docs/mkdocs.yml
@@ -21,7 +21,7 @@ theme:
- content.tooltips
- navigation.footer
- navigation.indexes
- - navigation.instant # Instant loading (SPA-like)
+ #- navigation.instant # Instant loading, but it causes issues with rendering equations
#- navigation.sections
- navigation.top # Back-to-top button
- navigation.tracking # Anchor tracking
@@ -84,10 +84,12 @@ extra:
# Customization to be included by the theme
extra_css:
- assets/stylesheets/extra.css
+
extra_javascript:
- assets/javascripts/extra.js
- - javascripts/mathjax.js
- - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js
+ # MathJax for rendering mathematical expressions
+ - assets/javascripts/mathjax.js # Custom MathJax config to ensure compatibility with mkdocs-jupyter
+ - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js # Official MathJax CDN
# A list of extensions beyond the ones that MkDocs uses by default (meta, toc, tables, and fenced_code)
markdown_extensions:
@@ -96,7 +98,7 @@ markdown_extensions:
- attr_list
- def_list
- footnotes
- - pymdownx.arithmatex:
+ - pymdownx.arithmatex: # rendering of equations and integrates with MathJax or KaTeX
generic: true
- pymdownx.blocks.caption
- pymdownx.details
@@ -136,7 +138,7 @@ plugins:
allow_errors: false
include_source: true
include_requirejs: true # Required for Plotly
- # custom_mathjax_url: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS_CHTML-full,Safe'
+ #custom_mathjax_url: 'https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js' # See 'extra_javascript' above
ignore_h1_titles: true # Use titles defined in the nav section below
remove_tag_config:
remove_input_tags:
diff --git a/pixi.toml b/pixi.toml
index d280c259..c4592b6a 100644
--- a/pixi.toml
+++ b/pixi.toml
@@ -42,10 +42,10 @@ channels = ['conda-forge']
[dependencies]
nodejs = '*' # Required for Prettier (non-Python formatting)
-gsl = '*' # GNU Scientific Library; required for pdffit2.
+#gsl = '*' # GNU Scientific Library; required for pdffit2
[pypi-dependencies] # == [feature.default.pypi-dependencies]
-pip = '*' # Native package installer
+#pip = '*' # Native package installer
easydynamics = { path = ".", editable = true, extras = ['dev'] }
# Specific features: Set specific Python versions
@@ -182,9 +182,9 @@ docs-update-assets = 'python tools/update_docs_assets.py'
# π¦ Template Management Tasks
##############################
-copier-copy = "copier copy gh:easyscience/templates . --data-file ../dynamics/.copier-answers.yml --data template_type=lib"
-copier-recopy = "copier recopy --data-file ../dynamics/.copier-answers.yml --data template_type=lib"
-copier-update = "copier update --data-file ../dynamics/.copier-answers.yml --data template_type=lib"
+copier-copy = "copier copy gh:easyscience/templates . --data-file .copier-answers.yml --data template_type=lib"
+copier-recopy = "copier recopy --data-file .copier-answers.yml --data template_type=lib"
+copier-update = "copier update --data-file .copier-answers.yml --data template_type=lib"
#####################
# πͺ Pre-commit Hooks
@@ -199,12 +199,38 @@ pre-commit-setup = { depends-on = [
'pre-commit-install',
] }
+#################
+# ποΈ GitHub Tasks
+#################
+
+repo-wiki = 'gh api -X PATCH repos/easyscience/dynamics-lib -f has_wiki=false'
+repo-discussions = 'gh api -X PATCH repos/easyscience/dynamics-lib -f has_discussions=true'
+repo-description = "gh api -X PATCH repos/easyscience/dynamics-lib -f description='QENS data analysis'"
+repo-homepage = "gh api -X PATCH repos/easyscience/dynamics-lib -f homepage='https://easyscience.github.io/dynamics-lib'"
+repo-config = { depends-on = [
+ 'repo-wiki',
+ 'repo-discussions',
+ 'repo-description',
+ 'repo-homepage',
+] }
+
+master-protection = 'gh api -X POST repos/easyscience/dynamics-lib/rulesets --input .github/configs/rulesets-master.json'
+develop-protection = 'gh api -X POST repos/easyscience/dynamics-lib/rulesets --input .github/configs/rulesets-develop.json'
+gh-pages-protection = 'gh api -X POST repos/easyscience/dynamics-lib/rulesets --input .github/configs/rulesets-gh-pages.json'
+branch-protection = { depends-on = [
+ 'master-protection',
+ 'develop-protection',
+ 'gh-pages-protection',
+] }
+
+pages-deployment = 'gh api -X POST repos/easyscience/dynamics-lib/pages --input .github/configs/pages-deployment.json'
+
+github-labels = 'python tools/update_github_labels.py'
+
####################################
# π Other Development & Build Tasks
####################################
-github-labels = 'python tools/update_github_labels.py'
-
default-build = 'python -m build'
dist-build = 'python -m build --wheel --outdir dist'
@@ -212,7 +238,7 @@ npm-config = 'npm config set registry https://registry.npmjs.org/'
prettier-install = 'npm install --no-save --no-audit --no-fund prettier prettier-plugin-toml'
clean-pycache = "find . -type d -name '__pycache__' -prune -exec rm -rf '{}' +"
-spdx-update = 'python tools/update_spdx.py'
+spdx-update = 'python tools/update_spdx.py src/ tests/'
post-install = { depends-on = [
'npm-config',
diff --git a/pyproject.toml b/pyproject.toml
index 46ab2717..485d03b1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -6,9 +6,10 @@
name = 'easydynamics'
dynamic = ['version'] # Use versioningit to manage the version
description = 'QENS data analysis'
-authors = [{ name = 'EasyDynamics contributors' }]
+authors = [{ name = 'EasyScience contributors' }]
readme = 'README.md'
-license = { file = 'LICENSE' }
+license = 'BSD-3-Clause'
+license-files = ['LICENSE']
classifiers = [
'Intended Audience :: Science/Research',
'Topic :: Scientific/Engineering',
@@ -36,6 +37,7 @@ dependencies = [
[project.optional-dependencies]
dev = [
+ 'GitPython', # Interact with Git repositories
'build', # Building the package
'pre-commit', # Pre-commit hooks
'jinja2', # Templating
@@ -67,10 +69,11 @@ dev = [
]
[project.urls]
-homepage = 'https://easyscience.github.io/dynamics'
-documentation = 'https://easyscience.github.io/dynamics-lib'
-source = 'https://github.com/easyscience/dynamics-lib'
-tracker = 'https://github.com/easyscience/dynamics-lib/issues'
+Homepage = 'https://easyscience.github.io/dynamics'
+Documentation = 'https://easyscience.github.io/dynamics-lib'
+'Release Notes' = 'https://github.com/easyscience/dynamics-lib/releases'
+'Source Code' = 'https://github.com/easyscience/dynamics-lib'
+'Issue Tracker' = 'https://github.com/easyscience/dynamics-lib/issues'
############################
# Build system configuration
@@ -122,19 +125,6 @@ method = 'git'
match = ['v*']
default-tag = 'v999.0.0'
-################################
-# Configuration for docformatter
-################################
-
-# 'docformatter' -- Code formatter for docstrings
-# https://docformatter.readthedocs.io/en/latest/
-
-[tool.docformatter]
-recursive = true
-wrap-summaries = 72
-wrap-descriptions = 72
-close-quotes-on-newline = true
-
################################
# Configuration for interrogate
################################
@@ -216,8 +206,33 @@ force-single-line = true
max-complexity = 10 # default is 10
[tool.ruff.lint.pycodestyle]
-max-line-length = 99 # https://peps.python.org/pep-0008/#maximum-line-length
-max-doc-length = 72 # https://peps.python.org/pep-0008/#maximum-line-length
+# PEP 8 line length guidance:
+# https://peps.python.org/pep-0008/#maximum-line-length
+# Use 99 characters as the project-wide maximum for regular code lines.
+max-line-length = 99
+# allow longer lines so that parameter declarations such as
+# `name (Type | Type | None):` remain on a single line. Splitting these
+# lines can prevent tools such as MkDocs and IDEs from correctly
+# parsing and rendering parameter documentation.
+# The descriptive text itself is wrapped more strictly by
+# `docformatter` (see the configuration in [tool.docformatter] below)
+# whenever it is treated as normal paragraph text.
+# The line length for code snippets in docstrings is also more strict,
+# as defined in the [tool.ruff.format] section above.
+max-doc-length = 99
[tool.ruff.lint.pydocstyle]
convention = 'google'
+
+################################
+# Configuration for docformatter
+################################
+
+# 'docformatter' -- Code formatter for docstrings
+# https://docformatter.readthedocs.io/en/latest/
+
+[tool.docformatter]
+recursive = true
+wrap-summaries = 72
+wrap-descriptions = 72
+close-quotes-on-newline = true
diff --git a/tools/update_github_labels.py b/tools/update_github_labels.py
index a18043d0..8ec8c2d7 100644
--- a/tools/update_github_labels.py
+++ b/tools/update_github_labels.py
@@ -1,5 +1,4 @@
-"""
-Set/update GitHub labels for current or specified easyscience
+"""Set/update GitHub labels for current or specified easyscience
repository.
Requires:
@@ -21,187 +20,290 @@
import subprocess
import sys
from dataclasses import dataclass
-from typing import Iterable
-
EASYSCIENCE_ORG = 'easyscience'
-# --- Label definitions -----------------------------------------------------------
+# Data structures
-BASIC_GITHUB_LABELS = [
- 'bug',
- 'documentation',
- 'duplicate',
- 'enhancement',
- 'good first issue',
- 'help wanted',
- 'invalid',
- 'question',
- 'wontfix',
-]
-NEW_BASIC_LABEL_NAMES = [
- '[scope] bug',
- '[scope] documentation',
- '[maintainer] duplicate',
- '[scope] enhancement',
- '[maintainer] good first issue',
- '[maintainer] help wanted',
- '[maintainer] invalid',
- '[maintainer] question',
- '[maintainer] wontfix',
-]
+@dataclass(frozen=True)
+class Label:
+ """A GitHub label with name, color, and description."""
-SCOPE_LABELS = [
- ('bug', 'Bug report or fix (major.minor.PATCH)'),
- ('documentation', 'Documentation only changes (major.minor.patch.POST)'),
- ('enhancement', 'Adds/improves features (major.MINOR.patch)'),
- ('maintenance', 'Code/tooling cleanup, no feature or bugfix (major.minor.PATCH)'),
- ('significant', 'Breaking or major changes (MAJOR.minor.patch)'),
- ('β οΈ label needed', 'Automatically added to issues and PRs without a [scope] label'),
-]
+ name: str
+ color: str
+ description: str = ''
-MAINTAINER_LABELS = [
- ('duplicate', 'Already reported or submitted'),
- ('good first issue', 'Good entry-level issue for newcomers'),
- ('help wanted', 'Needs additional help to resolve or implement'),
- ('invalid', 'Invalid, incorrect or outdated'),
- ('question', 'Needs clarification, discussion, or more information'),
- ('wontfix', 'Will not be fixed or continued'),
-]
-PRIORITY_LABELS = [
- ('lowest', 'Very low urgency'),
- ('low', 'Low importance'),
- ('medium', 'Normal/default priority'),
- ('high', 'Should be prioritized soon'),
- ('highest', 'Urgent. Needs attention ASAP'),
- ('β οΈ label needed', 'Automatically added to issues without a [priority] label'),
+@dataclass(frozen=True)
+class LabelRename:
+ """Mapping from old label name to new label name."""
+
+ old: str
+ new: str
+
+
+class Colors:
+ """Hex color codes for label groups."""
+
+ SCOPE = 'd73a4a'
+ MAINTAINER = '0e8a16'
+ PRIORITY = 'fbca04'
+ BOT = '5319e7'
+
+
+LABEL_RENAMES = [
+ # Default GitHub labels to rename (if they exist)
+ LabelRename('bug', '[scope] bug'),
+ LabelRename('documentation', '[scope] documentation'),
+ LabelRename('duplicate', '[maintainer] duplicate'),
+ LabelRename('enhancement', '[scope] enhancement'),
+ LabelRename('good first issue', '[maintainer] good first issue'),
+ LabelRename('help wanted', '[maintainer] help wanted'),
+ LabelRename('invalid', '[maintainer] invalid'),
+ LabelRename('question', '[maintainer] question'),
+ LabelRename('wontfix', '[maintainer] wontfix'),
+ # Custom label renames (if they exist)
+ LabelRename('[bot] pull request', '[bot] release'),
]
-BOT_LABEL = (
- '[bot] pull request',
- 'Automated release PR. Excluded from changelog/versioning',
-)
-
-COLORS = {
- 'scope': 'd73a4a',
- 'maintainer': '0e8a16',
- 'priority': 'fbca04',
- 'bot': '5319e7',
-}
+LABELS = [
+ # Scope labels
+ Label(
+ '[scope] bug',
+ Colors.SCOPE,
+ 'Bug report or fix (major.minor.PATCH)',
+ ),
+ Label(
+ '[scope] documentation',
+ Colors.SCOPE,
+ 'Documentation only changes (major.minor.patch.POST)',
+ ),
+ Label(
+ '[scope] enhancement',
+ Colors.SCOPE,
+ 'Adds/improves features (major.MINOR.patch)',
+ ),
+ Label(
+ '[scope] maintenance',
+ Colors.SCOPE,
+ 'Code/tooling cleanup, no feature or bugfix (major.minor.PATCH)',
+ ),
+ Label(
+ '[scope] significant',
+ Colors.SCOPE,
+ 'Breaking or major changes (MAJOR.minor.patch)',
+ ),
+ Label(
+ '[scope] β οΈ label needed',
+ Colors.SCOPE,
+ 'Automatically added to issues and PRs without a [scope] label',
+ ),
+ # Maintainer labels
+ Label(
+ '[maintainer] duplicate',
+ Colors.MAINTAINER,
+ 'Already reported or submitted',
+ ),
+ Label(
+ '[maintainer] good first issue',
+ Colors.MAINTAINER,
+ 'Good entry-level issue for newcomers',
+ ),
+ Label(
+ '[maintainer] help wanted',
+ Colors.MAINTAINER,
+ 'Needs additional help to resolve or implement',
+ ),
+ Label(
+ '[maintainer] invalid',
+ Colors.MAINTAINER,
+ 'Invalid, incorrect or outdated',
+ ),
+ Label(
+ '[maintainer] question',
+ Colors.MAINTAINER,
+ 'Needs clarification, discussion, or more information',
+ ),
+ Label(
+ '[maintainer] wontfix',
+ Colors.MAINTAINER,
+ 'Will not be fixed or continued',
+ ),
+ # Priority labels
+ Label(
+ '[priority] lowest',
+ Colors.PRIORITY,
+ 'Very low urgency',
+ ),
+ Label(
+ '[priority] low',
+ Colors.PRIORITY,
+ 'Low importance',
+ ),
+ Label(
+ '[priority] medium',
+ Colors.PRIORITY,
+ 'Normal/default priority',
+ ),
+ Label(
+ '[priority] high',
+ Colors.PRIORITY,
+ 'Should be prioritized soon',
+ ),
+ Label(
+ '[priority] highest',
+ Colors.PRIORITY,
+ 'Urgent. Needs attention ASAP',
+ ),
+ Label(
+ '[priority] β οΈ label needed',
+ Colors.PRIORITY,
+ 'Automatically added to issues without a [priority] label',
+ ),
+ # Bot label
+ Label(
+ '[bot] release',
+ Colors.BOT,
+ 'Automated release PR. Excluded from changelog/versioning',
+ ),
+ Label(
+ '[bot] backmerge',
+ Colors.BOT,
+ 'Automated backmerge master β develop failed due to conflicts',
+ ),
+]
-# --- Helpers --------------------------------------------------------------------
+# Helpers
@dataclass(frozen=True)
class CmdResult:
+ """Result of a shell command execution."""
+
returncode: int
stdout: str
stderr: str
-def run_cmd(args: list[str], *, dry_run: bool, check: bool = True) -> CmdResult:
+def run_cmd(
+ args: list[str],
+ *,
+ dry_run: bool,
+ check: bool = True,
+) -> CmdResult:
"""Run a command (or print it in dry-run mode)."""
cmd_str = ' '.join(shlex.quote(a) for a in args)
if dry_run:
- print(f'{cmd_str}')
+ print(f' [dry-run] {cmd_str}')
return CmdResult(0, '', '')
proc = subprocess.run(
- args,
+ args=args,
text=True,
capture_output=True,
)
- res = CmdResult(proc.returncode, proc.stdout.strip(), proc.stderr.strip())
+ result = CmdResult(
+ proc.returncode,
+ proc.stdout.strip(),
+ proc.stderr.strip(),
+ )
if check and proc.returncode != 0:
- raise RuntimeError(f'Command failed ({proc.returncode}): {cmd_str}\n{res.stderr}')
+ raise RuntimeError(f'Command failed ({proc.returncode}): {cmd_str}\n{result.stderr}')
- return res
+ return result
-def get_current_repo_name_with_owner() -> str:
- res = subprocess.run(
- ['gh', 'repo', 'view', '--json', 'nameWithOwner'],
+def get_current_repo() -> str:
+ """Get the current repository name in 'owner/repo' format."""
+ result = subprocess.run(
+ args=[
+ 'gh',
+ 'repo',
+ 'view',
+ '--json',
+ 'nameWithOwner',
+ ],
text=True,
capture_output=True,
check=True,
)
- data = json.loads(res.stdout)
- nwo = data.get('nameWithOwner')
- if not nwo or '/' not in nwo:
+ data = json.loads(result.stdout)
+ name_with_owner = data.get('nameWithOwner', '')
+
+ if '/' not in name_with_owner:
raise RuntimeError('Could not determine current repository name')
- return nwo
+ return name_with_owner
-def try_rename_label(repo: str, old: str, new: str, *, dry_run: bool) -> None:
- try:
- run_cmd(
- ['gh', 'label', 'edit', old, '--name', new, '--repo', repo],
- dry_run=dry_run,
- )
- print(f'Rename: {old!r} β {new!r}')
- except Exception:
- print(f'Skip rename (label not found): {old!r}')
+
+def rename_label(
+ repo: str,
+ rename: LabelRename,
+ *,
+ dry_run: bool,
+) -> None:
+ """Rename a label, silently skipping if it doesn't exist."""
+ result = run_cmd(
+ args=[
+ 'gh',
+ 'label',
+ 'edit',
+ rename.old,
+ '--name',
+ rename.new,
+ '--repo',
+ repo,
+ ],
+ dry_run=dry_run,
+ check=False,
+ )
+
+ if dry_run or result.returncode == 0:
+ print(f' Rename: {rename.old!r} β {rename.new!r}')
+ else:
+ print(f' Skip (not found): {rename.old!r}')
def upsert_label(
repo: str,
- name: str,
- color: str,
- description: str,
+ label: Label,
*,
dry_run: bool,
) -> None:
+ """Create or update a label."""
run_cmd(
[
'gh',
'label',
'create',
- name,
+ label.name,
'--color',
- color,
+ label.color,
'--description',
- description,
+ label.description,
'--force',
'--repo',
repo,
],
dry_run=dry_run,
)
- print(f'Upsert label: {name!r}')
+ print(f' Upsert: {label.name!r}')
-def upsert_group(
- repo: str,
- prefix: str,
- color: str,
- items: Iterable[tuple[str, str]],
- *,
- dry_run: bool,
-) -> None:
- for short, desc in items:
- upsert_label(
- repo,
- f'[{prefix}] {short}',
- color,
- desc,
- dry_run=dry_run,
- )
-
-
-# --- Main -----------------------------------------------------------------------
+# Main
def main() -> int:
+ """Entry point: parse arguments and sync labels."""
parser = argparse.ArgumentParser(description='Sync GitHub labels for easyscience repos')
parser.add_argument(
'--repo',
- help='Target repository in the form easyscience/',
+ help='Target repository (owner/name)',
)
parser.add_argument(
'--dry-run',
@@ -210,41 +312,24 @@ def main() -> int:
)
args = parser.parse_args()
- if args.repo:
- repo = args.repo
- else:
- repo = get_current_repo_name_with_owner()
-
- org, _ = repo.split('/', 1)
+ repo = args.repo or get_current_repo()
+ org = repo.split('/')[0]
if org.lower() != EASYSCIENCE_ORG:
- print(
- f"Refusing to run: repository {repo!r} is not under '{EASYSCIENCE_ORG}'.",
- file=sys.stderr,
- )
+ print(f"Error: repository '{repo}' is not under '{EASYSCIENCE_ORG}'", file=sys.stderr)
return 2
- print(f'Target repository: {repo}')
+ print(f'Repository: {repo}')
if args.dry_run:
- print('Running in DRY-RUN mode (no changes will be made)\n')
-
- # 1) Rename basic labels
- for old, new in zip(BASIC_GITHUB_LABELS, NEW_BASIC_LABEL_NAMES, strict=True):
- try_rename_label(repo, old, new, dry_run=args.dry_run)
-
- # 2) Scope / Maintainer / Priority groups
- upsert_group(repo, 'scope', COLORS['scope'], SCOPE_LABELS, dry_run=args.dry_run)
- upsert_group(repo, 'maintainer', COLORS['maintainer'], MAINTAINER_LABELS, dry_run=args.dry_run)
- upsert_group(repo, 'priority', COLORS['priority'], PRIORITY_LABELS, dry_run=args.dry_run)
-
- # 3) Bot label
- upsert_label(
- repo,
- BOT_LABEL[0],
- COLORS['bot'],
- BOT_LABEL[1],
- dry_run=args.dry_run,
- )
+ print('Mode: DRY-RUN (no changes will be made)\n')
+
+ print('\nRenaming default labels...')
+ for rename in LABEL_RENAMES:
+ rename_label(repo, rename, dry_run=args.dry_run)
+
+ print('\nUpserting labels...')
+ for label in LABELS:
+ upsert_label(repo, label, dry_run=args.dry_run)
print('\nDone.')
return 0
diff --git a/tools/update_spdx.py b/tools/update_spdx.py
index ec3bc446..d7313565 100644
--- a/tools/update_spdx.py
+++ b/tools/update_spdx.py
@@ -1,104 +1,143 @@
"""Update or insert SPDX headers in Python files.
-- Ensures SPDX-FileCopyrightText has the current year.
+- Ensures SPDX-FileCopyrightText has the file's creation year.
- Ensures SPDX-License-Identifier is set to BSD-3-Clause.
"""
-import fnmatch
-import re
+
+from __future__ import annotations
+
+import argparse
+import tomllib
+from datetime import datetime
from pathlib import Path
+from typing import Optional
+from typing import Union
+
+from git import Repo
+from spdx_headers.core import find_repository_root
+from spdx_headers.core import get_copyright_info
+from spdx_headers.data import load_license_data
+from spdx_headers.operations import add_header_to_single_file
+from spdx_headers.operations import remove_header_from_single_file
+
+LICENSE_DATABASE = load_license_data()
+
+
+def load_pyproject(repo_path: Union[str, Path]) -> dict:
+ """Load and return parsed ``pyproject.toml`` data for the
+ repository.
+ """
+ repo_root = find_repository_root(repo_path)
+ pyproject_path = repo_root / 'pyproject.toml'
+
+ with open(pyproject_path, 'rb') as file_handle:
+ return tomllib.load(file_handle)
+
+
+def get_file_creation_year(file_path: Union[str, Path]) -> str:
+ """Return the year the file was first added to Git history.
+
+ If the year cannot be determined, fall back to the current year.
+ """
+ file_path = Path(file_path)
+
+ repo = Repo(file_path, search_parent_directories=True)
+ root = Path(repo.working_tree_dir).resolve()
+ rel_path = file_path.resolve().relative_to(root)
+
+ output = repo.git.log(
+ '--follow',
+ '--diff-filter=A',
+ '--reverse',
+ '--max-count=1',
+ '--format=%ad',
+ '--date=format:%Y',
+ '--',
+ str(rel_path),
+ ).strip()
+
+ return output or str(datetime.now().year)
+
-COPYRIGHT_TEXT = '# SPDX-FileCopyrightText: 2025-2026 EasyDynamics contributors '
-LICENSE_TEXT = '# SPDX-License-Identifier: BSD-3-Clause'
-
-# Patterns to exclude from SPDX header updates (vendored code)
-EXCLUDE_PATTERNS = [
- '*/_vendored/jupyter_dark_detect/*',
-]
-
-
-def should_exclude(file_path: Path) -> bool:
- """Check if a file should be excluded from SPDX header updates."""
- path_str = str(file_path)
- return any(fnmatch.fnmatch(path_str, pattern) for pattern in EXCLUDE_PATTERNS)
-
-
-def update_spdx_header(file_path: Path):
- # Use Path.open to satisfy lint rule PTH123.
- with file_path.open('r', encoding='utf-8') as f:
- original_lines = f.readlines()
-
- # Regexes for SPDX lines
- copy_re = re.compile(r'^#\s*SPDX-FileCopyrightText:.*$')
- lic_re = re.compile(r'^#\s*SPDX-License-Identifier:.*$')
-
- # 1) Preserve any leading shebang / coding cookie lines
- prefix = []
- body_start = 0
- if original_lines:
- # Shebang line like "#!/usr/bin/env python3"
- if original_lines[0].startswith('#!'):
- prefix.append(original_lines[0])
- body_start = 1
- # PEP 263 coding cookie on first or second line
- # e.g. "# -*- coding: utf-8 -*-" or "# coding: utf-8"
- for _ in range(2): # at most one more line to inspect
- if body_start < len(original_lines):
- line = original_lines[body_start]
- if re.match(r'^#.*coding[:=]\s*[-\w.]+', line):
- prefix.append(line)
- body_start += 1
- else:
- break
-
- # 2) Work on the remaining body
- body = original_lines[body_start:]
-
- # Remove any existing SPDX lines anywhere in the body
- body = [ln for ln in body if not (copy_re.match(ln) or lic_re.match(ln))]
-
- # Strip leading blank lines in the body so header is tight
- while body and not body[0].strip():
- body.pop(0)
-
- # 3) Build canonical SPDX block: two lines + exactly one blank
- spdx_block = [
- COPYRIGHT_TEXT + '\n',
- LICENSE_TEXT + '\n',
- '\n',
- ]
-
- # 4) New content: prefix + SPDX + body
- new_lines = prefix + spdx_block + body
-
- # 5) Normalize: collapse any extra blank lines immediately after
- # LICENSE to exactly one. This keeps the script idempotent.
- # Find the index of LICENSE we just inserted (prefix may be 0, 1,
- # or 2 lines)
- lic_idx = len(prefix) + 1 # spdx_block[1] is the license line
- # Ensure exactly one blank line after LICENSE
- # Remove all blank lines after lic_idx, then insert a single blank.
- j = lic_idx + 1
- # Remove any number of blank lines following
- while j < len(new_lines) and not new_lines[j].strip():
- new_lines.pop(j)
- # Insert exactly one blank line at this position
- new_lines.insert(j, '\n')
-
- with file_path.open('w', encoding='utf-8') as f:
- f.writelines(new_lines)
-
-
-def main():
- """Recursively update or insert SPDX headers in all Python files
- under the 'src' and 'tests' directories.
+def get_org_url(repo_path: Union[str, Path]) -> str:
+ """Return the organization URL derived from the repository source
+ URL.
"""
- for base_dir in ('src', 'tests'):
- for py_file in Path(base_dir).rglob('*.py'):
- if should_exclude(py_file):
- continue
- update_spdx_header(py_file)
+ pyproject_data = load_pyproject(repo_path)
+ repo_url = pyproject_data['project']['urls']['source']
+ return repo_url.rsplit('/', 1)[0]
+
+
+def get_project_license(repo_path: Union[str, Path]) -> str:
+ """Return the project license value from ``pyproject.toml``."""
+ pyproject_data = load_pyproject(repo_path)
+ return pyproject_data['project']['license']
+
+
+def get_copyright_holder(repo_path: Union[str, Path]) -> str:
+ """Return the repository copyright holder name."""
+ _, name, _ = get_copyright_info(repo_path)
+ return name
+
+
+def update_spdx_header(
+ target_file: Union[str, Path],
+ *,
+ license_key: str,
+ copyright_holder: str,
+ org_url: str,
+) -> None:
+ """Remove any existing SPDX header and add an updated one."""
+ year = get_file_creation_year(target_file)
+
+ remove_header_from_single_file(target_file)
+ add_header_to_single_file(
+ filepath=target_file,
+ license_key=license_key,
+ license_data=LICENSE_DATABASE,
+ year=year,
+ name=copyright_holder,
+ email=org_url,
+ )
+
+
+def build_parser() -> argparse.ArgumentParser:
+ parser = argparse.ArgumentParser(
+ description='Update SPDX headers for Python files under the given paths.',
+ )
+ parser.add_argument(
+ 'paths',
+ nargs='+',
+ help='Relative paths to scan (e.g. src tests)',
+ )
+ return parser
+
+
+def main(argv: Optional[list[str]] = None) -> int:
+ parser = build_parser()
+ args = parser.parse_args(argv)
+
+ repo_path = Path('.').resolve()
+ license_key = get_project_license(repo_path)
+ copyright_holder = get_copyright_holder(repo_path)
+ org_url = get_org_url(repo_path)
+
+ for base_dir in args.paths:
+ base_path = Path(base_dir)
+ if not base_path.exists():
+ parser.error(f'Path does not exist: {base_dir}')
+
+ for py_file in base_path.rglob('*.py'):
+ update_spdx_header(
+ py_file,
+ license_key=license_key,
+ copyright_holder=copyright_holder,
+ org_url=org_url,
+ )
+
+ return 0
if __name__ == '__main__':
- main()
+ raise SystemExit(main())
From e6c28c990633e73d811a9efbda5b7e48d1d73190 Mon Sep 17 00:00:00 2001
From: Andrew Sazonov
Date: Thu, 5 Mar 2026 01:46:10 +0100
Subject: [PATCH 03/16] Switch easyscience dep to PyPI
---
pixi.lock | 731 ++++++-------------------------------------------
pyproject.toml | 2 +-
2 files changed, 90 insertions(+), 643 deletions(-)
diff --git a/pixi.lock b/pixi.lock
index 7ffe17ef..4b99d089 100644
--- a/pixi.lock
+++ b/pixi.lock
@@ -14,27 +14,21 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-hbf7d49c_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
@@ -80,7 +74,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/b8/01/74922a1c552137c05a41fee0c61153753dddc9117d19c7c5902c146c25ab/copier-9.11.3-py3-none-any.whl
- - pypi: git+https://github.com/easyscience/corelib.git#59d787b5158c6d72e0b4aa3cedd5e24f7fa61c56
- pypi: https://files.pythonhosted.org/packages/ea/b4/694159c15c52b9f7ec7adf49d50e5f8ee71d3e9ef38adb4445d13dd56c20/coverage-7.13.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f2/f2/728f041460f1b9739b85ee23b45fa5a505962ea11fd85bdbe2a02b021373/darkdetect-0.8.0-py3-none-any.whl
@@ -92,6 +85,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f0/d4/0a873d3ead6815fb046189d375144a97e04902dbe221eeeb582a71d69f85/easyscience-2.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl
@@ -101,6 +95,8 @@ environments:
- pypi: https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/3a/30/d1c94066343a98bb2cea40120873193a4fed68c4ad7f8935c11caf74c681/h5py-3.15.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
@@ -185,7 +181,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/84/4a/d070dc6a36c2eb8b8a19b31908d0817e2a85fe0b70f9db20834a495a74e1/plopp-25.11.0-py3-none-any.whl
@@ -237,6 +232,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/e0/76/f963c61683a39084aa575f98089253e1e852a4417cb8a3a8a422923a5246/setuptools-80.10.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl
@@ -269,32 +265,23 @@ environments:
- pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl
- pypi: ./
osx-64:
- - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/gsl-2.8-hc707ee6_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20250512.1-cxx17_hfc00f1c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.2.1-h4e79119_2.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda
@@ -335,7 +322,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/b8/01/74922a1c552137c05a41fee0c61153753dddc9117d19c7c5902c146c25ab/copier-9.11.3-py3-none-any.whl
- - pypi: git+https://github.com/easyscience/corelib.git#59d787b5158c6d72e0b4aa3cedd5e24f7fa61c56
- pypi: https://files.pythonhosted.org/packages/ce/8a/87af46cccdfa78f53db747b09f5f9a21d5fc38d796834adac09b30a8ce74/coverage-7.13.1-cp312-cp312-macosx_10_13_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f2/f2/728f041460f1b9739b85ee23b45fa5a505962ea11fd85bdbe2a02b021373/darkdetect-0.8.0-py3-none-any.whl
@@ -347,6 +333,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f0/d4/0a873d3ead6815fb046189d375144a97e04902dbe221eeeb582a71d69f85/easyscience-2.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl
@@ -356,6 +343,8 @@ environments:
- pypi: https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/62/b8/c0d9aa013ecfa8b7057946c080c0c07f6fa41e231d2e9bd306a2f8110bdc/h5py-3.15.1-cp312-cp312-macosx_10_13_x86_64.whl
@@ -440,7 +429,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/84/4a/d070dc6a36c2eb8b8a19b31908d0817e2a85fe0b70f9db20834a495a74e1/plopp-25.11.0-py3-none-any.whl
@@ -492,6 +480,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/e0/76/f963c61683a39084aa575f98089253e1e852a4417cb8a3a8a422923a5246/setuptools-80.10.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl
@@ -524,32 +513,23 @@ environments:
- pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl
- pypi: ./
osx-arm64:
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.8-h8d0574d_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250512.1-cxx17_hd41c47c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.2.1-he11bded_2.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda
@@ -590,7 +570,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl
- pypi: https://files.pythonhosted.org/packages/b8/01/74922a1c552137c05a41fee0c61153753dddc9117d19c7c5902c146c25ab/copier-9.11.3-py3-none-any.whl
- - pypi: git+https://github.com/easyscience/corelib.git#59d787b5158c6d72e0b4aa3cedd5e24f7fa61c56
- pypi: https://files.pythonhosted.org/packages/82/a8/6e22fdc67242a4a5a153f9438d05944553121c8f4ba70cb072af4c41362e/coverage-7.13.1-cp312-cp312-macosx_11_0_arm64.whl
- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f2/f2/728f041460f1b9739b85ee23b45fa5a505962ea11fd85bdbe2a02b021373/darkdetect-0.8.0-py3-none-any.whl
@@ -602,6 +581,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f0/d4/0a873d3ead6815fb046189d375144a97e04902dbe221eeeb582a71d69f85/easyscience-2.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl
@@ -611,6 +591,8 @@ environments:
- pypi: https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl
- pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/a4/5e/3c6f6e0430813c7aefe784d00c6711166f46225f5d229546eb53032c3707/h5py-3.15.1-cp312-cp312-macosx_11_0_arm64.whl
@@ -695,7 +677,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/84/4a/d070dc6a36c2eb8b8a19b31908d0817e2a85fe0b70f9db20834a495a74e1/plopp-25.11.0-py3-none-any.whl
@@ -747,6 +728,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/e0/76/f963c61683a39084aa575f98089253e1e852a4417cb8a3a8a422923a5246/setuptools-80.10.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl
@@ -781,26 +763,14 @@ environments:
win-64:
- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/gsl-2.8-h5b8d9c4_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.8-h4fa8253_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.2.1-he453025_2.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.12-h0159041_1_cpython.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
@@ -838,7 +808,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl
- pypi: https://files.pythonhosted.org/packages/b8/01/74922a1c552137c05a41fee0c61153753dddc9117d19c7c5902c146c25ab/copier-9.11.3-py3-none-any.whl
- - pypi: git+https://github.com/easyscience/corelib.git#59d787b5158c6d72e0b4aa3cedd5e24f7fa61c56
- pypi: https://files.pythonhosted.org/packages/fa/dc/7282856a407c621c2aad74021680a01b23010bb8ebf427cf5eacda2e876f/coverage-7.13.1-cp312-cp312-win_amd64.whl
- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f2/f2/728f041460f1b9739b85ee23b45fa5a505962ea11fd85bdbe2a02b021373/darkdetect-0.8.0-py3-none-any.whl
@@ -850,6 +819,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f0/d4/0a873d3ead6815fb046189d375144a97e04902dbe221eeeb582a71d69f85/easyscience-2.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl
@@ -859,6 +829,8 @@ environments:
- pypi: https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl
- pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cf/51/329e7436bf87ca6b0fe06dd0a3795c34bebe4ed8d6c44450a20565d57832/h5py-3.15.1-cp312-cp312-win_amd64.whl
@@ -942,7 +914,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/a7/87/90b358775a3f02765d87655237229ba64a997b87efa8ccaca7dd3e36e7a7/pillow-12.1.0-cp312-cp312-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/84/4a/d070dc6a36c2eb8b8a19b31908d0817e2a85fe0b70f9db20834a495a74e1/plopp-25.11.0-py3-none-any.whl
@@ -995,6 +966,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/e0/76/f963c61683a39084aa575f98089253e1e852a4417cb8a3a8a422923a5246/setuptools-80.10.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl
@@ -1040,27 +1012,21 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-hbf7d49c_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
@@ -1106,7 +1072,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/b8/01/74922a1c552137c05a41fee0c61153753dddc9117d19c7c5902c146c25ab/copier-9.11.3-py3-none-any.whl
- - pypi: git+https://github.com/easyscience/corelib.git#59d787b5158c6d72e0b4aa3cedd5e24f7fa61c56
- pypi: https://files.pythonhosted.org/packages/f7/7c/347280982982383621d29b8c544cf497ae07ac41e44b1ca4903024131f55/coverage-7.13.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f2/f2/728f041460f1b9739b85ee23b45fa5a505962ea11fd85bdbe2a02b021373/darkdetect-0.8.0-py3-none-any.whl
@@ -1118,6 +1083,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f0/d4/0a873d3ead6815fb046189d375144a97e04902dbe221eeeb582a71d69f85/easyscience-2.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl
@@ -1127,6 +1093,8 @@ environments:
- pypi: https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/8b/23/4ab1108e87851ccc69694b03b817d92e142966a6c4abd99e17db77f2c066/h5py-3.15.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
@@ -1212,7 +1180,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/5c/1f/8e66ab9be3aaf1435bc03edd1ebdf58ffcd17f7349c1d970cafe87af27d9/pillow-12.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/84/4a/d070dc6a36c2eb8b8a19b31908d0817e2a85fe0b70f9db20834a495a74e1/plopp-25.11.0-py3-none-any.whl
@@ -1264,6 +1231,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/e0/76/f963c61683a39084aa575f98089253e1e852a4417cb8a3a8a422923a5246/setuptools-80.10.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl
@@ -1296,32 +1264,23 @@ environments:
- pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl
- pypi: ./
osx-64:
- - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/gsl-2.8-hc707ee6_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20250512.1-cxx17_hfc00f1c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.2.1-h4e79119_2.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda
@@ -1362,7 +1321,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/b8/01/74922a1c552137c05a41fee0c61153753dddc9117d19c7c5902c146c25ab/copier-9.11.3-py3-none-any.whl
- - pypi: git+https://github.com/easyscience/corelib.git#59d787b5158c6d72e0b4aa3cedd5e24f7fa61c56
- pypi: https://files.pythonhosted.org/packages/b4/9b/77baf488516e9ced25fc215a6f75d803493fc3f6a1a1227ac35697910c2a/coverage-7.13.1-cp311-cp311-macosx_10_9_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f2/f2/728f041460f1b9739b85ee23b45fa5a505962ea11fd85bdbe2a02b021373/darkdetect-0.8.0-py3-none-any.whl
@@ -1374,6 +1332,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f0/d4/0a873d3ead6815fb046189d375144a97e04902dbe221eeeb582a71d69f85/easyscience-2.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl
@@ -1383,6 +1342,8 @@ environments:
- pypi: https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/41/fd/8349b48b15b47768042cff06ad6e1c229f0a4bd89225bf6b6894fea27e6d/h5py-3.15.1-cp311-cp311-macosx_10_9_x86_64.whl
@@ -1468,7 +1429,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/43/c4/bf8328039de6cc22182c3ef007a2abfbbdab153661c0a9aa78af8d706391/pillow-12.1.0-cp311-cp311-macosx_10_10_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/84/4a/d070dc6a36c2eb8b8a19b31908d0817e2a85fe0b70f9db20834a495a74e1/plopp-25.11.0-py3-none-any.whl
@@ -1520,6 +1480,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/e0/76/f963c61683a39084aa575f98089253e1e852a4417cb8a3a8a422923a5246/setuptools-80.10.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl
@@ -1552,32 +1513,23 @@ environments:
- pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl
- pypi: ./
osx-arm64:
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.8-h8d0574d_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250512.1-cxx17_hd41c47c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.2.1-he11bded_2.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda
@@ -1618,7 +1570,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl
- pypi: https://files.pythonhosted.org/packages/b8/01/74922a1c552137c05a41fee0c61153753dddc9117d19c7c5902c146c25ab/copier-9.11.3-py3-none-any.whl
- - pypi: git+https://github.com/easyscience/corelib.git#59d787b5158c6d72e0b4aa3cedd5e24f7fa61c56
- pypi: https://files.pythonhosted.org/packages/d7/cd/7ab01154e6eb79ee2fab76bf4d89e94c6648116557307ee4ebbb85e5c1bf/coverage-7.13.1-cp311-cp311-macosx_11_0_arm64.whl
- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f2/f2/728f041460f1b9739b85ee23b45fa5a505962ea11fd85bdbe2a02b021373/darkdetect-0.8.0-py3-none-any.whl
@@ -1630,6 +1581,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f0/d4/0a873d3ead6815fb046189d375144a97e04902dbe221eeeb582a71d69f85/easyscience-2.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl
@@ -1639,6 +1591,8 @@ environments:
- pypi: https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl
- pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c1/b0/1c628e26a0b95858f54aba17e1599e7f6cd241727596cc2580b72cb0a9bf/h5py-3.15.1-cp311-cp311-macosx_11_0_arm64.whl
@@ -1724,7 +1678,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/43/06/7264c0597e676104cc22ca73ee48f752767cd4b1fe084662620b17e10120/pillow-12.1.0-cp311-cp311-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/84/4a/d070dc6a36c2eb8b8a19b31908d0817e2a85fe0b70f9db20834a495a74e1/plopp-25.11.0-py3-none-any.whl
@@ -1776,6 +1729,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/e0/76/f963c61683a39084aa575f98089253e1e852a4417cb8a3a8a422923a5246/setuptools-80.10.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl
@@ -1810,26 +1764,14 @@ environments:
win-64:
- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/gsl-2.8-h5b8d9c4_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.8-h4fa8253_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.2.1-he453025_2.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.14-h0159041_2_cpython.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
@@ -1867,7 +1809,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl
- pypi: https://files.pythonhosted.org/packages/b8/01/74922a1c552137c05a41fee0c61153753dddc9117d19c7c5902c146c25ab/copier-9.11.3-py3-none-any.whl
- - pypi: git+https://github.com/easyscience/corelib.git#59d787b5158c6d72e0b4aa3cedd5e24f7fa61c56
- pypi: https://files.pythonhosted.org/packages/27/56/c216625f453df6e0559ed666d246fcbaaa93f3aa99eaa5080cea1229aa3d/coverage-7.13.1-cp311-cp311-win_amd64.whl
- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f2/f2/728f041460f1b9739b85ee23b45fa5a505962ea11fd85bdbe2a02b021373/darkdetect-0.8.0-py3-none-any.whl
@@ -1879,6 +1820,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f0/d4/0a873d3ead6815fb046189d375144a97e04902dbe221eeeb582a71d69f85/easyscience-2.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl
@@ -1888,6 +1830,8 @@ environments:
- pypi: https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl
- pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/23/95/499b4e56452ef8b6c95a271af0dde08dac4ddb70515a75f346d4f400579b/h5py-3.15.1-cp311-cp311-win_amd64.whl
@@ -1972,7 +1916,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/6c/af/b1d7e301c4cd26cd45d4af884d9ee9b6fab893b0ad2450d4746d74a6968c/pillow-12.1.0-cp311-cp311-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/84/4a/d070dc6a36c2eb8b8a19b31908d0817e2a85fe0b70f9db20834a495a74e1/plopp-25.11.0-py3-none-any.whl
@@ -2025,6 +1968,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/e0/76/f963c61683a39084aa575f98089253e1e852a4417cb8a3a8a422923a5246/setuptools-80.10.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl
@@ -2070,27 +2014,21 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-hbf7d49c_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
@@ -2136,7 +2074,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/b8/01/74922a1c552137c05a41fee0c61153753dddc9117d19c7c5902c146c25ab/copier-9.11.3-py3-none-any.whl
- - pypi: git+https://github.com/easyscience/corelib.git#59d787b5158c6d72e0b4aa3cedd5e24f7fa61c56
- pypi: https://files.pythonhosted.org/packages/ea/b4/694159c15c52b9f7ec7adf49d50e5f8ee71d3e9ef38adb4445d13dd56c20/coverage-7.13.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f2/f2/728f041460f1b9739b85ee23b45fa5a505962ea11fd85bdbe2a02b021373/darkdetect-0.8.0-py3-none-any.whl
@@ -2148,6 +2085,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f0/d4/0a873d3ead6815fb046189d375144a97e04902dbe221eeeb582a71d69f85/easyscience-2.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl
@@ -2157,6 +2095,8 @@ environments:
- pypi: https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/3a/30/d1c94066343a98bb2cea40120873193a4fed68c4ad7f8935c11caf74c681/h5py-3.15.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
@@ -2241,7 +2181,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/84/4a/d070dc6a36c2eb8b8a19b31908d0817e2a85fe0b70f9db20834a495a74e1/plopp-25.11.0-py3-none-any.whl
@@ -2293,6 +2232,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/e0/76/f963c61683a39084aa575f98089253e1e852a4417cb8a3a8a422923a5246/setuptools-80.10.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl
@@ -2325,32 +2265,23 @@ environments:
- pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl
- pypi: ./
osx-64:
- - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/gsl-2.8-hc707ee6_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20250512.1-cxx17_hfc00f1c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-25.2.1-h4e79119_2.conda
- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda
@@ -2391,7 +2322,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/b8/01/74922a1c552137c05a41fee0c61153753dddc9117d19c7c5902c146c25ab/copier-9.11.3-py3-none-any.whl
- - pypi: git+https://github.com/easyscience/corelib.git#59d787b5158c6d72e0b4aa3cedd5e24f7fa61c56
- pypi: https://files.pythonhosted.org/packages/ce/8a/87af46cccdfa78f53db747b09f5f9a21d5fc38d796834adac09b30a8ce74/coverage-7.13.1-cp312-cp312-macosx_10_13_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f2/f2/728f041460f1b9739b85ee23b45fa5a505962ea11fd85bdbe2a02b021373/darkdetect-0.8.0-py3-none-any.whl
@@ -2403,6 +2333,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f0/d4/0a873d3ead6815fb046189d375144a97e04902dbe221eeeb582a71d69f85/easyscience-2.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl
@@ -2412,6 +2343,8 @@ environments:
- pypi: https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/62/b8/c0d9aa013ecfa8b7057946c080c0c07f6fa41e231d2e9bd306a2f8110bdc/h5py-3.15.1-cp312-cp312-macosx_10_13_x86_64.whl
@@ -2496,7 +2429,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl
- - pypi: https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/84/4a/d070dc6a36c2eb8b8a19b31908d0817e2a85fe0b70f9db20834a495a74e1/plopp-25.11.0-py3-none-any.whl
@@ -2548,6 +2480,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/e0/76/f963c61683a39084aa575f98089253e1e852a4417cb8a3a8a422923a5246/setuptools-80.10.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl
@@ -2580,32 +2513,23 @@ environments:
- pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl
- pypi: ./
osx-arm64:
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.8-h8d0574d_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250512.1-cxx17_hd41c47c_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-25.2.1-he11bded_2.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda
@@ -2646,7 +2570,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl
- pypi: https://files.pythonhosted.org/packages/b8/01/74922a1c552137c05a41fee0c61153753dddc9117d19c7c5902c146c25ab/copier-9.11.3-py3-none-any.whl
- - pypi: git+https://github.com/easyscience/corelib.git#59d787b5158c6d72e0b4aa3cedd5e24f7fa61c56
- pypi: https://files.pythonhosted.org/packages/82/a8/6e22fdc67242a4a5a153f9438d05944553121c8f4ba70cb072af4c41362e/coverage-7.13.1-cp312-cp312-macosx_11_0_arm64.whl
- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f2/f2/728f041460f1b9739b85ee23b45fa5a505962ea11fd85bdbe2a02b021373/darkdetect-0.8.0-py3-none-any.whl
@@ -2658,6 +2581,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f0/d4/0a873d3ead6815fb046189d375144a97e04902dbe221eeeb582a71d69f85/easyscience-2.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl
@@ -2667,6 +2591,8 @@ environments:
- pypi: https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl
- pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/a4/5e/3c6f6e0430813c7aefe784d00c6711166f46225f5d229546eb53032c3707/h5py-3.15.1-cp312-cp312-macosx_11_0_arm64.whl
@@ -2751,7 +2677,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl
- - pypi: https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/84/4a/d070dc6a36c2eb8b8a19b31908d0817e2a85fe0b70f9db20834a495a74e1/plopp-25.11.0-py3-none-any.whl
@@ -2803,6 +2728,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/e0/76/f963c61683a39084aa575f98089253e1e852a4417cb8a3a8a422923a5246/setuptools-80.10.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl
@@ -2837,26 +2763,14 @@ environments:
win-64:
- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/gsl-2.8-h5b8d9c4_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.8-h4fa8253_0.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-25.2.1-he453025_2.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.12-h0159041_1_cpython.conda
- - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
@@ -2894,7 +2808,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl
- pypi: https://files.pythonhosted.org/packages/b8/01/74922a1c552137c05a41fee0c61153753dddc9117d19c7c5902c146c25ab/copier-9.11.3-py3-none-any.whl
- - pypi: git+https://github.com/easyscience/corelib.git#59d787b5158c6d72e0b4aa3cedd5e24f7fa61c56
- pypi: https://files.pythonhosted.org/packages/fa/dc/7282856a407c621c2aad74021680a01b23010bb8ebf427cf5eacda2e876f/coverage-7.13.1-cp312-cp312-win_amd64.whl
- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f2/f2/728f041460f1b9739b85ee23b45fa5a505962ea11fd85bdbe2a02b021373/darkdetect-0.8.0-py3-none-any.whl
@@ -2906,6 +2819,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/f0/d4/0a873d3ead6815fb046189d375144a97e04902dbe221eeeb582a71d69f85/easyscience-2.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl
@@ -2915,6 +2829,8 @@ environments:
- pypi: https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl
- pypi: https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cf/51/329e7436bf87ca6b0fe06dd0a3795c34bebe4ed8d6c44450a20565d57832/h5py-3.15.1-cp312-cp312-win_amd64.whl
@@ -2998,7 +2914,6 @@ environments:
- pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/a7/87/90b358775a3f02765d87655237229ba64a997b87efa8ccaca7dd3e36e7a7/pillow-12.1.0-cp312-cp312-win_amd64.whl
- - pypi: https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/84/4a/d070dc6a36c2eb8b8a19b31908d0817e2a85fe0b70f9db20834a495a74e1/plopp-25.11.0-py3-none-any.whl
@@ -3051,6 +2966,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/e0/76/f963c61683a39084aa575f98089253e1e852a4417cb8a3a8a422923a5246/setuptools-80.10.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl
@@ -3104,28 +3020,6 @@ packages:
purls: []
size: 23621
timestamp: 1650670423406
-- conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- build_number: 7
- sha256: 30006902a9274de8abdad5a9f02ef7c8bb3d69a503486af0c1faee30b023e5b7
- md5: eaac87c21aff3ed21ad9656697bb8326
- depends:
- - llvm-openmp >=9.0.1
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 8328
- timestamp: 1764092562779
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- build_number: 7
- sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd
- md5: a44032f282e7d2acdeb1c240308052dd
- depends:
- - llvm-openmp >=9.0.1
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 8325
- timestamp: 1764092507920
- pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl
name: aiohappyeyeballs
version: 2.6.1
@@ -4091,11 +3985,11 @@ packages:
requires_python: '>=3.5'
- pypi: ./
name: easydynamics
- version: 0.1.1+dev9
- sha256: de299c914d4a865b9e2fdefa5e3947f37b1f26f73ff9087f7918ee417f3dd288
+ version: 0.1.1+devdirty11
+ sha256: da4b49c88212d3ad9f3765778df8fe9f93b028370e1d4b4c5b9461d2c3cad3c8
requires_dist:
- darkdetect
- - easyscience @ git+https://github.com/easyscience/corelib.git@develop
+ - easyscience
- ipympl
- ipywidgets
- jupyterlab
@@ -4108,6 +4002,7 @@ packages:
- build ; extra == 'dev'
- copier ; extra == 'dev'
- docformatter ; extra == 'dev'
+ - gitpython ; extra == 'dev'
- interrogate ; extra == 'dev'
- jinja2 ; extra == 'dev'
- jupyterquiz ; extra == 'dev'
@@ -4134,9 +4029,10 @@ packages:
- validate-pyproject[all] ; extra == 'dev'
- versioningit ; extra == 'dev'
requires_python: '>=3.11'
-- pypi: git+https://github.com/easyscience/corelib.git#59d787b5158c6d72e0b4aa3cedd5e24f7fa61c56
+- pypi: https://files.pythonhosted.org/packages/f0/d4/0a873d3ead6815fb046189d375144a97e04902dbe221eeeb582a71d69f85/easyscience-2.1.0-py3-none-any.whl
name: easyscience
- version: 2.2.0
+ version: 2.1.0
+ sha256: 2caac82bd91d599321e586be23ebd24801fe2723abafc6c7aa8885cea4eaed6b
requires_dist:
- asteval
- bumps
@@ -4538,6 +4434,35 @@ packages:
- markdown ; extra == 'dev'
- flake8 ; extra == 'dev'
- wheel ; extra == 'dev'
+- pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl
+ name: gitdb
+ version: 4.0.12
+ sha256: 67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf
+ requires_dist:
+ - smmap>=3.0.1,<6
+ requires_python: '>=3.7'
+- pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl
+ name: gitpython
+ version: 3.1.46
+ sha256: 79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058
+ requires_dist:
+ - gitdb>=4.0.1,<5
+ - typing-extensions>=3.10.0.2 ; python_full_version < '3.10'
+ - coverage[toml] ; extra == 'test'
+ - ddt>=1.1.1,!=1.4.3 ; extra == 'test'
+ - mock ; python_full_version < '3.8' and extra == 'test'
+ - mypy==1.18.2 ; python_full_version >= '3.9' and extra == 'test'
+ - pre-commit ; extra == 'test'
+ - pytest>=7.3.1 ; extra == 'test'
+ - pytest-cov ; extra == 'test'
+ - pytest-instafail ; extra == 'test'
+ - pytest-mock ; extra == 'test'
+ - pytest-sugar ; extra == 'test'
+ - typing-extensions ; python_full_version < '3.11' and extra == 'test'
+ - sphinx>=7.1.2,<7.2 ; extra == 'doc'
+ - sphinx-rtd-theme ; extra == 'doc'
+ - sphinx-autodoc-typehints ; extra == 'doc'
+ requires_python: '>=3.7'
- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl
name: griffe
version: 1.15.0
@@ -4548,57 +4473,6 @@ packages:
- platformdirs>=4.2 ; extra == 'pypi'
- wheel>=0.42 ; extra == 'pypi'
requires_python: '>=3.10'
-- conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-hbf7d49c_1.conda
- sha256: f923af07c3a3db746d3be8efebdaa9c819a6007ee3cc12445cee059641611e05
- md5: 04e128d2adafe3c844cde58f103c481b
- depends:
- - __glibc >=2.17,<3.0.a0
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - libgcc >=13
- license: GPL-3.0-or-later
- license_family: GPL
- purls: []
- size: 2486744
- timestamp: 1737621160295
-- conda: https://conda.anaconda.org/conda-forge/osx-64/gsl-2.8-hc707ee6_1.conda
- sha256: 1d729f940f28dd5476b847123883abce119dff7af1abc236452d54ad4682b702
- md5: 382c8abc7d56f9236090a76fc6e51a97
- depends:
- - __osx >=10.13
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- license: GPL-3.0-or-later
- license_family: GPL
- purls: []
- size: 2300171
- timestamp: 1737621445693
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.8-h8d0574d_1.conda
- sha256: f11d8f2007f6591022afa958d8fe15afbe4211198d1603c0eb886bc21a9eb19e
- md5: cc261442bead590d89ca9f96884a344f
- depends:
- - __osx >=11.0
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- license: GPL-3.0-or-later
- license_family: GPL
- purls: []
- size: 1862134
- timestamp: 1737621413640
-- conda: https://conda.anaconda.org/conda-forge/win-64/gsl-2.8-h5b8d9c4_1.conda
- sha256: 87a3468e09cc1ee0268e8639debad6a5b440090ef8cb1d2ee5eed66c86085528
- md5: a47cf810b7c03955139a150b228b93ca
- depends:
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.2,<15
- - vc14_runtime >=14.29.30139
- license: GPL-3.0-or-later
- license_family: GPL
- purls: []
- size: 1528970
- timestamp: 1737622367981
- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
name: h11
version: 0.16.0
@@ -4722,18 +4596,6 @@ packages:
purls: []
size: 12358010
timestamp: 1767970350308
-- conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda
- sha256: 5a41fb28971342e293769fc968b3414253a2f8d9e30ed7c31517a15b4887246a
- md5: 0ee3bb487600d5e71ab7d28951b2016a
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- purls: []
- size: 13222158
- timestamp: 1767970128854
- pypi: https://files.pythonhosted.org/packages/b8/58/40fbbcefeda82364720eba5cf2270f98496bdfa19ea75b4cccae79c698e6/identify-2.6.16-py2.py3-none-any.whl
name: identify
version: 2.6.16
@@ -5534,76 +5396,6 @@ packages:
purls: []
size: 1174081
timestamp: 1750194620012
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
- build_number: 5
- sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c
- md5: c160954f7418d7b6e87eaf05a8913fa9
- depends:
- - libopenblas >=0.3.30,<0.3.31.0a0
- - libopenblas >=0.3.30,<1.0a0
- constrains:
- - mkl <2026
- - liblapack 3.11.0 5*_openblas
- - libcblas 3.11.0 5*_openblas
- - blas 2.305 openblas
- - liblapacke 3.11.0 5*_openblas
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 18213
- timestamp: 1765818813880
-- conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda
- build_number: 5
- sha256: 4754de83feafa6c0b41385f8dab1b13f13476232e16f524564a340871a9fc3bc
- md5: 36d2e68a156692cbae776b75d6ca6eae
- depends:
- - libopenblas >=0.3.30,<0.3.31.0a0
- - libopenblas >=0.3.30,<1.0a0
- constrains:
- - liblapack 3.11.0 5*_openblas
- - blas 2.305 openblas
- - libcblas 3.11.0 5*_openblas
- - mkl <2026
- - liblapacke 3.11.0 5*_openblas
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 18476
- timestamp: 1765819054657
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
- build_number: 5
- sha256: 620a6278f194dcabc7962277da6835b1e968e46ad0c8e757736255f5ddbfca8d
- md5: bcc025e2bbaf8a92982d20863fe1fb69
- depends:
- - libopenblas >=0.3.30,<0.3.31.0a0
- - libopenblas >=0.3.30,<1.0a0
- constrains:
- - libcblas 3.11.0 5*_openblas
- - liblapack 3.11.0 5*_openblas
- - liblapacke 3.11.0 5*_openblas
- - blas 2.305 openblas
- - mkl <2026
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 18546
- timestamp: 1765819094137
-- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda
- build_number: 5
- sha256: f0cb7b2697461a306341f7ff32d5b361bb84f3e94478464c1e27ee01fc8f276b
- md5: f9decf88743af85c9c9e05556a4c47c0
- depends:
- - mkl >=2025.3.0,<2026.0a0
- constrains:
- - liblapack 3.11.0 5*_mkl
- - libcblas 3.11.0 5*_mkl
- - blas 2.305 mkl
- - liblapacke 3.11.0 5*_mkl
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 67438
- timestamp: 1765819100043
- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
sha256: 318f36bd49ca8ad85e6478bd8506c88d82454cc008c1ac1c6bf00a3c42fa610e
md5: 72c8fd1af66bd67bf580645b426513ed
@@ -5703,66 +5495,6 @@ packages:
purls: []
size: 290754
timestamp: 1764018009077
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
- build_number: 5
- sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8
- md5: 6636a2b6f1a87572df2970d3ebc87cc0
- depends:
- - libblas 3.11.0 5_h4a7cf45_openblas
- constrains:
- - liblapacke 3.11.0 5*_openblas
- - blas 2.305 openblas
- - liblapack 3.11.0 5*_openblas
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 18194
- timestamp: 1765818837135
-- conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda
- build_number: 5
- sha256: 8077c29ea720bd152be6e6859a3765228cde51301fe62a3b3f505b377c2cb48c
- md5: b31d771cbccff686e01a687708a7ca41
- depends:
- - libblas 3.11.0 5_he492b99_openblas
- constrains:
- - liblapack 3.11.0 5*_openblas
- - blas 2.305 openblas
- - liblapacke 3.11.0 5*_openblas
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 18484
- timestamp: 1765819073006
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda
- build_number: 5
- sha256: 38809c361bbd165ecf83f7f05fae9b791e1baa11e4447367f38ae1327f402fc0
- md5: efd8bd15ca56e9d01748a3beab8404eb
- depends:
- - libblas 3.11.0 5_h51639a9_openblas
- constrains:
- - liblapacke 3.11.0 5*_openblas
- - liblapack 3.11.0 5*_openblas
- - blas 2.305 openblas
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 18548
- timestamp: 1765819108956
-- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda
- build_number: 5
- sha256: 49dc59d8e58360920314b8d276dd80da7866a1484a9abae4ee2760bc68f3e68d
- md5: b3fa8e8b55310ba8ef0060103afb02b5
- depends:
- - libblas 3.11.0 5_hf2e6a31_mkl
- constrains:
- - liblapack 3.11.0 5*_mkl
- - liblapacke 3.11.0 5*_mkl
- - blas 2.305 mkl
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 68079
- timestamp: 1765819124349
- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda
sha256: cbd8e821e97436d8fc126c24b50df838b05ba4c80494fbb93ccaf2e3b2d109fb
md5: 9f8a60a77ecafb7966ca961c94f33bd1
@@ -5917,32 +5649,6 @@ packages:
purls: []
size: 1042798
timestamp: 1765256792743
-- conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda
- sha256: e04b115ae32f8cbf95905971856ff557b296511735f4e1587b88abf519ff6fb8
- md5: c816665789d1e47cdfd6da8a81e1af64
- depends:
- - _openmp_mutex
- constrains:
- - libgomp 15.2.0 15
- - libgcc-ng ==15.2.0=*_15
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 422960
- timestamp: 1764839601296
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda
- sha256: 646c91dbc422fe92a5f8a3a5409c9aac66549f4ce8f8d1cab7c2aa5db789bb69
- md5: 8b216bac0de7a9d60f3ddeba2515545c
- depends:
- - _openmp_mutex
- constrains:
- - libgcc-ng ==15.2.0=*_16
- - libgomp 15.2.0 16
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 402197
- timestamp: 1765258985740
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda
sha256: 5f07f9317f596a201cc6e095e5fc92621afca64829785e483738d935f8cab361
md5: 5a68259fac2da8f2ee6f7bfe49c9eb8b
@@ -5953,79 +5659,6 @@ packages:
purls: []
size: 27256
timestamp: 1765256804124
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda
- sha256: 8a7b01e1ee1c462ad243524d76099e7174ebdd94ff045fe3e9b1e58db196463b
- md5: 40d9b534410403c821ff64f00d0adc22
- depends:
- - libgfortran5 15.2.0 h68bc16d_16
- constrains:
- - libgfortran-ng ==15.2.0=*_16
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 27215
- timestamp: 1765256845586
-- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda
- sha256: 7bb4d51348e8f7c1a565df95f4fc2a2021229d42300aab8366eda0ea1af90587
- md5: a089323fefeeaba2ae60e1ccebf86ddc
- depends:
- - libgfortran5 15.2.0 hd16e46c_15
- constrains:
- - libgfortran-ng ==15.2.0=*_15
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 139002
- timestamp: 1764839892631
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda
- sha256: 68a6c1384d209f8654112c4c57c68c540540dd8e09e17dd1facf6cf3467798b5
- md5: 11e09edf0dde4c288508501fe621bab4
- depends:
- - libgfortran5 15.2.0 hdae7583_16
- constrains:
- - libgfortran-ng ==15.2.0=*_16
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 138630
- timestamp: 1765259217400
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda
- sha256: d0e974ebc937c67ae37f07a28edace978e01dc0f44ee02f29ab8a16004b8148b
- md5: 39183d4e0c05609fd65f130633194e37
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=15.2.0
- constrains:
- - libgfortran 15.2.0
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 2480559
- timestamp: 1765256819588
-- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda
- sha256: 456385a7d3357d5fdfc8e11bf18dcdf71753c4016c440f92a2486057524dd59a
- md5: c2a6149bf7f82774a0118b9efef966dd
- depends:
- - libgcc >=15.2.0
- constrains:
- - libgfortran 15.2.0
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 1061950
- timestamp: 1764839609607
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda
- sha256: 9fb7f4ff219e3fb5decbd0ee90a950f4078c90a86f5d8d61ca608c913062f9b0
- md5: 265a9d03461da24884ecc8eb58396d57
- depends:
- - libgcc >=15.2.0
- constrains:
- - libgfortran 15.2.0
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- purls: []
- size: 598291
- timestamp: 1765258993165
- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda
sha256: 5b3e5e4e9270ecfcd48f47e3a68f037f5ab0f529ccb223e8e5d5ac75a58fc687
md5: 26c46f90d0e727e95c6c9498a33a09f3
@@ -6036,32 +5669,6 @@ packages:
purls: []
size: 603284
timestamp: 1765256703881
-- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda
- sha256: 8cdf11333a81085468d9aa536ebb155abd74adc293576f6013fc0c85a7a90da3
- md5: 3b576f6860f838f950c570f4433b086e
- depends:
- - libwinpthread >=12.0.0.r4.gg4f2fc60ca
- - libxml2
- - libxml2-16 >=2.14.6
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 2411241
- timestamp: 1765104337762
-- conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7
- md5: 64571d1dd6cdcfa25d0664a5950fdaa2
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LGPL-2.1-only
- purls: []
- size: 696926
- timestamp: 1754909290005
- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb
md5: c7c83eecbb72d88b940c249af56c8b17
@@ -6169,51 +5776,6 @@ packages:
purls: []
size: 33731
timestamp: 1750274110928
-- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
- sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5
- md5: be43915efc66345cccb3c310b6ed0374
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libgfortran
- - libgfortran5 >=14.3.0
- constrains:
- - openblas >=0.3.30,<0.3.31.0a0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 5927939
- timestamp: 1763114673331
-- conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda
- sha256: ba642353f7f41ab2d2eb6410fbe522238f0f4483bcd07df30b3222b4454ee7cd
- md5: 9241a65e6e9605e4581a2a8005d7f789
- depends:
- - __osx >=10.13
- - libgfortran
- - libgfortran5 >=14.3.0
- - llvm-openmp >=19.1.7
- constrains:
- - openblas >=0.3.30,<0.3.31.0a0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 6268795
- timestamp: 1763117623665
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda
- sha256: ebbbc089b70bcde87c4121a083c724330f02a690fb9d7c6cd18c30f1b12504fa
- md5: a6f6d3a31bb29e48d37ce65de54e2df0
- depends:
- - __osx >=11.0
- - libgfortran
- - libgfortran5 >=14.3.0
- - llvm-openmp >=19.1.7
- constrains:
- - openblas >=0.3.30,<0.3.31.0a0
- license: BSD-3-Clause
- license_family: BSD
- purls: []
- size: 4284132
- timestamp: 1768547079205
- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda
sha256: 04596fcee262a870e4b7c9807224680ff48d4d0cc0dac076a602503d3dc6d217
md5: da5be73701eecd0e8454423fd6ffcf30
@@ -6313,18 +5875,6 @@ packages:
purls: []
size: 421195
timestamp: 1753948426421
-- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0
- md5: 8a86073cf3b343b87d03f41790d8b4e5
- depends:
- - ucrt
- constrains:
- - pthreads-win32 <0.0a0
- - msys2-conda-epoch <0.0a0
- license: MIT AND BSD-3-Clause-Clear
- purls: []
- size: 36621
- timestamp: 1759768399557
- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda
sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c
md5: 5aa797f8787fe7a17d1b0821485b5adc
@@ -6334,41 +5884,6 @@ packages:
purls: []
size: 100393
timestamp: 1702724383534
-- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda
- sha256: 8b47d5fb00a6ccc0f495d16787ab5f37a434d51965584d6000966252efecf56d
- md5: 68dc154b8d415176c07b6995bd3a65d9
- depends:
- - icu >=78.1,<79.0a0
- - libiconv >=1.18,<2.0a0
- - liblzma >=5.8.1,<6.0a0
- - libxml2-16 2.15.1 h3cfd58e_1
- - libzlib >=1.3.1,<2.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- purls: []
- size: 43387
- timestamp: 1766327259710
-- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda
- sha256: a857e941156b7f462063e34e086d212c6ccbc1521ebdf75b9ed66bd90add57dc
- md5: 07d73826fde28e7dbaec52a3297d7d26
- depends:
- - icu >=78.1,<79.0a0
- - libiconv >=1.18,<2.0a0
- - liblzma >=5.8.1,<6.0a0
- - libzlib >=1.3.1,<2.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - libxml2 2.15.1
- license: MIT
- license_family: MIT
- purls: []
- size: 518964
- timestamp: 1766327232819
- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda
sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4
md5: edb0dca6bc32e4f4789199455a1dbeb8
@@ -6420,47 +5935,6 @@ packages:
purls: []
size: 55476
timestamp: 1727963768015
-- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda
- sha256: 2a41885f44cbc1546ff26369924b981efa37a29d20dc5445b64539ba240739e6
- md5: e2d811e9f464dd67398b4ce1f9c7c872
- depends:
- - __osx >=10.13
- constrains:
- - openmp 21.1.8|21.1.8.*
- - intel-openmp <0.0a0
- license: Apache-2.0 WITH LLVM-exception
- license_family: APACHE
- purls: []
- size: 311405
- timestamp: 1765965194247
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda
- sha256: 56bcd20a0a44ddd143b6ce605700fdf876bcf5c509adc50bf27e76673407a070
- md5: 206ad2df1b5550526e386087bef543c7
- depends:
- - __osx >=11.0
- constrains:
- - openmp 21.1.8|21.1.8.*
- - intel-openmp <0.0a0
- license: Apache-2.0 WITH LLVM-exception
- license_family: APACHE
- purls: []
- size: 285974
- timestamp: 1765964756583
-- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.8-h4fa8253_0.conda
- sha256: 145c4370abe870f10987efa9fc15a8383f1dab09abbc9ad4ff15a55d45658f7b
- md5: 0d8b425ac862bcf17e4b28802c9351cb
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - intel-openmp <0.0a0
- - openmp 21.1.8|21.1.8.*
- license: Apache-2.0 WITH LLVM-exception
- license_family: APACHE
- purls: []
- size: 347566
- timestamp: 1765964942856
- pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl
name: lmfit
version: 1.3.4
@@ -6945,20 +6419,6 @@ packages:
- griffe>=1.13
- typing-extensions>=4.0 ; python_full_version < '3.11'
requires_python: '>=3.10'
-- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda
- sha256: b2b4c84b95210760e4d12319416c60ab66e03674ccdcbd14aeb59f82ebb1318d
- md5: fd05d1e894497b012d05a804232254ed
- depends:
- - llvm-openmp >=21.1.8
- - tbb >=2022.3.0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LicenseRef-IntelSimplifiedSoftwareOct2022
- license_family: Proprietary
- purls: []
- size: 100224829
- timestamp: 1767634557029
- pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl
name: mpld3
version: 0.5.12
@@ -8543,11 +8003,6 @@ packages:
- trove-classifiers>=2024.10.12 ; extra == 'tests'
- defusedxml ; extra == 'xmp'
requires_python: '>=3.10'
-- pypi: https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl
- name: pip
- version: '25.3'
- sha256: 9655943313a94722b7774661c21049070f6bbb0a1516bf02f7c8d5d9201514cd
- requires_python: '>=3.9'
- pypi: https://files.pythonhosted.org/packages/c4/36/ce5f75aa7c736a663a901766edc3580098c7ea3959a0e878363a54a3714e/pixi_kernel-0.7.1-py3-none-any.whl
name: pixi-kernel
version: 0.7.1
@@ -10239,6 +9694,11 @@ packages:
version: 1.17.0
sha256: 4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274
requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*'
+- pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl
+ name: smmap
+ version: 5.0.2
+ sha256: b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e
+ requires_python: '>=3.7'
- pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl
name: soupsieve
version: 2.8.3
@@ -10264,19 +9724,6 @@ packages:
requires_dist:
- wcwidth ; extra == 'widechars'
requires_python: '>=3.7'
-- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda
- sha256: abd9a489f059fba85c8ffa1abdaa4d515d6de6a3325238b8e81203b913cf65a9
- md5: 0f9817ffbe25f9e69ceba5ea70c52606
- depends:
- - libhwloc >=2.12.2,<2.12.3.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: Apache-2.0
- license_family: APACHE
- purls: []
- size: 155869
- timestamp: 1767886839029
- pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl
name: terminado
version: 0.18.1
diff --git a/pyproject.toml b/pyproject.toml
index 485d03b1..583edcef 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -22,7 +22,7 @@ classifiers = [
]
requires-python = '>=3.11'
dependencies = [
- 'easyscience @ git+https://github.com/easyscience/corelib.git@develop', # The base library of the EasyScience framework
+ 'easyscience', # The base library of the EasyScience framework
'pooch', # Data downloader
'darkdetect', # Detecting dark mode (system-level)
'pandas', # Displaying tables in Jupyter notebooks
From 94c939801ef6ab5147a2918edbc8447b423504d1 Mon Sep 17 00:00:00 2001
From: Andrew Sazonov
Date: Thu, 5 Mar 2026 01:51:33 +0100
Subject: [PATCH 04/16] Apply linting and formatting
---
.copier-answers.yml | 5 ++--
CONTRIBUTING.md | 7 ++---
README.md | 32 +++++++++++++----------
docs/docs/installation-and-setup/index.md | 4 +--
docs/docs/introduction/index.md | 11 +++-----
pyproject.toml | 20 +++++++-------
6 files changed, 41 insertions(+), 38 deletions(-)
diff --git a/.copier-answers.yml b/.copier-answers.yml
index 8e67fdfb..9a09536b 100644
--- a/.copier-answers.yml
+++ b/.copier-answers.yml
@@ -1,6 +1,6 @@
# WARNING: Do not edit this file manually.
# Any changes will be overwritten by Copier.
-_commit: v0.8.0-7-ge6d283b
+_commit: v0.8.0-8-gb03d60e
_src_path: gh:easyscience/templates
app_docs_url: https://easyscience.github.io/dynamics-app
app_doi: 10.5281/zenodo.18163581
@@ -17,7 +17,8 @@ lib_python_min: '3.11'
lib_repo_name: dynamics-lib
project_contact_email: henrik.jacobsen@ess.eu
project_copyright_years: 2025-2026
-project_extended_description: For plotting and fitting QENS and INS powder data
+project_extended_description: A software for plotting and fitting QENS and INS powder
+ data
project_name: EasyDynamics
project_short_description: QENS data analysis
project_shortcut: EQ
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0d54aaff..d3dd2479 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -42,8 +42,8 @@ Please make sure you follow the EasyScience organization-wide
If you are not planning to modify the code, you may want to:
- π Report a bug β see [Reporting Issues](#11-reporting-issues)
-- π‘ Report a security issue β
- see [Security Issues](#12-security-issues)
+- π‘ Report a security issue β see
+ [Security Issues](#12-security-issues)
- π¬ Ask a question or start a discussion at
[Project Discussions](https://github.com/easyscience/dynamics-lib/discussions)
@@ -83,7 +83,8 @@ strategy.
If you are not a core maintainer of this repository, follow these steps.
-1. Open the repository page: `https://github.com/easyscience/dynamics-lib`
+1. Open the repository page:
+ `https://github.com/easyscience/dynamics-lib`
2. Click the **Fork** button (top-right corner). This creates your own
copy of the repository.
diff --git a/README.md b/README.md
index 0ebd5fd5..065db358 100644
--- a/README.md
+++ b/README.md
@@ -9,11 +9,11 @@
-**EasyDynamics** is for plotting and fitting QENS and INS powder data.
+**EasyDynamics** is a software for plotting and fitting QENS and INS
+powder data.
-
**EasyDynamics** is developed both as a Python library and as a
cross-platform desktop application.
@@ -21,26 +21,30 @@ Here, we focus on the Python library. For the graphical user interface
(GUI), please see the corresponding
[GUI resources](https://github.com/easyscience/dynamics-app).
-
-
-
-
-License: [BSD 3-Clause](https://github.com/easyscience/dynamics-lib/blob/master/LICENSE)
+License:
+[BSD 3-Clause](https://github.com/easyscience/dynamics-lib/blob/master/LICENSE)
## Useful Links
### For Users
- π [Documentation](https://easyscience.github.io/dynamics-lib/latest)
-- π [Getting Started](https://easyscience.github.io/dynamics-lib/latest/introduction)
-- π§ͺ [Tutorials](https://easyscience.github.io/dynamics-lib/latest/tutorials)
-- π¬ [Get in Touch](https://easyscience.github.io/dynamics-lib/latest/introduction/#get-in-touch)
-- π§Ύ [Citation](https://easyscience.github.io/dynamics-lib/latest/introduction/#citation)
+- π
+ [Getting Started](https://easyscience.github.io/dynamics-lib/latest/introduction)
+- π§ͺ
+ [Tutorials](https://easyscience.github.io/dynamics-lib/latest/tutorials)
+- π¬
+ [Get in Touch](https://easyscience.github.io/dynamics-lib/latest/introduction/#get-in-touch)
+- π§Ύ
+ [Citation](https://easyscience.github.io/dynamics-lib/latest/introduction/#citation)
### For Contributors
- π§βπ» [Source Code](https://github.com/easyscience/dynamics-lib)
- π [Issue Tracker](https://github.com/easyscience/dynamics-lib/issues)
-- π‘ [Discussions](https://github.com/easyscience/dynamics-lib/discussions)
-- π€ [Contributing Guide](https://github.com/easyscience/dynamics-lib/blob/master/CONTRIBUTING.md)
-- π‘ [Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md)
+- π‘
+ [Discussions](https://github.com/easyscience/dynamics-lib/discussions)
+- π€
+ [Contributing Guide](https://github.com/easyscience/dynamics-lib/blob/master/CONTRIBUTING.md)
+- π‘
+ [Code of Conduct](https://github.com/easyscience/.github/blob/master/CODE_OF_CONDUCT.md)
diff --git a/docs/docs/installation-and-setup/index.md b/docs/docs/installation-and-setup/index.md
index e587c850..150ba5ab 100644
--- a/docs/docs/installation-and-setup/index.md
+++ b/docs/docs/installation-and-setup/index.md
@@ -95,8 +95,8 @@ This section describes the simplest way to set up EasyDynamics using
## Classical Installation
This section describes how to install EasyDynamics using the traditional
-method with **pip**. It is assumed that you are familiar with Python package
-management and virtual environments.
+method with **pip**. It is assumed that you are familiar with Python
+package management and virtual environments.
### Environment Setup optional { #environment-setup data-toc-label="Environment Setup" }
diff --git a/docs/docs/introduction/index.md b/docs/docs/introduction/index.md
index 2058e9a5..7b8e76a1 100644
--- a/docs/docs/introduction/index.md
+++ b/docs/docs/introduction/index.md
@@ -6,8 +6,8 @@ icon: material/information-slab-circle
## Description
-**EasyDynamics** is for plotting and fitting QENS and INS powder data.
-
+**EasyDynamics** is a software for plotting and fitting QENS and INS
+powder data.
**EasyDynamics** is developed both as a Python library and as a
cross-platform desktop application.
@@ -16,10 +16,6 @@ Here, we focus on the Python library. For the graphical user interface
(GUI), please see the corresponding
[GUI resources](https://easyscience.github.io/dynamics-app).
-
-
-
-