From db9aa5d6a33b2b5e71230eee67140b625d90d204 Mon Sep 17 00:00:00 2001 From: Michael Walsh <68125095+walshmm@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:16:31 -0500 Subject: [PATCH 1/2] initialize commons with some utils (#1) * initialize commons with some utils * update github actions to point at correct app name * update more missing packagename updates, added some ai generated docs for the initial utils * condense docs --- .github/workflows/test_and_deploy.yaml | 4 +- docs/config.rst | 214 + docs/index.rst | 3 + docs/singleton.rst | 291 + docs/time.rst | 265 + notebooks/example.ipynb | 27 - pixi.lock | 5406 ++++-------------- pyproject.toml | 59 +- scripts/myscripts.py | 2 - src/commons/__init__.py | 18 + src/commons/_version.py | 1 + src/commons/config.py | 485 ++ src/commons/decorators/__init__.py | 0 src/commons/decorators/singleton.py | 77 + src/commons/resources/application.yml | 8 + src/commons/time.py | 40 + src/packagenamepy/__init__.py | 13 - src/packagenamepy/configuration.py | 105 - src/packagenamepy/configuration_template.ini | 2 - src/packagenamepy/help/help_model.py | 12 - src/packagenamepy/home/home_model.py | 12 - src/packagenamepy/home/home_presenter.py | 19 - src/packagenamepy/home/home_view.py | 13 - src/packagenamepy/mainwindow.py | 54 - src/packagenamepy/packagename.py | 62 - tests/conftest.py | 34 + tests/resources/application.yml | 16 + tests/resources/commons_next.yml | 3 + tests/resources/outputs/empty.txt | 0 tests/resources/test.yml | 3 + tests/test_config.py | 381 ++ tests/test_version.py | 2 +- tests/util/Config_helpers.py | 64 + 33 files changed, 2981 insertions(+), 4714 deletions(-) create mode 100644 docs/config.rst create mode 100644 docs/singleton.rst create mode 100644 docs/time.rst delete mode 100644 notebooks/example.ipynb delete mode 100644 scripts/myscripts.py create mode 100644 src/commons/__init__.py create mode 100644 src/commons/_version.py create mode 100644 src/commons/config.py create mode 100644 src/commons/decorators/__init__.py create mode 100644 src/commons/decorators/singleton.py create mode 100644 src/commons/resources/application.yml create mode 100644 src/commons/time.py delete mode 100644 src/packagenamepy/__init__.py delete mode 100644 src/packagenamepy/configuration.py delete mode 100644 src/packagenamepy/configuration_template.ini delete mode 100644 src/packagenamepy/help/help_model.py delete mode 100644 src/packagenamepy/home/home_model.py delete mode 100644 src/packagenamepy/home/home_presenter.py delete mode 100644 src/packagenamepy/home/home_view.py delete mode 100644 src/packagenamepy/mainwindow.py delete mode 100644 src/packagenamepy/packagename.py create mode 100644 tests/conftest.py create mode 100644 tests/resources/application.yml create mode 100644 tests/resources/commons_next.yml create mode 100644 tests/resources/outputs/empty.txt create mode 100644 tests/resources/test.yml create mode 100644 tests/test_config.py create mode 100644 tests/util/Config_helpers.py diff --git a/.github/workflows/test_and_deploy.yaml b/.github/workflows/test_and_deploy.yaml index 67bee23..21cb9ab 100644 --- a/.github/workflows/test_and_deploy.yaml +++ b/.github/workflows/test_and_deploy.yaml @@ -8,8 +8,8 @@ on: tags: ["v*"] env: - PKG_NAME: examplepyapp - MODULE_NAME: packagenamepy + PKG_NAME: commons + MODULE_NAME: commons # cancel previous job if new commit is pushed concurrency: diff --git a/docs/config.rst b/docs/config.rst new file mode 100644 index 0000000..1a8f5ac --- /dev/null +++ b/docs/config.rst @@ -0,0 +1,214 @@ +================================ +Configuration Management (Config) +================================ + +YAML-based configuration system with environment layering, deep merging, token substitution, and automatic backup. + +Quick Reference +=============== + +.. code-block:: python + + from commons import Config + + # Access values + Config["database.host"] # Dot-delimited lookup + Config.exists("optional.key") # Check if key exists + + # Environment management + Config.loadEnv("production.yml") # Load environment config + Config.reload(env_name="qa.yml") # Reload with environment + Config.getCurrentEnv() # Get current environment name + + # User config + Config.swapToUserYml() # Use ~/.{package_name}-user.yml + Config.shouldSwapToUserYml() # Check if user config available + + # Backup + Config.persistBackup() # Backup to ~/.{package_name}/application.yml.bak + Config.archiveUserYml() # Archive versioned user config + +Dot-Delimited Lookup +-------------------- + +Access nested values with dot notation. Automatically resolves token substitutions: + +.. code-block:: python + + Config["database.host"] # localhost + Config["paths.input"] # /data/input (resolved from ${paths.base}/input) + Config.exists("optional.setting") # Returns bool + +Configuration Layering +---------------------- + +Base configuration (``application.yml``) + environment override (e.g., ``production.yml``) merged recursively: + +**Base (application.yml):** + +.. code-block:: yaml + + database: + host: localhost + port: 5432 + credentials: + username: user + password: pass + +**Override (production.yml):** + +.. code-block:: yaml + + database: + host: prod-db.example.com + credentials: + password: secure-pass + +**Result (merged):** + +.. code-block:: yaml + + database: + host: prod-db.example.com # Overridden + port: 5432 # From base (preserved) + credentials: + username: user # From base (preserved) + password: secure-pass # Overridden + +**Merge rules:** Dictionaries merge recursively; scalar values replace entirely; new keys added; nothing deleted. + +Token Substitution +------------------ + +Reference other config values with ``${key.subkey}`` syntax: + +.. code-block:: yaml + + paths: + base: /data + input: ${paths.base}/input # Resolves to /data/input + output: ${paths.base}/output + + module: + root: /app # Auto-set by Config + +Environment Configuration +-------------------------- + +Specify environment via: + +- Environment variable: ``env=environment_name`` +- YAML property: ``environment: environment_name`` +- Auto-detect user config: ``~/.{package_name}-user.yml`` + +User Configuration Management +----------------------------- + +User config (``~/.{package_name}-user.yml``) auto-loads if present and no explicit ``env`` specified. Old configs archived with version + timestamp when app version changes. + +Configuration Backup +-------------------- + +Backups created automatically during ``Config.reload()``: + +.. code-block:: text + + ~/.{package_name}/ + ├── application.yml.bak # Latest backup + └── {package_name}-user-1.0.0-2026-03-04T16:10:34.817Z.yml.bak # Versioned + +Deployment Configuration +------------------------ + +Auto-select environment based on app version: + +.. code-block:: python + + Config.configureForDeploy() + +- Contains ``dev`` → NEXT environment +- Contains ``rc`` → QA environment +- Otherwise → PROD environment + +Merges and exports to ``application.yml``. + +Directory Path Expansion +------------------------ + +Home directory ``~`` automatically expands: + +.. code-block:: yaml + + instrument: + home: ~/instruments # Expands to /home/user/instruments + samples: + home: ~/samples + +Error Handling +-------------- + +Failed config loading automatically restores previous state: + +.. code-block:: python + + try: + Config.loadEnv("invalid.yml") # Fails, restores previous + except Exception: + pass # Config unchanged + + try: + value = Config["nonexistent"] # Raises KeyError + except KeyError: + pass + +Examples +======== + +Basic Usage +----------- + +.. code-block:: python + + from commons import Config + + # Read values + host = Config["database.host"] + + # Safe access with check + if Config.exists("optional.feature"): + feature_dir = Config["optional.feature"] + + # Switch environment + Config.loadEnv("production.yml") + prod_host = Config["database.host"] + +Configuration File Example +-------------------------- + +.. code-block:: yaml + + application: + version: 1.0.0 + + environment: default + + database: + host: localhost + port: 5432 + credentials: + username: app_user + password: app_pass + + paths: + base: /data + input: ${paths.base}/input + output: ${paths.base}/output + resources: ${module.root}/resources + + logging: + level: INFO + file: app.log + + # Set automatically + module: + root: /app diff --git a/docs/index.rst b/docs/index.rst index b3000f3..48c92b9 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -7,6 +7,9 @@ Welcome to python project template docs! :caption: Contents: README + config + singleton + time ========================================= Indices and tables diff --git a/docs/singleton.rst b/docs/singleton.rst new file mode 100644 index 0000000..3e484c2 --- /dev/null +++ b/docs/singleton.rst @@ -0,0 +1,291 @@ +========================== +Singleton Decorator Pattern +========================== + +Ensures only one instance of a decorated class exists throughout application lifecycle. + +Quick Reference +=============== + +.. code-block:: python + + from commons.decorators.singleton import Singleton, reset_Singletons + + @Singleton + class MyService: + def __init__(self): + self.state = {} + + # All references point to same instance + s1 = MyService() + s2 = MyService() + assert s1 is s2 # True + + # Testing: reset before each test + MyService._reset_Singleton() # Reset one singleton + reset_Singletons() # Reset all singletons + reset_Singletons(fully_unwrap=True) # Remove decorator behavior + +Basic Usage +----------- + +.. code-block:: python + + @Singleton + class DatabaseConnection: + def __init__(self): + self.connection = self._connect() + + def _connect(self): + return "Connected" + + db1 = DatabaseConnection() + db2 = DatabaseConnection() + + assert db1 is db2 # Same object + assert db1 is not DatabaseConnection() # Never creates new instances + +Key Behaviors +============= + +Single Instance +--------------- + +Only one object created, all calls reuse it: + +.. code-block:: python + + @Singleton + class Logger: + def __init__(self): + print("Initialized") + + Logger() # Prints "Initialized" + Logger() # No print - reuses existing + Logger() # No print - reuses existing + +Initialization Guard +-------------------- + +``__init__`` runs only on first instantiation, skipped on subsequent calls: + +.. code-block:: python + + @Singleton + class Counter: + def __init__(self): + self.count = 0 + + c1 = Counter() + c1.count = 5 + + c2 = Counter() # __init__ not called + c2.count # 5, not 0 - same instance + +Reset and Testing +----------------- + +Reset individual singleton (allows re-initialization): + +.. code-block:: python + + MyClass._reset_Singleton() # Next call creates new instance + MyClass._reset_Singleton(fully_unwrap=True) # Remove Singleton behavior + +Reset all singletons: + +.. code-block:: python + + from commons.decorators.singleton import reset_Singletons + + reset_Singletons() # Reset all + reset_Singletons(fully_unwrap=True) # Fully unwrap all + +Examples +======== + +Pytest Fixture +-------------- + +.. code-block:: python + + import pytest + from commons.decorators.singleton import reset_Singletons + + @pytest.fixture(autouse=True) + def reset_all_singletons(): + """Fresh instance for each test.""" + reset_Singletons() + yield + reset_Singletons() + + def test_one(): + obj1 = MyClass() + obj1.value = "test1" + + def test_two(): + obj2 = MyClass() + assert obj2.value != "test1" # Fresh instance + +Selective Reset +--------------- + +.. code-block:: python + + @pytest.fixture + def fresh_database(): + """Fresh database instance.""" + DatabaseConnection._reset_Singleton() + db = DatabaseConnection() + yield db + DatabaseConnection._reset_Singleton() + + def test_with_fresh_db(fresh_database): + # fresh_database is guaranteed new instance + pass + +Use Cases +========= + +Shared Resource Pools +--------------------- + +.. code-block:: python + + @Singleton + class ConnectionPool: + def __init__(self): + self.connections = self._create_pool(10) + + def get_connection(self): + return self.connections.pop() + + # Entire app shares same pool + pool = ConnectionPool() + +Logging and Monitoring +---------------------- + +.. code-block:: python + + @Singleton + class ApplicationLogger: + def __init__(self): + self.messages = [] + + def log(self, msg): + self.messages.append(msg) + + # All modules log to same instance + logger = ApplicationLogger() + +State Management +---------------- + +.. code-block:: python + + @Singleton + class SessionManager: + def __init__(self): + self.sessions = {} + self.current_user = None + + def set_user(self, user): + self.current_user = user + + # Application-wide state + mgr = SessionManager() + +Configuration Objects +--------------------- + +.. code-block:: python + + from commons import Config # Already a Singleton + + # Config is single instance across app + cfg = Config + cfg.reload() + host = cfg["database.host"] + +Thread Safety +============= + +Not thread-safe by default. For multi-threaded use, add locking: + +.. code-block:: python + + import threading + + @Singleton + class ThreadSafeResource: + def __init__(self): + self.lock = threading.Lock() + self.data = [] + + def append(self, value): + with self.lock: + self.data.append(value) + +Common Patterns +=============== + +Lazy Initialization +------------------- + +.. code-block:: python + + @Singleton + class ExpensiveResource: + def __init__(self): + self.resource = None + + def get_resource(self): + if self.resource is None: + self.resource = self._load() + return self.resource + +Service Factory +--------------- + +.. code-block:: python + + @Singleton + class ServiceFactory: + def __init__(self): + self.services = {} + + def register(self, name, service): + self.services[name] = service + + def get(self, name): + return self.services.get(name) + +Pitfalls +======== + +State Pollution Between Tests +----------------------------- + +Always reset singletons in test fixtures to prevent state leakage between tests. + +Over-Use +-------- + +Too many singletons make code harder to test and reason about. Use when truly needed for application-wide shared resources. + +Mutable Class Variables +----------------------- + +.. code-block:: python + + # Bad - shared mutable + @Singleton + class BadClass: + items = [] # Shared across all + + # Good - instance variable + @Singleton + class GoodClass: + def __init__(self): + self.items = [] diff --git a/docs/time.rst b/docs/time.rst new file mode 100644 index 0000000..8d18400 --- /dev/null +++ b/docs/time.rst @@ -0,0 +1,265 @@ +==================== +Time Utilities (time) +==================== + +High-precision timestamp generation, parsing, and ISO 8601 formatting with nanosecond accuracy. + +Quick Reference +=============== + +.. code-block:: python + + from commons.time import timestamp, parseTimestamp, isoFromTimestamp + + # Generate timestamps + ts = timestamp() # Current time (float seconds) + ts = timestamp(ensureUnique=True) # Unique, monotonically increasing + + # Convert between formats + float_seconds = parseTimestamp("2026-03-04T16:10:34.817Z") # ISO string → float + float_seconds = parseTimestamp(1741100434.817) # Float → float + float_seconds = parseTimestamp(1741100434817) # Milliseconds → float + + # Format for display/storage + iso_str = isoFromTimestamp(1741100434.817) # 2026-03-04T16:10:34.817000000Z + +timestamp() +----------- + +Generate current timestamp in seconds (float) with nanosecond precision: + +.. code-block:: python + + ts = timestamp() # 1741100434.817123456 + ts = timestamp(ensureUnique=True) # Guaranteed > previous, even in same second + +**Parameters:** + +- ``ensureUnique`` (bool): If True, timestamps are monotonically increasing (useful for event ordering) + +**Returns:** float (seconds since epoch) + +parseTimestamp() +---------------- + +Parse timestamps from multiple formats to float seconds: + +.. code-block:: python + + parseTimestamp("2026-03-04T16:10:34.817Z") # ISO 8601 string + parseTimestamp(1741100434.817) # Float seconds + parseTimestamp(1741100434817) # Legacy milliseconds (int) + +**Parameters:** + +- ``ts`` (str | float | int): Timestamp in supported format + +**Returns:** float (seconds since epoch) + +**Formats:** + +- ISO 8601 string: ``"2026-03-04T16:10:34.817Z"`` +- Float seconds: ``1741100434.817`` +- Integer milliseconds: ``1741100434817`` (deprecated) + +isoFromTimestamp() +------------------ + +Convert float seconds to ISO 8601 string with nanosecond precision and timezone: + +.. code-block:: python + + iso = isoFromTimestamp(1741100434.817) + # Returns: "2026-03-04T16:10:34.817000000Z" + +**Parameters:** + +- ``ts`` (float): Seconds since epoch + +**Returns:** str (ISO 8601 format with nanosecond precision and local timezone) + +Examples +======== + +Event Logging +------------- + +.. code-block:: python + + from commons.time import timestamp, isoFromTimestamp + + events = [] + for event_type in ["login", "query", "logout"]: + events.append({ + 'type': event_type, + 'timestamp': isoFromTimestamp(timestamp(ensureUnique=True)) + }) + # Guaranteed ordering: each timestamp strictly increases + +Performance Measurement +----------------------- + +.. code-block:: python + + from commons.time import timestamp + + start = timestamp() + perform_operation() + elapsed = timestamp() - start + print(f"Operation took {elapsed} seconds") + +Timestamp Conversion Round-Trip +------------------------------- + +.. code-block:: python + + from commons.time import timestamp, isoFromTimestamp, parseTimestamp + + # Original timestamp + ts1 = timestamp() + + # Convert to ISO and back + iso = isoFromTimestamp(ts1) # "2026-03-04T16:10:34.817Z" + ts2 = parseTimestamp(iso) + + # Minor rounding error, but functionally equivalent + assert abs(ts1 - ts2) < 0.001 + +Configuration Backup Timestamping +---------------------------------- + +.. code-block:: python + + from commons.time import isoFromTimestamp, timestamp + from pathlib import Path + + def backup_file(filepath): + backup_time = isoFromTimestamp(timestamp()) + backup_path = Path(filepath).parent / f"{filepath}-{backup_time}.bak" + shutil.copy(filepath, backup_path) + return backup_path + +Use Cases +========= + +Audit Trails +------------ + +.. code-block:: python + + from commons.time import timestamp, isoFromTimestamp + + class AuditLog: + def __init__(self): + self.events = [] + + def record(self, action, details): + self.events.append({ + 'action': action, + 'timestamp': isoFromTimestamp(timestamp(ensureUnique=True)), + 'details': details + }) + + audit = AuditLog() + audit.record("user_login", {"user": "alice"}) + audit.record("data_export", {"table": "sales"}) + +Time Series Data +---------------- + +.. code-block:: python + + from commons.time import timestamp, isoFromTimestamp + + class TimeSeries: + def __init__(self): + self.points = [] + + def add_point(self, value): + self.points.append({ + 'timestamp': timestamp(ensureUnique=True), + 'value': value + }) + + def export_csv(self): + lines = ["timestamp,value"] + for point in self.points: + iso_ts = isoFromTimestamp(point['timestamp']) + lines.append(f"{iso_ts},{point['value']}") + return "\n".join(lines) + +Database Integration +-------------------- + +.. code-block:: python + + from commons.time import timestamp, isoFromTimestamp, parseTimestamp + + class DatabaseRecord: + def __init__(self, data): + self.data = data + self.created_at = timestamp() + + def to_db(self): + """Save to database with ISO timestamp.""" + return { + **self.data, + 'created_at': isoFromTimestamp(self.created_at) + } + + @classmethod + def from_db(cls, db_row): + """Load from database.""" + record = cls(db_row) + record.created_at = parseTimestamp(db_row['created_at']) + return record + +Precision and Guarantees +======================== + +Nanosecond Precision +-------------------- + +All timestamps maintain nanosecond precision (9 decimal places): + +.. code-block:: python + + iso = isoFromTimestamp(timestamp()) + # "2026-03-04T16:10:34.817123456Z" <- 9 decimal places (nanoseconds) + +Monotonic Uniqueness +-------------------- + +With ``ensureUnique=True``, timestamps strictly increase even in same second: + +.. code-block:: python + + from commons.time import timestamp + + times = [timestamp(ensureUnique=True) for _ in range(100)] + + # Each is strictly greater than the previous + for i in range(len(times) - 1): + assert times[i] < times[i + 1] + +Format Examples +=============== + +.. code-block:: text + + Float seconds: + 1741100434.817123456 + + ISO 8601 (with nanoseconds): + 2026-03-04T16:10:34.817123456Z + │ │ │ │ │ │ │ + Year ─────┘ │ │ │ │ │ + Month ──────┘ │ │ │ │ + Day ───────────┘ │ │ │ + Hour ────────────┘ │ │ + Minute ─────────────┘ │ + Second & nanoseconds ──────────┘ + Timezone indicator: Z = UTC + + Milliseconds (legacy): + 1741100434817 diff --git a/notebooks/example.ipynb b/notebooks/example.ipynb deleted file mode 100644 index 7fa8701..0000000 --- a/notebooks/example.ipynb +++ /dev/null @@ -1,27 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Overview\n", - "\n", - "This folder is used to store notebooks that demonstrate how to use the library in an interactive environment like Jupyter." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "language_info": { - "name": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/pixi.lock b/pixi.lock index ebe1d8c..6426624 100644 --- a/pixi.lock +++ b/pixi.lock @@ -6,48 +6,42 @@ environments: - url: https://prefix.dev/pixi-build-backends/ indexes: - https://pypi.org/simple - options: - pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-auth-0.13.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-cli-base-0.8.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-client-1.14.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/boolean.py-5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py312h4c3975b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py314h67df5f8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py314h7fe84b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py312ha4b625e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cyclonedx-python-lib-11.6.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda @@ -55,24 +49,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.24.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.86.4-h5192d8d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.26.10-h0363672_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.26.10-h17cb667_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.3.2-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.16.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.28.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda @@ -83,7 +62,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.16-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda @@ -98,9 +77,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyha804496_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda @@ -108,130 +84,86 @@ environments: - 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/libcap-2.77-h3ff7636_0.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/libclang-cpp21.1-21.1.8-default_h99862b1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.0-default_h746c552_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.0-hf7376ad_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.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/libopengl-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.6.1-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.2-hb80d175_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.10-hd0affe5_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.6.0-h9635ea4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/license-expression-30.4.4-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py314h9891dd4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.3-py310h6de7dc8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py312h33ff503_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packageurl-python-0.17.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hadf4263_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py312h50c33e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-api-0.0.34-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-audit-2.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-requirements-parser-32.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkce-1.0.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-h9a6aba3_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-serializable-2.1.0-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py312h868fb18_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.13.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.11-py314h92491ac_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.17.0-py314ha160325_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyqtgraph-0.14.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hd63d673_2_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-5.15.15-h57362cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-hc240232_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-webengine-5.15.15-h5dcc908_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/qtpy-2.4.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readchar-4.2.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda @@ -242,14 +174,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.2-h40fa522_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.1-py314hdafbbf9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py312h868fb18_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.15-py312h5253ce2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.4-h40fa522_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.1-py312h7900ff3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/semver-3.0.4-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sip-6.10.0-py314ha160325_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda @@ -277,55 +209,25 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.9.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.10.7-h6dd6661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.10.8-h6dd6661_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/versioningit-3.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.39.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.47-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxshmfence-1.3.3-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: https://files.pythonhosted.org/packages/6a/2b/7f0990efc53f85dd90213b33a6ac0356d5adbb52e0c5bf15a66e9b5193ef/bm3d-4.0.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/01/907bd81c49be4fe40719149dceeb79467fa39b75bfac103e40670606be90/bm3d_streak_removal-0.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/47/034be51bc2b40279fd1417397d3f330b73906774bd6eaecd26ed93c1491f/bm4d-4.2.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/14/2f/967ba146e6d58cf6a652da73885f52fc68001525b4197effc174321d70b4/jmespath-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/af/009958cbf23fac551a940d34e3206e6c7eed2b8c940d0c3afd1feb0b0589/playwright-1.58.0-py3-none-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/a0/c4/b4d4827c93ef43c01f599ef31453ccc1c132b353284fc6c87d535c233129/pyee-13.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/1c/b00940ab9eb8ede7897443b771987f2f4a76f06be02f1b3f01eb7567e24a/pytest_base_url-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/61/4d333d8354ea2bea2c2f01bad0a4aa3c1262de20e1241f78e73360e9b620/pytest_playwright-0.7.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c9/54/777e0495acd4fb008791e84889be33d6e7fc8af095b441d939390b7d2491/pywavelets-1.9.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c7/7a/a8f5e0561702b25239846a16349feece59712ae20598ebb205580332a471/regex-2026.2.28-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/40/bb226f203caa22c1043c1ca79b36340156eca0f6a6742b46c3bb222a3a57/regex-2026.2.28-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/b8/f0b9b880c03a3db8eaff63d76ca751ac7d8e45483fb7a0bb9f8e5c6ce433/toml_cli-0.8.2-py3-none-any.whl - - pypi: ./ + - 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/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda @@ -337,56 +239,39 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/backports.zstd-1.3.0-py312h44dc372_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/boolean.py-5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py312h0dfefe5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py312h1b4d9a2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-2024.11.20-py314hb84d1df_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-2024.11.20-py312h163523d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.4-py314h6e9b3f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-46.0.5-py314h2cafa77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.4-py312h04c11ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-46.0.5-py312h3fef973_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cyclonedx-python-lib-11.6.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cyrus-sasl-2.1.28-ha1cbb27_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.24.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-2.86.4-h903c028_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gst-plugins-base-1.26.10-hd17a83a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gstreamer-1.26.10-h30d696d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-12.3.2-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.16.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.28.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda @@ -397,7 +282,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.16-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda @@ -411,7 +296,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda @@ -419,11 +303,8 @@ environments: - 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/libclang-cpp18.1-18.1.8-default_h73dfc95_17.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-22.1.0-default_h13b06bd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.1-hce30654_0.conda @@ -431,98 +312,69 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.25.1-h493aca8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm18-18.1.8-default_h3f38c9c_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm22-22.1.0-h89af1be_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libntlm-1.8-h5505292_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libogg-1.3.5-h48c0fde_1.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/libopus-1.6.1-h1a92334_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpq-18.2-h6caddbb_0.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/libtiff-4.7.1-h4030677_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvorbis-1.3.7-h81086ad_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-1.6.0-hc0253d1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_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/noarch/license-expression-30.4.4-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.2-py314h784bc60_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.2-py312h84eede6_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.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/nh3-0.3.3-py310hf32026f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nspr-4.38-heaf21c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.118-h1c710a3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hbfb3c88_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openldap-2.6.10-hbe55e7a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py312he281c53_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packageurl-python-0.17.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-h875632e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py312h4e908a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-api-0.0.34-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-audit-2.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-requirements-parser-32.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkce-1.0.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-serializable-2.1.0-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py312h6ef9ec0_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.13.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyqt-5.15.11-py314h17b549b_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyqt5-sip-12.17.0-py314h93ecee7_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyqtgraph-0.14.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.12-h18782d2_2_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qt-5.15.15-h7b2f662_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qt-main-5.15.15-h4427410_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qt-webengine-5.15.15-h5422c0a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/qtpy-2.4.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readchar-4.2.1-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda @@ -533,13 +385,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.2-h279115b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py312h6ef9ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.15-py312hb3ab3e3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.4-h279115b_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/semver-3.0.4-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sip-6.15.0-py314h93ecee7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda @@ -567,646 +419,25 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py314h6cfcd04_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py312h766f71e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.9.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.10.7-h9b11cc2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.10.8-h9b11cc2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/versioningit-3.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.39.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py314h9d33bd4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py312h37e1c23_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/6a/2b/7f0990efc53f85dd90213b33a6ac0356d5adbb52e0c5bf15a66e9b5193ef/bm3d-4.0.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/01/907bd81c49be4fe40719149dceeb79467fa39b75bfac103e40670606be90/bm3d_streak_removal-0.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/47/034be51bc2b40279fd1417397d3f330b73906774bd6eaecd26ed93c1491f/bm4d-4.2.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3f/ae/8bffcbd373b57a5992cd077cbe8858fff39110480a9d50697091faea6f39/greenlet-3.3.2-cp314-cp314-macosx_11_0_universal2.whl - pypi: https://files.pythonhosted.org/packages/14/2f/967ba146e6d58cf6a652da73885f52fc68001525b4197effc174321d70b4/jmespath-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e0/40/59d34a756e02f8c670f0fee987d46f7ee53d05447d43cd114ca015cb168c/playwright-1.58.0-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/a0/c4/b4d4827c93ef43c01f599ef31453ccc1c132b353284fc6c87d535c233129/pyee-13.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/1c/b00940ab9eb8ede7897443b771987f2f4a76f06be02f1b3f01eb7567e24a/pytest_base_url-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/61/4d333d8354ea2bea2c2f01bad0a4aa3c1262de20e1241f78e73360e9b620/pytest_playwright-0.7.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/eb/e1/1c92ac6b538ef5388caf1a74af61cf6af16ea6d14115bb53357469cb38d6/pywavelets-1.9.0-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/5a/79/9aa0caf089e8defef9b857b52fc53801f62ff868e19e5c83d4a96612eba1/regex-2026.2.28-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/06/3ef1ac6910dc3295ebd71b1f9bfa737e82cfead211a18b319d45f85ddd09/regex-2026.2.28-cp312-cp312-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/d2/b8/f0b9b880c03a3db8eaff63d76ca751ac7d8e45483fb7a0bb9f8e5c6ce433/toml_cli-0.8.2-py3-none-any.whl - - pypi: ./ - jupyter: - channels: - - url: https://conda.anaconda.org/conda-forge/ - - url: https://prefix.dev/pixi-build-backends/ - indexes: - - https://pypi.org/simple - options: - pypi-prerelease-mode: if-necessary-or-explicit - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/boolean.py-5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py314h7fe84b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cyclonedx-python-lib-11.6.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.24.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.1-pyh7db6752_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.86.4-h5192d8d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.26.10-h0363672_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.26.10-h17cb667_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.3.2-h6083320_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/html5lib-1.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipympl-0.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.10.0-pyh53cf698_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.16-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py314h97ea11e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.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/libcap-2.77-h3ff7636_0.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/libclang-cpp21.1-21.1.8-default_h99862b1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.0-default_h746c552_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.0-hf7376ad_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_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/libopengl-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.6.1-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.2-hb80d175_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.10-hd0affe5_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.6.0-h9635ea4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/license-expression-30.4.4-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py314h9891dd4_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packageurl-python-0.17.6-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hadf4263_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-api-0.0.34-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-audit-2.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-requirements-parser-32.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-h9a6aba3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-serializable-2.1.0-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.11-py314h92491ac_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.17.0-py314ha160325_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyqtgraph-0.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-5.15.15-h57362cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-hc240232_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-webengine-5.15.15-h5dcc908_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/qtpy-2.4.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.2-h40fa522_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sip-6.10.0-py314ha160325_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/versioningit-3.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.39.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.15-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.47-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxshmfence-1.3.3-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: https://files.pythonhosted.org/packages/6a/2b/7f0990efc53f85dd90213b33a6ac0356d5adbb52e0c5bf15a66e9b5193ef/bm3d-4.0.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/01/907bd81c49be4fe40719149dceeb79467fa39b75bfac103e40670606be90/bm3d_streak_removal-0.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/47/034be51bc2b40279fd1417397d3f330b73906774bd6eaecd26ed93c1491f/bm4d-4.2.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/48/aa685dbf1024c7bd82bede569e3a85f82c32fd3d79ba5fea578f0159571a/jaraco_context-6.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/af/009958cbf23fac551a940d34e3206e6c7eed2b8c940d0c3afd1feb0b0589/playwright-1.58.0-py3-none-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/c4/b4d4827c93ef43c01f599ef31453ccc1c132b353284fc6c87d535c233129/pyee-13.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/1c/b00940ab9eb8ede7897443b771987f2f4a76f06be02f1b3f01eb7567e24a/pytest_base_url-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/61/4d333d8354ea2bea2c2f01bad0a4aa3c1262de20e1241f78e73360e9b620/pytest_playwright-0.7.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c9/54/777e0495acd4fb008791e84889be33d6e7fc8af095b441d939390b7d2491/pywavelets-1.9.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.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/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/boolean.py-5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-46.0.5-py314h2cafa77_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cyclonedx-python-lib-11.6.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cyrus-sasl-2.1.28-ha1cbb27_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.24.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.1-pyh7db6752_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.1-hce30654_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-2.86.4-h903c028_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gst-plugins-base-1.26.10-hd17a83a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gstreamer-1.26.10-h30d696d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-12.3.2-h3103d1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/html5lib-1.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipympl-0.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.10.0-pyh53cf698_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.16-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.9-py314h42813c9_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.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/libclang-cpp18.1-18.1.8-default_h73dfc95_17.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-22.1.0-default_h13b06bd_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.1-hce30654_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.1-h6da58f4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm18-18.1.8-default_h3f38c9c_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm22-22.1.0-h89af1be_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libntlm-1.8-h5505292_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libogg-1.3.5-h48c0fde_1.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/libopus-1.6.1-h1a92334_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpq-18.2-h6caddbb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.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/libtiff-4.7.1-h4030677_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvorbis-1.3.7-h81086ad_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-1.6.0-hc0253d1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_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/noarch/license-expression-30.4.4-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.2-py314h784bc60_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nspr-4.38-heaf21c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.118-h1c710a3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hbfb3c88_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openldap-2.6.10-hbe55e7a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packageurl-python-0.17.6-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-h875632e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-api-0.0.34-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-audit-2.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-requirements-parser-32.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-serializable-2.1.0-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.1-py314h3a4d195_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-12.1-py314h36abed7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyqt-5.15.11-py314h17b549b_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyqt5-sip-12.17.0-py314h93ecee7_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyqtgraph-0.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qt-5.15.15-h7b2f662_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qt-main-5.15.15-h4427410_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qt-webengine-5.15.15-h5422c0a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/qtpy-2.4.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.2-h279115b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sip-6.15.0-py314h93ecee7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py314h6cfcd04_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/versioningit-3.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.39.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.15-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h888dc83_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/6a/2b/7f0990efc53f85dd90213b33a6ac0356d5adbb52e0c5bf15a66e9b5193ef/bm3d-4.0.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/01/907bd81c49be4fe40719149dceeb79467fa39b75bfac103e40670606be90/bm3d_streak_removal-0.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/47/034be51bc2b40279fd1417397d3f330b73906774bd6eaecd26ed93c1491f/bm4d-4.2.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3f/ae/8bffcbd373b57a5992cd077cbe8858fff39110480a9d50697091faea6f39/greenlet-3.3.2-cp314-cp314-macosx_11_0_universal2.whl - - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/48/aa685dbf1024c7bd82bede569e3a85f82c32fd3d79ba5fea578f0159571a/jaraco_context-6.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e0/40/59d34a756e02f8c670f0fee987d46f7ee53d05447d43cd114ca015cb168c/playwright-1.58.0-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/c4/b4d4827c93ef43c01f599ef31453ccc1c132b353284fc6c87d535c233129/pyee-13.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/1c/b00940ab9eb8ede7897443b771987f2f4a76f06be02f1b3f01eb7567e24a/pytest_base_url-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/61/4d333d8354ea2bea2c2f01bad0a4aa3c1262de20e1241f78e73360e9b620/pytest_playwright-0.7.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/eb/e1/1c92ac6b538ef5388caf1a74af61cf6af16ea6d14115bb53357469cb38d6/pywavelets-1.9.0-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl - - pypi: ./ + - pypi: . packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 @@ -1219,6 +450,7 @@ packages: - openmp_impl <0.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 28948 timestamp: 1770939786096 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda @@ -1229,6 +461,7 @@ packages: - llvm-openmp >=9.0.1 license: BSD-3-Clause license_family: BSD + purls: [] size: 8325 timestamp: 1764092507920 - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda @@ -1239,6 +472,7 @@ packages: - python-gil license: MIT license_family: MIT + purls: [] size: 8191 timestamp: 1744137672556 - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda @@ -1248,18 +482,10 @@ packages: - python >=3.10 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/alabaster size: 18684 timestamp: 1733750512696 -- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda - sha256: d88aa7ae766cf584e180996e92fef2aa7d8e0a0a5ab1d4d49c32390c1b5fff31 - md5: dcdc58c15961dbf17a0621312b01f5cb - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: LGPL-2.1-or-later - license_family: GPL - size: 584660 - timestamp: 1768327524772 - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-auth-0.13.0-pyhd8ed1ab_0.conda sha256: 07409058cc87b0f3ea865ad3412aea9ad212401c0a7ce3a5e1a69323ff0c70b2 md5: 7df604fa6b0c70bac9d77dec7a3741af @@ -1281,6 +507,8 @@ packages: - anaconda-cloud-auth >=0.8 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/anaconda-auth size: 51059 timestamp: 1772213549452 - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-cli-base-0.8.1-pyhcf101f3_0.conda @@ -1303,6 +531,8 @@ packages: - anaconda-cloud-cli >=0.3.0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/anaconda-cli-base size: 29684 timestamp: 1769448209558 - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-client-1.14.1-pyhcf101f3_0.conda @@ -1330,6 +560,8 @@ packages: - python license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/anaconda-client size: 82696 timestamp: 1770211941226 - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda @@ -1340,6 +572,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/annotated-doc size: 14222 timestamp: 1762868213144 - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda @@ -1350,6 +584,8 @@ packages: - typing-extensions >=4.0.0 license: MIT license_family: MIT + purls: + - pkg:pypi/annotated-types size: 18074 timestamp: 1733247158254 - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda @@ -1363,103 +599,13 @@ packages: - python constrains: - trio >=0.32.0 - - uvloop >=0.21 - license: MIT - license_family: MIT - size: 145175 - timestamp: 1767719033569 -- conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda - sha256: 8f032b140ea4159806e4969a68b4a3c0a7cab1ad936eb958a2b5ffe5335e19bf - md5: 54898d0f524c9dee622d44bbb081a8ab - depends: - - python >=3.9 - license: BSD-2-Clause - license_family: BSD - size: 10076 - timestamp: 1733332433806 -- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda - sha256: bea62005badcb98b1ae1796ec5d70ea0fc9539e7d59708ac4e7d41e2f4bb0bad - md5: 8ac12aff0860280ee0cff7fa2cf63f3b - depends: - - argon2-cffi-bindings - - python >=3.9 - - typing-extensions - constrains: - - argon2_cffi ==999 - license: MIT - license_family: MIT - size: 18715 - timestamp: 1749017288144 -- conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda - sha256: 39234a99df3d2e3065383808ed8bfda36760de5ef590c54c3692bb53571ef02b - md5: 3cca1b74b2752917b5b65b81f61f0553 - depends: - - __glibc >=2.17,<3.0.a0 - - cffi >=2.0.0b1 - - libgcc >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - size: 35598 - timestamp: 1762509505285 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda - sha256: aab60bbaea5cc49dff37438d1ad469d64025cda2ce58103cf68da61701ed2075 - md5: a240a79a49a95b388ef81ccda27a5e51 - depends: - - __osx >=11.0 - - cffi >=2.0.0b1 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - size: 34218 - timestamp: 1762509977830 -- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda - sha256: 792da8131b1b53ff667bd6fc617ea9087b570305ccb9913deb36b8e12b3b5141 - md5: 85c4f19f377424eafc4ed7911b291642 - depends: - - python >=3.10 - - python-dateutil >=2.7.0 - - python-tzdata - - python - license: Apache-2.0 - license_family: APACHE - size: 113854 - timestamp: 1760831179410 -- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - sha256: ee4da0f3fe9d59439798ee399ef3e482791e48784873d546e706d0935f9ff010 - md5: 9673a61a297b00016442e022d689faa6 - depends: - - python >=3.10 - constrains: - - astroid >=2,<5 - license: Apache-2.0 - license_family: Apache - size: 28797 - timestamp: 1763410017955 -- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda - sha256: d078b0d3fdc13b0ff08485af20928a095c80dff03f7021ee18e8426a773ae948 - md5: 2cdaf7f8bda7eb9ce49c3e08f2f65803 - depends: - - python >=3.10 - - typing_extensions >=4.0.0 - - python - license: MIT - license_family: MIT - size: 21470 - timestamp: 1771623881915 -- conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda - sha256: a9c114cbfeda42a226e2db1809a538929d2f118ef855372293bd188f71711c48 - md5: 791365c5f65975051e4e017b5da3abf5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: GPL-2.0-or-later - license_family: GPL - size: 68072 - timestamp: 1756738968573 + - uvloop >=0.21 + license: MIT + license_family: MIT + purls: + - pkg:pypi/anyio + size: 145175 + timestamp: 1767719033569 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda sha256: c13d5e42d187b1d0255f591b7ce91201d4ed8a5370f0d986707a802c20c9d32f md5: 537296d57ea995666c68c821b00e360b @@ -1468,19 +614,24 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/attrs size: 64759 timestamp: 1764875182184 -- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda - sha256: 7377bce9fcc03fecd3607843d20b50546c30a923a3517a322a2a784fa6e380eb - md5: ea5be9abc2939c8431893b4e123a2065 +- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + sha256: a14a9ad02101aab25570543a59c5193043b73dc311a25650134ed9e6cb691770 + md5: f1976ce927373500cc19d3c0b2c85177 depends: - python >=3.10 - - pytz >=2015.7 - python + constrains: + - pytz >=2015.7 license: BSD-3-Clause license_family: BSD - size: 7684373 - timestamp: 1770326844118 + purls: + - pkg:pypi/babel + size: 7684321 + timestamp: 1772555330347 - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda sha256: e1c3dc8b5aa6e12145423fed262b4754d70fec601339896b9ccf483178f690a6 md5: 767d508c1a67e02ae8f50e44cacfadb2 @@ -1488,6 +639,8 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/backports size: 7069 timestamp: 1733218168786 - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda @@ -1499,74 +652,38 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/backports-tarfile size: 35739 timestamp: 1767290467820 -- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - noarch: generic - sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 - md5: a2ac7763a9ac75055b68f325d3255265 +- conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda + sha256: d77a24be15e283d83214121428290dbe55632a6e458378205b39c550afa008cf + md5: 5b8c55fed2e576dde4b0b33693a4fdb1 depends: - - python >=3.14 + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause AND MIT AND EPL-2.0 - size: 7514 - timestamp: 1767044983590 -- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - sha256: bf1e71c3c0a5b024e44ff928225a0874fc3c3356ec1a0b6fe719108e6d1288f6 - md5: 5267bef8efea4127aacd1f4e1f149b6e - depends: - - python >=3.10 - - soupsieve >=1.2 - - typing-extensions - license: MIT - license_family: MIT - size: 90399 - timestamp: 1764520638652 -- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda - sha256: f8ff1f98423674278964a46c93a1766f9e91960d44efd91c6c3ed56a33813f46 - md5: 7c5ebdc286220e8021bf55e6384acd67 + purls: + - pkg:pypi/backports-zstd + size: 237970 + timestamp: 1767045004512 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/backports.zstd-1.3.0-py312h44dc372_0.conda + sha256: aee745bfca32f7073d3298157bbb2273d6d83383cb266840cf0a7862b3cd8efc + md5: c2d5961bfd98504b930e704426d16572 depends: - - python >=3.10 - - webencodings - python - constrains: - - tinycss2 >=1.1.0,<1.5 - license: Apache-2.0 AND MIT - size: 142008 - timestamp: 1770719370680 -- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda - sha256: 7c07a865e5e4cca233cc4e0eb3f0f5ff6c90776461687b4fb0b1764133e1fd61 - md5: f11a319b9700b203aa14c295858782b6 - depends: - - bleach ==6.3.0 pyhcf101f3_1 - - tinycss2 - license: Apache-2.0 AND MIT - size: 4409 - timestamp: 1770719370682 -- pypi: https://files.pythonhosted.org/packages/6a/2b/7f0990efc53f85dd90213b33a6ac0356d5adbb52e0c5bf15a66e9b5193ef/bm3d-4.0.3-py3-none-any.whl - name: bm3d - version: 4.0.3 - sha256: fc4dfc0de0cd810fcb6ad198e1d0c6f99cf19d41f2ec69ff867674cfb9f2a775 - requires_dist: - - bm4d>=4.2.5 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/9b/01/907bd81c49be4fe40719149dceeb79467fa39b75bfac103e40670606be90/bm3d_streak_removal-0.2.0-py3-none-any.whl - name: bm3d-streak-removal - version: 0.2.0 - sha256: bcd5372369c3de63baf46df5815bcd8c2a9b6627e4b6bf3c4e6643762b5e9fa4 - requires_dist: - - bm3d - - numpy - - scipy - requires_python: '>=3.5' -- pypi: https://files.pythonhosted.org/packages/19/47/034be51bc2b40279fd1417397d3f330b73906774bd6eaecd26ed93c1491f/bm4d-4.2.5-py3-none-any.whl - name: bm4d - version: 4.2.5 - sha256: 601338bbd54bcbd971d70b5a6961583a9ccaa564c982389cf3f82bd0a6d5bad5 - requires_dist: - - numpy - - scipy>=1.13.0 - - pywavelets - requires_python: '>=3.9' + - python 3.12.* *_cpython + - __osx >=11.0 + - zstd >=1.5.7,<1.6.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause AND MIT AND EPL-2.0 + purls: + - pkg:pypi/backports-zstd + size: 241051 + timestamp: 1767045000787 - conda: https://conda.anaconda.org/conda-forge/noarch/boolean.py-5.0-pyhd8ed1ab_0.conda sha256: 6195e09f7d8a3a5e2fc0dddd6d1e87198e9c3d2a1982ff04624957a6c6466e54 md5: 26c3480f80364e9498a48bb5c3e35f85 @@ -1574,6 +691,8 @@ packages: - python >=3.9 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/boolean-py size: 29946 timestamp: 1743687383956 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda @@ -1587,6 +706,8 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: + - pkg:pypi/brotli size: 20103 timestamp: 1764017231353 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda @@ -1599,6 +720,8 @@ packages: - libbrotlienc 1.2.0 hc919400_1 license: MIT license_family: MIT + purls: + - pkg:pypi/brotli size: 20237 timestamp: 1764018058424 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda @@ -1611,6 +734,8 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: + - pkg:pypi/brotli-bin size: 21021 timestamp: 1764017221344 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda @@ -1622,38 +747,44 @@ packages: - libbrotlienc 1.2.0 hc919400_1 license: MIT license_family: MIT + purls: + - pkg:pypi/brotli-bin size: 18628 timestamp: 1764018033635 -- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 - md5: 8910d2c46f7e7b519129f486e0fe927a +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda + sha256: 49df13a1bb5e388ca0e4e87022260f9501ed4192656d23dc9d9a1b4bf3787918 + md5: 64088dffd7413a2dd557ce837b4cbbdb depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 constrains: - libbrotlicommon 1.2.0 hb03c661_1 license: MIT license_family: MIT - size: 367376 - timestamp: 1764017265553 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda - sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99 - md5: f9501812fe7c66b6548c7fcaa1c1f252 + purls: + - pkg:pypi/brotli-python + size: 368300 + timestamp: 1764017300621 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py312h0dfefe5_1.conda + sha256: 6178775a86579d5e8eec6a7ab316c24f1355f6c6ccbe84bb341f342f1eda2440 + md5: 311fcf3f6a8c4eb70f912798035edd35 depends: - __osx >=11.0 - libcxx >=19 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 constrains: - libbrotlicommon 1.2.0 hc919400_1 license: MIT license_family: MIT - size: 359854 - timestamp: 1764018178608 + purls: + - pkg:pypi/brotli-python + size: 359503 + timestamp: 1764018572368 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 md5: d2ffd7602c02f2b316fd921d39876885 @@ -1662,6 +793,8 @@ packages: - libgcc >=14 license: bzip2-1.0.6 license_family: BSD + purls: + - pkg:pypi/bzip2 size: 260182 timestamp: 1771350215188 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda @@ -1671,6 +804,8 @@ packages: - __osx >=11.0 license: bzip2-1.0.6 license_family: BSD + purls: + - pkg:pypi/bzip2 size: 124834 timestamp: 1771350416561 - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda @@ -1679,6 +814,8 @@ packages: depends: - __unix license: ISC + purls: + - pkg:pypi/ca-certificates size: 147413 timestamp: 1772006283803 - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.3-pyha770c72_0.conda @@ -1690,108 +827,52 @@ packages: - requests >=2.16.0 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/cachecontrol size: 23868 timestamp: 1746103006628 -- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - noarch: python - sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17 - md5: 9b347a7ec10940d3f7941ff6c460b551 - depends: - - cached_property >=1.5.2,<1.5.3.0a0 - license: BSD-3-Clause - license_family: BSD - size: 4134 - timestamp: 1615209571450 -- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7 - md5: 576d629e47797577ab0f1b351297ef4a - depends: - - python >=3.6 - license: BSD-3-Clause - license_family: BSD - size: 11065 - timestamp: 1615209567874 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - sha256: 06525fa0c4e4f56e771a3b986d0fdf0f0fc5a3270830ee47e127a5105bde1b9a - md5: bb6c4808bfa69d6f7f6b07e5846ced37 - depends: - - __glibc >=2.17,<3.0.a0 - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - icu >=78.1,<79.0a0 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libgcc >=14 - - libglib >=2.86.3,<3.0a0 - - libpng >=1.6.53,<1.7.0a0 - - libstdcxx >=14 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - pixman >=0.46.4,<1.0a0 - - xorg-libice >=1.1.2,<2.0a0 - - xorg-libsm >=1.2.6,<2.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxrender >=0.9.12,<0.10.0a0 - license: LGPL-2.1-only or MPL-1.1 - size: 989514 - timestamp: 1766415934926 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda - sha256: cde9b79ee206fe3ba6ca2dc5906593fb7a1350515f85b2a1135a4ce8ec1539e3 - md5: 36200ecfbbfbcb82063c87725434161f - depends: - - __osx >=11.0 - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - icu >=78.1,<79.0a0 - - libcxx >=19 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libglib >=2.86.3,<3.0a0 - - libpng >=1.6.53,<1.7.0a0 - - libzlib >=1.3.1,<2.0a0 - - pixman >=0.46.4,<1.0a0 - license: LGPL-2.1-only or MPL-1.1 - size: 900035 - timestamp: 1766416416791 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 md5: 765c4d97e877cdbbb88ff33152b86125 depends: - python >=3.10 license: ISC + purls: + - pkg:pypi/certifi size: 151445 timestamp: 1772001170301 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e - md5: cf45f4278afd6f4e6d03eda0f435d527 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda + sha256: 7dafe8173d5f94e46cf9cd597cc8ff476a8357fbbd4433a8b5697b2864845d9c + md5: 648ee28dcd4e07a1940a17da62eccd40 depends: - __glibc >=2.17,<3.0.a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - pycparser - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 license: MIT license_family: MIT - size: 300271 - timestamp: 1761203085220 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda - sha256: 5b5ee5de01eb4e4fd2576add5ec9edfc654fbaf9293e7b7ad2f893a67780aa98 - md5: 10dd19e4c797b8f8bdb1ec1fbb6821d7 + purls: + - pkg:pypi/cffi + size: 295716 + timestamp: 1761202958833 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py312h1b4d9a2_1.conda + sha256: 597e986ac1a1bd1c9b29d6850e1cdea4a075ce8292af55568952ec670e7dd358 + md5: 503ac138ad3cfc09459738c0f5750705 depends: - __osx >=11.0 - libffi >=3.5.2,<3.6.0a0 - pycparser - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 license: MIT license_family: MIT - size: 292983 - timestamp: 1761203354051 + purls: + - pkg:pypi/cffi + size: 288080 + timestamp: 1761203317419 - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda sha256: aa589352e61bb221351a79e5946d56916e3c595783994884accdb3b97fe9d449 md5: 381bd45fb7aa032691f3063aff47e3a1 @@ -1799,6 +880,8 @@ packages: - python >=3.10 license: MIT license_family: MIT + purls: + - pkg:pypi/cfgv size: 13589 timestamp: 1763607964133 - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda @@ -1808,6 +891,8 @@ packages: - python >=3.10 license: MIT license_family: MIT + purls: + - pkg:pypi/charset-normalizer size: 50965 timestamp: 1760437331772 - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -1819,34 +904,40 @@ packages: - python license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/click size: 97676 timestamp: 1764518652276 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda - sha256: c2420839a943580dece9c5857492d69732df2af6dac6cb8fd8dd92c20060beae - md5: 23985f6de5f68e3465807e1fbbc98f30 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py312h4c3975b_1.conda + sha256: e7320d6fba9a749dd97b9a03c16cd4c3d029302d3246a239612d0e59b33691aa + md5: 17e204b4c81a23d4cab7744909bf67b9 depends: - __glibc >=2.17,<3.0.a0 - cffi >=1.0.0 - libgcc >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 license: MIT license_family: MIT - size: 144534 - timestamp: 1760363043706 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-2024.11.20-py314hb84d1df_1.conda - sha256: 17fd950dd391f5471210a3a0fcddd2a0b4d5affa6da67f9d9e01dd276192c856 - md5: 53a4b07a7da29004b99261d77798109c + purls: + - pkg:pypi/cmarkgfm + size: 142378 + timestamp: 1760363098343 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-2024.11.20-py312h163523d_1.conda + sha256: 6aea1c9887e69ac0e37211023190fb1526ba356affbe537eb75da028aed666fe + md5: 660087d3044bbb4f8fe780dd4f6d767d depends: - __osx >=11.0 - cffi >=1.0.0 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 license: MIT license_family: MIT - size: 115970 - timestamp: 1760363189413 + purls: + - pkg:pypi/cmarkgfm + size: 115798 + timestamp: 1760363773598 - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 md5: 962b9857ee8e7018c22f2776ffa0b2d7 @@ -1854,18 +945,22 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/colorama size: 27011 timestamp: 1733218222191 -- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - sha256: 576a44729314ad9e4e5ebe055fbf48beb8116b60e58f9070278985b2b634f212 - md5: 2da13f2b299d8e1995bafbbe9689a2f7 - depends: - - python >=3.9 - - python - license: BSD-3-Clause - license_family: BSD - size: 14690 - timestamp: 1753453984907 +- pypi: . + name: commons + version: 0.2.0.dev2 + sha256: 74652998068a25755ae361a30f9e7be8885d98b0602133995d030694e7dd32e6 + requires_dist: + - numpy>=2.2,<3 + - myst-parser ; extra == 'docs' + - sphinx ; extra == 'docs' + - sphinx-rtd-theme ; extra == 'docs' + - versioningit ; extra == 'docs' + requires_python: '>=3.10' + editable: true - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda sha256: 8b2b1c235b7cbfa8488ad88ff934bdad25bac6a4c035714681fbff85b602f3f0 md5: 32c158f481b4fd7630c565030f7bc482 @@ -1876,6 +971,8 @@ packages: - zstandard >=0.15 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/conda-package-handling size: 257995 timestamp: 1736345601691 - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda @@ -1886,114 +983,88 @@ packages: - zstandard >=0.15 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/conda-package-streaming size: 21933 timestamp: 1751548225624 -- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda - sha256: b0314a7f1fb4a294b1a8bcf5481d4a8d9412a9fee23b7e3f93fb10e4d504f2cc - md5: 95bede9cdb7a30a4b611223d52a01aa4 - depends: - - numpy >=1.25 - - python - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.14.* *_cp314 - license: BSD-3-Clause - license_family: BSD - size: 324013 - timestamp: 1769155968691 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda - sha256: 754ab72f1c1ae99ef7c57995f59224dc9632cbd6731fe7e6277437fd01d43156 - md5: cddc851000ce131d757678c2f329eaad - depends: - - numpy >=1.25 - - python - - python 3.14.* *_cp314 - - __osx >=11.0 - - libcxx >=19 - - python_abi 3.14.* *_cp314 - license: BSD-3-Clause - license_family: BSD - size: 290405 - timestamp: 1769156069514 -- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py314h67df5f8_0.conda - sha256: b84aa99886610e0c3856ee1b577fe5c2552a5677bb7d281b4a86e79248813898 - md5: 6c7efc167cee337d9c41200506d022b8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py312h8a5da7c_0.conda + sha256: 2c785feaf79c31981ef4a87e41ea1161e1ce6b740ce3f1fb9cf44245cae5cf29 + md5: a8df7f0812ac4fa6bbc7135556d3e2c4 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 - tomli license: Apache-2.0 license_family: APACHE - size: 412776 - timestamp: 1770720660175 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.4-py314h6e9b3f0_0.conda - sha256: e8ef991376e43f1248f0a16108b29534b24ad633cc4848927d7cf74622961ee9 - md5: 96c7bf4f2b5010d29604a62e91e634bb + purls: + - pkg:pypi/coverage + size: 388190 + timestamp: 1770720373428 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.4-py312h04c11ed_0.conda + sha256: 711f0fdda04d834b16de0d60b518ff57fe8ac25000678d6d31445f1301827c62 + md5: 8857ec2579297861a95ac913f5b2d97f depends: - __osx >=11.0 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 - tomli license: Apache-2.0 license_family: APACHE - size: 412030 - timestamp: 1770720628409 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda + purls: + - pkg:pypi/coverage + size: 386007 + timestamp: 1770720691274 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_2.conda noarch: generic - sha256: 91b06300879df746214f7363d6c27c2489c80732e46a369eb2afc234bcafb44c - md5: 3bb89e4f795e5414addaa531d6b1500a + sha256: ccb90d95bac9f1f4f6629a4addb44d36433e4ad1fe4ac87a864f90ff305dbf6d + md5: ef3e093ecfd4533eee992cdaa155b47e depends: - - python >=3.14,<3.15.0a0 - - python_abi * *_cp314 + - python >=3.12,<3.13.0a0 + - python_abi * *_cp312 license: Python-2.0 - size: 50078 - timestamp: 1770674447292 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py314h7fe84b3_0.conda - sha256: 5be059316118da3f9f0b0b1d20829975415f980f4be7093464947703df62e7ea - md5: a2dd595998bd8e745c54ffdbbdc6dc97 + purls: + - pkg:pypi/cpython + size: 46644 + timestamp: 1769471040321 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py312ha4b625e_0.conda + sha256: 3a20020b7c9efbabfbfdd726ff303df81159e0c3a41a40ef8b37c3ce161a7849 + md5: 4c69182866fcdd2fc335885b8f0ac192 depends: - __glibc >=2.17,<3.0.a0 - cffi >=1.14 - libgcc >=14 - openssl >=3.5.5,<4.0a0 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 constrains: - __glibc >=2.17 license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT license_family: BSD - size: 1721078 - timestamp: 1770772685661 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-46.0.5-py314h2cafa77_0.conda - sha256: 8100a7a45ff60dc5bb0adb29270720b7d54b6bf9ff0e828aadd2888cc478edd9 - md5: c6f7f575f6e55ae1662db9d4504e1235 + purls: + - pkg:pypi/cryptography + size: 1712251 + timestamp: 1770772759286 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-46.0.5-py312h3fef973_0.conda + sha256: 4fed9778697e456bdc9d1a64fcb5f3e38467ccb72aca74acc50c2775832763f5 + md5: 32a1800587ad5f93389ea271f15bdedd depends: - __osx >=11.0 - cffi >=1.14 - openssl >=3.5.5,<4.0a0 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 constrains: - __osx >=11.0 license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT license_family: BSD - size: 1602727 - timestamp: 1770772756612 -- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - sha256: bb47aec5338695ff8efbddbc669064a3b10fe34ad881fb8ad5d64fbfa6910ed1 - md5: 4c2a8fef270f6c69591889b93f9f55c1 - depends: - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - size: 14778 - timestamp: 1764466758386 + purls: + - pkg:pypi/cryptography + size: 1595763 + timestamp: 1770772744039 - conda: https://conda.anaconda.org/conda-forge/noarch/cyclonedx-python-lib-11.6.0-pyhcf101f3_0.conda sha256: 0266bbbffb30ec5fe926a512f0842066d8828c6926afc55388204126df449fb5 md5: 81dcbd6793677087b9bf04eb4cb4464b @@ -2007,36 +1078,10 @@ packages: - python license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/cyclonedx-python-lib size: 184428 timestamp: 1764716172329 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda - sha256: ee09ad7610c12c7008262d713416d0b58bf365bc38584dce48950025850bdf3f - md5: cae723309a49399d2949362f4ab5c9e4 - depends: - - __glibc >=2.17,<3.0.a0 - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - libntlm >=1.8,<2.0a0 - - libstdcxx >=13 - - libxcrypt >=4.4.36 - - openssl >=3.5.0,<4.0a0 - license: BSD-3-Clause-Attribution - license_family: BSD - size: 209774 - timestamp: 1750239039316 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cyrus-sasl-2.1.28-ha1cbb27_0.conda - sha256: 7de03254fa5421e7ec2347c830a59530fb5356022ee0dc26ec1cef0be1de0911 - md5: 2867ea6551e97e53a81787fd967162b1 - depends: - - __osx >=11.0 - - krb5 >=1.21.3,<1.22.0a0 - - libcxx >=18 - - libntlm >=1.8,<2.0a0 - - openssl >=3.5.0,<4.0a0 - license: BSD-3-Clause-Attribution - license_family: BSD - size: 193732 - timestamp: 1750239236574 - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda sha256: 8bb557af1b2b7983cf56292336a1a1853f26555d9c6cecf1e5b2b96838c9da87 md5: ce96f2f470d39bd96ce03945af92e280 @@ -2048,43 +1093,10 @@ packages: - libglib >=2.86.2,<3.0a0 - libexpat >=2.7.3,<3.0a0 license: AFL-2.1 OR GPL-2.0-or-later + purls: + - pkg:pypi/dbus size: 447649 timestamp: 1764536047944 -- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda - sha256: d9e89e351d7189c41615cfceca76b3bcacaa9c81d9945ac1caa6fb9e5184f610 - md5: 57e6fad901c05754d5256fe3ab9f277b - depends: - - python - - libgcc >=14 - - libstdcxx >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - size: 2886804 - timestamp: 1769744977998 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py314he609de1_0.conda - sha256: 7736a82ebe75c0f3ea6991298363d1f2edb34291f8616c1d3719862881c3a167 - md5: 407c74dc27356ba6bf3a0191070e3ac0 - depends: - - python - - python 3.14.* *_cp314 - - __osx >=11.0 - - libcxx >=19 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - size: 2778080 - timestamp: 1769745040206 -- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - sha256: c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017 - md5: 9ce473d1d1be1cc3810856a48b3fab32 - depends: - - python >=3.9 - license: BSD-2-Clause - license_family: BSD - size: 14129 - timestamp: 1740385067843 - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be md5: 961b3a227b437d82ad7054484cfa71b2 @@ -2092,6 +1104,8 @@ packages: - python >=3.6 license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/defusedxml size: 24062 timestamp: 1615232388757 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda @@ -2101,6 +1115,8 @@ packages: - python >=3.9 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/distlib size: 275642 timestamp: 1752823081585 - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda @@ -2109,6 +1125,8 @@ packages: depends: - python >=3.9 license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 + purls: + - pkg:pypi/docutils size: 402700 timestamp: 1733217860944 - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_1.conda @@ -2118,24 +1136,10 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/editables size: 10828 timestamp: 1733208220327 -- pypi: ./ - name: examplepyapp - version: 1.1.0.dev119 - sha256: 270b50af6589829f6b9f492759e8c55ce4fd3a0ac1595aad34cebb1c43c778cd - requires_dist: - - bm3d-streak-removal>=0.2.0,<0.3 - - numpy>=2.2,<3 - - pyqt5 - - pyqtgraph - - pytest-playwright>=0.7.0,<0.8 - - qtpy - - myst-parser ; extra == 'docs' - - sphinx ; extra == 'docs' - - sphinx-rtd-theme ; extra == 'docs' - - versioningit ; extra == 'docs' - requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 md5: 8e662bd460bda79b1ea39194e3c4c9ab @@ -2143,6 +1147,8 @@ packages: - python >=3.10 - typing_extensions >=4.6.0 license: MIT and PSF-2.0 + purls: + - pkg:pypi/exceptiongroup size: 21333 timestamp: 1763918099466 - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda @@ -2152,349 +1158,20 @@ packages: - python >=3.10 license: MIT license_family: MIT + purls: + - pkg:pypi/execnet size: 39499 - timestamp: 1762974150770 -- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - sha256: 210c8165a58fdbf16e626aac93cc4c14dbd551a01d1516be5ecad795d2422cad - md5: ff9efb7f7469aed3c4a8106ffa29593c - depends: - - python >=3.10 - license: MIT - license_family: MIT - size: 30753 - timestamp: 1756729456476 -- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.24.3-pyhd8ed1ab_0.conda - sha256: 6d576ed3bd0e7c57b1144f0b2014de9ea3fab9786316bc3e748105d44e0140a0 - md5: 9dbb20eec24beb026291c20a35ce1ff9 - depends: - - python >=3.10 - license: Unlicense - size: 24808 - timestamp: 1771468713029 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b - md5: 0c96522c6bdaed4b1566d11387caaf45 - license: BSD-3-Clause - license_family: BSD - size: 397370 - timestamp: 1566932522327 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c - md5: 34893075a5c9e55cdafac56607368fc6 - license: OFL-1.1 - license_family: Other - size: 96530 - timestamp: 1620479909603 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 - md5: 4d59c254e01d9cde7957100457e2d5fb - license: OFL-1.1 - license_family: Other - size: 700814 - timestamp: 1620479612257 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 - md5: 49023d73832ef61042f6a237cb2687e7 - license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 - license_family: Other - size: 1620504 - timestamp: 1727511233259 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c - md5: 867127763fbe935bab59815b6e0b7b5c - depends: - - __glibc >=2.17,<3.0.a0 - - libexpat >=2.7.4,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libgcc >=14 - - libuuid >=2.41.3,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT - size: 270705 - timestamp: 1771382710863 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - sha256: 851e9c778bfc54645dcab7038c0383445cbebf16f6bb2d3f62ce422b1605385a - md5: d06ae1a11b46cc4c74177ecd28de7c7a - depends: - - __osx >=11.0 - - libexpat >=2.7.4,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT - size: 237308 - timestamp: 1771382999247 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 - md5: fee5683a3f04bd15cbd8318b096a27ab - depends: - - fonts-conda-forge - license: BSD-3-Clause - license_family: BSD - size: 3667 - timestamp: 1566974674465 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 - md5: a7970cd949a077b7cb9696379d338681 - depends: - - font-ttf-ubuntu - - font-ttf-inconsolata - - font-ttf-dejavu-sans-mono - - font-ttf-source-code-pro - license: BSD-3-Clause - license_family: BSD - size: 4059 - timestamp: 1762351264405 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.1-pyh7db6752_0.conda - sha256: bb74f1732065eb95c3ea4ae7f7ab29d6ddaafe6da32f009106bf9a335147cb77 - md5: d5da976e963e70364b9e3ff270842b9f - depends: - - brotli - - munkres - - python >=3.10 - - unicodedata2 >=15.1.0 - track_features: - - fonttools_no_compile - license: MIT - license_family: MIT - size: 834764 - timestamp: 1765632669874 -- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - sha256: 2509992ec2fd38ab27c7cdb42cf6cadc566a1cc0d1021a2673475d9fa87c6276 - md5: d3549fd50d450b6d9e7dddff25dd2110 - depends: - - cached-property >=1.3.0 - - python >=3.9,<4 - license: MPL-2.0 - license_family: MOZILLA - size: 16705 - timestamp: 1733327494780 -- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda - sha256: bf8e4dffe46f7d25dc06f31038cacb01672c47b9f45201f065b0f4d00ab0a83e - md5: 4afc585cd97ba8a23809406cd8a9eda8 - depends: - - libfreetype 2.14.1 ha770c72_0 - - libfreetype6 2.14.1 h73754d4_0 - license: GPL-2.0-only OR FTL - size: 173114 - timestamp: 1757945422243 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.1-hce30654_0.conda - sha256: 14427aecd72e973a73d5f9dfd0e40b6bc3791d253de09b7bf233f6a9a190fd17 - md5: 1ec9a1ee7a2c9339774ad9bb6fe6caec - depends: - - libfreetype 2.14.1 hce30654_0 - - libfreetype6 2.14.1 h6da58f4_0 - license: GPL-2.0-only OR FTL - size: 173399 - timestamp: 1757947175403 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - sha256: 858283ff33d4c033f4971bf440cebff217d5552a5222ba994c49be990dacd40d - md5: f9f81ea472684d75b9dd8d0b328cf655 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: LGPL-2.1-or-later - size: 61244 - timestamp: 1757438574066 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - sha256: d856dc6744ecfba78c5f7df3378f03a75c911aadac803fa2b41a583667b4b600 - md5: 04bdce8d93a4ed181d1d726163c2d447 - depends: - - __osx >=11.0 - license: LGPL-2.1-or-later - size: 59391 - timestamp: 1757438897523 -- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda - sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff - md5: 3bf7b9fd5a7136126e0234db4b87c8b6 - depends: - - libgcc-ng >=12 - license: MIT - license_family: MIT - size: 77248 - timestamp: 1712692454246 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda - sha256: 843b3f364ff844137e37d5c0a181f11f6d51adcedd216f019d074e5aa5d7e09c - md5: 95fa1486c77505330c20f7202492b913 - license: MIT - license_family: MIT - size: 71613 - timestamp: 1712692611426 -- conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.86.4-h5192d8d_1.conda - sha256: 5439dc9c3f3ac84b5f637b31e0480b721d686da21927f6fc3f0e7b6944e53012 - md5: 61272bde04aeccf919351b92fbb96a53 - depends: - - glib-tools 2.86.4 hf516916_1 - - libglib 2.86.4 h6548e54_1 - - packaging - - python * - license: LGPL-2.1-or-later - size: 79208 - timestamp: 1771863362595 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-2.86.4-h903c028_1.conda - sha256: f03dcbf7a6546d15ddfc8090be60627cd58c3a4346eab1f189130697b3b93aa6 - md5: 26ad61ca4d6a0d0a7f85185c61a6982f - depends: - - glib-tools 2.86.4 h60c1bae_1 - - libglib 2.86.4 he378b5c_1 - - libintl >=0.25.1,<1.0a0 - - libintl-devel - - packaging - - python * - license: LGPL-2.1-or-later - size: 78388 - timestamp: 1771864390600 -- conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda - sha256: 441586fc577c5a3f2ad7bf83578eb135dac94fb0cb75cc4da35f8abb5823b857 - md5: b52b769cd13f7adaa6ccdc68ef801709 - depends: - - __glibc >=2.17,<3.0.a0 - - libffi - - libgcc >=14 - - libglib 2.86.4 h6548e54_1 - license: LGPL-2.1-or-later - size: 214712 - timestamp: 1771863307416 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda - sha256: 339adcf9170d1c6eaf125a309debd541d20cb72964bff8edd51197ed1154e13b - md5: 2e1684508bcd4b343b34c27731fa5bbe - depends: - - __osx >=11.0 - - libffi - - libglib 2.86.4 he378b5c_1 - - libintl >=0.25.1,<1.0a0 - license: LGPL-2.1-or-later - size: 183089 - timestamp: 1771864291777 -- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c - md5: 2cd94587f3a401ae05e03a6caf09539d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - license: LGPL-2.0-or-later - license_family: LGPL - size: 99596 - timestamp: 1755102025473 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - sha256: c507ae9989dbea7024aa6feaebb16cbf271faac67ac3f0342ef1ab747c20475d - md5: 0fc46fee39e88bbcf5835f71a9d9a209 - depends: - - __osx >=11.0 - - libcxx >=19 - license: LGPL-2.0-or-later - license_family: LGPL - size: 81202 - timestamp: 1755102333712 -- pypi: https://files.pythonhosted.org/packages/3f/ae/8bffcbd373b57a5992cd077cbe8858fff39110480a9d50697091faea6f39/greenlet-3.3.2-cp314-cp314-macosx_11_0_universal2.whl - name: greenlet - version: 3.3.2 - sha256: 8d1658d7291f9859beed69a776c10822a0a799bc4bfe1bd4272bb60e62507dab - requires_dist: - - sphinx ; extra == 'docs' - - furo ; extra == 'docs' - - objgraph ; extra == 'test' - - psutil ; extra == 'test' - - setuptools ; extra == 'test' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - name: greenlet - version: 3.3.2 - sha256: 63d10328839d1973e5ba35e98cccbca71b232b14051fd957b6f8b6e8e80d0506 - requires_dist: - - sphinx ; extra == 'docs' - - furo ; extra == 'docs' - - objgraph ; extra == 'test' - - psutil ; extra == 'test' - - setuptools ; extra == 'test' - requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.26.10-h0363672_0.conda - sha256: f43bc8fd2c8b0c4317cf771f2cf8a9e7eee47105c233bfed00158f6579e41340 - md5: fd9738c3189541787bd967e19587de26 - depends: - - __glibc >=2.17,<3.0.a0 - - alsa-lib >=1.2.15.1,<1.3.0a0 - - gstreamer 1.26.10 h17cb667_0 - - libdrm >=2.4.125,<2.5.0a0 - - libegl >=1.7.0,<2.0a0 - - libexpat >=2.7.3,<3.0a0 - - libgcc >=14 - - libgl >=1.7.0,<2.0a0 - - libglib >=2.86.3,<3.0a0 - - libogg >=1.3.5,<1.4.0a0 - - libopus >=1.5.2,<2.0a0 - - libpng >=1.6.53,<1.7.0a0 - - libstdcxx >=14 - - libvorbis >=1.3.7,<1.4.0a0 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - pango >=1.56.4,<2.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxau >=1.0.12,<2.0a0 - - xorg-libxdamage >=1.1.6,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxfixes >=6.0.2,<7.0a0 - - xorg-libxrender >=0.9.12,<0.10.0a0 - - xorg-libxshmfence >=1.3.3,<2.0a0 - - xorg-libxxf86vm >=1.1.6,<2.0a0 - license: LGPL-2.0-or-later - license_family: LGPL - size: 2928142 - timestamp: 1766699713774 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gst-plugins-base-1.26.10-hd17a83a_0.conda - sha256: 892c0d86182548a0c33a60af4c195d5b7963de4a1a26466c9fbf6024e97bf959 - md5: da40bf8267461044b2df6e467695bdf7 - depends: - - __osx >=11.0 - - gstreamer 1.26.10 h30d696d_0 - - libcxx >=19 - - libexpat >=2.7.3,<3.0a0 - - libglib >=2.86.3,<3.0a0 - - libintl >=0.25.1,<1.0a0 - - libogg >=1.3.5,<1.4.0a0 - - libopus >=1.6,<2.0a0 - - libpng >=1.6.53,<1.7.0a0 - - libvorbis >=1.3.7,<1.4.0a0 - - libzlib >=1.3.1,<2.0a0 - - pango >=1.56.4,<2.0a0 - license: LGPL-2.0-or-later - license_family: LGPL - size: 2041012 - timestamp: 1766700009773 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.26.10-h17cb667_0.conda - sha256: 35044ecb0b08cd61f32b18f0c0c60f8d4aa610352eee4c5902e171a3decc0eba - md5: 0c38cdf4414540aae129822f961b5636 - depends: - - __glibc >=2.17,<3.0.a0 - - glib >=2.86.3,<3.0a0 - - libgcc >=14 - - libglib >=2.86.3,<3.0a0 - - libiconv >=1.18,<2.0a0 - - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 - license: LGPL-2.0-or-later - license_family: LGPL - size: 2059388 - timestamp: 1766699555877 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gstreamer-1.26.10-h30d696d_0.conda - sha256: 84230383c9cfb0b62ec4cdc3db444095308bb4b4b1cd9b76cb64e0e0951f5324 - md5: 9f2f36d5dc016272f358bc564198fec8 + timestamp: 1762974150770 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.0-pyhd8ed1ab_0.conda + sha256: 55162ec0ff4e22d8f762b3e774f08f79f234ba37ab5e64d7a1421ed9216a222c + md5: 49a92015e912176999ae81bea11ea778 depends: - - __osx >=11.0 - - glib >=2.86.3,<3.0a0 - - libcxx >=19 - - libglib >=2.86.3,<3.0a0 - - libiconv >=1.18,<2.0a0 - - libintl >=0.25.1,<1.0a0 - - libzlib >=1.3.1,<2.0a0 - license: LGPL-2.0-or-later - license_family: LGPL - size: 1375508 - timestamp: 1766699743601 + - python >=3.10 + license: Unlicense + purls: + - pkg:pypi/filelock + size: 25656 + timestamp: 1772380968183 - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda sha256: 96cac6573fd35ae151f4d6979bab6fbc90cb6b1fb99054ba19eb075da9822fcb md5: b8993c19b0c32a2f7b66cbb58ca27069 @@ -2504,6 +1181,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/h11 size: 39069 timestamp: 1767729720872 - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -2516,45 +1195,10 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/h2 size: 95967 timestamp: 1756364871835 -- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.3.2-h6083320_0.conda - sha256: 92015faf283f9c0a8109e2761042cd47ae7a4505e24af42a53bc3767cb249912 - md5: d170a70fc1d5c605fcebdf16851bd54a - depends: - - __glibc >=2.17,<3.0.a0 - - cairo >=1.18.4,<2.0a0 - - graphite2 >=1.3.14,<2.0a0 - - icu >=78.2,<79.0a0 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libgcc >=14 - - libglib >=2.86.3,<3.0a0 - - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT - size: 2035859 - timestamp: 1769445400168 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-12.3.2-h3103d1b_0.conda - sha256: f68c6704610396012124a3d86b087581174c2cf7968a46b6d95ba84cd87063c7 - md5: d0af4858d81c0c7abddc6b71fd8c0340 - depends: - - __osx >=11.0 - - cairo >=1.18.4,<2.0a0 - - graphite2 >=1.3.14,<2.0a0 - - icu >=78.2,<79.0a0 - - libcxx >=19 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libglib >=2.86.3,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT - size: 1441619 - timestamp: 1769446246348 - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.16.3-pyhcf101f3_0.conda sha256: 8eeb0759c702589a3fd0f1b9ad3c85f52b534db2f4d0d0c6397e0d172a5be644 md5: fa1a9e9bf9c27a07924e7be31825b420 @@ -2580,6 +1224,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/hatch size: 207766 timestamp: 1769175114713 - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.28.0-pyhcf101f3_1.conda @@ -2596,6 +1242,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/hatchling size: 60891 timestamp: 1767609134323 - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda @@ -2605,6 +1253,8 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/hpack size: 30731 timestamp: 1737618390337 - conda: https://conda.anaconda.org/conda-forge/noarch/html5lib-1.1-pyhd8ed1ab_2.conda @@ -2616,6 +1266,8 @@ packages: - webencodings license: MIT license_family: MIT + purls: + - pkg:pypi/html5lib size: 94853 timestamp: 1734075276288 - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda @@ -2631,6 +1283,8 @@ packages: - python license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/httpcore size: 49483 timestamp: 1745602916758 - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -2644,6 +1298,8 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/httpx size: 63082 timestamp: 1733663449209 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -2653,6 +1309,8 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/hyperframe size: 17397 timestamp: 1737618427549 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyh29332c3_1.conda @@ -2664,6 +1322,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/hyperlink size: 74751 timestamp: 1733319972207 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda @@ -2675,6 +1335,8 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: + - pkg:pypi/icu size: 12728445 timestamp: 1767969922681 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_0.conda @@ -2684,6 +1346,8 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + purls: + - pkg:pypi/icu size: 12389400 timestamp: 1772209104304 - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.6.1-pyhcf101f3_0.conda @@ -2695,18 +1359,22 @@ packages: - python license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/id size: 27972 timestamp: 1770237711404 -- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.16-pyhd8ed1ab_0.conda - sha256: 6a88cdde151469131df1948839ac2315ada99cf8d38aaacc9a7a5984e9cd8c19 - md5: 8bc5851c415865334882157127e75799 +- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda + sha256: 7cd5eccdb171a0adbf83a1ad8fc4e17822f4fc3f5518da9040de64e88bc07343 + md5: 5b7ae2ec4e0750e094f804a6cf1b2a37 depends: - python >=3.10 - ukkonen license: MIT license_family: MIT - size: 79302 - timestamp: 1768295306539 + purls: + - pkg:pypi/identify + size: 79520 + timestamp: 1772402363021 - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 md5: 53abe63df7e10a6ba605dc5f9f961d36 @@ -2714,6 +1382,8 @@ packages: - python >=3.10 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/idna size: 50721 timestamp: 1760286526795 - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 @@ -2723,6 +1393,8 @@ packages: - python >=3.4 license: MIT license_family: MIT + purls: + - pkg:pypi/imagesize size: 10164 timestamp: 1656939625410 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda @@ -2734,6 +1406,8 @@ packages: - python license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/importlib-metadata size: 34641 timestamp: 1747934053147 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda @@ -2746,13 +1420,10 @@ packages: - importlib-resources >=6.5.2,<6.5.3.0a0 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/importlib-resources size: 33781 timestamp: 1736252433366 -- pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - name: iniconfig - version: 2.3.0 - sha256: f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12 - requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 md5: 9614359868482abba1bd15ce465e3c42 @@ -2760,152 +1431,10 @@ packages: - python >=3.10 license: MIT license_family: MIT + purls: + - pkg:pypi/iniconfig size: 13387 timestamp: 1760831448842 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda - sha256: 5c1f3e874adaf603449f2b135d48f168c5d510088c78c229bda0431268b43b27 - md5: 4b53d436f3fbc02ce3eeaf8ae9bebe01 - depends: - - appnope - - __osx - - comm >=0.1.1 - - debugpy >=1.6.5 - - ipython >=7.23.1 - - jupyter_client >=8.8.0 - - jupyter_core >=5.1,!=6.0.* - - matplotlib-inline >=0.1 - - nest-asyncio >=1.4 - - packaging >=22 - - psutil >=5.7 - - python >=3.10 - - pyzmq >=25 - - tornado >=6.4.1 - - traitlets >=5.4.0 - - python - constrains: - - appnope >=0.1.2 - license: BSD-3-Clause - license_family: BSD - size: 132260 - timestamp: 1770566135697 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda - sha256: b77ed58eb235e5ad80e742b03caeed4bbc2a2ef064cb9a2deee3b75dfae91b2a - md5: 8b267f517b81c13594ed68d646fd5dcb - depends: - - __linux - - comm >=0.1.1 - - debugpy >=1.6.5 - - ipython >=7.23.1 - - jupyter_client >=8.8.0 - - jupyter_core >=5.1,!=6.0.* - - matplotlib-inline >=0.1 - - nest-asyncio >=1.4 - - packaging >=22 - - psutil >=5.7 - - python >=3.10 - - pyzmq >=25 - - tornado >=6.4.1 - - traitlets >=5.4.0 - - python - constrains: - - appnope >=0.1.2 - license: BSD-3-Clause - license_family: BSD - size: 133644 - timestamp: 1770566133040 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipympl-0.10.0-pyhcf101f3_0.conda - sha256: 5cb435e0fe1238b0ec4baa13d52faf4490b76bb62202e5fd5bf004e95f2cf425 - md5: abb099ef4a8ab45d4b713f2d4277f727 - depends: - - ipython <10 - - ipywidgets >=7.6.0,<9 - - matplotlib-base >=3.5.0,<4 - - numpy - - pillow - - python >=3.10 - - traitlets <6 - - python - license: BSD-3-Clause - license_family: BSD - size: 244162 - timestamp: 1769263121500 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.10.0-pyh53cf698_0.conda - sha256: 12cb4db242ea1a2e5e60a51b20f16e9c8120a9eb5d013c641cbf827bf3bb78e1 - md5: 441ca4e203a62f7db2f29f190c02b9cf - depends: - - __unix - - pexpect >4.3 - - decorator >=4.3.2 - - ipython_pygments_lexers >=1.0.0 - - jedi >=0.18.1 - - matplotlib-inline >=0.1.5 - - prompt-toolkit >=3.0.41,<3.1.0 - - pygments >=2.11.0 - - python >=3.11 - - stack_data >=0.6.0 - - traitlets >=5.13.0 - - typing_extensions >=4.6 - - python - license: BSD-3-Clause - license_family: BSD - size: 647436 - timestamp: 1770040907512 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104 - md5: bd80ba060603cc228d9d81c257093119 - depends: - - pygments - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 13993 - timestamp: 1737123723464 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.8-pyhd8ed1ab_0.conda - sha256: 6bb58afb7eabc8b4ac0c7e92707fb498313cc0164cf04e7ba1090dbf49af514b - md5: d68e3f70d1f068f1b66d94822fdc644e - depends: - - comm >=0.1.3 - - ipython >=6.1.0 - - jupyterlab_widgets >=3.0.15,<3.1.0 - - python >=3.10 - - traitlets >=4.3.1 - - widgetsnbextension >=4.0.14,<4.1.0 - license: BSD-3-Clause - license_family: BSD - size: 114376 - timestamp: 1762040524661 -- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda - sha256: 08e838d29c134a7684bca0468401d26840f41c92267c4126d7b43a6b533b0aed - md5: 0b0154421989637d424ccf0f104be51a - depends: - - arrow >=0.15.0 - - python >=3.9 - license: MIT - license_family: MIT - size: 19832 - timestamp: 1733493720346 -- pypi: https://files.pythonhosted.org/packages/8d/48/aa685dbf1024c7bd82bede569e3a85f82c32fd3d79ba5fea578f0159571a/jaraco_context-6.1.0-py3-none-any.whl - name: jaraco-context - version: 6.1.0 - sha256: a43b5ed85815223d0d3cfdb6d7ca0d2bc8946f28f30b6f3216bda070f68badda - requires_dist: - - backports-tarfile ; python_full_version < '3.12' - - pytest>=6,!=8.1.* ; extra == 'test' - - jaraco-test>=5.6.0 ; extra == 'test' - - portend ; extra == 'test' - - sphinx>=3.5 ; extra == 'doc' - - jaraco-packaging>=9.3 ; extra == 'doc' - - rst-linker>=1.9 ; extra == 'doc' - - furo ; extra == 'doc' - - sphinx-lint ; extra == 'doc' - - jaraco-tidelift>=1.4 ; extra == 'doc' - - pytest-checkdocs>=2.4 ; extra == 'check' - - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' - - pytest-cov ; extra == 'cover' - - pytest-enabler>=3.4 ; extra == 'enabler' - - pytest-mypy>=1.0.1 ; extra == 'type' - - mypy<1.19 ; platform_python_implementation == 'PyPy' and extra == 'type' - requires_python: '>=3.9' - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda sha256: 3cc991f0f09dfd00d2626e745ba68da03e4f1dcbb7b36dd20f7a7373643cd5d5 md5: d59568bad316413c89831456e691de29 @@ -2915,6 +1444,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/jaraco-classes size: 14831 timestamp: 1767294269456 - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.1.0-pyhcf101f3_0.conda @@ -2926,6 +1457,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/jaraco-context size: 15566 timestamp: 1768299702258 - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.4.0-pyhcf101f3_1.conda @@ -2937,17 +1470,10 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/jaraco-functools size: 18744 timestamp: 1767294193246 -- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - sha256: 92c4d217e2dc68983f724aa983cca5464dcb929c566627b26a2511159667dba8 - md5: a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 - depends: - - parso >=0.8.3,<0.9.0 - - python >=3.9 - license: Apache-2.0 AND MIT - size: 843646 - timestamp: 1733300981994 - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda sha256: 00d37d85ca856431c67c8f6e890251e7cc9e5ef3724a0302b8d4a101f22aa27f md5: b4b91eb14fbe2f850dd2c5fc20676c0d @@ -2955,6 +1481,8 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/jeepney size: 40015 timestamp: 1740828380668 - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda @@ -2966,6 +1494,8 @@ packages: - python license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/jinja2 size: 120685 timestamp: 1764517220861 - pypi: https://files.pythonhosted.org/packages/14/2f/967ba146e6d58cf6a652da73885f52fc68001525b4197effc174321d70b4/jmespath-1.1.0-py3-none-any.whl @@ -2973,25 +1503,6 @@ packages: version: 1.1.0 sha256: a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64 requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda - sha256: ba03ca5a6db38d9f48bd30172e8c512dea7a686a5c7701c6fcdb7b3023dae2ad - md5: 8d5f66ebf832c4ce28d5c37a0e76605c - depends: - - python >=3.10 - license: Apache-2.0 - license_family: APACHE - size: 34017 - timestamp: 1767325114901 -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda - sha256: 1a1328476d14dfa8b84dbacb7f7cd7051c175498406dc513ca6c679dc44f3981 - md5: cd2214824e36b0180141d422aba01938 - depends: - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - size: 13967 - timestamp: 1765026384757 - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 md5: ada41c863af263cc4c5fcbaff7c3e4dc @@ -3004,6 +1515,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/jsonschema size: 82356 timestamp: 1767839954256 - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda @@ -3015,53 +1528,10 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/jsonschema-specifications size: 19236 timestamp: 1757335715225 -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda - sha256: 6886fc61e4e4edd38fd38729976b134e8bd2143f7fce56cc80d7ac7bac99bce1 - md5: 8368d58342d0825f0843dc6acdd0c483 - depends: - - jsonschema >=4.26.0,<4.26.1.0a0 - - fqdn - - idna - - isoduration - - jsonpointer >1.13 - - rfc3339-validator - - rfc3986-validator >0.1.0 - - rfc3987-syntax >=1.1.0 - - uri-template - - webcolors >=24.6.0 - license: MIT - license_family: MIT - size: 4740 - timestamp: 1767839954258 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda - sha256: 897ad2e2c2335ef3c2826d7805e16002a1fd0d509b4ae0bc66617f0e0ff07bc2 - md5: 62b7c96c6cd77f8173cc5cada6a9acaa - depends: - - importlib-metadata >=4.8.3 - - jupyter_server >=1.1.2 - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - size: 60377 - timestamp: 1756388269267 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda - sha256: e402bd119720862a33229624ec23645916a7d47f30e1711a4af9e005162b84f3 - md5: 8a3d6d0523f66cf004e563a50d9392b3 - depends: - - jupyter_core >=5.1 - - python >=3.10 - - python-dateutil >=2.8.2 - - pyzmq >=25.0 - - tornado >=6.4.1 - - traitlets >=5.3 - - python - license: BSD-3-Clause - license_family: BSD - size: 112785 - timestamp: 1767954655912 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda sha256: 1d34b80e5bfcd5323f104dbf99a2aafc0e5d823019d626d0dce5d3d356a2a52a md5: b38fe4e78ee75def7e599843ef4c1ab0 @@ -3076,129 +1546,10 @@ packages: - pywin32 >=300 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/jupyter-core size: 65503 timestamp: 1760643864586 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda - sha256: e9964aaaf6d24a685cd5ce9d75731b643ed7f010fb979574a6580cd2f974c6cd - md5: 31e11c30bbee1682a55627f953c6725a - depends: - - jsonschema-with-format-nongpl >=4.18.0 - - packaging - - python >=3.9 - - python-json-logger >=2.0.4 - - pyyaml >=5.3 - - referencing - - rfc3339-validator - - rfc3986-validator >=0.1.1 - - traitlets >=5.3 - - python - license: BSD-3-Clause - license_family: BSD - size: 24306 - timestamp: 1770937604863 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda - sha256: 74c4e642be97c538dae1895f7052599dfd740d8bd251f727bce6453ce8d6cd9a - md5: d79a87dcfa726bcea8e61275feed6f83 - depends: - - anyio >=3.1.0 - - argon2-cffi >=21.1 - - jinja2 >=3.0.3 - - jupyter_client >=7.4.4 - - jupyter_core >=4.12,!=5.0.* - - jupyter_events >=0.11.0 - - jupyter_server_terminals >=0.4.4 - - nbconvert-core >=6.4.4 - - nbformat >=5.3.0 - - overrides >=5.0 - - packaging >=22.0 - - prometheus_client >=0.9 - - python >=3.10 - - pyzmq >=24 - - send2trash >=1.8.2 - - terminado >=0.8.3 - - tornado >=6.2.0 - - traitlets >=5.6.0 - - websocket-client >=1.7 - - python - license: BSD-3-Clause - license_family: BSD - size: 347094 - timestamp: 1755870522134 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda - sha256: 5eda79ed9f53f590031d29346abd183051263227dd9ee667b5ca1133ce297654 - md5: 7b8bace4943e0dc345fc45938826f2b8 - depends: - - python >=3.10 - - terminado >=0.8.3 - - python - license: BSD-3-Clause - license_family: BSD - size: 22052 - timestamp: 1768574057200 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.5-pyhd8ed1ab_0.conda - sha256: 53705b629a27cc91600f99b70c39181bbc428cdbc70f22aa40cea21e9fa6d560 - md5: c4b96d937d1b03203c00fed92e713cd1 - depends: - - async-lru >=1.0.0 - - httpx >=0.25.0,<1 - - ipykernel >=6.5.0,!=6.30.0 - - jinja2 >=3.0.3 - - jupyter-lsp >=2.0.0 - - jupyter_core - - jupyter_server >=2.4.0,<3 - - jupyterlab_server >=2.28.0,<3 - - notebook-shim >=0.2 - - packaging - - python >=3.10 - - setuptools >=41.1.0 - - tomli >=1.2.2 - - tornado >=6.2.0 - - traitlets - license: BSD-3-Clause - license_family: BSD - size: 7994221 - timestamp: 1771885064306 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0 - md5: fd312693df06da3578383232528c468d - depends: - - pygments >=2.4.1,<3 - - python >=3.9 - constrains: - - jupyterlab >=4.0.8,<5.0.0 - license: BSD-3-Clause - license_family: BSD - size: 18711 - timestamp: 1733328194037 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda - sha256: 381d2d6a259a3be5f38a69463e0f6c5dcf1844ae113058007b51c3bef13a7cee - md5: a63877cb23de826b1620d3adfccc4014 - depends: - - babel >=2.10 - - jinja2 >=3.0.3 - - json5 >=0.9.0 - - jsonschema >=4.18 - - jupyter_server >=1.21,<3 - - packaging >=21.3 - - python >=3.10 - - requests >=2.31 - - python - license: BSD-3-Clause - license_family: BSD - size: 51621 - timestamp: 1761145478692 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.16-pyhcf101f3_1.conda - sha256: 5c03de243d7ae6247f39a402f4785d95e61c3be79ef18738e8f17155585d31a8 - md5: dbf8b81974504fa51d34e436ca7ef389 - depends: - - python >=3.10 - - python - constrains: - - jupyterlab >=3,<5 - license: BSD-3-Clause - license_family: BSD - size: 216779 - timestamp: 1762267481404 - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda sha256: 9def5c6fb3b3b4952a4f6b55a019b5c7065b592682b84710229de5a0b73f6364 md5: c88f9579d08eb4031159f03640714ce3 @@ -3212,6 +1563,8 @@ packages: - python >=3.10 license: MIT license_family: MIT + purls: + - pkg:pypi/keyring size: 37924 timestamp: 1763320995459 - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyha804496_0.conda @@ -3229,88 +1582,10 @@ packages: - secretstorage >=3.2 license: MIT license_family: MIT + purls: + - pkg:pypi/keyring size: 37717 timestamp: 1763320674488 -- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 - md5: b38117a3c920364aff79f870c984b4a3 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: LGPL-2.1-or-later - size: 134088 - timestamp: 1754905959823 -- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py314h97ea11e_2.conda - sha256: a707d08c095d02148201f2da9fba465054fb750e33117e215892a4fefcc1b54a - md5: 57f1ce4f7ba6bcd460be8f83c8f04c69 - depends: - - python - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.14.* *_cp314 - license: BSD-3-Clause - license_family: BSD - size: 78071 - timestamp: 1762488742381 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.9-py314h42813c9_2.conda - sha256: c4d7e6653d343e768110ec77ac1c6c89f313f77a19a1f2cd60b7c7b8b0758bdf - md5: 9aa431bf603c231e8c77a1b0842a85ed - depends: - - python - - python 3.14.* *_cp314 - - __osx >=11.0 - - libcxx >=19 - - python_abi 3.14.* *_cp314 - license: BSD-3-Clause - license_family: BSD - size: 68534 - timestamp: 1762489024029 -- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 - md5: 3f43953b7d3fb3aaa1d0d0723d91e368 - depends: - - keyutils >=1.6.1,<2.0a0 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - openssl >=3.3.1,<4.0a0 - license: MIT - license_family: MIT - size: 1370023 - timestamp: 1719463201255 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b - md5: c6dc8a0fdec13a0565936655c33069a1 - depends: - - __osx >=11.0 - - libcxx >=16 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - openssl >=3.3.1,<4.0a0 - license: MIT - license_family: MIT - size: 1155530 - timestamp: 1719463474401 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab - md5: a8832b479f93521a9e7b5b743803be51 - depends: - - libgcc-ng >=12 - license: LGPL-2.0-only - license_family: LGPL - size: 508258 - timestamp: 1664996250081 -- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - sha256: 49570840fb15f5df5d4b4464db8ee43a6d643031a2bc70ef52120a52e3809699 - md5: 9b965c999135d43a3d0f7bd7d024e26a - depends: - - python >=3.10 - license: MIT - license_family: MIT - size: 94312 - timestamp: 1761596921009 - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a md5: 6f2e2c8f58160147c4d1c6f4c14cbac4 @@ -3321,6 +1596,8 @@ packages: - libtiff >=4.7.1,<4.8.0a0 license: MIT license_family: MIT + purls: + - pkg:pypi/lcms2 size: 249959 timestamp: 1768184673131 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda @@ -3332,6 +1609,8 @@ packages: - libtiff >=4.7.1,<4.8.0a0 license: MIT license_family: MIT + purls: + - pkg:pypi/lcms2 size: 211756 timestamp: 1768184994800 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda @@ -3344,6 +1623,8 @@ packages: - binutils_impl_linux-64 2.45.1 license: GPL-3.0-only license_family: GPL + purls: + - pkg:pypi/ld-impl-linux-64 size: 725507 timestamp: 1770267139900 - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda @@ -3355,6 +1636,8 @@ packages: - libstdcxx >=13 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/lerc size: 264243 timestamp: 1745264221534 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda @@ -3365,6 +1648,8 @@ packages: - libcxx >=18 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/lerc size: 188306 timestamp: 1745264362794 - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda @@ -3382,6 +1667,8 @@ packages: - liblapacke 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/libblas size: 18213 timestamp: 1765818813880 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda @@ -3399,6 +1686,8 @@ packages: - mkl <2026 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/libblas size: 18546 timestamp: 1765819094137 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda @@ -3409,6 +1698,8 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: + - pkg:pypi/libbrotlicommon size: 79965 timestamp: 1764017188531 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda @@ -3418,6 +1709,8 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + purls: + - pkg:pypi/libbrotlicommon size: 79443 timestamp: 1764017945924 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda @@ -3429,6 +1722,8 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: + - pkg:pypi/libbrotlidec size: 34632 timestamp: 1764017199083 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda @@ -3439,6 +1734,8 @@ packages: - libbrotlicommon 1.2.0 hc919400_1 license: MIT license_family: MIT + purls: + - pkg:pypi/libbrotlidec size: 29452 timestamp: 1764017979099 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda @@ -3450,6 +1747,8 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: + - pkg:pypi/libbrotlienc size: 298378 timestamp: 1764017210931 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda @@ -3460,19 +1759,10 @@ packages: - libbrotlicommon 1.2.0 hc919400_1 license: MIT license_family: MIT + purls: + - pkg:pypi/libbrotlienc size: 290754 timestamp: 1764018009077 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-h3ff7636_0.conda - sha256: 9517cce5193144af0fcbf19b7bd67db0a329c2cc2618f28ffecaa921a1cbe9d3 - md5: 09c264d40c67b82b49a3f3b89037bd2e - depends: - - __glibc >=2.17,<3.0.a0 - - attr >=2.5.2,<2.6.0a0 - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD - size: 121429 - timestamp: 1762349484074 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda build_number: 5 sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8 @@ -3485,6 +1775,8 @@ packages: - liblapack 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/libcblas size: 18194 timestamp: 1765818837135 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda @@ -3499,67 +1791,10 @@ packages: - blas 2.305 openblas license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/libcblas size: 18548 timestamp: 1765819108956 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp18.1-18.1.8-default_h73dfc95_17.conda - sha256: 115503fb68a76ccdbbc1af5d79d4cb741c9dbec0af911e93783f1dcb2ed078d0 - md5: f741d4a6ae4bc92d6a18fc3c69e66f1a - depends: - - __osx >=11.0 - - libcxx >=18.1.8 - - libllvm18 >=18.1.8,<18.2.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 13334948 - timestamp: 1768826899333 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_3.conda - sha256: de512ce246faec2d4f7766774769921a85b5aa053a74abd2f8c97ad50b393aac - md5: 24a2802074d26aecfdbc9b3f1d8168d1 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libllvm21 >=21.1.8,<21.2.0a0 - - libstdcxx >=14 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 21066639 - timestamp: 1770190428756 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.0-default_h746c552_0.conda - sha256: 4a9dd814492a129f2ff40cd4ab0b942232c9e3c6dbc0d0aaf861f1f65e99cc7d - md5: 140459a7413d8f6884eb68205ce39a0d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libllvm22 >=22.1.0,<22.2.0a0 - - libstdcxx >=14 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 12817500 - timestamp: 1772101411287 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-22.1.0-default_h13b06bd_0.conda - sha256: 1f9195e2f9be884880b3d119be6eaea4b8f57d399b49e78a9718071ecee1cc29 - md5: 64ecee538edc16caf5717f3c2d6d8545 - depends: - - __osx >=11.0 - - libcxx >=22.1.0 - - libllvm22 >=22.1.0,<22.2.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 8934812 - timestamp: 1772098474633 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda - sha256: cb83980c57e311783ee831832eb2c20ecb41e7dee6e86e8b70b8cef0e43eab55 - md5: d4a250da4737ee127fb1fa6452a9002e - depends: - - __glibc >=2.17,<3.0.a0 - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - license: Apache-2.0 - license_family: Apache - size: 4523621 - timestamp: 1749905341688 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda sha256: ce1049fa6fda9cf08ff1c50fb39573b5b0ea6958375d8ea7ccd8456ab81a0bcb md5: e9c56daea841013e7774b5cd46f41564 @@ -3567,6 +1802,8 @@ packages: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache + purls: + - pkg:pypi/libcxx size: 568910 timestamp: 1772001095642 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda @@ -3577,70 +1814,21 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: + - pkg:pypi/libdeflate size: 73490 timestamp: 1761979956660 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - sha256: 5e0b6961be3304a5f027a8c00bd0967fc46ae162cffb7553ff45c70f51b8314c - md5: a6130c709305cd9828b4e1bd9ba0000c - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 55420 - timestamp: 1761980066242 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda - sha256: c076a213bd3676cc1ef22eeff91588826273513ccc6040d9bea68bccdc849501 - md5: 9314bc5a1fe7d1044dc9dfd3ef400535 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libpciaccess >=0.18,<0.19.0a0 - license: MIT - license_family: MIT - size: 310785 - timestamp: 1757212153962 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 - md5: c277e0a4d549b03ac1e9d6cbbe3d017b - depends: - - ncurses - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - ncurses >=6.5,<7.0a0 - license: BSD-2-Clause - license_family: BSD - size: 134676 - timestamp: 1738479519902 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 - md5: 44083d2d2c2025afca315c7a172eab2b + sha256: 5e0b6961be3304a5f027a8c00bd0967fc46ae162cffb7553ff45c70f51b8314c + md5: a6130c709305cd9828b4e1bd9ba0000c depends: - - ncurses - __osx >=11.0 - - ncurses >=6.5,<7.0a0 - license: BSD-2-Clause - license_family: BSD - size: 107691 - timestamp: 1738479560845 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - sha256: 7fd5408d359d05a969133e47af580183fbf38e2235b562193d427bb9dad79723 - md5: c151d5eb730e9b7480e6d48c0fc44048 - depends: - - __glibc >=2.17,<3.0.a0 - - libglvnd 1.7.0 ha4b6fd6_2 - license: LicenseRef-libglvnd - size: 44840 - timestamp: 1731330973553 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 - md5: a1cfcc585f0c42bf8d5546bb1dfb668d - depends: - - libgcc-ng >=12 - - openssl >=3.1.1,<4.0a0 - license: BSD-3-Clause - license_family: BSD - size: 427426 - timestamp: 1685725977222 + license: MIT + license_family: MIT + purls: + - pkg:pypi/libdeflate + size: 55420 + timestamp: 1761980066242 - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 @@ -3651,6 +1839,8 @@ packages: - expat 2.7.4.* license: MIT license_family: MIT + purls: + - pkg:pypi/libexpat size: 76798 timestamp: 1771259418166 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda @@ -3662,6 +1852,8 @@ packages: - expat 2.7.4.* license: MIT license_family: MIT + purls: + - pkg:pypi/libexpat size: 68199 timestamp: 1771260020767 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda @@ -3672,6 +1864,8 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: + - pkg:pypi/libffi size: 58592 timestamp: 1769456073053 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda @@ -3681,27 +1875,18 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + purls: + - pkg:pypi/libffi size: 40979 timestamp: 1769456747661 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda - sha256: e755e234236bdda3d265ae82e5b0581d259a9279e3e5b31d745dc43251ad64fb - md5: 47595b9d53054907a00d95e4d47af1d6 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - libogg >=1.3.5,<1.4.0a0 - - libstdcxx >=14 - license: BSD-3-Clause - license_family: BSD - size: 424563 - timestamp: 1764526740626 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda sha256: 4641d37faeb97cf8a121efafd6afd040904d4bca8c46798122f417c31d5dfbec md5: f4084e4e6577797150f9b04a4560ceb0 depends: - libfreetype6 >=2.14.1 license: GPL-2.0-only OR FTL + purls: + - pkg:pypi/libfreetype size: 7664 timestamp: 1757945417134 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.1-hce30654_0.conda @@ -3710,6 +1895,8 @@ packages: depends: - libfreetype6 >=2.14.1 license: GPL-2.0-only OR FTL + purls: + - pkg:pypi/libfreetype size: 7810 timestamp: 1757947168537 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda @@ -3723,6 +1910,8 @@ packages: constrains: - freetype >=2.14.1 license: GPL-2.0-only OR FTL + purls: + - pkg:pypi/libfreetype6 size: 386739 timestamp: 1757945416744 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.1-h6da58f4_0.conda @@ -3735,6 +1924,8 @@ packages: constrains: - freetype >=2.14.1 license: GPL-2.0-only OR FTL + purls: + - pkg:pypi/libfreetype6 size: 346703 timestamp: 1757947166116 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda @@ -3748,6 +1939,8 @@ packages: - libgomp 15.2.0 he0feb66_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: + - pkg:pypi/libgcc size: 1041788 timestamp: 1771378212382 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda @@ -3760,6 +1953,8 @@ packages: - libgomp 15.2.0 18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: + - pkg:pypi/libgcc size: 401974 timestamp: 1771378877463 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda @@ -3769,6 +1964,8 @@ packages: - libgcc 15.2.0 he0feb66_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: + - pkg:pypi/libgcc-ng size: 27526 timestamp: 1771378224552 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda @@ -3780,6 +1977,8 @@ packages: - libgfortran-ng ==15.2.0=*_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: + - pkg:pypi/libgfortran size: 27523 timestamp: 1771378269450 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda @@ -3791,6 +1990,8 @@ packages: - libgfortran-ng ==15.2.0=*_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: + - pkg:pypi/libgfortran size: 138973 timestamp: 1771379054939 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda @@ -3803,6 +2004,8 @@ packages: - libgfortran 15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: + - pkg:pypi/libgfortran5 size: 2482475 timestamp: 1771378241063 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda @@ -3814,18 +2017,10 @@ packages: - libgfortran 15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: + - pkg:pypi/libgfortran5 size: 598634 timestamp: 1771378886363 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - sha256: dc2752241fa3d9e40ce552c1942d0a4b5eeb93740c9723873f6fcf8d39ef8d2d - md5: 928b8be80851f5d8ffb016f9c81dae7a - depends: - - __glibc >=2.17,<3.0.a0 - - libglvnd 1.7.0 ha4b6fd6_2 - - libglx 1.7.0 ha4b6fd6_2 - license: LicenseRef-libglvnd - size: 134712 - timestamp: 1731330998354 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda sha256: a27e44168a1240b15659888ce0d9b938ed4bdb49e9ea68a7c1ff27bcea8b55ce md5: bb26456332b07f68bf3b7622ed71c0da @@ -3839,41 +2034,10 @@ packages: constrains: - glib 2.86.4 *_1 license: LGPL-2.1-or-later + purls: + - pkg:pypi/libglib size: 4398701 timestamp: 1771863239578 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda - sha256: a4254a241a96198e019ced2e0d2967e4c0ef64fac32077a45c065b32dc2b15d2 - md5: 673069f6725ed7b1073f9b96094294d1 - depends: - - __osx >=11.0 - - libffi >=3.5.2,<3.6.0a0 - - libiconv >=1.18,<2.0a0 - - libintl >=0.25.1,<1.0a0 - - libzlib >=1.3.1,<2.0a0 - - pcre2 >=10.47,<10.48.0a0 - constrains: - - glib 2.86.4 *_1 - license: LGPL-2.1-or-later - size: 4108927 - timestamp: 1771864169970 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 - md5: 434ca7e50e40f4918ab701e3facd59a0 - depends: - - __glibc >=2.17,<3.0.a0 - license: LicenseRef-libglvnd - size: 132463 - timestamp: 1731330968309 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - sha256: 2d35a679624a93ce5b3e9dd301fff92343db609b79f0363e6d0ceb3a6478bfa7 - md5: c8013e438185f33b13814c5c488acd5c - depends: - - __glibc >=2.17,<3.0.a0 - - libglvnd 1.7.0 ha4b6fd6_2 - - xorg-libx11 >=1.8.10,<2.0a0 - license: LicenseRef-libglvnd - size: 75504 - timestamp: 1731330988898 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 md5: 239c5e9546c38a1e884d69effcf4c882 @@ -3881,6 +2045,8 @@ packages: - __glibc >=2.17,<3.0.a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: + - pkg:pypi/libgomp size: 603262 timestamp: 1771378117851 - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda @@ -3890,35 +2056,10 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: LGPL-2.1-only + purls: + - pkg:pypi/libiconv size: 790176 timestamp: 1754908768807 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 - md5: 4d5a7445f0b25b6a3ddbb56e790f5251 - depends: - - __osx >=11.0 - license: LGPL-2.1-only - size: 750379 - timestamp: 1754909073836 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a - md5: 5103f6a6b210a3912faf8d7db516918c - depends: - - __osx >=11.0 - - libiconv >=1.18,<2.0a0 - license: LGPL-2.1-or-later - size: 90957 - timestamp: 1751558394144 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.25.1-h493aca8_0.conda - sha256: 5a446cb0501d87e0816da0bce524c60a053a4cf23c94dfd3e2b32a8499009e36 - md5: 5f9888e1cdbbbef52c8cf8b567393535 - depends: - - __osx >=11.0 - - libiconv >=1.18,<2.0a0 - - libintl 0.25.1 h493aca8_0 - license: LGPL-2.1-or-later - size: 40340 - timestamp: 1751558481257 - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 md5: 8397539e3a0bbd1695584fb4f927485a @@ -3928,6 +2069,8 @@ packages: constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib + purls: + - pkg:pypi/libjpeg-turbo size: 633710 timestamp: 1762094827865 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda @@ -3938,6 +2081,8 @@ packages: constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib + purls: + - pkg:pypi/libjpeg-turbo size: 551197 timestamp: 1762095054358 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda @@ -3952,6 +2097,8 @@ packages: - libcblas 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/liblapack size: 18200 timestamp: 1765818857876 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda @@ -3966,66 +2113,10 @@ packages: - liblapacke 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/liblapack size: 18551 timestamp: 1765819121855 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm18-18.1.8-default_h3f38c9c_11.conda - sha256: e777446dc50c48ed59486f6a08419d59a03f01c5594154f19d182a2ce5a664f3 - md5: 6a9bba912968fb782aa1e8cb180ca6cc - depends: - - __osx >=11.0 - - libcxx >=19 - - libxml2 - - libxml2-16 >=2.14.6 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 25876220 - timestamp: 1764314088538 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - sha256: 91bb4f5be1601b40b4995911d785e29387970f0b3c80f33f7f9028f95335399f - md5: 1a2708a460884d6861425b7f9a7bef99 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - libxml2 - - libxml2-16 >=2.14.6 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 44333366 - timestamp: 1765959132513 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.0-hf7376ad_0.conda - sha256: 2efe1d8060c6afeb2df037fc61c182fb84e10f49cdbd29ed672e112d4d4ce2d7 - md5: 213f51bbcce2964ff2ec00d0fdd38541 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - libxml2 - - libxml2-16 >=2.14.6 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 44236214 - timestamp: 1772009776202 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm22-22.1.0-h89af1be_0.conda - sha256: 19e2c69bd90cffc66a9fd9feff2bfe6093cda8bf69aa01a6e1c41cbc0a5c24a0 - md5: 620fe27ebf89177446fb7cc3c26c9cc0 - depends: - - __osx >=11.0 - - libcxx >=19 - - libxml2 - - libxml2-16 >=2.14.6 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 30060199 - timestamp: 1771978789197 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb md5: c7c83eecbb72d88b940c249af56c8b17 @@ -4035,6 +2126,8 @@ packages: constrains: - xz 5.8.2.* license: 0BSD + purls: + - pkg:pypi/liblzma size: 113207 timestamp: 1768752626120 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda @@ -4045,63 +2138,22 @@ packages: constrains: - xz 5.8.2.* license: 0BSD + purls: + - pkg:pypi/liblzma size: 92242 timestamp: 1768752982486 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 - md5: 2c21e66f50753a083cbe6b80f38268fa - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: BSD-2-Clause - license_family: BSD - size: 92400 - timestamp: 1769482286018 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 - md5: 57c4be259f5e0b99a5983799a228ae55 - depends: - - __osx >=11.0 - license: BSD-2-Clause - license_family: BSD - size: 73690 - timestamp: 1769482560514 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda - sha256: 3b3f19ced060013c2dd99d9d46403be6d319d4601814c772a3472fe2955612b0 - md5: 7c7927b404672409d9917d49bff5f2d6 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 + md5: d864d34357c3b65a4b731f78c0801dc4 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - license: LGPL-2.1-or-later - size: 33418 - timestamp: 1734670021371 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libntlm-1.8-h5505292_0.conda - sha256: ea8c680924d957e12270dca549620327d5e986f23c4bd5f45627167ca6ef7a3b - md5: c90c1d3bd778f5ec0d4bb4ef36cbd5b6 - depends: - - __osx >=11.0 - license: LGPL-2.1-or-later - size: 31099 - timestamp: 1734670168822 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda - sha256: ffb066ddf2e76953f92e06677021c73c85536098f1c21fcd15360dbc859e22e4 - md5: 68e52064ed3897463c0e958ab5c8f91b - depends: - - libgcc >=13 - - __glibc >=2.17,<3.0.a0 - license: BSD-3-Clause - license_family: BSD - size: 218500 - timestamp: 1745825989535 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libogg-1.3.5-h48c0fde_1.conda - sha256: 28bd1fe20fe43da105da41b95ac201e95a1616126f287985df8e86ddebd1c3d8 - md5: 29b8b11f6d7e6bd0e76c029dcf9dd024 - depends: - - __osx >=11.0 - license: BSD-3-Clause - license_family: BSD - size: 216719 - timestamp: 1745826006052 + license: LGPL-2.1-only + license_family: GPL + purls: + - pkg:pypi/libnsl + 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 @@ -4114,6 +2166,8 @@ packages: - openblas >=0.3.30,<0.3.31.0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/libopenblas size: 5927939 timestamp: 1763114673331 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda @@ -4128,46 +2182,10 @@ packages: - openblas >=0.3.30,<0.3.31.0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/libopenblas size: 4284132 timestamp: 1768547079205 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda - sha256: 215086c108d80349e96051ad14131b751d17af3ed2cb5a34edd62fa89bfe8ead - md5: 7df50d44d4a14d6c31a2c54f2cd92157 - depends: - - __glibc >=2.17,<3.0.a0 - - libglvnd 1.7.0 ha4b6fd6_2 - license: LicenseRef-libglvnd - size: 50757 - timestamp: 1731330993524 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.6.1-h280c20c_0.conda - sha256: f1061a26213b9653bbb8372bfa3f291787ca091a9a3060a10df4d5297aad74fd - md5: 2446ac1fe030c2aa6141386c1f5a6aed - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD - size: 324993 - timestamp: 1768497114401 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopus-1.6.1-h1a92334_0.conda - sha256: 5c95a5f7712f543c59083e62fc3a95efec8b7f3773fbf4542ad1fb87fbf51ff4 - md5: 7f414dd3fd1cb7a76e51fec074a9c49e - depends: - - __osx >=11.0 - license: BSD-3-Clause - license_family: BSD - size: 308000 - timestamp: 1768497248058 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - sha256: 0bd91de9b447a2991e666f284ae8c722ffb1d84acb594dbd0c031bd656fa32b2 - md5: 70e3400cbbfa03e96dcde7fc13e38c7b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - size: 28424 - timestamp: 1749901812541 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c md5: 5f13ffc7d30ffec87864e678df9957b4 @@ -4176,6 +2194,8 @@ packages: - __glibc >=2.17,<3.0.a0 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement + purls: + - pkg:pypi/libpng size: 317669 timestamp: 1770691470744 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda @@ -4185,66 +2205,10 @@ packages: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement + purls: + - pkg:pypi/libpng size: 288950 timestamp: 1770691485950 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.2-hb80d175_0.conda - sha256: 5f857281d53334f1a400afae7ae915161eb8f796ddadb11c082839a4c47de6da - md5: fa63c385ddb50957d93bdb394e355be8 - depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.2,<79.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=14 - - openldap >=2.6.10,<2.7.0a0 - - openssl >=3.5.5,<4.0a0 - license: PostgreSQL - size: 2809023 - timestamp: 1770915404394 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpq-18.2-h6caddbb_0.conda - sha256: c5df229177c964cce817739b4b59e1e1ceec315d4e6a30c70cb4994cf27390aa - md5: 41ae8b0d426096e1d11bd83d8ca949f5 - depends: - - __osx >=11.0 - - icu >=78.2,<79.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - openldap >=2.6.10,<2.7.0a0 - - openssl >=3.5.5,<4.0a0 - license: PostgreSQL - size: 2643395 - timestamp: 1770916690384 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda - sha256: 57cb5f92110324c04498b96563211a1bca6a74b2918b1e8df578bfed03cc32e4 - md5: 067590f061c9f6ea7e61e3b2112ed6b3 - depends: - - __glibc >=2.17,<3.0.a0 - - lame >=3.100,<3.101.0a0 - - libflac >=1.5.0,<1.6.0a0 - - libgcc >=14 - - libogg >=1.3.5,<1.4.0a0 - - libopus >=1.5.2,<2.0a0 - - libstdcxx >=14 - - libvorbis >=1.3.7,<1.4.0a0 - - mpg123 >=1.32.9,<1.33.0a0 - license: LGPL-2.1-or-later - license_family: LGPL - size: 355619 - timestamp: 1765181778282 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 - md5: a587892d3c13b6621a6091be690dbca2 - depends: - - libgcc-ng >=12 - license: ISC - size: 205978 - timestamp: 1716828628198 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda - sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 - md5: a7ce36e284c5faaf93c220dfc39e3abd - depends: - - __osx >=11.0 - license: ISC - size: 164972 - timestamp: 1716828607917 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda sha256: 04596fcee262a870e4b7c9807224680ff48d4d0cc0dac076a602503d3dc6d217 md5: da5be73701eecd0e8454423fd6ffcf30 @@ -4254,6 +2218,8 @@ packages: - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: blessing + purls: + - pkg:pypi/libsqlite size: 942808 timestamp: 1768147973361 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda @@ -4264,6 +2230,8 @@ packages: - icu >=78.2,<79.0a0 - libzlib >=1.3.1,<2.0a0 license: blessing + purls: + - pkg:pypi/libsqlite size: 909777 timestamp: 1768148320535 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda @@ -4276,27 +2244,10 @@ packages: - libstdcxx-ng ==15.2.0=*_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: + - pkg:pypi/libstdcxx size: 5852330 timestamp: 1771378262446 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - sha256: 3c902ffd673cb3c6ddde624cdb80f870b6c835f8bf28384b0016e7d444dd0145 - md5: 6235adb93d064ecdf3d44faee6f468de - depends: - - libstdcxx 15.2.0 h934c35e_18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 27575 - timestamp: 1771378314494 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.10-hd0affe5_4.conda - sha256: f0356bb344a684e7616fc84675cfca6401140320594e8686be30e8ac7547aed2 - md5: 1d4c18d75c51ed9d00092a891a547a7d - depends: - - __glibc >=2.17,<3.0.a0 - - libcap >=2.77,<2.78.0a0 - - libgcc >=14 - license: LGPL-2.1-or-later - size: 491953 - timestamp: 1770738638119 - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 md5: cd5a90476766d53e901500df9215e927 @@ -4312,6 +2263,8 @@ packages: - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: HPND + purls: + - pkg:pypi/libtiff size: 435273 timestamp: 1762022005702 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda @@ -4328,6 +2281,8 @@ packages: - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: HPND + purls: + - pkg:pypi/libtiff size: 373892 timestamp: 1762022345545 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda @@ -4338,65 +2293,10 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/libuuid size: 40311 timestamp: 1766271528534 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda - sha256: ca494c99c7e5ecc1b4cd2f72b5584cef3d4ce631d23511184411abcbb90a21a5 - md5: b4ecbefe517ed0157c37f8182768271c - depends: - - libogg - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - libogg >=1.3.5,<1.4.0a0 - license: BSD-3-Clause - license_family: BSD - size: 285894 - timestamp: 1753879378005 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvorbis-1.3.7-h81086ad_2.conda - sha256: 95768e4eceaffb973081fd986d03da15d93aa10609ed202e6fd5ca1e490a3dce - md5: 719e7653178a09f5ca0aa05f349b41f7 - depends: - - libogg - - libcxx >=19 - - __osx >=11.0 - - libogg >=1.3.5,<1.4.0a0 - license: BSD-3-Clause - license_family: BSD - size: 259122 - timestamp: 1753879389702 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.6.0-h9635ea4_0.conda - sha256: 6ebd63ad14a601d715e5812c062e6c0c7a1fe9e9acacd8bd103de00a492f7b5f - md5: 2a4575ed55e0a4346722aac07ccd2b23 - depends: - - __glibc >=2.17,<3.0.a0 - - giflib >=5.2.2,<5.3.0a0 - - libgcc >=14 - - libjpeg-turbo >=3.1.0,<4.0a0 - - libpng >=1.6.50,<1.7.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base 1.6.0.* - - libwebp-base >=1.6.0,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 93944 - timestamp: 1752167121836 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-1.6.0-hc0253d1_0.conda - sha256: a2ed07c20ea34224f4b1f47acece03ae5ef97dbd4481ec649eecdf0d3b780bc3 - md5: 9aaaf3669a32f6ebb63c445cc19fdc64 - depends: - - __osx >=11.0 - - giflib >=5.2.2,<5.3.0a0 - - libjpeg-turbo >=3.1.0,<4.0a0 - - libpng >=1.6.50,<1.7.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base 1.6.0.* - - libwebp-base >=1.6.0,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 89030 - timestamp: 1752167481967 - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b md5: aea31d2e5b1091feca96fcfe945c3cf9 @@ -4407,6 +2307,8 @@ packages: - libwebp 1.6.0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/libwebp-base size: 429011 timestamp: 1752159441324 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda @@ -4418,6 +2320,8 @@ packages: - libwebp 1.6.0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/libwebp-base size: 294974 timestamp: 1752159906788 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda @@ -4431,6 +2335,8 @@ packages: - xorg-libxdmcp license: MIT license_family: MIT + purls: + - pkg:pypi/libxcb size: 395888 timestamp: 1727278577118 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda @@ -4443,104 +2349,20 @@ packages: - xorg-libxdmcp license: MIT license_family: MIT + purls: + - pkg:pypi/libxcb size: 323658 timestamp: 1727278733917 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c - md5: 5aa797f8787fe7a17d1b0821485b5adc - depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later - size: 100393 - timestamp: 1702724383534 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - sha256: d2195b5fbcb0af1ff7b345efdf89290c279b8d1d74f325ae0ac98148c375863c - md5: 2bca1fbb221d9c3c8e3a155784bbc2e9 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - libxcb >=1.17.0,<2.0a0 - - libxml2 - - libxml2-16 >=2.14.6 - - xkeyboard-config - - xorg-libxau >=1.0.12,<2.0a0 - license: MIT/X11 Derivative - license_family: MIT - size: 837922 - timestamp: 1764794163823 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda - sha256: 047be059033c394bd32ae5de66ce389824352120b3a7c0eff980195f7ed80357 - md5: 417955234eccd8f252b86a265ccdab7f - depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.1,<79.0a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libxml2-16 2.15.1 hca6bf5a_1 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT - size: 45402 - timestamp: 1766327161688 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_1.conda - sha256: 59f96fa27cce6a9a27414c5bb301eedda1a1b85cd0d8f5d68f77e46b86e7c95f - md5: fd804ee851e20faca4fecc7df0901d07 - depends: - - __osx >=11.0 - - icu >=78.1,<79.0a0 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libxml2-16 2.15.1 h5ef1a60_1 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT - size: 40607 - timestamp: 1766327501392 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda - sha256: 8331284bf9ae641b70cdc0e5866502dd80055fc3b9350979c74bb1d192e8e09e - md5: 3fdd8d99683da9fe279c2f4cecd1e048 - depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.1,<79.0a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - constrains: - - libxml2 2.15.1 - license: MIT - license_family: MIT - size: 555747 - timestamp: 1766327145986 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda - sha256: 2d5ab15113b0ba21f4656d387d26ab59e4fbaf3027f5e58a2a4fe370821eb106 - md5: 7eed1026708e26ee512f43a04d9d0027 - depends: - - __osx >=11.0 - - icu >=78.1,<79.0a0 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - constrains: - - libxml2 2.15.1 - license: MIT - license_family: MIT - size: 464886 - timestamp: 1766327479416 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda - sha256: 0694760a3e62bdc659d90a14ae9c6e132b525a7900e59785b18a08bb52a5d7e5 - md5: 87e6096ec6d542d1c1f8b33245fe8300 + md5: 5aa797f8787fe7a17d1b0821485b5adc depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libxml2 - - libxml2-16 >=2.14.6 - license: MIT - license_family: MIT - size: 245434 - timestamp: 1757963724977 + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: + - pkg:pypi/libxcrypt + size: 100393 + timestamp: 1702724383534 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 md5: edb0dca6bc32e4f4789199455a1dbeb8 @@ -4551,6 +2373,8 @@ packages: - zlib 1.3.1 *_2 license: Zlib license_family: Other + purls: + - pkg:pypi/libzlib size: 60963 timestamp: 1727963148474 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda @@ -4562,6 +2386,8 @@ packages: - zlib 1.3.1 *_2 license: Zlib license_family: Other + purls: + - pkg:pypi/libzlib size: 46438 timestamp: 1727963202283 - conda: https://conda.anaconda.org/conda-forge/noarch/license-expression-30.4.4-pyhe01879c_0.conda @@ -4573,6 +2399,8 @@ packages: - python license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/license-expression size: 120884 timestamp: 1753294907822 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda @@ -4585,6 +2413,8 @@ packages: - intel-openmp <0.0a0 license: Apache-2.0 WITH LLVM-exception license_family: APACHE + purls: + - pkg:pypi/llvm-openmp size: 285558 timestamp: 1772028716784 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda @@ -4595,86 +2425,42 @@ packages: - python >=3.10 license: MIT license_family: MIT + purls: + - pkg:pypi/markdown-it-py size: 64736 timestamp: 1754951288511 -- conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - sha256: e0cbfea51a19b3055ca19428bd9233a25adca956c208abb9d00b21e7259c7e03 - md5: fab1be106a50e20f10fe5228fd1d1651 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + sha256: 5f3aad1f3a685ed0b591faad335957dbdb1b73abfd6fc731a0d42718e0653b33 + md5: 93a4752d42b12943a355b682ee43285b depends: - - python >=3.10 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 constrains: - jinja2 >=3.0.0 - track_features: - - markupsafe_no_compile license: BSD-3-Clause license_family: BSD - size: 15499 - timestamp: 1759055275624 -- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda - sha256: ee773261fbd6c76fc8174b0e4e1ce272b0bbaa56610f130e9d3d1f575106f04f - md5: b8683e6068099b69c10dbfcf7204203f - depends: - - __glibc >=2.17,<3.0.a0 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - freetype - - kiwisolver >=1.3.1 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libgcc >=14 - - libstdcxx >=14 - - numpy >=1.23 - - numpy >=1.23,<3 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python >=3.14,<3.15.0a0 - - python-dateutil >=2.7 - - python_abi 3.14.* *_cp314 - - qhull >=2020.2,<2020.3.0a0 - - tk >=8.6.13,<8.7.0a0 - license: PSF-2.0 - license_family: PSF - size: 8473358 - timestamp: 1763055439346 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda - sha256: 198dcc0ed83e78bc7bf48e6ef8d4ecd220e9cf1f07db98508251b2bc0be067f9 - md5: c84152e510d41378b8758826655b6ed7 + purls: + - pkg:pypi/markupsafe + size: 26057 + timestamp: 1772445297924 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda + sha256: 330394fb9140995b29ae215a19fad46fcc6691bdd1b7654513d55a19aaa091c1 + md5: 11d95ab83ef0a82cc2de12c1e0b47fe4 depends: - __osx >=11.0 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - freetype - - kiwisolver >=1.3.1 - - libcxx >=19 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - numpy >=1.23 - - numpy >=1.23,<3 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python-dateutil >=2.7 - - python_abi 3.14.* *_cp314 - - qhull >=2020.2,<2020.3.0a0 - license: PSF-2.0 - license_family: PSF - size: 8286510 - timestamp: 1763055937766 -- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda - sha256: 9d690334de0cd1d22c51bc28420663f4277cfa60d34fa5cad1ce284a13f1d603 - md5: 00e120ce3e40bad7bfc78861ce3c4a25 - depends: - - python >=3.10 - - traitlets + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD - size: 15175 - timestamp: 1761214578417 + purls: + - pkg:pypi/markupsafe + size: 25564 + timestamp: 1772445846939 - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda sha256: 123cc004e2946879708cdb6a9eff24acbbb054990d6131bb94bca7a374ebebfc md5: 1997a083ef0b4c9331f9191564be275e @@ -4683,6 +2469,8 @@ packages: - python >=3.10 license: MIT license_family: MIT + purls: + - pkg:pypi/mdit-py-plugins size: 43805 timestamp: 1754946862113 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda @@ -4692,19 +2480,10 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/mdurl size: 14465 timestamp: 1733255681319 -- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda - sha256: d3fb4beb5e0a52b6cc33852c558e077e1bfe44df1159eb98332d69a264b14bae - md5: b11e360fc4de2b0035fc8aaa74f17fd6 - depends: - - python >=3.10 - - typing_extensions - - python - license: BSD-3-Clause - license_family: BSD - size: 74250 - timestamp: 1766504456031 - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda sha256: 449609f0d250607a300754474350a3b61faf45da183d3071e9720e453c765b8a md5: 32f78e9d06e8593bc4bbf1338da06f5f @@ -4713,54 +2492,40 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/more-itertools size: 69210 timestamp: 1764487059562 -- conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda - sha256: 39c4700fb3fbe403a77d8cc27352fa72ba744db487559d5d44bf8411bb4ea200 - md5: c7f302fd11eeb0987a6a5e1f3aed6a21 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - license: LGPL-2.1-only - license_family: LGPL - size: 491140 - timestamp: 1730581373280 -- conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py314h9891dd4_1.conda - sha256: d41c2734d314303e329680aeef282766fe399a0ce63297a68a2f8f9b43b1b68a - md5: c6752022dcdbf4b9ef94163de1ab7f03 +- conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda + sha256: 94068fd39d1a672f8799e3146a18ba4ef553f0fcccefddb3c07fbdabfd73667a + md5: 2e489969e38f0b428c39492619b5e6e5 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: Apache - size: 103380 - timestamp: 1762504077009 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.2-py314h784bc60_1.conda - sha256: 9dc4ebe88064cf96bb97a4de83be10fbc52a24d2ff48a4561fb0fed337b526f0 - md5: 305227e4de261896033ad8081e8b52ae + purls: + - pkg:pypi/msgpack-python + size: 102525 + timestamp: 1762504116832 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.2-py312h84eede6_1.conda + sha256: 1540339678e13365001453fdcb698887075a2b326d5fab05cfd0f4fdefae4eab + md5: e3973f0ac5ac854bf86f0d5674a1a289 depends: - __osx >=11.0 - libcxx >=19 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: Apache - size: 92381 - timestamp: 1762504601981 -- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90 - md5: 37293a85a0f4f77bbd9cf7aaefc62609 - depends: - - python >=3.9 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: Apache - size: 15851 - timestamp: 1749895533014 + purls: + - pkg:pypi/msgpack-python + size: 91268 + timestamp: 1762504467174 - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.0.0-pyhd8ed1ab_0.conda sha256: f352d594d968acd31052c5f894ae70718be56481ffa9c304fdfcbe78ddf66eb1 md5: a65e2c3c764766f0b28a3ac5052502a6 @@ -4774,49 +2539,10 @@ packages: - sphinx >=8,<10 license: MIT license_family: MIT + purls: + - pkg:pypi/myst-parser size: 73535 timestamp: 1768942892170 -- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - sha256: 1b66960ee06874ddceeebe375d5f17fb5f393d025a09e15b830ad0c4fffb585b - md5: 00f5b8dafa842e0c27c1cd7296aa4875 - depends: - - jupyter_client >=6.1.12 - - jupyter_core >=4.12,!=5.0.* - - nbformat >=5.1 - - python >=3.8 - - traitlets >=5.4 - license: BSD-3-Clause - license_family: BSD - size: 28473 - timestamp: 1766485646962 -- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda - sha256: 628fea99108df8e33396bb0b88658ec3d58edf245df224f57c0dce09615cbed2 - md5: b14079a39ae60ac7ad2ec3d9eab075ca - depends: - - beautifulsoup4 - - bleach-with-css !=5.0.0 - - defusedxml - - importlib-metadata >=3.6 - - jinja2 >=3.0 - - jupyter_core >=4.7 - - jupyterlab_pygments - - markupsafe >=2.0 - - mistune >=2.0.3,<4 - - nbclient >=0.5.0 - - nbformat >=5.7 - - packaging - - pandocfilters >=1.4.1 - - pygments >=2.4.1 - - python >=3.10 - - traitlets >=5.1 - - python - constrains: - - pandoc >=2.9.2,<4.0.0 - - nbconvert ==7.17.0 *_0 - license: BSD-3-Clause - license_family: BSD - size: 202284 - timestamp: 1769709543555 - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda sha256: 7a5bd30a2e7ddd7b85031a5e2e14f290898098dc85bea5b3a5bf147c25122838 md5: bbe1963f1e47f594070ffe87cdf612ea @@ -4828,6 +2554,8 @@ packages: - traitlets >=5.1 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/nbformat size: 100945 timestamp: 1733402844974 - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda @@ -4837,6 +2565,8 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: X11 AND BSD-3-Clause + purls: + - pkg:pypi/ncurses size: 891641 timestamp: 1738195959188 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda @@ -4845,17 +2575,10 @@ packages: depends: - __osx >=11.0 license: X11 AND BSD-3-Clause + purls: + - pkg:pypi/ncurses size: 797030 timestamp: 1738196177597 -- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - sha256: bb7b21d7fd0445ddc0631f64e66d91a179de4ba920b8381f29b9d006a42788c0 - md5: 598fd7d4d0de2455fb74f56063969a97 - depends: - - python >=3.9 - license: BSD-2-Clause - license_family: BSD - size: 11543 - timestamp: 1733325673691 - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.3-py310h6de7dc8_0.conda noarch: python sha256: dcc0eee49226ef2f8f58de541a1b0ec492f4f0928ec43b1c26bf498511c363b1 @@ -4870,6 +2593,8 @@ packages: - __glibc >=2.17 license: MIT license_family: MIT + purls: + - pkg:pypi/nh3 size: 678551 timestamp: 1771078193635 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.3-py310hf32026f_0.conda @@ -4885,6 +2610,8 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + purls: + - pkg:pypi/nh3 size: 634553 timestamp: 1771078287944 - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda @@ -4895,102 +2622,50 @@ packages: - setuptools license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/nodeenv size: 40866 timestamp: 1766261270149 -- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - sha256: 7b920e46b9f7a2d2aa6434222e5c8d739021dbc5cc75f32d124a8191d86f9056 - md5: e7f89ea5f7ea9401642758ff50a2d9c1 - depends: - - jupyter_server >=1.8,<3 - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 16817 - timestamp: 1733408419340 -- conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda - sha256: e3664264bd936c357523b55c71ed5a30263c6ba278d726a75b1eb112e6fb0b64 - md5: e235d5566c9cc8970eb2798dd4ecf62f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - license: MPL-2.0 - license_family: MOZILLA - size: 228588 - timestamp: 1762348634537 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nspr-4.38-heaf21c2_0.conda - sha256: f8373ff02098179b9f9b2ce7b309e7ca4021c26180d07d67e1726e3d02e68e26 - md5: 0b528ead848386c8a53ee0b76fbf2ac1 - depends: - - __osx >=11.0 - - libcxx >=19 - license: MPL-2.0 - license_family: MOZILLA - size: 201977 - timestamp: 1762349100072 -- conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda - sha256: 44dd98ffeac859d84a6dcba79a2096193a42fc10b29b28a5115687a680dd6aea - md5: 567fbeed956c200c1db5782a424e58ee - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libsqlite >=3.51.0,<4.0a0 - - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 - - nspr >=4.38,<5.0a0 - license: MPL-2.0 - license_family: MOZILLA - size: 2057773 - timestamp: 1763485556350 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.118-h1c710a3_0.conda - sha256: d57f7b2cf2860a2a848e3dd43cc4f5488e60050a7d62af1834da3ee43911d9c4 - md5: ae07409126ced4f0d982dfeab0681016 - depends: - - __osx >=11.0 - - libcxx >=19 - - libsqlite >=3.51.0,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - nspr >=4.38,<5.0a0 - license: MPL-2.0 - license_family: MOZILLA - size: 1839904 - timestamp: 1763486575227 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda - sha256: 1d8377c8001c15ed12c2713b723213474b435706ab9d34ede69795d64af9e94d - md5: 4ea6b620fdf24a1a0bc4f1c7134dfafb +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py312h33ff503_1.conda + sha256: fec4d37e1a7c677ddc07bb968255df74902733398b77acc1d05f9dc599e879df + md5: 3569a8fca2dd3202e4ab08f42499f6d3 depends: - python - - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.12.* *_cp312 - libcblas >=3.9.0,<4.0a0 - - python_abi 3.14.* *_cp314 - libblas >=3.9.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD - size: 8926994 - timestamp: 1770098474394 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py314hae46ccb_1.conda - sha256: 43b5ed0ead36e5133ee8462916d23284f0bce0e5f266fa4bd31a020a6cc22f14 - md5: 0f0ddf0575b98d91cda9e3ca9eaeb9a2 + purls: + - pkg:pypi/numpy + size: 8757566 + timestamp: 1770098484112 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py312he281c53_1.conda + sha256: 7fd2f1a33b244129dcc2163304d103a7062fc38f01fe13945c9ea95cef12b954 + md5: 4afbe6ffff0335d25f3c5cc78b1350a4 depends: - python - - __osx >=11.0 - - python 3.14.* *_cp314 - libcxx >=19 + - __osx >=11.0 + - python 3.12.* *_cpython - libblas >=3.9.0,<4.0a0 + - python_abi 3.12.* *_cp312 - liblapack >=3.9.0,<4.0a0 - - python_abi 3.14.* *_cp314 - libcblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD - size: 6992958 - timestamp: 1770098398327 + purls: + - pkg:pypi/numpy + size: 6840961 + timestamp: 1770098400654 - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d md5: 11b3379b191f63139e29c0d19dee24cd @@ -5003,48 +2678,24 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/openjpeg size: 355400 timestamp: 1758489294972 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hbfb3c88_0.conda - sha256: dd73e8f1da7dd6a5494c5586b835cbe2ec68bace55610b1c4bf927400fe9c0d7 - md5: 6bf3d24692c157a41c01ce0bd17daeea +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda + sha256: 60aca8b9f94d06b852b296c276b3cf0efba5a6eb9f25feb8708570d3a74f00e4 + md5: 4b5d3a91320976eec71678fad1e3569b depends: - __osx >=11.0 - libcxx >=19 - - libpng >=1.6.50,<1.7.0a0 + - libpng >=1.6.55,<1.7.0a0 - libtiff >=4.7.1,<4.8.0a0 - libzlib >=1.3.1,<2.0a0 license: BSD-2-Clause - license_family: BSD - size: 319967 - timestamp: 1758489514651 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda - sha256: cb0b07db15e303e6f0a19646807715d28f1264c6350309a559702f4f34f37892 - md5: 2e5bf4f1da39c0b32778561c3c4e5878 - depends: - - __glibc >=2.17,<3.0.a0 - - cyrus-sasl >=2.1.27,<3.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - libstdcxx >=13 - - openssl >=3.5.0,<4.0a0 - license: OLDAP-2.8 - license_family: BSD - size: 780253 - timestamp: 1748010165522 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openldap-2.6.10-hbe55e7a_0.conda - sha256: 08d859836b81296c16f74336c3a9a455b23d57ce1d7c2b0b3e1b7a07f984c677 - md5: 6fd5d73c63b5d37d9196efb4f044af76 - depends: - - __osx >=11.0 - - cyrus-sasl >=2.1.27,<3.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libcxx >=18 - - openssl >=3.5.0,<4.0a0 - license: OLDAP-2.8 - license_family: BSD - size: 843597 - timestamp: 1748010484231 + purls: + - pkg:pypi/openjpeg + size: 319697 + timestamp: 1772625397692 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c md5: f61eb8cd60ff9057122a3d338b99c00f @@ -5054,6 +2705,8 @@ packages: - libgcc >=14 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/openssl size: 3164551 timestamp: 1769555830639 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda @@ -5064,18 +2717,10 @@ packages: - ca-certificates license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/openssl size: 3104268 timestamp: 1769556384749 -- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - sha256: 1840bd90d25d4930d60f57b4f38d4e0ae3f5b8db2819638709c36098c6ba770c - md5: e51f1e4089cad105b6cac64bd8166587 - depends: - - python >=3.9 - - typing_utils - license: Apache-2.0 - license_family: APACHE - size: 30139 - timestamp: 1734587755455 - conda: https://conda.anaconda.org/conda-forge/noarch/packageurl-python-0.17.6-pyhcf101f3_0.conda sha256: 8490e4fdfe719f80bb5bc424b9c6f39d3a91490b64f1cea1046eee33b32b6703 md5: d16b02286ab26ad862c55815c997adc6 @@ -5084,6 +2729,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/packageurl-python size: 33897 timestamp: 1764001202900 - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda @@ -5094,66 +2741,10 @@ packages: - python license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/packaging size: 72010 timestamp: 1769093650580 -- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f - md5: 457c2c8c08e54905d6954e79cb5b5db9 - depends: - - python !=3.0,!=3.1,!=3.2,!=3.3 - license: BSD-3-Clause - license_family: BSD - size: 11627 - timestamp: 1631603397334 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hadf4263_0.conda - sha256: 3613774ad27e48503a3a6a9d72017087ea70f1426f6e5541dbdb59a3b626eaaf - md5: 79f71230c069a287efe3a8614069ddf1 - depends: - - __glibc >=2.17,<3.0.a0 - - cairo >=1.18.4,<2.0a0 - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - fribidi >=1.0.10,<2.0a0 - - harfbuzz >=11.0.1 - - libexpat >=2.7.0,<3.0a0 - - libfreetype >=2.13.3 - - libfreetype6 >=2.13.3 - - libgcc >=13 - - libglib >=2.84.2,<3.0a0 - - libpng >=1.6.49,<1.7.0a0 - - libzlib >=1.3.1,<2.0a0 - license: LGPL-2.1-or-later - size: 455420 - timestamp: 1751292466873 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-h875632e_0.conda - sha256: 705484ad60adee86cab1aad3d2d8def03a699ece438c864e8ac995f6f66401a6 - md5: 7d57f8b4b7acfc75c777bc231f0d31be - depends: - - __osx >=11.0 - - cairo >=1.18.4,<2.0a0 - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - fribidi >=1.0.10,<2.0a0 - - harfbuzz >=11.0.1 - - libexpat >=2.7.0,<3.0a0 - - libfreetype >=2.13.3 - - libfreetype6 >=2.13.3 - - libglib >=2.84.2,<3.0a0 - - libpng >=1.6.49,<1.7.0a0 - - libzlib >=1.3.1,<2.0a0 - license: LGPL-2.1-or-later - size: 426931 - timestamp: 1751292636271 -- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda - sha256: 42b2d77ccea60752f3aa929a6413a7835aaacdbbde679f2f5870a744fa836b94 - md5: 97c1ce2fffa1209e7afb432810ec6e12 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - size: 82287 - timestamp: 1770676243987 - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda sha256: 29ea20d0faf20374fcd61c25f6d32fb8e9a2c786a7f1473a0c3ead359470fbe1 md5: 2908273ac396d2cd210a8127f5f1c0d6 @@ -5161,6 +2752,8 @@ packages: - python >=3.10 license: MPL-2.0 license_family: MOZILLA + purls: + - pkg:pypi/pathspec size: 53739 timestamp: 1769677743677 - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda @@ -5173,19 +2766,10 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pcre2 size: 1222481 timestamp: 1763655398280 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - sha256: 5e2e443f796f2fd92adf7978286a525fb768c34e12b1ee9ded4000a41b2894ba - md5: 9b4190c4055435ca3502070186eba53a - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 850231 - timestamp: 1763655726735 - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a md5: d0d408b1f18883a944376da5cf8101ea @@ -5193,59 +2777,69 @@ packages: - ptyprocess >=0.5 - python >=3.9 license: ISC + purls: + - pkg:pypi/pexpect size: 53561 timestamp: 1733302019362 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda - sha256: 9e6ec8f3213e8b7d64b0ad45f84c51a2c9eba4398efda31e196c9a56186133ee - md5: 79678378ae235e24b3aa83cee1b38207 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py312h50c33e8_0.conda + sha256: 782b6b578a0e61f6ef5cca5be993d902db775a2eb3d0328a3c4ff515858e7f2c + md5: c5eff3ada1a829f0bdb780dc4b62bbae depends: - python - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - libwebp-base >=1.6.0,<2.0a0 - - zlib-ng >=2.3.3,<2.4.0a0 - - python_abi 3.14.* *_cp314 - - tk >=8.6.13,<8.7.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 + - tk >=8.6.13,<8.7.0a0 - libxcb >=1.17.0,<2.0a0 - - openjpeg >=2.5.4,<3.0a0 - - lcms2 >=2.18,<3.0a0 - - libtiff >=4.7.1,<4.8.0a0 + - libwebp-base >=1.6.0,<2.0a0 - libfreetype >=2.14.1 - libfreetype6 >=2.14.1 + - lcms2 >=2.18,<3.0a0 + - python_abi 3.12.* *_cp312 + - zlib-ng >=2.3.3,<2.4.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - openjpeg >=2.5.4,<3.0a0 license: HPND - size: 1073026 - timestamp: 1770794002408 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py314hab283cf_0.conda - sha256: 1659ff6e8ea6170a90fb8eb7291990d12bba270aab18176defa0717ed34ce186 - md5: bcb38a8005e93a3b240a0dbcf28df87a + purls: + - pkg:pypi/pillow + size: 1029755 + timestamp: 1770794002406 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.1-py312h4e908a4_0.conda + sha256: 4729476631c025dfce555a5fd97f1b0b97e765e7c01aee5b7e59b880d8335006 + md5: 537e6079e50e219252d016254b0d2573 depends: - python - - python 3.14.* *_cp314 - __osx >=11.0 - - libxcb >=1.17.0,<2.0a0 - - zlib-ng >=2.3.3,<2.4.0a0 + - python 3.12.* *_cpython + - libwebp-base >=1.6.0,<2.0a0 - openjpeg >=2.5.4,<3.0a0 - - tk >=8.6.13,<8.7.0a0 - libfreetype >=2.14.1 - libfreetype6 >=2.14.1 + - python_abi 3.12.* *_cp312 - libjpeg-turbo >=3.1.2,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - libxcb >=1.17.0,<2.0a0 - libtiff >=4.7.1,<4.8.0a0 - - python_abi 3.14.* *_cp314 + - zlib-ng >=2.3.3,<2.4.0a0 - lcms2 >=2.18,<3.0a0 - - libwebp-base >=1.6.0,<2.0a0 license: HPND - size: 996187 - timestamp: 1770794152243 -- conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda - sha256: 5f66ea31d62188c266c5a8752119b0cc90a5bf05963f665cf48a33e0ec58d39c - md5: 09a970fbf75e8ed1aa633827ded6aa4f - depends: - - python >=3.13.0a0 + purls: + - pkg:pypi/pillow + size: 954096 + timestamp: 1770794152238 +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda + sha256: 8e1497814a9997654ed7990a79c054ea5a42545679407acbc6f7e809c73c9120 + md5: 67bdec43082fd8a9cffb9484420b39a2 + depends: + - python >=3.10,<3.13.0a0 + - setuptools + - wheel license: MIT license_family: MIT - size: 1180743 - timestamp: 1770270312477 + purls: + - pkg:pypi/pip + size: 1181790 + timestamp: 1770270305795 - conda: https://conda.anaconda.org/conda-forge/noarch/pip-api-0.0.34-pyhd8ed1ab_0.conda sha256: 2d0a1dc9695eb260400496c038e8a467d37d2fd04ecf9ec2e205a921d5adfa45 md5: 8ea39496190b1a0f92f049685f97e8c7 @@ -5254,6 +2848,8 @@ packages: - python >=3.6 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/pip-api size: 105443 timestamp: 1720569935582 - conda: https://conda.anaconda.org/conda-forge/noarch/pip-audit-2.10.0-pyhd8ed1ab_0.conda @@ -5275,6 +2871,8 @@ packages: - tomli-w >=1.2.0 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/pip-audit size: 51236 timestamp: 1764641837169 - conda: https://conda.anaconda.org/conda-forge/noarch/pip-requirements-parser-32.0.1-pyhd8ed1ab_1.conda @@ -5286,30 +2884,10 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/pip-requirements-parser size: 113962 timestamp: 1734796725791 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a - md5: c01af13bdc553d1a8fbfff6e8db075f0 - depends: - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - license: MIT - license_family: MIT - size: 450960 - timestamp: 1754665235234 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda - sha256: 29c9b08a9b8b7810f9d4f159aecfd205fce051633169040005c0b7efad4bc718 - md5: 17c3d745db6ea72ae2fce17e7338547f - depends: - - __osx >=11.0 - - libcxx >=19 - license: MIT - license_family: MIT - size: 248045 - timestamp: 1754665282033 - conda: https://conda.anaconda.org/conda-forge/noarch/pkce-1.0.3-pyhd8ed1ab_1.conda sha256: 5bf8d0d2c8db333abcd8455f06dbc01d60ffe2aac5fe6ff3d31bab69a5185a1e md5: 26080682305b698406b4086210b9c237 @@ -5317,6 +2895,8 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/pkce size: 9126 timestamp: 1736219305828 - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda @@ -5327,35 +2907,10 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/platformdirs size: 25643 timestamp: 1771233827084 -- pypi: https://files.pythonhosted.org/packages/e0/40/59d34a756e02f8c670f0fee987d46f7ee53d05447d43cd114ca015cb168c/playwright-1.58.0-py3-none-macosx_11_0_arm64.whl - name: playwright - version: 1.58.0 - sha256: 70c763694739d28df71ed578b9c8202bb83e8fe8fb9268c04dd13afe36301f71 - requires_dist: - - pyee>=13,<14 - - greenlet>=3.1.1,<4.0.0 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/f1/af/009958cbf23fac551a940d34e3206e6c7eed2b8c940d0c3afd1feb0b0589/playwright-1.58.0-py3-none-manylinux1_x86_64.whl - name: playwright - version: 1.58.0 - sha256: c95568ba1eda83812598c1dc9be60b4406dffd60b149bc1536180ad108723d6b - requires_dist: - - pyee>=13,<14 - - greenlet>=3.1.1,<4.0.0 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - name: pluggy - version: 1.6.0 - sha256: e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 - requires_dist: - - pre-commit ; extra == 'dev' - - tox ; extra == 'dev' - - pytest ; extra == 'testing' - - pytest-benchmark ; extra == 'testing' - - coverage ; extra == 'testing' - requires_python: '>=3.9' - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e md5: d7585b6550ad04c8c5e21097ada2888e @@ -5364,17 +2919,10 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/pluggy size: 25877 timestamp: 1764896838868 -- conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda - sha256: bae453e5cecf19cab23c2e8929c6e30f4866d996a8058be16c797ed4b935461f - md5: fd5062942bfa1b0bd5e0d2a4397b099e - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 49052 - timestamp: 1733239818090 - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda sha256: 5b81b7516d4baf43d0c185896b245fa7384b25dc5615e7baa504b7fa4e07b706 md5: 7f3ac694319c7eaf81a0325d6405e974 @@ -5387,53 +2935,10 @@ packages: - virtualenv >=20.10.0 license: MIT license_family: MIT + purls: + - pkg:pypi/pre-commit size: 200827 timestamp: 1765937577534 -- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda - sha256: 75b2589159d04b3fb92db16d9970b396b9124652c784ab05b66f584edc97f283 - md5: 7526d20621b53440b0aae45d4797847e - depends: - - python >=3.10 - license: Apache-2.0 - license_family: Apache - size: 56634 - timestamp: 1768476602855 -- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda - sha256: 4817651a276016f3838957bfdf963386438c70761e9faec7749d411635979bae - md5: edb16f14d920fb3faf17f5ce582942d6 - depends: - - python >=3.10 - - wcwidth - constrains: - - prompt_toolkit 3.0.52 - license: BSD-3-Clause - license_family: BSD - size: 273927 - timestamp: 1756321848365 -- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda - sha256: f15574ed6c8c8ed8c15a0c5a00102b1efe8b867c0bd286b498cd98d95bd69ae5 - md5: 4f225a966cfee267a79c5cb6382bd121 - depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.14.* *_cp314 - license: BSD-3-Clause - license_family: BSD - size: 231303 - timestamp: 1769678156552 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda - sha256: e0f31c053eb11803d63860c213b2b1b57db36734f5f84a3833606f7c91fedff9 - md5: fc4c7ab223873eee32080d51600ce7e7 - depends: - - python - - __osx >=11.0 - - python 3.14.* *_cp314 - - python_abi 3.14.* *_cp314 - license: BSD-3-Clause - license_family: BSD - size: 245502 - timestamp: 1769678303655 - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 md5: b3c17d95b5a10c6e64a21fa17573e70e @@ -5442,6 +2947,8 @@ packages: - libgcc >=13 license: MIT license_family: MIT + purls: + - pkg:pypi/pthread-stubs size: 8252 timestamp: 1726802366959 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda @@ -5451,6 +2958,8 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + purls: + - pkg:pypi/pthread-stubs size: 8381 timestamp: 1726802424786 - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda @@ -5459,35 +2968,10 @@ packages: depends: - python >=3.9 license: ISC + purls: + - pkg:pypi/ptyprocess size: 19457 - timestamp: 1733302371990 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-h9a6aba3_3.conda - sha256: 0a0858c59805d627d02bdceee965dd84fde0aceab03a2f984325eec08d822096 - md5: b8ea447fdf62e3597cb8d2fae4eb1a90 - depends: - - __glibc >=2.17,<3.0.a0 - - dbus >=1.16.2,<2.0a0 - - libgcc >=14 - - libglib >=2.86.1,<3.0a0 - - libiconv >=1.18,<2.0a0 - - libsndfile >=1.2.2,<1.3.0a0 - - libsystemd0 >=257.10 - - libxcb >=1.17.0,<2.0a0 - constrains: - - pulseaudio 17.0 *_3 - license: LGPL-2.1-or-later - license_family: LGPL - size: 750785 - timestamp: 1763148198088 -- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0 - md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04 - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 16668 - timestamp: 1733569518868 + timestamp: 1733302371990 - conda: https://conda.anaconda.org/conda-forge/noarch/py-serializable-2.1.0-pyhe01879c_0.conda sha256: 4ffd89066e900ce4dd46d1c0be0df301a93c05e98dc30bb1367b7b2900997af5 md5: 3370ce91eb2bf86619891d1c1ee23420 @@ -5497,6 +2981,8 @@ packages: - python license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/py-serializable size: 42545 timestamp: 1753103948408 - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -5507,6 +2993,8 @@ packages: - python license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pycparser size: 110100 timestamp: 1733195786147 - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda @@ -5522,38 +3010,44 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/pydantic size: 340482 timestamp: 1764434463101 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda - sha256: 7e0ae379796e28a429f8e48f2fe22a0f232979d65ec455e91f8dac689247d39f - md5: 432b0716a1dfac69b86aa38fdd59b7e6 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py312h868fb18_1.conda + sha256: 07f899d035e06598682d3904d55f1529fac71b15e12b61d44d6a5fbf8521b0fe + md5: 56a776330a7d21db63a7c9d6c3711a04 depends: - python - typing-extensions >=4.6.0,!=4.7.0 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - python_abi 3.14.* *_cp314 + - python_abi 3.12.* *_cp312 constrains: - __glibc >=2.17 license: MIT license_family: MIT - size: 1943088 - timestamp: 1762988995556 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda - sha256: dded9092d89f1d8c267d5ce8b5e21f935c51acb7a64330f507cdfb3b69a98116 - md5: 420a4b8024e9b22880f1e03b612afa7d + purls: + - pkg:pypi/pydantic-core + size: 1935221 + timestamp: 1762989004359 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py312h6ef9ec0_1.conda + sha256: 048da0a49d644dba126905a1abcea0aee75efe88b5d621b9007b569dd753cfbc + md5: 88a76b4c912b6127d64298e3d8db980c depends: - python - typing-extensions >=4.6.0,!=4.7.0 + - python 3.12.* *_cpython - __osx >=11.0 - - python 3.14.* *_cp314 - - python_abi 3.14.* *_cp314 + - python_abi 3.12.* *_cp312 constrains: - __osx >=11.0 license: MIT license_family: MIT - size: 1784478 - timestamp: 1762989019956 + purls: + - pkg:pypi/pydantic-core + size: 1769018 + timestamp: 1762989029329 - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.13.1-pyhd8ed1ab_0.conda sha256: 343988d65c08477a87268d4fbeba59d0295514143965d2755ac4519b73155479 md5: cc0da73801948100ae97383b8da12993 @@ -5564,37 +3058,10 @@ packages: - typing-inspection >=0.4.0 license: MIT license_family: MIT + purls: + - pkg:pypi/pydantic-settings size: 49319 timestamp: 1771527313149 -- pypi: https://files.pythonhosted.org/packages/a0/c4/b4d4827c93ef43c01f599ef31453ccc1c132b353284fc6c87d535c233129/pyee-13.0.1-py3-none-any.whl - name: pyee - version: 13.0.1 - sha256: af2f8fede4171ef667dfded53f96e2ed0d6e6bd7ee3bb46437f77e3b57689228 - requires_dist: - - typing-extensions - - build ; extra == 'dev' - - flake8 ; extra == 'dev' - - flake8-black ; extra == 'dev' - - pytest ; extra == 'dev' - - pytest-asyncio ; python_full_version >= '3.4' and extra == 'dev' - - pytest-trio ; python_full_version >= '3.7' and extra == 'dev' - - black ; extra == 'dev' - - isort ; extra == 'dev' - - jupyter-console ; extra == 'dev' - - mkdocs ; extra == 'dev' - - mkdocs-include-markdown-plugin ; extra == 'dev' - - mkdocstrings[python] ; extra == 'dev' - - mypy ; extra == 'dev' - - sphinx ; extra == 'dev' - - toml ; extra == 'dev' - - tox ; extra == 'dev' - - trio ; extra == 'dev' - - trio ; python_full_version >= '3.7' and extra == 'dev' - - trio-typing ; python_full_version >= '3.7' and extra == 'dev' - - twine ; extra == 'dev' - - twisted ; extra == 'dev' - - validate-pyproject[all] ; extra == 'dev' - requires_python: '>=3.8' - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a md5: 6b6ece66ebcae2d5f326c77ef2c5a066 @@ -5602,6 +3069,8 @@ packages: - python >=3.9 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/pygments size: 889287 timestamp: 1750615908735 - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.11.0-pyhd8ed1ab_0.conda @@ -5613,36 +3082,10 @@ packages: - cryptography >=3.4.0 license: MIT license_family: MIT + purls: + - pkg:pypi/pyjwt size: 30144 timestamp: 1769858771741 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.1-py314h3a4d195_0.conda - sha256: df5af268c5a74b7160d772c263ece6f43257faff571783443e34b5f1d5a61cf2 - md5: 75a84fc8337557347252cc4fd3ba2a93 - depends: - - __osx >=11.0 - - libffi >=3.5.2,<3.6.0a0 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - - setuptools - license: MIT - license_family: MIT - size: 483374 - timestamp: 1763151489724 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-12.1-py314h36abed7_0.conda - sha256: aa76ee4328d0514d7c1c455dcd2d3b547db1c59797e54ce0a3f27de5b970e508 - md5: 4219bb3408016e22316cf8b443b5ef93 - depends: - - __osx >=11.0 - - libffi >=3.5.2,<3.6.0a0 - - pyobjc-core 12.1.* - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - size: 374792 - timestamp: 1763160601898 - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda sha256: 417fba4783e528ee732afa82999300859b065dc59927344b4859c64aae7182de md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -5651,6 +3094,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/pyparsing size: 110893 timestamp: 1769003998136 - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda @@ -5661,104 +3106,10 @@ packages: - tomli >=1.1.0 license: MIT license_family: MIT + purls: + - pkg:pypi/pyproject-hooks size: 15528 timestamp: 1733710122949 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.11-py314h92491ac_2.conda - sha256: cb2a10165be13f1211b887d32f25707f8662f712494a8295f8eb4b3b51b2f104 - md5: 82975f30ab918ded6d07a02d71af52ab - depends: - - __glibc >=2.17,<3.0.a0 - - libegl >=1.7.0,<2.0a0 - - libgcc >=14 - - libgl >=1.7.0,<2.0a0 - - libopengl >=1.7.0,<2.0a0 - - libstdcxx >=14 - - pyqt5-sip 12.17.0 py314ha160325_2 - - python >=3.14.0rc3,<3.15.0a0 - - python_abi 3.14.* *_cp314 - - qt-main >=5.15.15,<5.16.0a0 - - sip >=6.10.0,<6.11.0a0 - - xcb-util >=0.4.1,<0.5.0a0 - - xcb-util-image >=0.4.0,<0.5.0a0 - - xcb-util-keysyms >=0.4.1,<0.5.0a0 - - xcb-util-renderutil >=0.3.10,<0.4.0a0 - - xcb-util-wm >=0.4.2,<0.5.0a0 - - xorg-libice >=1.1.2,<2.0a0 - - xorg-libsm >=1.2.6,<2.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxcomposite >=0.4.6,<1.0a0 - - xorg-libxdamage >=1.1.6,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxxf86vm >=1.1.6,<2.0a0 - license: GPL-3.0-only - license_family: GPL - purls: - - pkg:pypi/PyQt5?source=project-defined-mapping - size: 5261831 - timestamp: 1759497508250 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyqt-5.15.11-py314h17b549b_2.conda - sha256: c6cdc2783c6464eefb8bba753fc18314678c7772bd41897a1b835b49b751f622 - md5: ff5afa9bdf5c659e2269e73256ab66a4 - depends: - - __osx >=11.0 - - libcxx >=19 - - pyqt5-sip 12.17.0 py314h93ecee7_2 - - python >=3.14.0rc3,<3.15.0a0 - - python >=3.14.0rc3,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - - qt-main >=5.15.15,<5.16.0a0 - license: GPL-3.0-only - license_family: GPL - purls: - - pkg:pypi/PyQt5?source=project-defined-mapping - size: 3967870 - timestamp: 1759499573401 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.17.0-py314ha160325_2.conda - sha256: 91720bee01311e367923bbfc7673d4e1de63921774e73e0533f17a984e32d1fb - md5: 52df24691fa319a06523a6e6c271bb58 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - packaging - - python >=3.14.0rc3,<3.15.0a0 - - python_abi 3.14.* *_cp314 - - sip - - toml - license: GPL-3.0-only - license_family: GPL - size: 85916 - timestamp: 1759495659021 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyqt5-sip-12.17.0-py314h93ecee7_2.conda - sha256: a78ec8edecd23a63fd27ce9f0aec4ae3ff3bebdad581c7a422ae19572b28aaf9 - md5: 28a382eab52bf955386e8a7fc821f7f4 - depends: - - __osx >=11.0 - - libcxx >=19 - - packaging - - python >=3.14.0rc3,<3.15.0a0 - - python >=3.14.0rc3,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - - sip - - toml - license: GPL-3.0-only - license_family: GPL - size: 76245 - timestamp: 1759495990306 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyqtgraph-0.14.0-pyhd8ed1ab_0.conda - sha256: f1bc737d8c525a6aeaa687fd4e6ab9d07871be089ec1824349c9dd598e0420ea - md5: 1a9d422262ef2e0928a90dde1da5b33a - depends: - - colorama - - numpy >=1.25 - - python >=3.10 - constrains: - - pyqt >=5.15 - - pyside2 >=5.15 - license: MIT - license_family: MIT - size: 1436545 - timestamp: 1763549841016 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 md5: 461219d1a5bd61342293efa2c0c90eac @@ -5767,28 +3118,10 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pysocks size: 21085 timestamp: 1733217331982 -- pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - name: pytest - version: 9.0.2 - sha256: 711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b - requires_dist: - - colorama>=0.4 ; sys_platform == 'win32' - - exceptiongroup>=1 ; python_full_version < '3.11' - - iniconfig>=1.0.1 - - packaging>=22 - - pluggy>=1.5,<2 - - pygments>=2.7.2 - - tomli>=1 ; python_full_version < '3.11' - - argcomplete ; extra == 'dev' - - attrs>=19.2 ; extra == 'dev' - - hypothesis>=3.56 ; extra == 'dev' - - mock ; extra == 'dev' - - requests ; extra == 'dev' - - setuptools ; extra == 'dev' - - xmlschema ; extra == 'dev' - requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda sha256: 39f41a52eb6f927caf5cd42a2ff98a09bb850ce9758b432869374b6253826962 md5: da0c42269086f5170e2b296878ec13a6 @@ -5806,21 +3139,10 @@ packages: - pytest-faulthandler >=2 license: MIT license_family: MIT + purls: + - pkg:pypi/pytest size: 294852 timestamp: 1762354779909 -- pypi: https://files.pythonhosted.org/packages/98/1c/b00940ab9eb8ede7897443b771987f2f4a76f06be02f1b3f01eb7567e24a/pytest_base_url-2.1.0-py3-none-any.whl - name: pytest-base-url - version: 2.1.0 - sha256: 3ad15611778764d451927b2a53240c1a7a591b521ea44cebfe45849d2d2812e6 - requires_dist: - - pytest>=7.0.0 - - requests>=2.9 - - black>=22.1.0 ; extra == 'test' - - flake8>=4.0.1 ; extra == 'test' - - pre-commit>=2.17.0 ; extra == 'test' - - pytest-localserver>=0.7.1 ; extra == 'test' - - tox>=3.24.5 ; extra == 'test' - requires_python: '>=3.8' - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda sha256: d0f45586aad48ef604590188c33c83d76e4fc6370ac569ba0900906b24fd6a26 md5: 6891acad5e136cb62a8c2ed2679d6528 @@ -5832,18 +3154,10 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/pytest-cov size: 29016 timestamp: 1757612051022 -- pypi: https://files.pythonhosted.org/packages/76/61/4d333d8354ea2bea2c2f01bad0a4aa3c1262de20e1241f78e73360e9b620/pytest_playwright-0.7.2-py3-none-any.whl - name: pytest-playwright - version: 0.7.2 - sha256: 8084e015b2b3ecff483c2160f1c8219b38b66c0d4578b23c0f700d1b0240ea38 - requires_dist: - - playwright>=1.18 - - pytest>=6.2.4,<10.0.0 - - pytest-base-url>=1.0.0,<3.0.0 - - python-slugify>=6.0.0,<9.0.0 - requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda sha256: cea7b0555c22a734d732f98a3b256646f3d82d926a35fa2bfd16f11395abd83b md5: 9e8871313f26d8b6f0232522b3bc47a5 @@ -5852,6 +3166,8 @@ packages: - python >=3.9 license: MPL-2.0 license_family: MOZILLA + purls: + - pkg:pypi/pytest-repeat size: 10537 timestamp: 1744061283541 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda @@ -5865,12 +3181,14 @@ packages: - psutil >=3.0 license: MIT license_family: MIT + purls: + - pkg:pypi/pytest-xdist size: 39300 timestamp: 1751452761594 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda - build_number: 101 - sha256: cb0628c5f1732f889f53a877484da98f5a0e0f47326622671396fb4f2b0cd6bd - md5: c014ad06e60441661737121d3eae8a60 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hd63d673_2_cpython.conda + build_number: 2 + sha256: 6621befd6570a216ba94bc34ec4618e4f3777de55ad0adc15fc23c28fadd4d1a + md5: c4540d3de3fa228d9fa95e31f8e97f89 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -5879,45 +3197,47 @@ packages: - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - liblzma >=5.8.2,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 + - libnsl >=2.0.1,<2.1.0a0 - libsqlite >=3.51.2,<4.0a0 - libuuid >=2.41.3,<3.0a0 + - libxcrypt >=4.4.36 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.5,<4.0a0 - - python_abi 3.14.* *_cp314 + - openssl >=3.5.4,<4.0a0 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - zstd >=1.5.7,<1.6.0a0 + constrains: + - python_abi 3.12.* *_cp312 license: Python-2.0 - size: 36702440 - timestamp: 1770675584356 - python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda - build_number: 101 - sha256: fccce2af62d11328d232df9f6bbf63464fd45f81f718c661757f9c628c4378ce - md5: 753c8d0447677acb7ddbcc6e03e82661 + purls: + - pkg:pypi/python + size: 31457785 + timestamp: 1769472855343 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.12-h18782d2_2_cpython.conda + build_number: 2 + sha256: 765e5d0f92dabc8c468d078a4409490e08181a6f9be6f5d5802a4e3131b9a69c + md5: e198b8f74b12292d138eb4eceb004fa3 depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.7.3,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - liblzma >=5.8.2,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - libsqlite >=3.51.2,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.5,<4.0a0 - - python_abi 3.14.* *_cp314 + - openssl >=3.5.4,<4.0a0 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - zstd >=1.5.7,<1.6.0a0 + constrains: + - python_abi 3.12.* *_cp312 license: Python-2.0 - size: 13522698 - timestamp: 1770675365241 - python_site_packages_path: lib/python3.14/site-packages + purls: + - pkg:pypi/python + size: 12953358 + timestamp: 1769472376612 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 md5: 5b8d21249ff20967101ffa321cab24e8 @@ -5927,18 +3247,21 @@ packages: - python license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/python-dateutil size: 233310 timestamp: 1751104122689 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.1-pyhcf101f3_0.conda - sha256: aa98e0b1f5472161318f93224f1cfec1355ff69d2f79f896c0b9e033e4a6caf9 - md5: 083725d6cd3dc007f06d04bcf1e613a2 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda + sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 + md5: 130584ad9f3a513cdd71b1fdc1244e9c depends: - python >=3.10 - - python license: BSD-3-Clause license_family: BSD - size: 26922 - timestamp: 1761503229008 + purls: + - pkg:pypi/python-dotenv + size: 27848 + timestamp: 1772388605021 - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda sha256: df9aa74e9e28e8d1309274648aac08ec447a92512c33f61a8de0afa9ce32ebe8 md5: 23029aae904a2ba587daba708208012f @@ -5947,53 +3270,33 @@ packages: - python license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/python-fastjsonschema size: 244628 timestamp: 1755304154927 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda - sha256: 233aebd94c704ac112afefbb29cf4170b7bc606e22958906f2672081bc50638a - md5: 235765e4ea0d0301c75965985163b5a1 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_2.conda + sha256: 3307c01627ae45524dfbdb149f7801818608c9c49d88ac89632dff32e149057f + md5: d41b6b394546ee6e1c423e28a581fc71 depends: - - cpython 3.14.3.* - - python_abi * *_cp314 + - cpython 3.12.12.* + - python_abi * *_cp312 license: Python-2.0 - size: 50062 - timestamp: 1770674497152 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca - md5: a61bf9ec79426938ff785eb69dbb1960 - depends: - - python >=3.6 - license: BSD-2-Clause - license_family: BSD - size: 13383 - timestamp: 1677079727691 -- pypi: https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl - name: python-slugify - version: 8.0.4 - sha256: 276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8 - requires_dist: - - text-unidecode>=1.3 - - unidecode>=1.1.1 ; extra == 'unidecode' - requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda - sha256: 467134ef39f0af2dbb57d78cb3e4821f01003488d331a8dd7119334f4f47bfbd - md5: 7ead57407430ba33f681738905278d03 - depends: - - python >=3.10 - license: Apache-2.0 - license_family: APACHE - size: 143542 - timestamp: 1765719982349 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + purls: + - pkg:pypi/python-gil + size: 46618 + timestamp: 1769471082980 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda build_number: 8 - sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 - md5: 0539938c55b6b1a59b560e843ad864a4 + sha256: 80677180dd3c22deb7426ca89d6203f1c7f1f256f2d5a94dc210f6e758229809 + md5: c3efd25ac4d74b1584d2f7a57195ddf1 constrains: - - python 3.14.* *_cp314 + - python 3.12.* *_cpython license: BSD-3-Clause license_family: BSD - size: 6989 - timestamp: 1752805904792 + purls: + - pkg:pypi/python-abi + size: 6958 + timestamp: 1752805918820 - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda sha256: 8d2a8bf110cc1fc3df6904091dead158ba3e614d8402a83e51ed3a8aa93cdeb0 md5: bc8e3267d44011051f2eb14d22fb0960 @@ -6001,289 +3304,40 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/pytz size: 189015 timestamp: 1742920947249 -- pypi: https://files.pythonhosted.org/packages/c9/54/777e0495acd4fb008791e84889be33d6e7fc8af095b441d939390b7d2491/pywavelets-1.9.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - name: pywavelets - version: 1.9.0 - sha256: 4ee1ee7d80f88c64b8ec3b5021dd1e94545cc97f0cd479fb51aa7b10f6def08e - requires_dist: - - numpy>=1.25,<3 - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/eb/e1/1c92ac6b538ef5388caf1a74af61cf6af16ea6d14115bb53357469cb38d6/pywavelets-1.9.0-cp314-cp314-macosx_11_0_arm64.whl - name: pywavelets - version: 1.9.0 - sha256: 56bc36b42b1b125fd9cb56e7956b22f8d0f83c1093f49c77fc042135e588c799 - requires_dist: - - numpy>=1.25,<3 - requires_python: '>=3.11' -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda - sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d - md5: 2035f68f96be30dc60a5dfd7452c7941 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + sha256: cb142bfd92f6e55749365ddc244294fa7b64db6d08c45b018ff1c658907bfcbf + md5: 15878599a87992e44c059731771591cb depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT - size: 202391 - timestamp: 1770223462836 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda - sha256: 95f385f9606e30137cf0b5295f63855fd22223a4cf024d306cf9098ea1c4a252 - md5: dcf51e564317816cb8d546891019b3ab + purls: + - pkg:pypi/pyyaml + size: 198293 + timestamp: 1770223620706 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.conda + sha256: 737959262d03c9c305618f2d48c7f1691fb996f14ae420bfd05932635c99f873 + md5: 95a5f0831b5e0b1075bbd80fcffc52ac depends: - __osx >=11.0 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT - size: 189475 - timestamp: 1770223788648 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - noarch: python - sha256: be66c1f85c3b48137200d62c12d918f4f8ad329423daef04fed292818efd3c28 - md5: 082985717303dab433c976986c674b35 - depends: - - python - - libgcc >=14 - - libstdcxx >=14 - - __glibc >=2.17,<3.0.a0 - - zeromq >=4.3.5,<4.4.0a0 - - _python_abi3_support 1.* - - cpython >=3.12 - license: BSD-3-Clause - license_family: BSD - size: 211567 - timestamp: 1771716961404 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - noarch: python - sha256: 2f31f799a46ed75518fae0be75ecc8a1b84360dbfd55096bc2fe8bd9c797e772 - md5: 2f6b79700452ef1e91f45a99ab8ffe5a - depends: - - python - - libcxx >=19 - - __osx >=11.0 - - _python_abi3_support 1.* - - cpython >=3.12 - - zeromq >=4.3.5,<4.4.0a0 - license: BSD-3-Clause - license_family: BSD - size: 191641 - timestamp: 1771717073430 -- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc - md5: 353823361b1d27eb3960efb076dfcaf6 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: LicenseRef-Qhull - size: 552937 - timestamp: 1720813982144 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - sha256: 873ac689484262a51fd79bc6103c1a1bedbf524924d7f0088fb80703042805e4 - md5: 6483b1f59526e05d7d894e466b5b6924 - depends: - - __osx >=11.0 - - libcxx >=16 - license: LicenseRef-Qhull - size: 516376 - timestamp: 1720814307311 -- conda: https://conda.anaconda.org/conda-forge/linux-64/qt-5.15.15-h57362cc_0.conda - sha256: 4dd513a33779902f59768e07b5142b35688047ca60341fa444a6dd8a2795a5af - md5: 3d7908adf2d9997f8f2832e84166ed9f - depends: - - qt-main 5.15.15.* - - qt-webengine 5.15.15.* - license: LGPL-3.0-only - license_family: LGPL - size: 17602 - timestamp: 1751807763425 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/qt-5.15.15-h7b2f662_0.conda - sha256: 63015979dd4ba7af498cad2bc4fd2476208b9228956397fc7e8f5ac8db9e5a50 - md5: b179dad1b0f9780e240dcf3b54a1dae5 - depends: - - qt-main 5.15.15.* - - qt-webengine 5.15.15.* - license: LGPL-3.0-only - license_family: LGPL - size: 17603 - timestamp: 1747069486633 -- conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-hc240232_7.conda - sha256: 401cc7f9ff78ee12097fcda8c09dcf269847a8a55b17b7c0a973f322c7bd5fbc - md5: fa3bbe293d907990f3ca5b8b9d4b10f0 - depends: - - __glibc >=2.17,<3.0.a0 - - alsa-lib >=1.2.15.3,<1.3.0a0 - - dbus >=1.16.2,<2.0a0 - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - gst-plugins-base >=1.26.10,<1.27.0a0 - - gstreamer >=1.26.10,<1.27.0a0 - - harfbuzz >=12.3.2 - - icu >=78.2,<79.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libclang-cpp21.1 >=21.1.8,<21.2.0a0 - - libclang13 >=21.1.8 - - libcups >=2.3.3,<2.4.0a0 - - libdrm >=2.4.125,<2.5.0a0 - - libegl >=1.7.0,<2.0a0 - - libevent >=2.1.12,<2.1.13.0a0 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libgcc >=13 - - libgl >=1.7.0,<2.0a0 - - libglib >=2.86.3,<3.0a0 - - libjpeg-turbo >=3.1.2,<4.0a0 - - libllvm21 >=21.1.8,<21.2.0a0 - - libpng >=1.6.55,<1.7.0a0 - - libpq >=18.1,<19.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libstdcxx >=13 - - libxcb >=1.17.0,<2.0a0 - - libxkbcommon >=1.13.1,<2.0a0 - - libxml2 - - libxml2-16 >=2.14.6 - - libzlib >=1.3.1,<2.0a0 - - nspr >=4.38,<5.0a0 - - nss >=3.118,<4.0a0 - - openssl >=3.5.5,<4.0a0 - - pulseaudio-client >=17.0,<17.1.0a0 - - xcb-util >=0.4.1,<0.5.0a0 - - xcb-util-image >=0.4.0,<0.5.0a0 - - xcb-util-keysyms >=0.4.1,<0.5.0a0 - - xcb-util-renderutil >=0.3.10,<0.4.0a0 - - xcb-util-wm >=0.4.2,<0.5.0a0 - - xorg-libice >=1.1.2,<2.0a0 - - xorg-libsm >=1.2.6,<2.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxdamage >=1.1.6,<2.0a0 - - xorg-libxext >=1.3.7,<2.0a0 - - xorg-libxxf86vm >=1.1.7,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - constrains: - - qt 5.15.15 - license: LGPL-3.0-only - license_family: LGPL - size: 52414725 - timestamp: 1770722572283 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/qt-main-5.15.15-h4427410_7.conda - sha256: 9323bc4937d88bc855819ad47f895b2cdf16a115513faa52994b1ddd9cbc92c4 - md5: 224ddb761f423f0513032388d178efae - depends: - - __osx >=11.0 - - gst-plugins-base >=1.26.10,<1.27.0a0 - - gstreamer >=1.26.10,<1.27.0a0 - - icu >=78.2,<79.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libclang-cpp18.1 >=18.1.8,<18.2.0a0 - - libclang13 >=18.1.8 - - libcxx >=18 - - libglib >=2.86.3,<3.0a0 - - libjpeg-turbo >=3.1.2,<4.0a0 - - libllvm18 >=18.1.8,<18.2.0a0 - - libpng >=1.6.55,<1.7.0a0 - - libpq >=18.1,<19.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - nspr >=4.38,<5.0a0 - - nss >=3.118,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - constrains: - - qt 5.15.15 - license: LGPL-3.0-only - license_family: LGPL - size: 49981627 - timestamp: 1770724524902 -- conda: https://conda.anaconda.org/conda-forge/linux-64/qt-webengine-5.15.15-h5dcc908_4.conda - sha256: 2b02838b8e352cf8704db937be6c0c6647d1bd5599370f5535ad60b1990a6a7f - md5: 3b7e432d09201171b7129ca1af4935c6 - depends: - - __glibc >=2.17,<3.0.a0 - - alsa-lib >=1.2.15.3,<1.3.0a0 - - dbus >=1.16.2,<2.0a0 - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - harfbuzz >=12.2.0 - - libcups >=2.3.3,<2.4.0a0 - - libevent >=2.1.12,<2.1.13.0a0 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libgcc >=14 - - libgl >=1.7.0,<2.0a0 - - libglib >=2.86.3,<3.0a0 - - libiconv >=1.18,<2.0a0 - - libjpeg-turbo >=3.1.2,<4.0a0 - - libopus >=1.6.1,<2.0a0 - - libpng >=1.6.54,<1.7.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libstdcxx >=14 - - libwebp - - libwebp-base >=1.6.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libxkbcommon >=1.13.1,<2.0a0 - - libxml2 - - libxml2-16 >=2.14.6 - - libxslt >=1.1.43,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - nspr >=4.38,<5.0a0 - - nss >=3.118,<4.0a0 - - pulseaudio-client >=17.0,<17.1.0a0 - - qt-main >=5.15.15,<5.16.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxcomposite >=0.4.6,<1.0a0 - - xorg-libxcursor >=1.2.3,<2.0a0 - - xorg-libxdamage >=1.1.6,<2.0a0 - - xorg-libxext >=1.3.7,<2.0a0 - - xorg-libxfixes >=6.0.2,<7.0a0 - - xorg-libxi >=1.8.2,<2.0a0 - - xorg-libxrandr >=1.5.5,<2.0a0 - - xorg-libxrender >=0.9.12,<0.10.0a0 - - xorg-libxtst >=1.2.5,<2.0a0 - constrains: - - qt 5.15.3|5.15.4|5.15.6|5.15.8|5.15.15 - license: LGPL-3.0-only - license_family: LGPL - size: 51532169 - timestamp: 1769499727503 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/qt-webengine-5.15.15-h5422c0a_1.conda - sha256: 1d0e77747164dbc41972283dbcc838f926bc0db2d121b7fae3abaa7d550ad5df - md5: fd84cffd130e51dcca01142c554deabd - depends: - - __osx >=11.0 - - libcxx >=17 - - libiconv >=1.17,<2.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libpng >=1.6.44,<1.7.0a0 - - libsqlite >=3.47.0,<4.0a0 - - libwebp - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - nspr >=4.36,<5.0a0 - - nss >=3.106,<4.0a0 - - qt-main >=5.15.15,<5.16.0a0 - constrains: - - qt 5.15.3|5.15.4|5.15.6|5.15.8|5.15.15 - license: LGPL-3.0-only - license_family: LGPL - size: 44924621 - timestamp: 1729956546230 -- conda: https://conda.anaconda.org/conda-forge/noarch/qtpy-2.4.3-pyhd8ed1ab_1.conda - sha256: b17dd9d2ee7a4f60fb13712883cd2664aa1339df4b29eb7ae0f4423b31778b00 - md5: b49c000df5aca26d36b3f078ba85e03a - depends: - - packaging - - python >=3.9 - license: MIT - license_family: MIT - size: 63041 - timestamp: 1749167192680 + purls: + - pkg:pypi/pyyaml + size: 187278 + timestamp: 1770223990452 - conda: https://conda.anaconda.org/conda-forge/noarch/readchar-4.2.1-pyhe01879c_0.conda sha256: e8eb7be6d307f1625c6e6c100270a2eea92e6e7cc45277cd26233ce107ea9f73 md5: 7f24e776b0f2ffac7516e51e9d2c1e52 @@ -6292,6 +3346,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/readchar size: 15139 timestamp: 1750461053332 - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda @@ -6303,6 +3359,8 @@ packages: - ncurses >=6.5,<7.0a0 license: GPL-3.0-only license_family: GPL + purls: + - pkg:pypi/readline size: 345073 timestamp: 1765813471974 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda @@ -6313,6 +3371,8 @@ packages: - ncurses >=6.5,<7.0a0 license: GPL-3.0-only license_family: GPL + purls: + - pkg:pypi/readline size: 313930 timestamp: 1765813902568 - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda @@ -6326,6 +3386,8 @@ packages: - python >=3.9 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/readme-renderer size: 17481 timestamp: 1734339765256 - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda @@ -6339,17 +3401,19 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/referencing size: 51788 timestamp: 1760379115194 -- pypi: https://files.pythonhosted.org/packages/5a/79/9aa0caf089e8defef9b857b52fc53801f62ff868e19e5c83d4a96612eba1/regex-2026.2.28-cp314-cp314-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/9e/06/3ef1ac6910dc3295ebd71b1f9bfa737e82cfead211a18b319d45f85ddd09/regex-2026.2.28-cp312-cp312-macosx_11_0_arm64.whl name: regex version: 2026.2.28 - sha256: 19a9c9e0a8f24f39d575a6a854d516b48ffe4cbdcb9de55cb0570a032556ecff + sha256: 9b65d33a17101569f86d9c5966a8b1d7fbf8afdda5a8aa219301b0a80f58cf7d requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/c7/7a/a8f5e0561702b25239846a16349feece59712ae20598ebb205580332a471/regex-2026.2.28-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/9e/40/bb226f203caa22c1043c1ca79b36340156eca0f6a6742b46c3bb222a3a57/regex-2026.2.28-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: regex version: 2026.2.28 - sha256: dc8ed8c3f41c27acb83f7b6a9eb727a73fc6663441890c5cb3426a5f6a91ce7d + sha256: d6b08a06976ff4fb0d83077022fde3eca06c55432bb997d8c0495b9a4e9872f4 requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 @@ -6365,6 +3429,8 @@ packages: - chardet >=3.0.2,<6 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/requests size: 63602 timestamp: 1766926974520 - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda @@ -6375,18 +3441,10 @@ packages: - requests >=2.0.1,<3.0.0 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/requests-toolbelt size: 44285 timestamp: 1733734886897 -- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - sha256: 2e4372f600490a6e0b3bac60717278448e323cab1c0fecd5f43f7c56535a99c5 - md5: 36de09a8d3e5d5e6f4ee63af49e59706 - depends: - - python >=3.9 - - six - license: MIT - license_family: MIT - size: 10209 - timestamp: 1733600040800 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda sha256: d617373ba1a5108336cb87754d030b9e384dcf91796d143fa60fe61e76e5cfb0 md5: 43e14f832d7551e5a8910672bfc3d8c6 @@ -6394,28 +3452,10 @@ packages: - python >=3.9 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/rfc3986 size: 38028 timestamp: 1733921806657 -- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - sha256: 2a5b495a1de0f60f24d8a74578ebc23b24aa53279b1ad583755f223097c41c37 - md5: 912a71cc01012ee38e6b90ddd561e36f - depends: - - python - license: MIT - license_family: MIT - size: 7818 - timestamp: 1598024297745 -- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - sha256: 70001ac24ee62058557783d9c5a7bbcfd97bd4911ef5440e3f7a576f9e43bc92 - md5: 7234f99325263a5af6d4cd195035e8f2 - depends: - - python >=3.9 - - lark >=1.2.2 - - python - license: MIT - license_family: MIT - size: 22913 - timestamp: 1752876729969 - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda sha256: b06ce84d6a10c266811a7d3adbfa1c11f13393b91cc6f8a5b468277d90be9590 md5: 7a6289c50631d620652f5045a63eb573 @@ -6427,6 +3467,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/rich size: 208472 timestamp: 1771572730357 - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda @@ -6435,6 +3477,8 @@ packages: depends: - python >=3.10 license: 0BSD OR CC0-1.0 + purls: + - pkg:pypi/roman-numerals size: 13814 timestamp: 1766003022813 - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda @@ -6444,151 +3488,139 @@ packages: - python >=3.10 - roman-numerals 4.1.0 license: 0BSD OR CC0-1.0 + purls: + - pkg:pypi/roman-numerals-py size: 11074 timestamp: 1766025162370 -- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - sha256: e53b0cbf3b324eaa03ca1fe1a688fdf4ab42cea9c25270b0a7307d8aaaa4f446 - md5: c1c368b5437b0d1a68f372ccf01cb133 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py312h868fb18_0.conda + sha256: 62f46e85caaba30b459da7dfcf3e5488ca24fd11675c33ce4367163ab191a42c + md5: 3ffc5a3572db8751c2f15bacf6a0e937 depends: - python - - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - python_abi 3.14.* *_cp314 + - libgcc >=14 + - python_abi 3.12.* *_cp312 constrains: - __glibc >=2.17 license: MIT license_family: MIT - size: 376121 - timestamp: 1764543122774 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda - sha256: e161dd97403b8b8a083d047369a5cf854557dba1204d29e2f0250f5ac4403925 - md5: 76a4f88d1b7748c477abf3c341edc64c + purls: + - pkg:pypi/rpds-py + size: 383750 + timestamp: 1764543174231 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py312h6ef9ec0_0.conda + sha256: ea06f6f66b1bea97244c36fd2788ccd92fd1fb06eae98e469dd95ee80831b057 + md5: a7cfbbdeb93bb9a3f249bc4c3569cd4c depends: - python - __osx >=11.0 - - python 3.14.* *_cp314 - - python_abi 3.14.* *_cp314 + - python 3.12.* *_cpython + - python_abi 3.12.* *_cp312 constrains: - __osx >=11.0 license: MIT license_family: MIT - size: 350976 - timestamp: 1764543169524 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.2-h40fa522_0.conda - noarch: python - sha256: e0403324ac0de06f51c76ae2a4671255d48551a813d1f1dc03bd4db7364604f0 - md5: 8dec25bd8a94496202f6f3c9085f2ad3 + purls: + - pkg:pypi/rpds-py + size: 358853 + timestamp: 1764543161524 +- conda: https://conda.anaconda.org/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + sha256: b48bebe297a63ae60f52e50be328262e880702db4d9b4e86731473ada459c2a1 + md5: 06ad944772941d5dae1e0d09848d8e49 + depends: + - python >=3.10 + - ruamel.yaml.clib >=0.2.15 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruamel-yaml + size: 98448 + timestamp: 1767538149184 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.15-py312h5253ce2_1.conda + sha256: dc520329bdfd356e2f464393f8ad9b8450fd5a269699907b2b8d629300c2c068 + md5: 84aa470567e2211a2f8e5c8491cdd78c depends: - python - __glibc >=2.17,<3.0.a0 - libgcc >=14 - constrains: - - __glibc >=2.17 + - python_abi 3.12.* *_cp312 license: MIT license_family: MIT - size: 9284016 - timestamp: 1771570005837 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.2-h279115b_0.conda - noarch: python - sha256: 80f93811d26e58bf5a635d1034cba8497223c2bf9efa2a67776a18903e40944a - md5: a52cf978daa5290b1414d3bba6b6ea0b + purls: + - pkg:pypi/ruamel-yaml-clib + size: 148221 + timestamp: 1766159515069 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.15-py312hb3ab3e3_1.conda + sha256: ee60a8409096aec04e713c7d98b744689eabb0a98a6cd7b122e896636ec28696 + md5: b3f01912f92602e178c7106d5191f06e depends: - python + - python 3.12.* *_cpython - __osx >=11.0 - constrains: - - __osx >=11.0 + - python_abi 3.12.* *_cp312 license: MIT license_family: MIT - size: 8415205 - timestamp: 1771570140500 -- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda - sha256: 1ae427836d7979779c9005388a05993a3addabcc66c4422694639a4272d7d972 - md5: d0510124f87c75403090e220db1e9d41 + purls: + - pkg:pypi/ruamel-yaml-clib + size: 131636 + timestamp: 1766159558170 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.4-h40fa522_2.conda + noarch: python + sha256: f0a7d31e2f8de0548ad8d3212bf2df07f0387e1bfe1e2b35521f5955a6c5767f + md5: 5dc55c3ec210e7084e738a9eea34b248 depends: + - python - __glibc >=2.17,<3.0.a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx >=14 - - numpy <2.7 - - numpy >=1.23,<3 - - numpy >=1.25.2 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: BSD-3-Clause - license_family: BSD - size: 17225275 - timestamp: 1771880751368 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda - sha256: 6ca2abcaff2cd071aabaabd82b10a87fc7de3a4619f6c98820cc28e90cc2cb20 - md5: 7806ce54b78b0b11517b465a3398e910 - depends: - - __osx >=11.0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=19 - - libgfortran - - libgfortran5 >=14.3.0 - - liblapack >=3.9.0,<4.0a0 - - numpy <2.7 - - numpy >=1.23,<3 - - numpy >=1.25.2 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: BSD-3-Clause - license_family: BSD - size: 13986990 - timestamp: 1771881110844 -- conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.1-py314hdafbbf9_0.conda - sha256: f6883925a130126cdbdc62c2f43513db53c9f889cde4abc3bc66542336a87150 - md5: 54452085855583ccc3cc5dcd17b47ffe - depends: - - cryptography >=2.0 - - dbus - - jeepney >=0.6 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: BSD-3-Clause - license_family: BSD - size: 34098 - timestamp: 1763045408414 -- conda: https://conda.anaconda.org/conda-forge/noarch/semver-3.0.4-pyhcf101f3_1.conda - sha256: bea67173ed67c73cf16691ef72e58059492ac1ed1c880cfbeb6f1295c5add7d6 - md5: 8e7be844ccb9706a999a337e056606ab - depends: - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - size: 22532 - timestamp: 1767294175877 -- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda - sha256: 8fc024bf1a7b99fc833b131ceef4bef8c235ad61ecb95a71a6108be2ccda63e8 - md5: b70e2d44e6aa2beb69ba64206a16e4c6 + constrains: + - __glibc >=2.17 + license: MIT + purls: + - pkg:pypi/ruff + size: 9232759 + timestamp: 1772571785328 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.4-h279115b_2.conda + noarch: python + sha256: f2cb05ddf31fda5080ff2af1e92da6736ef4465567f6bade0f6c88926cf43ebe + md5: 1061250a7a9ea96d3eabf6d35b2a576f depends: - - __osx - - pyobjc-framework-cocoa - - python >=3.10 - python + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: MIT + purls: + - pkg:pypi/ruff + size: 8410687 + timestamp: 1772571918934 +- conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.1-py312h7900ff3_0.conda + sha256: 021c855a26b670bf0d437a9888ea8e302a454a7d1abd08d0df3b91d2b9b22769 + md5: 1b7706e1fb4e1c6cdb6eab38d69b2fc0 + depends: + - cryptography >=2.0 + - dbus + - jeepney >=0.6 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 license: BSD-3-Clause license_family: BSD - size: 22519 - timestamp: 1770937603551 -- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda - sha256: 59656f6b2db07229351dfb3a859c35e57cc8e8bcbc86d4e501bff881a6f771f1 - md5: 28eb91468df04f655a57bcfbb35fc5c5 + purls: + - pkg:pypi/secretstorage + size: 32525 + timestamp: 1763045447326 +- conda: https://conda.anaconda.org/conda-forge/noarch/semver-3.0.4-pyhcf101f3_1.conda + sha256: bea67173ed67c73cf16691ef72e58059492ac1ed1c880cfbeb6f1295c5add7d6 + md5: 8e7be844ccb9706a999a337e056606ab depends: - - __linux - python >=3.10 - python license: BSD-3-Clause license_family: BSD - size: 24108 - timestamp: 1770937597662 + purls: + - pkg:pypi/semver + size: 22532 + timestamp: 1767294175877 - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda sha256: fd7201e38e38bf7f25818d624ca8da97b8998957ca9ae3fb7fdc9c17e6b25fcd md5: 1d00d46c634177fc8ede8b99d6089239 @@ -6596,6 +3628,8 @@ packages: - python >=3.10 license: MIT license_family: MIT + purls: + - pkg:pypi/setuptools size: 637506 timestamp: 1770634745653 - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda @@ -6605,42 +3639,10 @@ packages: - python >=3.10 license: MIT license_family: MIT + purls: + - pkg:pypi/shellingham size: 15018 timestamp: 1762858315311 -- conda: https://conda.anaconda.org/conda-forge/linux-64/sip-6.10.0-py314ha160325_1.conda - sha256: 69262dce285041cc9c230a22915b3cf8bfdd617282e307b0de376aabce5707f5 - md5: f3d7c0d00801b70e0d356c17d6b98e52 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - packaging - - ply - - python >=3.14.0rc3,<3.15.0a0 - - python_abi 3.14.* *_cp314 - - setuptools - - tomli - license: BSD-2-Clause - license_family: BSD - size: 690179 - timestamp: 1759437928851 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sip-6.15.0-py314h93ecee7_0.conda - sha256: f7c96467d3ea096315cd53caa0f08d1ca4f118dbdb08d276877d0ef6bcf0758a - md5: 746c0ab2aab1f9daa441d9cc30a5cfa8 - depends: - - __osx >=11.0 - - libcxx >=19 - - packaging - - ply - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - - setuptools - - tomli - license: BSD-2-Clause - license_family: BSD - size: 733464 - timestamp: 1765031601777 - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -6649,6 +3651,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/six size: 18455 timestamp: 1753199211006 - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda @@ -6658,6 +3662,8 @@ packages: - python >=3.10 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/sniffio size: 15698 timestamp: 1762941572482 - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda @@ -6667,6 +3673,8 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/snowballstemmer size: 73009 timestamp: 1747749529809 - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda @@ -6676,17 +3684,10 @@ packages: - python >=3.9 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/sortedcontainers size: 28657 timestamp: 1738440459037 -- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda - sha256: 23b71ecf089967d2900126920e7f9ff18cdcef82dbff3e2f54ffa360243a17ac - md5: 18de09b20462742fe093ba39185d9bac - depends: - - python >=3.10 - license: MIT - license_family: MIT - size: 38187 - timestamp: 1769034509657 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda sha256: 995f58c662db0197d681fa345522fd9e7ac5f05330d3dff095ab2f102e260ab0 md5: f7af826063ed569bb13f7207d6f949b0 @@ -6711,6 +3712,8 @@ packages: - sphinxcontrib-serializinghtml >=1.1.9 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/sphinx size: 1424416 timestamp: 1740956642838 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.1.0-pyha770c72_0.conda @@ -6723,6 +3726,8 @@ packages: - sphinxcontrib-jquery >=4,<5 license: MIT license_family: MIT + purls: + - pkg:pypi/sphinx-rtd-theme size: 4626882 timestamp: 1769194859566 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda @@ -6733,6 +3738,8 @@ packages: - sphinx >=5 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-applehelp size: 29752 timestamp: 1733754216334 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda @@ -6743,6 +3750,8 @@ packages: - sphinx >=5 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-devhelp size: 24536 timestamp: 1733754232002 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -6753,6 +3762,8 @@ packages: - sphinx >=5 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-htmlhelp size: 32895 timestamp: 1733754385092 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda @@ -6762,6 +3773,8 @@ packages: - python >=3.9 - sphinx >=1.8 license: 0BSD AND MIT + purls: + - pkg:pypi/sphinxcontrib-jquery size: 112964 timestamp: 1734344603903 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda @@ -6771,6 +3784,8 @@ packages: - python >=3.9 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-jsmath size: 10462 timestamp: 1733753857224 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda @@ -6781,6 +3796,8 @@ packages: - sphinx >=5 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-qthelp size: 26959 timestamp: 1733753505008 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda @@ -6791,47 +3808,10 @@ packages: - sphinx >=5 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-serializinghtml size: 28669 timestamp: 1733750596111 -- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 - md5: b1b505328da7a6b246787df4b5a49fbc - depends: - - asttokens - - executing - - pure_eval - - python >=3.9 - license: MIT - license_family: MIT - size: 26988 - timestamp: 1733569565672 -- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda - sha256: 6b6727a13d1ca6a23de5e6686500d0669081a117736a87c8abf444d60c1e40eb - md5: 17b43cee5cc84969529d5d0b0309b2cb - depends: - - __unix - - ptyprocess - - python >=3.10 - - tornado >=6.1.0 - - python - license: BSD-2-Clause - license_family: BSD - size: 24749 - timestamp: 1766513766867 -- pypi: https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl - name: text-unidecode - version: '1.3' - sha256: 1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8 -- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - sha256: cad582d6f978276522f84bd209a5ddac824742fe2d452af6acf900f8650a73a2 - md5: f1acf5fdefa8300de697982bcb1761c9 - depends: - - python >=3.5 - - webencodings >=0.4 - license: BSD-3-Clause - license_family: BSD - size: 28285 - timestamp: 1729802975370 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac md5: cffd3bdd58090148f4cfcd831f4b26ab @@ -6843,6 +3823,8 @@ packages: - xorg-libx11 >=1.8.12,<2.0a0 license: TCL license_family: BSD + purls: + - pkg:pypi/tk size: 3301196 timestamp: 1769460227866 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda @@ -6853,6 +3835,8 @@ packages: - libzlib >=1.3.1,<2.0a0 license: TCL license_family: BSD + purls: + - pkg:pypi/tk size: 3127137 timestamp: 1769460817696 - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda @@ -6863,6 +3847,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/toml size: 24017 timestamp: 1764486833072 - pypi: https://files.pythonhosted.org/packages/d2/b8/f0b9b880c03a3db8eaff63d76ca751ac7d8e45483fb7a0bb9f8e5c6ce433/toml_cli-0.8.2-py3-none-any.whl @@ -6883,6 +3869,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/tomli size: 21453 timestamp: 1768146676791 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda @@ -6892,6 +3880,8 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/tomli-w size: 12680 timestamp: 1736962345843 - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.14.0-pyha770c72_0.conda @@ -6901,32 +3891,10 @@ packages: - python >=3.10 license: MIT license_family: MIT + purls: + - pkg:pypi/tomlkit size: 39224 timestamp: 1768476626454 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda - sha256: b8f9f9ae508d79c9c697eb01b6a8d2ed4bc1899370f44aa6497c8abbd15988ea - md5: e35f08043f54d26a1be93fdbf90d30c3 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: Apache - size: 905436 - timestamp: 1765458949518 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda - sha256: affbc6300e1baef5848f6e69569733a3e7a118aa642487c853f53d6f2bd23b89 - md5: 83e1a2d7b0c1352870bbe9d9406135cf - depends: - - __osx >=11.0 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: Apache - size: 909298 - timestamp: 1765836779269 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 md5: e5ce43272193b38c2e9037446c1d9206 @@ -6935,6 +3903,8 @@ packages: - __unix - python license: MPL-2.0 and MIT + purls: + - pkg:pypi/tqdm size: 94132 timestamp: 1770153424136 - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda @@ -6944,6 +3914,8 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/traitlets size: 110051 timestamp: 1733367480074 - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2026.1.14.14-pyhd8ed1ab_0.conda @@ -6953,6 +3925,8 @@ packages: - python >=3.10 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/trove-classifiers size: 19707 timestamp: 1768550221435 - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda @@ -6973,6 +3947,8 @@ packages: - python license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/twine size: 42488 timestamp: 1757013705407 - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.24.0-pyhcf101f3_0.conda @@ -6987,6 +3963,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/typer size: 117860 timestamp: 1771292312899 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -6996,6 +3974,8 @@ packages: - typing_extensions ==4.15.0 pyhcf101f3_0 license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/typing-extensions size: 91383 timestamp: 1756220668932 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda @@ -7006,6 +3986,8 @@ packages: - typing_extensions >=4.12.0 license: MIT license_family: MIT + purls: + - pkg:pypi/typing-inspection size: 18923 timestamp: 1764158430324 - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -7016,84 +3998,50 @@ packages: - python license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/typing-extensions size: 51692 timestamp: 1756220668932 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda - sha256: 3088d5d873411a56bf988eee774559335749aed6f6c28e07bf933256afb9eb6c - md5: f6d7aa696c67756a650e91e15e88223c - depends: - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - size: 15183 - timestamp: 1733331395943 - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c md5: ad659d0a2b3e47e38d829aa8cad2d610 license: LicenseRef-Public-Domain + purls: + - pkg:pypi/tzdata size: 119135 timestamp: 1767016325805 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda - sha256: c84034056dc938c853e4f61e72e5bd37e2ec91927a661fb9762f678cbea52d43 - md5: 5d3c008e54c7f49592fca9c32896a76f +- conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda + sha256: c975070ac28fe23a5bbb2b8aeca5976b06630eb2de2dc149782f74018bf07ae8 + md5: 55fd03988b1b1bc6faabbfb5b481ecd7 depends: - __glibc >=2.17,<3.0.a0 - cffi - libgcc >=14 - libstdcxx >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 license: MIT license_family: MIT - size: 15004 - timestamp: 1769438727085 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py314h6cfcd04_0.conda - sha256: 033dbf9859fe58fb85350cf6395be6b1346792e1766d2d5acab538a6eb3659fb - md5: e229f444fbdb28d8c4f40e247154d993 + purls: + - pkg:pypi/ukkonen + size: 14882 + timestamp: 1769438717830 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py312h766f71e_0.conda + sha256: 4d047b1d6e0f4bdd8c43e1b772665de9a10c0649a7f158df8193a3a6e7df714f + md5: e80504aa921f5ab11456f27bd9ef5d25 depends: - __osx >=11.0 - cffi - libcxx >=19 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - size: 14884 - timestamp: 1769439056290 -- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda - sha256: ff1c1d7c23b91c9b0eb93a3e1380f4e2ac6c37ea2bba4f932a5484e9a55bba30 - md5: 494fdf358c152f9fdd0673c128c2f3dd - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: Apache - size: 409562 - timestamp: 1770909102180 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda - sha256: 09bfbee5a2bcf4df06f21a2aa9eb40a7af97864a569beb5ea85fd6baf6e03ce7 - md5: 4fffb3ba871bb05f34ffb705534dfef5 - depends: - - __osx >=11.0 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: Apache - size: 416130 - timestamp: 1770909728445 -- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - sha256: e0eb6c8daf892b3056f08416a96d68b0a358b7c46b99c8a50481b22631a4dfc0 - md5: e7cb0f5745e4c5035a460248334af7eb - depends: - - python >=3.9 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 license: MIT license_family: MIT - size: 23990 - timestamp: 1733323714454 + purls: + - pkg:pypi/ukkonen + size: 14733 + timestamp: 1769439379176 - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a md5: 9272daa869e03efe68833e3dc7a02130 @@ -7105,6 +4053,8 @@ packages: - python >=3.10 license: MIT license_family: MIT + purls: + - pkg:pypi/urllib3 size: 103172 timestamp: 1767817860341 - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.9.2-pyhd8ed1ab_0.conda @@ -7115,31 +4065,37 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/userpath size: 14292 timestamp: 1735925027874 -- conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.10.7-h6dd6661_0.conda - sha256: 033aac3879d772ee496f383099c9e33240ee20956db86655beb23f295a21ade8 - md5: 288d83534bc284e480229b7c8f02d61a +- conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.10.8-h6dd6661_0.conda + sha256: fd0bc85ce7372361af95cac25cff3aa4f757e8a246f1202bcb32987a3c3ce855 + md5: c5c984c1f55bc8227d9eecfefb8dffb9 depends: + - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 constrains: - __glibc >=2.17 license: Apache-2.0 OR MIT - size: 18296149 - timestamp: 1772204925070 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.10.7-h9b11cc2_0.conda - sha256: 6d78aadca92de4c1c994b58b2e58c97675ba8a4937d754b5c8473ce375051c48 - md5: 97485afbd040c0afec82954b0ea58b44 + purls: + - pkg:pypi/uv + size: 18315979 + timestamp: 1772588899064 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.10.8-h9b11cc2_0.conda + sha256: 1837b58abcfe7074f4b5289abe6ad58cb367ddb476657327e91d8a1444465bfd + md5: 38da6bf3652752eaf3354a8021b4aca0 depends: - libcxx >=19 - __osx >=11.0 constrains: - __osx >=11.0 license: Apache-2.0 OR MIT - size: 15722451 - timestamp: 1772204889277 + purls: + - pkg:pypi/uv + size: 15736453 + timestamp: 1772588978714 - conda: https://conda.anaconda.org/conda-forge/noarch/versioningit-3.3.0-pyhd8ed1ab_0.conda sha256: 4b9a3f6738ab6e241b12b2fe9258f7e051678b911ca0f0ab042becc29096ff51 md5: 57b96d99ac0f5a548f7001618db6a561 @@ -7150,6 +4106,8 @@ packages: - tomli >=1.2,<3.0 license: MIT license_family: MIT + purls: + - pkg:pypi/versioningit size: 167034 timestamp: 1751113901223 - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.39.0-pyhcf101f3_0.conda @@ -7165,26 +4123,10 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/virtualenv size: 4657721 timestamp: 1771967166128 -- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - sha256: e298b508b2473c4227206800dfb14c39e4b14fd79d4636132e9e1e4244cdf4aa - md5: c3197f8c0d5b955c904616b716aca093 - depends: - - python >=3.10 - license: MIT - license_family: MIT - size: 71550 - timestamp: 1770634638503 -- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - sha256: 21f6c8a20fe050d09bfda3fb0a9c3493936ce7d6e1b3b5f8b01319ee46d6c6f6 - md5: 6639b6b0d8b5a284f027a2003669aa65 - depends: - - python >=3.10 - license: BSD-3-Clause - license_family: BSD - size: 18987 - timestamp: 1761899393153 - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda sha256: 19ff205e138bb056a46f9e3839935a2e60bd1cf01c8241a5e172a422fed4f9c6 md5: 2841eb5bfc75ce15e9a0054b98dcd64d @@ -7192,122 +4134,22 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/webencodings size: 15496 timestamp: 1733236131358 -- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - sha256: 42a2b61e393e61cdf75ced1f5f324a64af25f347d16c60b14117393a98656397 - md5: 2f1ed718fcd829c184a6d4f0f2e07409 - depends: - - python >=3.10 - license: Apache-2.0 - license_family: APACHE - size: 61391 - timestamp: 1759928175142 -- conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.15-pyhd8ed1ab_0.conda - sha256: 826af5e2c09e5e45361fa19168f46ff524e7a766022615678c3a670c45895d9a - md5: dc257b7e7cad9b79c1dfba194e92297b +- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda + sha256: d6cf2f0ebd5e09120c28ecba450556ce553752652d91795442f0e70f837126ae + md5: bdbd7385b4a67025ac2dba4ef8cb6a8f depends: + - packaging >=24.0 - python >=3.10 - license: BSD-3-Clause - license_family: BSD - size: 889195 - timestamp: 1762040404362 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda - sha256: ad8cab7e07e2af268449c2ce855cbb51f43f4664936eff679b1f3862e6e4b01d - md5: fdc27cb255a7a2cc73b7919a968b48f0 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libxcb >=1.17.0,<2.0a0 - license: MIT - license_family: MIT - size: 20772 - timestamp: 1750436796633 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda - sha256: 94b12ff8b30260d9de4fd7a28cca12e028e572cbc504fd42aa2646ec4a5bded7 - md5: a0901183f08b6c7107aab109733a3c91 - depends: - - libgcc-ng >=12 - - libxcb >=1.16,<2.0.0a0 - - xcb-util >=0.4.1,<0.5.0a0 - license: MIT - license_family: MIT - size: 24551 - timestamp: 1718880534789 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda - sha256: 546e3ee01e95a4c884b6401284bb22da449a2f4daf508d038fdfa0712fe4cc69 - md5: ad748ccca349aec3e91743e08b5e2b50 - depends: - - libgcc-ng >=12 - - libxcb >=1.16,<2.0.0a0 - license: MIT - license_family: MIT - size: 14314 - timestamp: 1718846569232 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda - sha256: 2d401dadc43855971ce008344a4b5bd804aca9487d8ebd83328592217daca3df - md5: 0e0cbe0564d03a99afd5fd7b362feecd - depends: - - libgcc-ng >=12 - - libxcb >=1.16,<2.0.0a0 - license: MIT - license_family: MIT - size: 16978 - timestamp: 1718848865819 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda - sha256: 31d44f297ad87a1e6510895740325a635dd204556aa7e079194a0034cdd7e66a - md5: 608e0ef8256b81d04456e8d211eee3e8 - depends: - - libgcc-ng >=12 - - libxcb >=1.16,<2.0.0a0 - license: MIT - license_family: MIT - size: 51689 - timestamp: 1718844051451 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.47-hb03c661_0.conda - sha256: 19c2bb14bec84b0e995b56b752369775c75f1589314b43733948bb5f471a6915 - md5: b56e0c8432b56decafae7e78c5f29ba5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - xorg-libx11 >=1.8.13,<2.0a0 - license: MIT - license_family: MIT - size: 399291 - timestamp: 1772021302485 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda - sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b - md5: fb901ff28063514abb6046c9ec2c4a45 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - size: 58628 - timestamp: 1734227592886 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda - sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250 - md5: 1c74ff8c35dcadf952a16f752ca5aa49 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libuuid >=2.38.1,<3.0a0 - - xorg-libice >=1.1.2,<2.0a0 - license: MIT - license_family: MIT - size: 27590 - timestamp: 1741896361728 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda - sha256: 516d4060139dbb4de49a4dcdc6317a9353fb39ebd47789c14e6fe52de0deee42 - md5: 861fb6ccbc677bb9a9fb2468430b9c6a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libxcb >=1.17.0,<2.0a0 license: MIT license_family: MIT - size: 839652 - timestamp: 1770819209719 + purls: + - pkg:pypi/wheel + size: 31858 + timestamp: 1769139207397 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b md5: b2895afaf55bf96a8c8282a2e47a5de0 @@ -7316,6 +4158,8 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: + - pkg:pypi/xorg-libxau size: 15321 timestamp: 1762976464266 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda @@ -7325,46 +4169,10 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + purls: + - pkg:pypi/xorg-libxau size: 14105 timestamp: 1762976976084 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda - sha256: 048c103000af9541c919deef03ae7c5e9c570ffb4024b42ecb58dbde402e373a - md5: f2ba4192d38b6cef2bb2c25029071d90 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxfixes >=6.0.2,<7.0a0 - license: MIT - license_family: MIT - size: 14415 - timestamp: 1770044404696 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda - sha256: 832f538ade441b1eee863c8c91af9e69b356cd3e9e1350fff4fe36cc573fc91a - md5: 2ccd714aa2242315acaf0a67faea780b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxfixes >=6.0.1,<7.0a0 - - xorg-libxrender >=0.9.11,<0.10.0a0 - license: MIT - license_family: MIT - size: 32533 - timestamp: 1730908305254 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda - sha256: 43b9772fd6582bf401846642c4635c47a9b0e36ca08116b3ec3df36ab96e0ec0 - md5: b5fcc7172d22516e1f965490e65e33a4 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxfixes >=6.0.1,<7.0a0 - license: MIT - license_family: MIT - size: 13217 - timestamp: 1727891438799 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 md5: 1dafce8548e38671bea82e3f5c6ce22f @@ -7373,6 +4181,8 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: + - pkg:pypi/xorg-libxdmcp size: 20591 timestamp: 1762976546182 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda @@ -7382,102 +4192,10 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + purls: + - pkg:pypi/xorg-libxdmcp size: 19156 timestamp: 1762977035194 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda - sha256: 79c60fc6acfd3d713d6340d3b4e296836a0f8c51602327b32794625826bd052f - md5: 34e54f03dfea3e7a2dcf1453a85f1085 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - xorg-libx11 >=1.8.12,<2.0a0 - license: MIT - license_family: MIT - size: 50326 - timestamp: 1769445253162 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda - sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 - md5: ba231da7fccf9ea1e768caf5c7099b84 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - xorg-libx11 >=1.8.12,<2.0a0 - license: MIT - license_family: MIT - size: 20071 - timestamp: 1759282564045 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda - sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a - md5: 17dcc85db3c7886650b8908b183d6876 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxfixes >=6.0.1,<7.0a0 - license: MIT - license_family: MIT - size: 47179 - timestamp: 1727799254088 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda - sha256: 80ed047a5cb30632c3dc5804c7716131d767089f65877813d4ae855ee5c9d343 - md5: e192019153591938acf7322b6459d36e - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxrender >=0.9.12,<0.10.0a0 - license: MIT - license_family: MIT - size: 30456 - timestamp: 1769445263457 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda - sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 - md5: 96d57aba173e878a2089d5638016dc5e - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - license: MIT - license_family: MIT - size: 33005 - timestamp: 1734229037766 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxshmfence-1.3.3-hb9d3cd8_0.conda - sha256: c0830fe9fa78d609cd9021f797307e7e0715ef5122be3f784765dad1b4d8a193 - md5: 9a809ce9f65460195777f2f2116bae02 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - size: 12302 - timestamp: 1734168591429 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda - sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a - md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxi >=1.7.10,<2.0a0 - license: MIT - license_family: MIT - size: 32808 - timestamp: 1727964811275 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda - sha256: 64db17baaf36fa03ed8fae105e2e671a7383e22df4077486646f7dbf12842c9f - md5: 665d152b9c6e78da404086088077c844 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - license: MIT - license_family: MIT - size: 18701 - timestamp: 1769434732453 - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad md5: a77f85f77be52ff59391544bfe73390a @@ -7486,6 +4204,8 @@ packages: - __glibc >=2.17,<3.0.a0 license: MIT license_family: MIT + purls: + - pkg:pypi/yaml size: 85189 timestamp: 1753484064210 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda @@ -7495,34 +4215,10 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + purls: + - pkg:pypi/yaml size: 83386 timestamp: 1753484079473 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda - sha256: 47cfe31255b91b4a6fa0e9dbaf26baa60ac97e033402dbc8b90ba5fee5ffe184 - md5: 8035e5b54c08429354d5d64027041cad - depends: - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libsodium >=1.0.20,<1.0.21.0a0 - - krb5 >=1.21.3,<1.22.0a0 - license: MPL-2.0 - license_family: MOZILLA - size: 310648 - timestamp: 1757370847287 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h888dc83_9.conda - sha256: b6f9c130646e5971f6cad708e1eee278f5c7eea3ca97ec2fdd36e7abb764a7b8 - md5: 26f39dfe38a2a65437c29d69906a0f68 - depends: - - __osx >=11.0 - - libcxx >=19 - - libsodium >=1.0.20,<1.0.21.0a0 - - krb5 >=1.21.3,<1.22.0a0 - license: MPL-2.0 - license_family: MOZILLA - size: 244772 - timestamp: 1757371008525 - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae md5: 30cd29cb87d819caead4d55184c1d115 @@ -7531,6 +4227,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/zipp size: 24194 timestamp: 1764460141901 - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda @@ -7542,6 +4240,8 @@ packages: - libstdcxx >=14 license: Zlib license_family: Other + purls: + - pkg:pypi/zlib-ng size: 122618 timestamp: 1770167931827 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda @@ -7552,38 +4252,44 @@ packages: - libcxx >=19 license: Zlib license_family: Other + purls: + - pkg:pypi/zlib-ng size: 94375 timestamp: 1770168363685 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda - sha256: e589f694b44084f2e04928cabd5dda46f20544a512be2bdb0d067d498e4ac8d0 - md5: 2930a6e1c7b3bc5f66172e324a8f5fc3 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda + sha256: c2bcb8aa930d6ea3c9c7a64fc4fab58ad7bcac483a9a45de294f67d2f447f413 + md5: 02738ff9855946075cbd1b5274399a41 depends: - python - cffi >=1.11 - zstd >=1.5.7,<1.5.8.0a0 - - __glibc >=2.17,<3.0.a0 - libgcc >=14 + - __glibc >=2.17,<3.0.a0 - zstd >=1.5.7,<1.6.0a0 - - python_abi 3.14.* *_cp314 + - python_abi 3.12.* *_cp312 license: BSD-3-Clause license_family: BSD - size: 473605 - timestamp: 1762512687493 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py314h9d33bd4_1.conda - sha256: cdeb350914094e15ec6310f4699fa81120700ca7ab7162a6b3421f9ea9c690b4 - md5: 8a92a736ab23b4633ac49dcbfcc81e14 + purls: + - pkg:pypi/zstandard + size: 467133 + timestamp: 1762512686069 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py312h37e1c23_1.conda + sha256: af843b0fe62d128a70f91dc954b2cb692f349a237b461788bd25dd928d0d1ef8 + md5: 9300889791d4decceea3728ad3b423ec depends: - python - cffi >=1.11 - zstd >=1.5.7,<1.5.8.0a0 - - python 3.14.* *_cp314 + - python 3.12.* *_cpython - __osx >=11.0 - - python_abi 3.14.* *_cp314 + - python_abi 3.12.* *_cp312 - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause license_family: BSD - size: 397786 - timestamp: 1762512730914 + purls: + - pkg:pypi/zstandard + size: 390920 + timestamp: 1762512713481 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 @@ -7592,6 +4298,8 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/zstd size: 601375 timestamp: 1764777111296 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda @@ -7602,5 +4310,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/zstd size: 433413 timestamp: 1764777166076 diff --git a/pyproject.toml b/pyproject.toml index f91c454..b4d861d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,34 +2,22 @@ ### Project Metadata ### ######################## [project] -name = "examplepyapp" -description = "Example Python repo for neutrons" +name = "commons" +description = "Python library repo for atomic software components generally applicable across neutrons repositories." dynamic = ["version"] requires-python = ">=3.10" license = { text = "MIT" } -keywords = ["neutrons", "example", "python"] +keywords = ["neutrons", "common", "python", "library", "utils"] readme = "README.md" dependencies = [ # Dependencies available from both PyPI and conda should be listed here "numpy>=2.2,<3", - "QtPy", - "PyQt5", - "pyqtgraph", - # Dependencies only available from PyPI - "bm3d-streak-removal>=0.2.0,<0.3", - "pytest-playwright>=0.7.0,<0.8", ] [project.optional-dependencies] docs = ["sphinx", "sphinx_rtd_theme", "versioningit", "myst_parser"] -[project.scripts] -packagename-cli = "packagenamepy.packagename:main" - -[project.gui-scripts] -packagenamepy = "packagenamepy.packagename:gui" - [project.urls] homepage = "https://github.com/neutrons/python_project_template/" repository = "https://github.com/neutrons/python_project_template/" @@ -48,19 +36,19 @@ requires = ["hatchling", "versioningit"] source = "versioningit" [tool.hatch.build.hooks.versioningit-onbuild] -source-file = "src/packagenamepy/_version.py" -build-file = "packagenamepy/_version.py" +source-file = "src/commons/_version.py" +build-file = "commons/_version.py" [tool.hatch.build] artifacts = [ - "src/packagenamepy/_version.py", - "src/packagenamepy/**/*.yml", - "src/packagenamepy/**/*.yaml", - "src/packagenamepy/**/*.ini", + "src/commons/_version.py", + "src/commons/**/*.yml", + "src/commons/**/*.yaml", + "src/commons/**/*.ini", ] [tool.hatch.build.targets.wheel] -packages = ["src/packagenamepy"] +packages = ["src/commons"] [tool.versioningit.vcs] method = "git" @@ -79,7 +67,7 @@ dirty = "{version}" distance-dirty = "{next_version}.dev{distance}" [tool.versioningit.write] -file = "src/packagenamepy/_version.py" +file = "src/commons/_version.py" ################### ### Pixi config ### @@ -101,12 +89,7 @@ conda-pypi-map = { "conda-forge" = "pixi-mapping.json" } [tool.pixi.dependencies] # Conda package dependencies numpy = "*" -scipy = "*" # specify derivative dependencies here if you need them from conda -# GUI -pyqtgraph = "*" -qt = "*" -qtpy = "*" -pyqt = "*" +"ruamel.yaml" = "*" # pip-audit h2 = ">=4.3.0" # Known vulnerability in <4.3.0 brotli = ">=1.2.0" @@ -118,7 +101,7 @@ pillow = ">=12.1.1" # CVE-2026-25990 [tool.pixi.pypi-dependencies] # PyPI dependencies, including this package to allow local editable installs -examplepyapp = { path = ".", editable = true } +commons = { path = ".", editable = true } jaraco-context = ">=6.1.0" # CVE-2026-23949 # Pixi Build configuration - https://pixi.sh/latest/reference/pixi_manifest/#pixi-build @@ -130,12 +113,10 @@ versioningit = "*" [tool.pixi.package.run-dependencies] python = ">=3.10" numpy = "*" -QtPy = "*" -pyqt = "*" -pyqtgraph = "*" +"ruamel.yaml" = "*" [tool.pixi.package] -name = "examplepyapp" +name = "commons" version = "0.0.0" # placeholder, overwritten by sync-version [tool.pixi.package.build] @@ -150,7 +131,6 @@ default = { features = [ "package", "test", ], solve-group = "default" } -jupyter = { features = ["developer", "jupyter"], solve-group = "jupyter" } [tool.pixi.feature.test.dependencies] pytest = ">=6.2.4,<9.0.0" # constrained to match pytest-playwright requirements @@ -179,11 +159,6 @@ sphinx = "*" sphinx_rtd_theme = "*" myst-parser = "*" -[tool.pixi.feature.jupyter.dependencies] -jupyterlab = "*" -ipympl = "*" -ipywidgets = "*" - [tool.pixi.tasks] # Documentation build-docs = { cmd = 'sphinx-build -b html docs docs/_build', description = "Build documentation" } @@ -236,7 +211,7 @@ reset-toml = { cmd = "cp pyproject.toml.bak pyproject.toml; rm pyproject.toml.ba ############## [tool.pytest.ini_options] -addopts = "-v --cov=packagenamepy --cov-report=term-missing" +addopts = "-v --cov=commons --cov-report=term-missing" pythonpath = [".", "src", "scripts"] testpaths = ["tests"] python_files = ["test*.py"] @@ -264,7 +239,7 @@ select = ["A", "ARG", "ASYNC", "BLE", "C90", "E", "F", "I", "N", "UP032", "W"] ignore = [] [tool.ruff.lint.isort] -known-first-party = ["packagenamepy"] +known-first-party = ["commons"] [tool.ruff.format] quote-style = "double" diff --git a/scripts/myscripts.py b/scripts/myscripts.py deleted file mode 100644 index fce7406..0000000 --- a/scripts/myscripts.py +++ /dev/null @@ -1,2 +0,0 @@ -"""This is a script that use the package as a module.""" -#!/usr/bin/env python diff --git a/src/commons/__init__.py b/src/commons/__init__.py new file mode 100644 index 0000000..36c2001 --- /dev/null +++ b/src/commons/__init__.py @@ -0,0 +1,18 @@ +"""Contains the entry point for the application""" + +from commons.decorators.singleton import Singleton + + +try: + from ._version import __version__ # noqa: F401 +except ImportError: + __version__ = "unknown" + +@Singleton +class _Spec: + def __init__(self): + self.client_package_name: str = None +Spec : _Spec = _Spec() + +def init(client_package_name: str): + Spec.client_package_name = client_package_name \ No newline at end of file diff --git a/src/commons/_version.py b/src/commons/_version.py new file mode 100644 index 0000000..432268e --- /dev/null +++ b/src/commons/_version.py @@ -0,0 +1 @@ +__version__ = "0.2.0.dev2" diff --git a/src/commons/config.py b/src/commons/config.py new file mode 100644 index 0000000..ba21702 --- /dev/null +++ b/src/commons/config.py @@ -0,0 +1,485 @@ +"""Application configuration management.""" + +import copy +import importlib.resources as resources +import logging +import os +import re +import shutil +import subprocess +import sys +from enum import StrEnum +from pathlib import Path +from typing import IO, Any, Dict, TypeVar + +import yaml +from ruamel.yaml import YAML as rYAML # noqa: N811 + +from . import Spec, __version__ as app_version +from .decorators.singleton import Singleton +from .time import isoFromTimestamp, timestamp + +package_name = Spec.client_package_name + + +class DeployEnvEnum(StrEnum): + """Deployment environment enumeration.""" + + NEXT = f"{package_name}_next" + QA = f"{package_name}_qa" + PROD = f"{package_name}_prod" + + +def isTestEnv() -> bool: + """ + Check if the current environment is a test environment. + + This is determined by the presence of the "env" environment variable + and whether it contains the string "test". + """ + env = os.environ.get("env") + return env and "test" in env and "conftest" in sys.modules + + +def _find_root_dir() -> str: + """Find the root directory of the client module.""" + try: + MODULE_ROOT = Path(sys.modules[package_name].__file__).parent + + # Using `"test" in env` here allows different versions of "[category]_test.yml" to be used for different + # test categories: e.g. unit tests use "test.yml" but integration tests use "integration_test.yml". + if isTestEnv(): + # WARNING: there are now multiple "conftest.py" at various levels in the test hierarchy. + MODULE_ROOT = MODULE_ROOT.parent.parent / "tests" + except Exception as e: + raise RuntimeError(f"Unable to determine {package_name} module-root directory") from e + + return str(MODULE_ROOT) + + +# update config with self._config, deep_update does not work with ruamel.yaml +def merge_dicts(d1: Dict[str, Any], d2: Dict[str, Any]) -> Dict[str, Any]: + """Merge two dictionaries with d2 overwriting values in d1.""" + for key, value in d2.items(): + if isinstance(value, dict) and key in d1: + merge_dicts(d1[key], value) + else: + d1[key] = value + return d1 + + +@Singleton +class _Resource: + """Resource manager for loading application resources.""" + + _package_mode: bool + _resources_path: str + _logger = logging.getLogger(__name__ + ".Resource") + + def __init__(self) -> None: + """Initialize the resource manager.""" + # where the location of resources are depends on whether or not this is in package mode + self._package_mode = not self._existsInPackage("application.yml") + if self._package_mode: + self._logger.debug("In package mode") + self._resources_path = "/resources/" + else: + self._logger.debug("Not in package mode") + self._resources_path = os.path.join(_find_root_dir(), "resources/") + + def _existsInPackage(self, sub_path: str) -> bool: + """Check if a resource exists in the package.""" + with resources.path(f"{package_name}.resources", sub_path) as path: + return os.path.exists(path) + + def exists(self, sub_path: str) -> bool: + """Check if a resource exists.""" + if self._package_mode: + return self._existsInPackage(sub_path) + else: + return os.path.exists(self.getPath(sub_path)) + + def getPath(self, sub_path: str) -> str: + """Get the path to a resource.""" + if sub_path.startswith("/"): + return os.path.join(self._resources_path, sub_path[1:]) + else: + return os.path.join(self._resources_path, sub_path) + + def read(self, sub_path: str) -> str: + """Read a resource file.""" + with self.open(sub_path, "r") as file: + return file.read() + + def open(self, sub_path: str, mode: str) -> IO[Any]: + """Open a resource file.""" + if self._package_mode: + with resources.path(f"{package_name}.resources", sub_path) as path: + return open(path, mode) + else: + return open(self.getPath(sub_path), mode) + + +Resource = _Resource() + +KeyType = TypeVar("KeyType") + + +def deep_update(mapping: Dict[KeyType, Any], *updating_mappings: Dict[KeyType, Any]) -> Dict[KeyType, Any]: + """Crawl through initial dictionary while appending and updating entries in nested dicts.""" + updated_mapping = mapping.copy() + for updating_mapping in updating_mappings: + for k, v in updating_mapping.items(): + if k in updated_mapping and isinstance(updated_mapping[k], dict) and isinstance(v, dict): + updated_mapping[k] = deep_update(updated_mapping[k], v) + else: + updated_mapping[k] = v + return updated_mapping + + +@Singleton +class _Config: + _config: Dict[str, Any] = {} + _logger = logging.getLogger(__name__ + ".Config") + _property_change_warnings: Dict[str, str] = {} + _default_env: str = "application.yml" + + def __init__(self) -> None: + self._property_change_warnings = { + "version.start": ( + "It is NOT ADVISED to change the `version.start` property" + " WITHOUT CAREFUL CONSIDERATION of the file indexes on disk." + ), + } + + self.reload() + # if -user.yml exists, then load it by default + if self.shouldSwapToUserYml(): + self._logger.info("Found user configuration file, swapping to it") + self.swapToUserYml() + + def shouldSwapToUserYml(self) -> bool: + """Check if the app should use a user config.""" + isExplicitEnv = "env" in os.environ + isUserYmlExists = (self._userHome() / f"{package_name}-user.yml").exists() + return isUserYmlExists and not isExplicitEnv and not isTestEnv() + + def _fix_directory_properties(self) -> None: + """Expand ~/ to a specified path.""" + + def expandhome(direc: str) -> str: + if "~" in direc: + return str(Path(direc).expanduser()) + else: + return direc + + if "instrument" in self._config and "home" in self._config["instrument"]: + self._config["instrument"]["home"] = expandhome(self._config["instrument"]["home"]) + if "samples" in self._config and "home" in self._config["samples"]: + self._config["samples"]["home"] = expandhome(self._config["samples"]["home"]) + + def configureForDeploy(self) -> None: + version = self.packageVersion() + if "dev" in version: + self.mergeAndExport(DeployEnvEnum.NEXT) + elif "rc" in version: + self.mergeAndExport(DeployEnvEnum.QA) + else: + self.mergeAndExport(DeployEnvEnum.PROD) + + def mergeAndExport(self, envName: str) -> None: + """Merge/export the current configuration with the specified environment configuration.""" + self._logger.debug(f"Merging/exporting configuration with environment: {envName}") + self.refresh(envName, False) + + ryaml = rYAML() + ryaml.default_flow_style = False + ryaml.indent(mapping=2, sequence=4, offset=2) + + with Resource.open(self._default_env, "r") as file: + config = ryaml.load(file) + + # overwrite default env application.yml with exported config + merge_dicts(config, self._config) + + # Export the merged configuration to application.yml + with Resource.open(self._default_env, "w") as file: + ryaml.dump(config, file) + + def reload(self, env_name: str = None) -> None: + # use refresh to do initial load, clearing shouldn't matter + self.refresh(self._default_env, True) + + # ---------- internal values: -------------------------- + # allow "resources" relative paths to be entered into the "yml" + # using "${module.root}" + self._config["module"] = {} + self._config["module"]["root"] = _find_root_dir() + + self._config["version"] = self._config.get("version", {}) + self._config["version"]["default"] = -1 + + # ---------- end: internal values: ----------------------------- + + watchedProperties = {} + for key in self._property_change_warnings: + if self.exists(key): + watchedProperties[key] = self[key] + + # see if user used environment injection to modify what is needed + # this will get from the os environment or from the currently loaded one + # first case wins + self.env = env_name + if self.env is None: + self.env = os.environ.get("env", self._config.get("environment", None)) + if self.env is not None: + self._logger.info(f"Loading environment config: {self.env}") + self.refresh(self.env) + else: + self._logger.info("No environment config specified, using default") + self.warnSensitiveProperties(watchedProperties) + self.persistBackup() + + def persistBackup(self) -> None: + self._userHome().mkdir(parents=True, exist_ok=True) + backupFile = self._userHome() / "application.yml.bak" + with open(backupFile, "w") as file: + yaml.dump(self._config, file, default_flow_style=False) + self._logger.info(f"Backup of application.yml created at {backupFile.absolute()}") + + def loadEnv(self, env_name: str) -> None: + # load the new environment + self.reload(env_name) + + @staticmethod + def _timestamp() -> str: + return isoFromTimestamp(timestamp()) + + def archiveUserYml(self) -> None: + """Archive the user config for safe keeping.""" + # check if -user.yml exists + userHome = self._userHome() + if (userHome / f"{package_name}-user.yml").exists(): + version = self.getUserYmlVersionDisk() + + # generate human readable timestamp + timestamp = self._timestamp() + + # archive the old -user.yml + archivePath = userHome / f"{package_name}-user-{version}-{timestamp}.yml.bak" + shutil.copy(str(userHome / f"{package_name}-user.yml"), str(archivePath)) + + @staticmethod + def _userHome() -> Path: + return Path.home() / f".{package_name}" + + def packageVersion(self) -> str | None: + """Get the version of the application.""" + if app_version is None or app_version == "unknown" or app_version == "": + label = subprocess.check_output(["git", "rev-parse", "HEAD"]).strip() + if bool(label) and not label == b"": + return label.decode("utf-8") + raise ValueError( + f"The {package_name} Version is not set correctly. " + f"Please ensure that the {package_name} package is installed correctly." + ) + return app_version + + def getUserYmlVersionDisk(self) -> str | None: + """Get the associated app version the user config was generated with.""" + # check if -user.yml exists + userHome = self._userHome() + if (userHome / f"{package_name}-user.yml").exists(): + with open(str(userHome / f"{package_name}-user.yml"), "r") as f: + applicationYml = rYAML(typ="safe").load(f) + version = applicationYml.get("application", {"version": None})["version"] + return version + else: + return None + + def swapToUserYml(self) -> None: + """Swap to user generated config.""" + # generate root directory for user configurations + userHome = self._userHome() + + try: + if not userHome.exists(): + userHome.mkdir(parents=True, exist_ok=True) + + # check if -user.yml exists + if self.getUserYmlVersionDisk() != self.packageVersion(): + # if the version is not the same, then we need to archive the old one + if self.getUserYmlVersionDisk() is not None: + self._logger.warning( + "The user configuration file is out of date. A new configuration file will be generated." + ) + # archive the old -user.yml + self.archiveUserYml() + # generate a new valid -user.yml + self._generateUserYml() + + except Exception as e: # noqa: BLE001 + raise RuntimeError( + ( + "Unable to swap to user configuration: " + f"{userHome / f'{package_name}-user.yml'}" + "\nOriginal configuration maintained." + ) + ) from e + else: + # load the user yml file if the filesystem is ready + self.loadEnv(str(userHome / f"{package_name}-user.yml")) + # archive a backup of the current user yml + self.archiveUserYml() + + def _generateUserYml(self) -> None: + """Generate a default application config in the user's home dir.""" + userHome = self._userHome() + # copy commented out application.yml as -user.yml + # read the application.yml as a dict from resources + applicationYml = None + with Resource.open("application.yml", "r") as f: + applicationYml = rYAML(typ="safe").load(f) + + if applicationYml.get("application") is None: + applicationYml["application"] = {} + applicationYml["application"]["version"] = self.packageVersion() + applicationYml["environment"] = f"{package_name}-user" + + # convert the dict back to a yaml string + applicationYmlStr = yaml.dump(applicationYml, default_flow_style=False) + + # write the application.yml to the user home as -user.yml + with open(userHome / f"{package_name}-user.yml", "w") as f: + f.write(applicationYmlStr) + + def getCurrentEnv(self) -> str: + if self.env is not None: + return self.env + else: + # this is the default environment + return "default" + + def refresh(self, env_name: str, clearPrevious: bool = False) -> None: + """Load and refresh configuration from environment files.""" + # save a copy of previous config if it fails to load + prevConfig = copy.deepcopy(self._config) + + try: + if clearPrevious: + self._config.clear() + + if env_name.endswith(".yml"): + # name to be put into config + new_env_name = env_name + + # this is a filename that should be loaded + filepath = Path(env_name) + if filepath.exists(): + self._logger.debug(f"Loading config from {filepath.absolute()}") + with open(filepath, "r") as file: + envConfig = rYAML(typ="safe").load(file) + else: + # load from the resource + with Resource.open(env_name, "r") as file: + envConfig = rYAML(typ="safe").load(file) + new_env_name = env_name.replace(".yml", "") + # update the configuration with the new environment + self._config = merge_dicts(self._config, envConfig) + + # add the name to the config object if it wasn't specified + if "environment" not in envConfig: + self._config["environment"] = new_env_name + + # do fixups on items that are directories + self._fix_directory_properties() + else: + # recurse this function with a fuller name + self.refresh(f"{env_name}.yml", clearPrevious) + except Exception: + # if it fails, restore the previous config + self._logger.warning(f"Failed to load {env_name}.yml, restoring previous config") + self._config = prevConfig + raise + + def warnSensitiveProperties(self, watchedProperties: dict[str, Any]) -> None: + for key in watchedProperties: + msg = self._property_change_warnings[key] + if watchedProperties[key] != self[key]: + warningBar = ("/" * 20) + " WARNING " + ("/" * 20) + self._logger.warning(warningBar) + self._logger.warning(f"Property '{key}' was changed in {self.env}.yml") + self._logger.warning(msg) + self._logger.warning(warningBar) + + # method to regex for string pattern of ${key} and replace with value + def _replace(self, value: str, remainingKeys: list[str]) -> str: + # if the value is not a string, then just return it + if not isinstance(value, str): + return value + + # Regex all keys of the form ${key.subkey} and store in a list + regex = r"\$\{([a-zA-Z0-9_\.]+)\}" + matches = [match for match in re.finditer(regex, value, re.MULTILINE)] + # replace all keys with their values + if len(remainingKeys) == 0: + for match in matches: + key = match.group()[2:-1] + if isinstance(self[key], dict): + return value + value = value.replace(f"${{{key}}}", self[key]) + else: + match = matches[0] + rootKey = match.group()[2:-1] + key = rootKey + val = self[key] + + # while val is a dict, keep appending keys + while isinstance(val, dict): + key = key + f".{remainingKeys.pop(0)}" + val = self[key] + + value = value.replace(f"${{{rootKey}}}", val) + # if(len(remainingKeys) > 0): + value = self._replace(value, remainingKeys) + + return value + + def exists(self, key: str) -> bool: + val = self._find(key) + return val is not None + + def _find(self, key: str) -> Any: + keys = key.split(".") + val = self._config.get(keys[0]) + totalProcessed = 0 + for k in keys[1:]: + if val is None: + break + if isinstance(val, str): + break + totalProcessed += 1 + val = val.get(k) + + if val is not None: + val = self._replace(val, keys[1 + totalProcessed :]) + return val + + # period delimited key lookup + def __getitem__(self, key: str) -> Any: + """Lookup config value via . delimited key.""" + val = self._find(key) + if val is None: + raise KeyError(f"Key '{key}' not found in configuration") + if isinstance(val, dict): + # we need to solve the keys present in dict members + # we can accomplish this by recursively calling __getitem__ + return {k: self[f"{key}.{k}"] for k in val} + return val + + def validate(self) -> None: + """Validate for conflicting property values.""" + pass + + +Config = _Config() diff --git a/src/commons/decorators/__init__.py b/src/commons/decorators/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/commons/decorators/singleton.py b/src/commons/decorators/singleton.py new file mode 100644 index 0000000..aa82b2d --- /dev/null +++ b/src/commons/decorators/singleton.py @@ -0,0 +1,77 @@ +"""Singleton Module.""" + +from functools import wraps +from typing import Any, List + +_Singleton_instances: List[type] = [] + + +def Singleton(orig_cls) -> Any: # noqa: ANN001 + """Make an annotated class instantiate as a Singleton.""" + orig_new = orig_cls.__new__ + orig_init = orig_cls.__init__ + instance = None + initialized = False + + @wraps(orig_cls.__init__) + def __init__(self, *args, **kwargs) -> None: # noqa: ANN001, ANN002, ANN003 + nonlocal initialized + if initialized: + return + initialized = True + orig_init(self, *args, **kwargs) + + @wraps(orig_cls.__new__) + def __new__(cls, *args, **kwargs) -> Any: # noqa: ARG001, ANN001, ANN002, ANN003 + nonlocal instance + if instance is None: + # this needs to work with object.__new__, which only has only the `cls` arg + instance = orig_new(cls) # , *args, **kwargs) + return instance + + def _reset_Singleton(*, fully_unwrap: bool = False) -> None: + # Reset the Singleton: + # + # * The `@Singleton` decorator is applied at time of import. + # * This method does not _reinitialize_ any existing class instances; + # it just ensures that the next time the `__init__` is called it will + # initialize a new instance. + # * If `fully_unwrap` is set, it is equivalent to removing the `@Singleton` decorator from the class. + # + # This method is provided for use by `pytest` fixtures, + # as an alternative to mocking out the `Singleton` entirely. + # + nonlocal instance + nonlocal initialized + instance = None + initialized = False + + if fully_unwrap: + # this should be equivalent to mocking out the decorator + orig_cls.__new__ = orig_cls.__new__.__wrapped__ + orig_cls.__init__ = orig_cls.__init__.__wrapped__ + + orig_cls.__new__ = __new__ + orig_cls.__init__ = __init__ + + orig_cls._reset_Singleton = _reset_Singleton + global _Singleton_instances + _Singleton_instances.append(orig_cls) + + return orig_cls + + +def reset_Singletons(*, fully_unwrap: bool = False) -> None: + """Reset all singleton objects.""" + # Implementation notes: + # + # * The `@Singleton` decorator is applied at time of import. + # * This module-scope method does not _reinitialize_ any existing class instances; + # it just ensures that the next time the `__init__`[s] are called they will + # initialize new instances. + # * If `fully_unwrap` is set, it is equivalent to removing the `@Singleton` decorator from all of the classes; + # and, if that approach is taken, it's only necessary to apply this method at `scope="session"`. + # + global _Singleton_instances + for cls in _Singleton_instances: + cls._reset_Singleton(fully_unwrap=fully_unwrap) diff --git a/src/commons/resources/application.yml b/src/commons/resources/application.yml new file mode 100644 index 0000000..6c2aa02 --- /dev/null +++ b/src/commons/resources/application.yml @@ -0,0 +1,8 @@ +env: test + +some: + nested: + value: 42 + +templated: + value: ${some.nested.value} is the answer to the Ultimate Question of Life, The Universe, and Everything. \ No newline at end of file diff --git a/src/commons/time.py b/src/commons/time.py new file mode 100644 index 0000000..e24041f --- /dev/null +++ b/src/commons/time.py @@ -0,0 +1,40 @@ +"""Time utility module.""" + +import time + +import numpy as np + + +def timestamp(ensureUnique: bool = False) -> float: + """Generate a timestamp in seconds.""" + # no args in astimezone() means local timezone + nextTimestamp = time.time_ns() / 1e9 # convert to seconds + if ensureUnique: + _previousTimestamp = getattr(timestamp, "_previousTimestamp", None) + if _previousTimestamp is not None: + # compare as `time.struct_time` to ensure uniqueness after formatting + if nextTimestamp < _previousTimestamp or time.gmtime(nextTimestamp) == time.gmtime(_previousTimestamp): + nextTimestamp = _previousTimestamp + 1.0 + timestamp._previousTimestamp = nextTimestamp + return nextTimestamp + + +def parseTimestamp(ts: float | str | int) -> float: + """Parse timestamp from expected formats.""" + if isinstance(ts, str): + # Convert ISO format string to timestamp + return np.datetime64(ts).astype(int) / 1e9 # convert to seconds + if isinstance(ts, int): + # DEPRECIATED: support legacy integer encoding + return float(ts) / 1000.0 + if not isinstance(ts, float): + raise ValueError("Timestamp must be a float, int, or ISO format string") + return float(ts) + + +def isoFromTimestamp(ts: float) -> str: + """Convert float timestamp (seconds) to integer nanoseconds.""" + ts_ns = int(ts * 1e9) + npDatetime = np.datetime64(ts_ns, "ns") + iso = np.datetime_as_string(npDatetime, timezone="local", unit="ns") + return iso diff --git a/src/packagenamepy/__init__.py b/src/packagenamepy/__init__.py deleted file mode 100644 index 96e1d74..0000000 --- a/src/packagenamepy/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Contains the entry point for the application""" - -try: - from ._version import __version__ # noqa: F401 -except ImportError: - __version__ = "unknown" - - -def PackageName(): # noqa N802 - """This is needed for backward compatibility because mantid workbench does "from shiver import Shiver" """ - from .packagenamepy import PackageName as packagename # noqa N813 - - return packagename() diff --git a/src/packagenamepy/configuration.py b/src/packagenamepy/configuration.py deleted file mode 100644 index 2231ab6..0000000 --- a/src/packagenamepy/configuration.py +++ /dev/null @@ -1,105 +0,0 @@ -"""Module to load the the settings from SHOME/.packagename/configuration.ini file - -Will fall back to a default -""" - -import os -import shutil -from configparser import ConfigParser -from pathlib import Path - -from mantid.kernel import Logger - -logger = Logger("PACKAGENAME") - -# configuration settings file path -CONFIG_PATH_FILE = os.path.join(Path.home(), ".packagename", "configuration.ini") - - -class Configuration: - """Load and validate Configuration Data""" - - def __init__(self): - """Initialization of configuration mechanism""" - # capture the current state - self.valid = False - - # locate the template configuration file - project_directory = Path(__file__).resolve().parent - self.template_file_path = os.path.join(project_directory, "configuration_template.ini") - - # retrieve the file path of the file - self.config_file_path = CONFIG_PATH_FILE - logger.information(f"{self.config_file_path} will be used") - - # if template conf file path exists - if os.path.exists(self.template_file_path): - # file does not exist create it from template - if not os.path.exists(self.config_file_path): - # if directory structure does not exist create it - if not os.path.exists(os.path.dirname(self.config_file_path)): - os.makedirs(os.path.dirname(self.config_file_path)) - shutil.copy2(self.template_file_path, self.config_file_path) - - self.config = ConfigParser(allow_no_value=True, comment_prefixes="/") - # parse the file - try: - self.config.read(self.config_file_path) - # validate the file has the all the latest variables - self.validate() - except ValueError as err: - logger.error(str(err)) - logger.error(f"Problem with the file: {self.config_file_path}") - else: - logger.error(f"Template configuration file: {self.template_file_path} is missing!") - - def validate(self): - """Validates that the fields exist at the config_file_path and writes any missing fields/data - using the template configuration file: configuration_template.ini as a guide - """ - template_config = ConfigParser(allow_no_value=True, comment_prefixes="/") - template_config.read(self.template_file_path) - for section in template_config.sections(): - # if section is missing - if section not in self.config.sections(): - # copy the whole section - self.config.add_section(section) - - for item in template_config.items(section): - field, _ = item - if field not in self.config[section]: - # copy the field - self.config[section][field] = template_config[section][field] - with open(self.config_file_path, "w", encoding="utf8") as config_file: - self.config.write(config_file) - self.valid = True - - def is_valid(self): - """Returns the configuration state""" - return self.valid - - -def get_data(section, name=None): - """Retrieves the configuration data for a variable with name""" - # default file path location - config_file_path = CONFIG_PATH_FILE - if os.path.exists(config_file_path): - config = ConfigParser() - # parse the file - config.read(config_file_path) - try: - if name: - value = config[section][name] - # in case of boolean string value cast it to bool - if value in ("True", "False"): - return value == "True" - # in case of None - if value == "None": - return None - return value - return config[section] - except KeyError as err: - # requested section/field do not exist - logger.error(str(err)) - return None - return None diff --git a/src/packagenamepy/configuration_template.ini b/src/packagenamepy/configuration_template.ini deleted file mode 100644 index c8ea100..0000000 --- a/src/packagenamepy/configuration_template.ini +++ /dev/null @@ -1,2 +0,0 @@ -[global.other] -help_url = https://github.com/neutrons/python_project_template/blob/main/README.md diff --git a/src/packagenamepy/help/help_model.py b/src/packagenamepy/help/help_model.py deleted file mode 100644 index 636472d..0000000 --- a/src/packagenamepy/help/help_model.py +++ /dev/null @@ -1,12 +0,0 @@ -"""single help module""" - -import webbrowser - -from packagenamepy.configuration import get_data - - -def help_function(context): - """Open a browser with the appropriate help page""" - help_url = get_data("global.other", "help_url") - if context: - webbrowser.open(help_url) diff --git a/src/packagenamepy/home/home_model.py b/src/packagenamepy/home/home_model.py deleted file mode 100644 index e574925..0000000 --- a/src/packagenamepy/home/home_model.py +++ /dev/null @@ -1,12 +0,0 @@ -"""Model for the Main tab""" - -from mantid.kernel import Logger - -logger = Logger("PACKAGENAME") - - -class HomeModel: # pylint: disable=too-many-public-methods - """Main model""" - - def __init__(self): - return diff --git a/src/packagenamepy/home/home_presenter.py b/src/packagenamepy/home/home_presenter.py deleted file mode 100644 index 1b55b34..0000000 --- a/src/packagenamepy/home/home_presenter.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Presenter for the Main tab""" - - -class HomePresenter: # pylint: disable=too-many-public-methods - """Main presenter""" - - def __init__(self, view, model): - self._view = view - self._model = model - - @property - def view(self): - """Return the view for this presenter""" - return self._view - - @property - def model(self): - """Return the model for this presenter""" - return self._model diff --git a/src/packagenamepy/home/home_view.py b/src/packagenamepy/home/home_view.py deleted file mode 100644 index 61a8e71..0000000 --- a/src/packagenamepy/home/home_view.py +++ /dev/null @@ -1,13 +0,0 @@ -"""PyQt widget for the main tab""" - -from qtpy.QtWidgets import QHBoxLayout, QWidget - - -class Home(QWidget): # pylint: disable=too-many-public-methods - """Main widget""" - - def __init__(self, parent=None): - super().__init__(parent) - - layout = QHBoxLayout() - self.setLayout(layout) diff --git a/src/packagenamepy/mainwindow.py b/src/packagenamepy/mainwindow.py deleted file mode 100644 index 16c8aec..0000000 --- a/src/packagenamepy/mainwindow.py +++ /dev/null @@ -1,54 +0,0 @@ -"""Main Qt window""" - -from qtpy.QtWidgets import QHBoxLayout, QPushButton, QTabWidget, QVBoxLayout, QWidget - -from packagenamepy.help.help_model import help_function -from packagenamepy.home.home_model import HomeModel -from packagenamepy.home.home_presenter import HomePresenter -from packagenamepy.home.home_view import Home - - -class MainWindow(QWidget): - """Main widget""" - - def __init__(self, parent=None): - super().__init__(parent) - - ### Create tabs here ### - - ### Main tab - self.tabs = QTabWidget() - home = Home(self) - home_model = HomeModel() - self.home_presenter = HomePresenter(home, home_model) - self.tabs.addTab(home, "Home") - - ### Set tab layout - layout = QVBoxLayout() - layout.addWidget(self.tabs) - - ### Create bottom interface here ### - - # Help button - help_button = QPushButton("Help") - help_button.clicked.connect(self.handle_help) - - # Set bottom interface layout - hor_layout = QHBoxLayout() - hor_layout.addWidget(help_button) - - layout.addLayout(hor_layout) - - self.setLayout(layout) - - # register child widgets to make testing easier - self.home = home - - def handle_help(self): - """Get current tab type and open the corresponding help page""" - open_tab = self.tabs.currentWidget() - if isinstance(open_tab, Home): - context = "home" - else: - context = "" - help_function(context=context) diff --git a/src/packagenamepy/packagename.py b/src/packagenamepy/packagename.py deleted file mode 100644 index 15db777..0000000 --- a/src/packagenamepy/packagename.py +++ /dev/null @@ -1,62 +0,0 @@ -"""Main Qt application""" - -import sys - -from mantid.kernel import Logger -from mantidqt.gui_helper import set_matplotlib_backend -from qtpy.QtWidgets import QApplication, QMainWindow - -# make sure matplotlib is correctly set before we import shiver -set_matplotlib_backend() - -# make sure the algorithms have been loaded so they are available to the AlgorithmManager -import mantid.simpleapi # noqa: F401, E402 pylint: disable=unused-import, wrong-import-position - -from packagenamepy import __version__ # noqa: E402 pylint: disable=wrong-import-position -from packagenamepy.configuration import Configuration # noqa: E402 pylint: disable=wrong-import-position -from packagenamepy.mainwindow import MainWindow # noqa: E402 pylint: disable=wrong-import-position - -logger = Logger("PACKAGENAME") - - -class PackageName(QMainWindow): - """Main Package window""" - - __instance = None - - def __new__(cls): - if PackageName.__instance is None: - PackageName.__instance = QMainWindow.__new__(cls) # pylint: disable=no-value-for-parameter - return PackageName.__instance - - def __init__(self, parent=None): - super().__init__(parent) - logger.information(f"PackageName version: {__version__}") - config = Configuration() - - if not config.is_valid(): - msg = ( - "Error with configuration settings!", - f"Check and update your file: {config.config_file_path}", - "with the latest settings found here:", - f"{config.template_file_path} and start the application again.", - ) - - print(" ".join(msg)) - sys.exit(-1) - self.setWindowTitle(f"PACKAGENAME - {__version__}") - self.main_window = MainWindow(self) - self.setCentralWidget(self.main_window) - - -def gui(): - """Main entry point for Qt application""" - input_flags = sys.argv[1::] - if "--v" in input_flags or "--version" in input_flags: - print(__version__) - sys.exit() - else: - app = QApplication(sys.argv) - window = PackageName() - window.show() - sys.exit(app.exec_()) diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..641fdd8 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,34 @@ + + +import os +import pytest + +import commons +from commons.decorators.singleton import reset_Singletons + +commons.init("commons") + +if not os.environ.get("env"): + os.environ["env"] = "test" + +@pytest.fixture(autouse=True) +def _reset_Singletons(request): + if not "integration" in request.keywords: + reset_Singletons() + yield + +@pytest.fixture(scope="class", autouse=True) +def _reset_class_scope_Singletons(request): + if not "integration" in request.keywords: + reset_Singletons() + yield + +@pytest.fixture(scope="module", autouse=True) +def _reset_module_scope_Singletons(request): + if not "integration" in request.keywords: + reset_Singletons() + yield + + + +from util.Config_helpers import Config_override_fixture \ No newline at end of file diff --git a/tests/resources/application.yml b/tests/resources/application.yml new file mode 100644 index 0000000..6e2e9e1 --- /dev/null +++ b/tests/resources/application.yml @@ -0,0 +1,16 @@ +env: test + +some: + nested: + value: 42 + +templated: + value: ${some.nested.value} is the answer to the Ultimate Question of Life, The Universe, and Everything. + +user: + application: + home: ~/.commons/ + +test: + multi-substitution: + home: ~/${user.application.home}/test \ No newline at end of file diff --git a/tests/resources/commons_next.yml b/tests/resources/commons_next.yml new file mode 100644 index 0000000..e3a887e --- /dev/null +++ b/tests/resources/commons_next.yml @@ -0,0 +1,3 @@ +# environment: dev + +deploy: next \ No newline at end of file diff --git a/tests/resources/outputs/empty.txt b/tests/resources/outputs/empty.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/resources/test.yml b/tests/resources/test.yml new file mode 100644 index 0000000..06e99b5 --- /dev/null +++ b/tests/resources/test.yml @@ -0,0 +1,3 @@ +some: + test: + value: 42 \ No newline at end of file diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 0000000..910d67a --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,381 @@ +import logging +import os +import shutil +import sys +from pathlib import Path +from tempfile import TemporaryDirectory + +## +## In order to preserve the normal import order as much as possible, +## place test-specific imports last. +## +from unittest import mock + +import pytest +from commons import Spec +from ruamel.yaml import YAML as rYaml + +import commons.config as Config_module +from commons.config import ( + Config, + DeployEnvEnum, + Resource, + _find_root_dir, +) + + +package_name = Spec.client_package_name + +def test_environment(): + assert Config["environment"] == "test" + + +def test_find_root_dir_test_env(): + # Test that a test environment's `MODULE_ROOT` is set to the `tests` directory. + assert _find_root_dir().endswith("/tests") + + +def test_version_default(): + # Test that Config["version.default"] is implicitly set + assert isinstance(Config["version.default"], int) + + +@mock.patch.dict(os.environ, values={"env": "dev"}, clear=True) +def test_find_root_dir_non_test_env(): + # Test that a non-test environment's `MODULE_ROOT` is set to the package_name module directory + assert Path(_find_root_dir()) == Path(sys.modules[package_name].__file__).parent + + +@mock.patch.dict(os.environ, values={"env": "dev_test"}, clear=True) +def test_find_root_dir_special_test_env(): + # Test that a special test environment's (any "env" with "test" in the name) + # `MODULE_ROOT` is set to the `tests` directory. + assert _find_root_dir().endswith("/tests") + + +@mock.patch.dict(os.environ, values={"env": "dev"}, clear=True) +@mock.patch.dict(sys.modules, clear=True) +def test_find_root_dir_failure(): + # Test that not being able to define the `MODULE_ROOT` raises an exception. + with pytest.raises(Exception, match="Unable to determine commons module-root directory"): + _find_root_dir() + +def test_resource_packageMode(caplog): + # Test that "package mode" is recognized appropriately. + + # TODO: At present, 'Config' has a _redundant_ '@Singleton' => It is also initialized + # explicitly as a singleton. This needs to be fixed! + + ROOT_MODULE = Path(sys.modules[package_name].__file__).parent + ymlPath = ROOT_MODULE / "resources" / "application.yml" + + # In the below, we need to trigger a fresh import for the 'Config' module. + # AND, we need an absolute path for an "application.yml" which is _outside_ of "package_name/resources". + with ( + mock.patch.dict(os.environ), + mock.patch.dict(sys.modules), + TemporaryDirectory() as tmpdir, + ): + # An absolute path for "application.yml" _outside_ of "package_name/resources". + nonModuleEnvPath = Path(tmpdir) / "application.yml" + shutil.copy2(ymlPath, nonModuleEnvPath) + os.environ["env"] = str(nonModuleEnvPath) + + # Trigger a fresh import for the "Config" module. + del sys.modules[f"{package_name}.config"] + from commons.config import _Resource + + # `@Singleton` is now active for tests: + # we need to reset it, so that we can recreate the class. + # In this case, we need to fully remove the decorator, so that the original `__init__` will be called. + # Otherwise, the applied mocks will have no effect during the initialization. + _Resource._reset_Singleton(fully_unwrap=True) + + with ( + mock.patch.object(_Resource, "_existsInPackage") as mockExistsInPackage, + caplog.at_level(logging.DEBUG, logger=f"{package_name}.config.Resource"), + ): + # This mock bypasses the fact that "application.yml" actually does exist + # under "package_name/resources". Probably there's a better way to do this! + mockExistsInPackage.return_value = False + rs = _Resource() + assert rs._package_mode + assert "In package mode" in caplog.text + + +def test_resource_not_packageMode(caplog): + # Test that a test env is recognized as non-"package mode". + + with mock.patch.dict(sys.modules): + # Trigger a fresh import for the "Config" module. + del sys.modules[f"{package_name}.config"] + with caplog.at_level(logging.DEBUG, logger=f"{package_name}.config.Resource"): + from commons.config import _Resource + + rs = _Resource() + assert not rs._package_mode + assert "Not in package mode" in caplog.text + + +def test_resource_packageMode_exists(): + # Test that the "exists" method in package mode implements functionality. + + ROOT_MODULE = Path(sys.modules[package_name].__file__).parent + ymlPath = ROOT_MODULE / "resources" / "application.yml" + + # In the below, we need to trigger a fresh import for the 'Config' module. + # AND, we need an absolute path for an "application.yml" which is _outside_ of "package_name/resources". + with ( + mock.patch.dict(os.environ), + mock.patch.dict(sys.modules), + TemporaryDirectory() as tmpdir, + ): + # An absolute path for "application.yml" _outside_ of "package_name/resources". + nonModuleEnvPath = Path(tmpdir) / "application.yml" + shutil.copy2(ymlPath, nonModuleEnvPath) + os.environ["env"] = str(nonModuleEnvPath) + + # Trigger a fresh import for the "Config" module. + del sys.modules[f"{package_name}.config"] + from commons.config import _Resource + + # `@Singleton` is now active for tests: + # we need to reset it, so that we can recreate the class. + # In this case, we need to fully remove the decorator, so that the original `__init__` will be called. + # Otherwise, the applied mocks will have no effect during the initialization. + _Resource._reset_Singleton(fully_unwrap=True) + + with ( + mock.patch.object(_Resource, "_existsInPackage") as mockExistsInPackage, + ): + # This mock bypasses the fact that "application.yml" actually does exist + # under "package_name/resources". Probably there's a better way to do this! + mockExistsInPackage.return_value = False + rs = _Resource() + assert rs._package_mode + test_path = "any/path" + rs.exists(test_path) + mockExistsInPackage.assert_called_with(test_path) + + +def test_resource_exists(): + with mock.patch.object(Resource, "_existsInPackage") as mockExistsInPackage: + assert Resource.exists("application.yml") + mockExistsInPackage.assert_not_called() + + +def test_resource_exists_false(): + assert not Resource.exists("not_a_real_file.yml") + + +def test_resource_read(): + assert Resource.read("application.yml") is not None + + +def test_resource_open(): + with mock.patch.object(Config_module.resources, "path") as mockResourcesPath: + assert not Resource._package_mode + with Resource.open("application.yml", "r") as file: + assert file is not None + mockResourcesPath.assert_not_called() + + +def test_resource_packageMode_open(): + actual_path = Resource.getPath("application.yml") + with ( + mock.patch.object(Config_module.resources, "path") as mockResourcesPath, + mock.patch.object(Resource, "_package_mode") as mockPackageMode, + ): + mockResourcesPath.return_value = mock.Mock( + __enter__=mock.Mock(return_value=actual_path), + __exit__=mock.Mock(), + ) + mockPackageMode.return_value = True + test_path = "application.yml" + with Resource.open(test_path, "r") as file: + assert file is not None + mockResourcesPath.assert_called_once_with(f"{package_name}.resources", test_path) + + +def test_Config_persistBackup(): + # mock Path.home() to temporary directory + with TemporaryDirectory() as tmpdir: + with mock.patch.object(Config_module._Config, "_userHome", lambda _ :Path(tmpdir) / f".{package_name}"): + inst = Config_module._Config() + # remove the application.yml.bak file if it exists + if (Path(tmpdir) / f".{package_name}" / "application.yml.bak").exists(): + os.remove(Path(tmpdir) / f".{package_name}" / "application.yml.bak") + os.rmdir(Path(tmpdir) / f".{package_name}") + + assert not (Path(tmpdir) / f".{package_name}").exists() + # call the persistBackup method + inst.persistBackup() + assert (Path(tmpdir) / f".{package_name}").exists() + assert (Path(tmpdir) / f".{package_name}" / "application.yml.bak").exists() + + +def test_Config_accessor(): + # these values are copied from tests/resources/application.yml + assert Config["environment"] == "test" + + # these should throw KeyError + with pytest.raises(KeyError): + assert Config["garbage"] + with pytest.raises(KeyError): + assert Config["orchestration.garbage"] + + +def test_key_substitution(): + testString = "This is a test string with a ${test.key} in it" + Config._config["test"]["key"] = "value" + Config._config["test"]["substitution"] = testString + assert Config["test.substitution"] == "This is a test string with a value in it" + + +def test_multi_level_substitution(): + assert Config["test.multi-substitution.home"] == f"~/{Config['user.application.home']}/test" + + +def test_packageVersion(): + with mock.patch.object(Config_module, "app_version", ""): + assert len(Config.packageVersion()) == len("b2e9c58bd94d0c95cdfa81cb845deb7c636047db") + + +def test_packageVersion_empty(): + with ( + mock.patch.dict("sys.modules", {package_name: mock.Mock(__version__="unknown")}), + mock.patch.object(Config_module, "subprocess") as mockSubprocess, + mock.patch.object(Config_module, "app_version", ""), + ): + mockSubprocess.check_output.return_value = b"" + with pytest.raises(ValueError, match="The commons Version is not set correctly."): + Config.packageVersion() + + + +def test_getCurrentEnv(): + # Test that the current environment is returned correctly + assert Config.getCurrentEnv() == "test" + + +def test_swapToUserYml(): + # setup temp dir + with TemporaryDirectory(prefix=Resource.getPath("outputs/")) as tmpPath: + # mock out path's home method + with mock.patch(f"{package_name}.config.Path.home") as mockHome: + Config.packageVersion = lambda: "1.0.0" + mockHome.return_value = Path(tmpPath) + Config.swapToUserYml() + # check that the file exists + assert Path(tmpPath).exists() + assert (Path(tmpPath) / f".{package_name}").exists() + assert (Path(tmpPath) / f".{package_name}" / f"{package_name}-user.yml").exists() + + assert f"{package_name}-user" in Config["environment"] + + with open(Path(tmpPath) / f".{package_name}"/ f"{package_name}-user.yml", "r") as file: + yml = rYaml(typ="safe").load(file) + assert yml["application"]["version"] == "1.0.0" + + +def test_shouldSwapToUserYml(): + # Test that the method returns True when the user configuration file exists and is not in a test environment + with mock.patch.object(Config, "_userHome") as mockHome, mock.patch.dict(os.environ, values={}, clear=True): + with TemporaryDirectory() as tmpDir: + mockHome.return_value = Path(f"{tmpDir}/{package_name}") + mockHome.return_value.mkdir(exist_ok=True) + (mockHome.return_value / f"{package_name}-user.yml").touch() + assert "env" not in os.environ + assert Config.shouldSwapToUserYml() + + # Test that the method returns False when the user configuration file does not exist + with mock.patch.object(Config, "_userHome") as mockHome: + mockHome.return_value = Path(f"/tmp/{package_name}") + assert not Config.shouldSwapToUserYml() + + # Test that the method returns False when the environment variable 'env' is set + with mock.patch.object(Config, "_userHome") as mockHome, mock.patch.dict(os.environ, {"env": "test"}): + with TemporaryDirectory() as tmpDir: + mockHome.return_value = Path(f"{tmpDir}/{package_name}") + mockHome.return_value.mkdir(exist_ok=True) + (mockHome.return_value / f"{package_name}-user.yml").touch() + + assert not Config.shouldSwapToUserYml() + + +def test_swapToUserYml_error(): + # setup temp dir + with mock.patch.object(Config, "_userHome") as mockHome: + mockHome().exists.side_effect = RuntimeError("the file system messed up!!!") + with pytest.raises(RuntimeError, match="Unable to swap to user configuration"): + Config.swapToUserYml() + + +def test_swapToUserYml_archive(): + # setup temp dir + with TemporaryDirectory(prefix=Resource.getPath("outputs/")) as tmpPath: + # mock out path's home method + with ( + mock.patch(f"{package_name}.config.Path.home") as mockHome, + mock.patch.object(Config, "_timestamp") as mockTimeStamp, + ): + dateTime = "2023-10-01 12:00:00" + mockTimeStamp.return_value = dateTime + Config.packageVersion = lambda: "1.0.0" + mockHome.return_value = Path(tmpPath) + Config.swapToUserYml() + # check that the file exists + assert Path(tmpPath).exists() + assert (Path(tmpPath) / f".{package_name}").exists() + assert (Path(tmpPath) / f".{package_name}" / f"{package_name}-user.yml").exists() + + assert f"{package_name}-user" in Config["environment"] + Config.packageVersion = lambda: "1.0.8" + Config.swapToUserYml() + with open(Path(tmpPath) / f".{package_name}" / f"{package_name}-user.yml", "r") as file: + yml = rYaml(typ="safe").load(file) + assert yml["application"]["version"] == "1.0.8" + assert (Path(tmpPath) / f".{package_name}" / f"{package_name}-user.yml").exists() + assert (Path(tmpPath) / f".{package_name}" / f"{package_name}-user-1.0.0-{dateTime}.yml.bak").exists(), os.listdir( + Path(tmpPath) / f".{package_name}" + ) + + +def test_configureForDeploy(): + # copy application.yml to a temporary directory + with TemporaryDirectory() as tmpPath: + applicationYmlPath: Path = Path(Resource.getPath("application.yml")) + nextApplicationYmlPath = applicationYmlPath.parent / f"{package_name}_next.yml" + (Path(tmpPath) / "application.yml").write_bytes(applicationYmlPath.read_bytes()) + (Path(tmpPath) / f"{package_name}_next.yml").write_bytes(nextApplicationYmlPath.read_bytes()) + with ( + mock.patch.object(Resource, "_resources_path", Path(tmpPath)), + mock.patch.object(Config, f"packageVersion", mock.Mock(return_value="dev")), + # Dont want to overrite the config for the rest of the tests + mock.patch.object(Config, "_config", {}), + ): + Config.configureForDeploy() + # check that the file exists + assert (Path(tmpPath) / "application.yml").exists() + # check that the file is not empty + assert (Path(tmpPath) / "application.yml").stat().st_size > 0 + # check that the file is a valid yaml file + with open(Path(tmpPath) / "application.yml", "r") as file: + yml = rYaml(typ="safe").load(file) + assert "next" in yml["deploy"] + + +def test_configureForDeploy_qa_or_prod(): + with ( + mock.patch.object(Config, "packageVersion", mock.Mock(return_value="1.0.0")) as mockVersion, + mock.patch.object(Config, "mergeAndExport", mock.Mock()) as mockMergeExport, + ): + Config.configureForDeploy() + mockVersion.assert_called_once() + mockMergeExport.assert_called_once_with(DeployEnvEnum.PROD) + mockVersion.reset_mock() + mockMergeExport.reset_mock() + mockVersion.return_value = "1.0.1rc2" + Config.configureForDeploy() + mockVersion.assert_called_once() + mockMergeExport.assert_called_once_with(DeployEnvEnum.QA) \ No newline at end of file diff --git a/tests/test_version.py b/tests/test_version.py index 6a0bf51..58192c8 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -1,4 +1,4 @@ -from packagenamepy import __version__ +from commons import __version__ def test_version(): diff --git a/tests/util/Config_helpers.py b/tests/util/Config_helpers.py new file mode 100644 index 0000000..5d2fd18 --- /dev/null +++ b/tests/util/Config_helpers.py @@ -0,0 +1,64 @@ +from collections import namedtuple +from contextlib import ExitStack, contextmanager +from typing import Any, Dict, Tuple + +import pytest + +from commons.config import Config + +Node = namedtuple("Node", "dict key") + +# Implementation notes: +# * In order to allow convenient usage within CIS-test scripts, +# `Config_override` is deliberately _not_ implemented as a test fixture. +# * Multi-level substitution is not implemented: in general this can _effectively_ result in a +# period-delimited key corresponding to values from _multiple_ `Config` nodes. +# It's assumed that this does not pose much limitation, and that it should be possible +# to accomplish any required "override" usage with (possibly multiple) single-node subsitutions. + + +@contextmanager +def Config_override(key: str, value: Any): + # Context manager to safely override a `Config` entry: + # * `__enter__` returns the `Config` instance. + + # Find the _primary_ node associated with a period-delimited key. + def lookupNode(dict_: Dict[str, Any], key: str) -> Tuple[Dict[str, Any], str]: + # key_1.key_2. ... key_(n-1) lookup + ks = key.split(".") + val = dict_ + for k in ks[0:-1]: + val = val.get(k) + if not isinstance(val, dict): + # Anything else may not correspond to a _single_ `Config` node + raise RuntimeError( + f"not implemented: probable multilevel substitution with key: '{key}' for value: {value}" + ) + + return Node(val, ks[-1]) + + # __enter__ + # test failing with exepction will pollute other tests with this config change if not caught up the stack + try: + _savedNode: Tuple[Dict[str, Any], str] = lookupNode(Config._config, key) + _savedValue: Any = _savedNode.dict[_savedNode.key] + _savedNode.dict[_savedNode.key] = value + yield Config + finally: + # __exit__ + del _savedNode.dict[_savedNode.key] + if _savedValue is not None: + _savedNode.dict[_savedNode.key] = _savedValue + + +@pytest.fixture +def Config_override_fixture(): + _stack = ExitStack() + + def _Config_override_fixture(key: str, value: Any): + return _stack.enter_context(Config_override(key, value)) + + yield _Config_override_fixture + + # teardown => __exit__ + _stack.close() \ No newline at end of file From 57e57fc1651632fb2b2b99fbc3b67ac5093a345f Mon Sep 17 00:00:00 2001 From: Michael Walsh <68125095+walshmm@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:34:39 -0500 Subject: [PATCH 2/2] updated the readme (#2) * updated the readme * fix formatting * more doc fixing --- README.md | 441 +++++++++------------------------------------ docs/config.rst | 4 +- docs/singleton.rst | 4 +- docs/time.rst | 4 +- 4 files changed, 89 insertions(+), 364 deletions(-) diff --git a/README.md b/README.md index e70f5ff..2991196 100644 --- a/README.md +++ b/README.md @@ -1,416 +1,141 @@ -# Python Project Template (examplepyapp) +# PythonCommons -This repository contains a modern Python project managed entirely with [Pixi](https://pixi.sh/), a reproducible and declarative environment manager. -All build and packaging metadata is consolidated in a single `pyproject.toml` file, following modern Python packaging standards. +Common software utilities and architecture tools for neutrons Python projects. This repository provides only reusable infrastructure components. -## Getting Started +## Purpose -This project uses [Pixi](https://pixi.sh/) as the single tool for managing environments, dependencies, packaging, and task execution. +This package centralizes cross-cutting architectural concerns that are useful across multiple neutrons projects: -### 1. Install Pixi +- **Configuration Management** (`config.py`) - YAML-based configuration with environment layering and token substitution +- **Singleton Pattern** (`singleton.py`) - Decorator for enforcing single-instance patterns +- **Time Utilities** (`time.py`) - High-precision timestamp generation and parsing +- Other infrastructure utilities and design patterns -Follow the installation instructions from the [Pixi website](https://pixi.sh/), or use: +Domain-specific scientific utilities should be implemented in project-specific repositories, not here. + +## Quick Start + +### Install Pixi ```bash curl -fsSL https://pixi.sh/install.sh | bash ``` -### 2. Set Up the Environment - -Run the following command to create and activate the project environment with all dependencies: +### Set Up Environment ```bash pixi install ``` -### 3. Explore Available Tasks - -Use the following command to list all project-defined tasks: +### Run Tests ```bash -pixi run +pixi run test ``` -Example tasks: +## Using This Package -- `build-pypi`: build the PyPI wheel -- `build-conda`: build the Conda package -- `test`: run the test suite -- `conda-publish`, `pypi-publish`: publish the built artifacts -- `clean-*`: clean build artifacts +Add `PythonCommons` as a dependency to your project: -### 4. Development Workflow - -Activate the Pixi environment: - -```bash -pixi shell +```toml +# In your pyproject.toml +dependencies = [ + "PythonCommons @ git+https://github.com/neutrons/PythonCommons.git", +] ``` -Then, for development: - -- Run tests: `pixi run test` -- Run linting: `ruff check .` -- Perform editable install: `pip install --no-deps -e .` - -This ensures your environment remains clean and all tasks are reproducible. - -## Project Overview - -- 📦 **Unified packaging** for both PyPI and Conda via [`pixi build`](https://prefix.dev/docs/pixi/pixi-build/) -- 🐍 **Python 3.11+** compatibility -- ⚙️ **Versioning** handled by [`versioningit`](https://github.com/jwodder/versioningit), derived from Git tags -- 🧪 **Testing** with `pytest` and code coverage reporting -- 🧼 **Linting & formatting** with [`ruff`](https://docs.astral.sh/ruff/) -- 🚀 **Task automation** via `pixi run` -- 🔁 Supports CLI and optional GUI through modular structure in `src/packagenamepy/` - -## Codebase Adjustments - -1. Adjust the branch protection rules for the new repo. By default, we should protect the `main` (stable), `qa` (release candidate), and `next` (development) branches. - - 1.1 Go to the `Settings` tab of the new repo. - - 1.2 Click on `Branches` on the left side. - - 1.3 Click on `Add rule` button. - - 1.4 Follow the instructions from Github. - -1. Change the License if MIT license is not suitable for you project. For more information about licenses, please - refer to [Choose an open source license](https://choosealicense.com/). - -1. Adjust pre-commit configuration file, `.pre-commit-config.yaml` to enable/disable the hooks you need. For more information about pre-commit, please refer to [pre-commit](https://pre-commit.com/). - -1. Having code coverage, `codecov.yaml` is **strongly recommended**, please refer to [Code coverage](https://coverage.readthedocs.io/en/coverage-5.5/) for more information. - -1. Adjust the GitHub Actions workflows for CI/CD to align with Pixi-only packaging. For more information about GitHub Actions, please refer to [GitHub Actions](https://docs.github.com/en/actions). - - - Ensure that `.github/workflows/package.yaml` uses only `pixi run` commands for all build and publish steps. - - - Validate that the following Pixi tasks are correctly invoked: - - - `pixi run pypi-build` - - `pixi run pypi-publish` - - `pixi run conda-build` - - `pixi run conda-publish` - - - Remove or disable any steps using `conda-build`, `python setup.py`, or `pip install .`. - -1. The legacy `conda.recipe/meta.yaml` is no longer needed since Conda packaging is now handled via Pixi and `pyproject.toml`. - - - You may delete the `conda.recipe` folder entirely, unless it's still needed for backward compatibility with older workflows. - -1. Adjust `pyproject.toml` to match your project. For more information about `pyproject.toml`, - please refer to [pyproject.toml](https://www.python.org/dev/peps/pep-0518/). - - - Specify package name at: pyproject.toml#L5 - - - Specify package description at: pyproject.toml#L6 - - - Specify any terminal entry points (terminal commands) at: pyproject.toml#30. - -1. Adjust files for pixi - - - After updating your environment file, make sure to run `pixi install` and commit the updated lock file. - - - Specify package name at: pyproject.toml#L65 - - > In the example, invoking `packagename-cli` in a terminal is equivalent to running the python script `from packagenamepy.packagename import main; main()` - - - Projects will use a single `pyproject.toml` file to manage all the project metadata, including the project name, version, author, license, etc. - - - Python has moved away from `setup.cfg`/`setup.py`, and we would like to follow the trend for our new projects. - -1. Specify package name at src/packagenamepy - -1. Specify package name at: src/packagenamepy/packagename.py - -1. If a GUI isn't used, delete the MVP structure at src/packagenamepy: - - - mainwindow.py - - home/ - - help/ - -1. Clear the content of this file and add your own README.md as the project README file. - We recommend putting badges of the project status at the top of the README file. - For more information about badges, please refer to [shields.io](https://shields.io/). - -## Repository Adjustments - -### Add an access token to anaconda - -Here we assume your intent is to upload the conda package to the [anaconda.org/neutrons](https://anaconda.org/neutrons) organization. -An administrator of `anaconda.org/neutrons` must create an access token for your repository in the [access settings](https://anaconda.org/neutrons/settings/access). - -After created, the token must be stored in a `repository secret`: - -1. Navigate to the main page of the repository on GitHub.com. -1. Click on the "Settings" tab. -1. In the left sidebar, navigate to the "Security" section and select "Secrets and variables" followed by "Actions". -1. Click on the "New repository secret" button. -1. Enter `ANACONDA_TOKEN` for the secret name -1. Paste the Anaconda access token -1. Click on the "Add secret" button -1. Test the setup by creating a release candidate tag, - which will result in a package built and uploaded to `https://anaconda.org/neutrons/mypackagename` - -### Add an access token to codecov - -Follow the instructions in the [Confluence page](https://ornl-neutrons.atlassian.net/wiki/spaces/NDPD/pages/103546883/Coverage+reports) -to create the access token. +or -## Build & Publish Packages +```toml +[tool.pixi.workspace] +channels = [ + "neutrons", + "conda-forge", + "conda-forge", + "https://prefix.dev/pixi-build-backends", +] -Both PyPI and Conda packages are supported. All build and publishing steps are defined in Pixi tasks. +[tool.pixi.dependencies] +commons = "*" -Note that if your project is not being built and published to PyPI, you can safely modify the `pyproject.toml` -to remove any pixi tasks related to PyPI, and the `hatch` dependency. - -Similarly, if you are not publishing to conda, you can remove any related dependencies, configurations, and tasks. - -### Publish to PyPI - -1. Ensure you have access to the project on PyPI. -2. Clean working directory: `git status` should be clean. -3. Run the Pixi task to build the wheel: - - ```bash - pixi run pypi-build - ``` - -4. Check the wheel for issues manually: - - ```bash - twine check dist/* - ``` - -5. Upload to TestPyPI: - - ```bash - pixi run pypi-publish-test - ``` - - Ensure your `~/.pypirc` contains the correct token: - - ```ini - [distutils] - index-servers = pypi testpypi - - [testpypi] - repository = https://test.pypi.org/legacy/ - username = __token__ - password = YOUR_TESTPYPI_TOKEN - ``` - -6. Install from TestPyPI to verify: - - ```bash - pip install --index-url https://test.pypi.org/simple/ examplepyapp - ``` - -7. When ready, trigger the GitHub Action (`package.yaml`) to upload to PyPI. - -### Publish to Anaconda (Conda) - -1. Ensure the target channel is correct in `.github/workflows/package.yaml`. -2. Run the Pixi build: - - ```bash - pixi run conda-build - ``` - - This creates a `.conda` package in the project root. - -3. Publish using: - - ```bash - pixi run conda-publish - ``` - - Ensure the `ANACONDA_TOKEN` secret is configured in GitHub for CI/CD to work. - -## Development environment setup - -### Build development environment - -1. By default, we recommend using `pixi install` to set up the development environment. - This will create a virtual environment in the `.pixi` directory at the root of the repository. -1. If you prefer to use a detached environment, set the `detached-environments` option to `true` in `.pixi/config.toml`: - - ```bash - pixi config set detached-environments true - ``` - -1. If you want to keep your environment between sessions, add the following line to your `.bashrc` or `.bash_profile`: - - ```bash - export PIXI_CACHE_DIR="$HOME/.pixi/cache" - ``` - -1. After setting up the environment, you can activate it with: - - ```bash - pixi shell - ``` +[tool.pixi.package.run-dependencies] +commons = "*" +``` -1. If you are using VSCode as your IDE, we recommend to start code with `pixi run code .` to ensure the correct environment is inherited by the IDE. - Alternatively, you can specify the Python interpreter path using `Ctrl + Shift + P` and searching for "Python: Select Interpreter", - or manually editing the `.vscode/settings.json` file to set the Python interpreter path: +Then import utilities: - ```json - { - "python.pythonPath": ".pixi/venv/bin/python" - } - ``` +```python +from commons import Config +from commons.decorators.singleton import Singleton +from commons.time import timestamp, isoFromTimestamp +``` -### Auditing dependencies +See [`readthedocs`](https://pythoncommons.readthedocs.io/en/latest/) for detailed documentation on each module. -The tool [`pip-audit`](https://github.com/pypa/pip-audit) allows for checking dependencies for versions with known weaknesses or vulnerabilities as registered in [open source vulnerabilities database (osv)](https://osv.dev/). -This is provided as the task `audit-deps` which will verify that there are no known python dependencies in the pixi environment. +## Development -**Finding source of issue:** This is an outdated example used to demonstrate how to suppress vulnerabilities. -Assume that `pixi run audit-deps` returns a message that there is a issue [PYSEC-2025-61](https://osv.dev/vulnerability/PYSEC-2025-61) that is associated with pillow v11.2.0. -Since this is an indirect dependency, one can use +### Available Tasks ```bash -$ pixi tree --invert pillow - - pillow 11.2.0 - └── anaconda-client 1.13.0 +pixi run # List all tasks +pixi run test # Run tests +pixi run build-docs # Build documentation ``` -to find out that this is included by the anaconda-client package which is also not a runtime dependency. -This can be ignored. - -**Ignoring a vulnerability:** Unfortunately, `pip-audit` does not have a configuration file that allows for ignoring issues. -This is done with a suppression in the `pyproject.toml` by modifying the task. +### Development Workflow +```bash +pixi shell # Activate environment +python -m pytest tests/ # Run tests +ruff check . # Lint code ``` -# ignore pillow error because it is only used by anaconda-client v1.13.0 -audit-deps = { cmd = "pip-audit --local -s osv --ignore-vuln=PYSEC-2025-61" } -``` - -The comment is added to save future developers effort in confirming the issue. -At a later date, the team should periodically remove the suppression and confirm the issue persists or remove the suppression permanently. - -## Pixi -Pixi is the single tool used to manage environments, dependencies, packaging, and task execution for this project. -All metadata is centralized in `pyproject.toml`, eliminating the need for `environment.yml` or `meta.yaml`. +## Testing -### How to use Pixi - -1. Install `pixi` by running `curl -fsSL https://pixi.sh/install.sh | bash` - (or following the instruction on the [official website](https://pixi.sh/)) -2. Run `pixi install` to create the virtual environments. - By default, `pixi` creates a virtual environment in the `.pixi` directory at the root of the repository. -3. Run `pixi shell` to start a shell with an activate environment, and type `exit` to exit the shell. - -Adjust the tasks in `pyproject.toml` to match your project's needs. -Detailed instructions on adding tasks can be found in the [official documentation](https://pixi.sh/latest/features/tasks/). - -You can use `pixi task list` to see available tasks and their descriptions. +Run the test suite: ```bash -$> pixi task list -Tasks that can run on this machine: ------------------------------------ -audit-deps, backup-toml, build-docs, clean, clean-all, clean-conda, clean-docs, clean-pypi, conda-build, conda-build-command, conda-publish, pypi-build, pypi-publish, pypi-publish-test, pypi-sdist, pypi-wheel, reset-toml, sync-version, test, test-docs -Task Description -audit-deps Audit the package dependencies for vulnerabilities -backup-toml Backup the pyproject.toml file -build-docs Build documentation -clean Clean up various caches and build artifacts -clean-all Clean all artifacts -clean-conda Clean the local .conda build artifacts -clean-docs Clean up documentation build artifacts -clean-pypi Clean the PyPI build artifacts -conda-build Build the conda package -conda-build-command Build the conda package command -conda-publish Publish the .conda package to anaconda.org -pypi-build Build the packages for PyPI -pypi-publish Publish the package to PyPI -pypi-publish-test Publish the package to TestPyPI -pypi-sdist Build the source distribution (tar.gz) -pypi-wheel Build the wheel distribution -reset-toml Reset the pyproject.toml file to the original state -sync-version Sync pyproject.toml version with Git version -test Run the test suite -test-docs Test building the documentation +pixi run test ``` -Use `pixi run ` to run a specific task (note: if the selected task has dependencies, they will be run first). -You don't need to run `pixi shell` to run tasks, as `pixi run` will automatically activate the environment for you. +Tests are located in `tests/` and use pytest. -## Activating the Environment Automatically +## Documentation -Install [direnv](https://pixi.sh/latest/integration/third_party/direnv/) -and create a file `.envrc` in the project root directory with the following content: +Documentation is built with Sphinx: ```bash -watch_file pixi.lock -eval "$(pixi shell-hook)" -unset PS1 +pixi run build-docs ``` -- The line watch_file pixi.lock directs direnv to re-evaluate the environment whenever the file `pixi.lock `changes. -- The line `unset PS1` prevents direnv from reporting on a nagging, albeit harmless, error message. - -Then in the terminal, run `direnv allow`. -Now direnv activates the environment when you enter the project directory, -and deactivates it when you leave the directory. - - -### Known issues +Output will be in `docs/_build/html/`. -#### SQLite file locking on shared mounts +## Project Structure -On SNS Analysis systems, the `pixi run conda-build` task will fail due to `sqlite3` file locking issue. -This is most likely due to the user directory being a shared mount, -which interferes with `pixi` and `conda` environment locking. - -#### Dynamic versioning and lock file circular dependency - -When using pixi with an editable self-dependency (`examplepyapp = { path = ".", editable = true }`) and dynamic git-based versioning (versioningit), there is a fundamental circular dependency: +``` +PythonCommons/ +├── src/commons/ # Main package +│ ├── config.py # Configuration management +│ ├── time.py # Time utilities +│ └── decorators/ +│ └── singleton.py # Singleton pattern decorator +├── tests/ # Test suite +├── docs/ # Documentation (Sphinx) +├── pyproject.toml # Project metadata and Pixi tasks +└── pixi.lock # Locked dependencies +``` -1. The lock file (`pixi.lock`) records the package version computed from git state (e.g., `0.2.0.dev291`) -2. Committing the lock file changes the git state (new commit hash) -3. The new git state produces a different version than what's in the lock file -4. CI runs `pixi install --locked` and fails with "lock-file not up-to-date with the workspace" +## Known Issues -**The Problem:** -You cannot commit a lock file that references its own commit - it's a chicken-and-egg problem. Every commit changes the version, making the lock file immediately stale. +### SQLite file locking on shared mounts -**The Solution:** -We use pixi's `--skip` flag (available since v0.51.0) to skip the editable local package during locked install, then install it separately with pip: +On SNS Analysis systems, `pixi run conda-build` may fail due to sqlite3 file locking on shared mounts. This is a known limitation when user directories are network shares. -```yaml -# In .github/workflows/*.yaml -- name: Setup pixi - uses: prefix-dev/setup-pixi@v0.9.3 - with: - run-install: false # Disable automatic install +### Dynamic versioning and lock file circular dependency -- name: Install dependencies (skip local package) - run: pixi install --frozen --skip ${{ env.PKG_NAME }} +When using pixi with editable self-dependencies and git-based versioning, there's a circular dependency issue. The solution uses pixi's `--skip` flag: -- name: Install local package - run: pixi run pip install --no-deps -e . +```bash +pixi install --frozen --skip PythonCommons +pip install --no-deps -e . ``` - -**Why this works:** -- `--frozen` uses the lock file without checking if it's up-to-date -- `--skip ` skips the editable local package entirely -- `pip install --no-deps -e .` installs the local package separately (pip doesn't check against lock file) -- All external dependencies remain locked and verified -- The local package version can float freely - -**Trade-offs:** -- The local package's version is not enforced by the lock file (acceptable since it's the code being tested) -- Adds ~5-10 seconds to CI for the extra pip install step - -**References:** -- [Pixi PR #3092: Add --skip flag](https://github.com/prefix-dev/pixi/pull/3092) -- [setup-pixi GitHub Action](https://github.com/prefix-dev/setup-pixi) -- This is a known issue affecting all lock file-based package managers (pixi, poetry, pdm, uv) when combined with dynamic versioning tools (versioningit, setuptools-scm, hatch-vcs) diff --git a/docs/config.rst b/docs/config.rst index 1a8f5ac..e2913a4 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -1,6 +1,6 @@ -================================ +==================================== Configuration Management (Config) -================================ +==================================== YAML-based configuration system with environment layering, deep merging, token substitution, and automatic backup. diff --git a/docs/singleton.rst b/docs/singleton.rst index 3e484c2..33fb002 100644 --- a/docs/singleton.rst +++ b/docs/singleton.rst @@ -1,6 +1,6 @@ -========================== +============================= Singleton Decorator Pattern -========================== +============================= Ensures only one instance of a decorated class exists throughout application lifecycle. diff --git a/docs/time.rst b/docs/time.rst index 8d18400..3012af2 100644 --- a/docs/time.rst +++ b/docs/time.rst @@ -1,6 +1,6 @@ -==================== +======================= Time Utilities (time) -==================== +======================= High-precision timestamp generation, parsing, and ISO 8601 formatting with nanosecond accuracy.