From df3ab874a586bccb6d0ce0ded4c750dda7042b72 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 1 Jul 2026 14:22:22 +0200 Subject: [PATCH 1/5] Apply the latest copier templates --- .copier-answers.yml | 2 +- .github/workflows/coverage.yml | 26 +------------------------- .github/workflows/docs.yml | 9 ++++++--- .github/workflows/pypi-test.yml | 8 +++++--- .github/workflows/test.yml | 9 +++++---- .prettierignore | 3 +++ docs/docs/assets/stylesheets/extra.css | 9 ++++++++- docs/mkdocs.yml | 20 +++++++++++++++++++- pixi.toml | 3 ++- pyproject.toml | 9 ++++++--- 10 files changed, 56 insertions(+), 42 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 3929e0b0..b58039fb 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,6 +1,6 @@ # WARNING: Do not edit this file manually. # Any changes will be overwritten by Copier. -_commit: v0.11.3-3-ga67ebc3 +_commit: v0.13.0 _src_path: gh:easyscience/templates lib_docs_url: https://easyscience.github.io/core lib_doi: 10.5281/zenodo.18163581 diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index d96e5b87..5208a333 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -63,32 +63,8 @@ jobs: files: ./coverage-unit.xml token: ${{ secrets.CODECOV_TOKEN }} - # Job 2: Run integration tests with coverage and upload to Codecov - integration-tests-coverage: - runs-on: ubuntu-latest - - steps: - - name: Check-out repository - uses: actions/checkout@v6 - - - name: Set up pixi - uses: ./.github/actions/setup-pixi - - - name: Run integration tests with coverage - run: - pixi run integration-tests-coverage --cov-report=xml:coverage-integration.xml - - - name: Upload integration tests coverage to Codecov - if: ${{ !cancelled() }} - uses: ./.github/actions/upload-codecov - with: - name: integration-tests-job - flags: integration - files: ./coverage-integration.xml - token: ${{ secrets.CODECOV_TOKEN }} - # Job 4: Build and publish dashboard (reusable workflow) run-reusable-workflows: - needs: [docstring-coverage, unit-tests-coverage, integration-tests-coverage] # depend on the previous jobs + needs: [docstring-coverage, unit-tests-coverage] # depend on the previous jobs uses: ./.github/workflows/dashboard.yml secrets: inherit diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 0c88c804..f6d7eceb 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -123,11 +123,14 @@ jobs: # Build the static files for the documentation site for local inspection # Input: docs/ directory containing the Markdown files - # Output: site/ directory containing the generated HTML files + # Output: docs/site/ directory containing the generated HTML files + # Also verifies that mkdocstrings generated docs/site/objects.inv. - name: Build site for local check - run: pixi run docs-build-local + run: | + pixi run docs-build-local + pixi run docs-inventory-check - # Upload the static files from the site/ directory to be used for + # Upload the static files from the docs/site/ directory to be used for # local check - name: Upload built site as artifact uses: ./.github/actions/upload-artifact diff --git a/.github/workflows/pypi-test.yml b/.github/workflows/pypi-test.yml index 37fd3b5d..f002bc61 100644 --- a/.github/workflows/pypi-test.yml +++ b/.github/workflows/pypi-test.yml @@ -43,11 +43,13 @@ jobs: frozen: false - name: Init pixi project - run: pixi init easyscience + run: pixi init --platform linux-64 --platform osx-arm64 --platform win-64 easyscience - - name: Set the minimum system requirements + - name: Configure pixi platforms working-directory: easyscience - run: pixi project system-requirements add macos 14.0 + run: | + pixi workspace platform edit linux-64 --glibc 2.35 --no-install + pixi workspace platform edit osx-arm64 --macos 14.0 --no-install - name: Add Python 3.14 from Conda working-directory: easyscience diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2e3e51aa..9a95e0c1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -211,15 +211,16 @@ jobs: echo "πŸ”ΉπŸ”ΈπŸ”ΉπŸ”ΈπŸ”Ή Python: $py_ver πŸ”ΉπŸ”ΈπŸ”ΉπŸ”ΈπŸ”Ή" echo "Initializing pixi project" - pixi init easyscience_py$py_ver + pixi init --platform linux-64 --platform osx-arm64 --platform win-64 eeasyscience_py$py_ver cd easyscience_py$py_ver + echo "Configure pixi platforms" + pixi workspace platform edit linux-64 --glibc 2.35 --no-install + pixi workspace platform edit osx-arm64 --macos 14.0 --no-install + echo "Adding Python $py_ver" pixi add "python=$py_ver" - echo "Setting macOS 14.0 as minimum required" - pixi project system-requirements add macos 14.0 - echo "Looking for wheel in ../dist/py$py_ver/" ls -l "../dist/py$py_ver/" diff --git a/.prettierignore b/.prettierignore index a08c3c48..ec19b5ef 100644 --- a/.prettierignore +++ b/.prettierignore @@ -25,6 +25,9 @@ docs/docs/assets/ # Node node_modules +# Tox +.tox + # Misc .benchmarks .cache diff --git a/docs/docs/assets/stylesheets/extra.css b/docs/docs/assets/stylesheets/extra.css index a625be80..5bc1db12 100644 --- a/docs/docs/assets/stylesheets/extra.css +++ b/docs/docs/assets/stylesheets/extra.css @@ -200,7 +200,14 @@ label.md-nav__title[for="__drawer"] { /* Change the overall width of the page */ .md-grid { - max-width: 1280px; + max-width: 116em; +} + +/* Keep prose line length stable when sidebars are hidden at narrower widths */ +.md-main .md-content > .md-content__inner { + width: min(100%, 40.5em); + margin-left: auto !important; + margin-right: auto !important; } /* Needed for mkdocs-jupyter to show download and other buttons on top of the notebook */ diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 52170e3a..7839de1a 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -153,7 +153,25 @@ plugins: show_root_heading: true show_root_full_path: false show_submodules: true - show_source: true + show_source: false + show_bases: false + # Uncomment when the project depends on `easyscience` and inherited + # EasyScience base-class members should be shown in the API docs. + # preload_modules: + # - easyscience + inherited_members: true + show_category_heading: true + merge_init_into_class: true + docstring_options: + ignore_init_summary: true + summary: true + relative_crossrefs: true + scoped_crossrefs: true + filters: ["!^_[^_]", "!__repr__", "!__dir__"] # This is the default filter minus __repr__ and __dir__ + inventories: + - url: https://scipp.github.io/objects.inv + - url: https://numpy.org/doc/stable/objects.inv + - url: https://easyscience.github.io/core/latest/objects.inv - search # Determines additional directories to watch when running mkdocs serve diff --git a/pixi.toml b/pixi.toml index 6fa778c2..93b7d9a0 100644 --- a/pixi.toml +++ b/pixi.toml @@ -182,8 +182,9 @@ docs-serve = 'pixi run docs-pre serve -f docs/mkdocs.yml' docs-serve-dirty = 'pixi run docs-serve --dirty' docs-build = 'pixi run docs-pre build -f docs/mkdocs.yml' docs-build-local = 'pixi run docs-build --no-directory-urls' +docs-inventory-check = 'python -c "from pathlib import Path; p = Path(\"docs/site/objects.inv\"); raise SystemExit(0 if p.is_file() and p.stat().st_size > 0 else \"missing or empty docs/site/objects.inv\")"' -docs-deploy-pre = 'mike deploy -F docs/mkdocs.yml --push --branch gh-pages --update-aliases --alias-type redirect' +docs-deploy-pre = 'mike deploy -F docs/mkdocs.yml --push --branch gh-pages --update-aliases --alias-type copy' docs-set-default-pre = 'mike set-default -F docs/mkdocs.yml --push --branch gh-pages' docs-update-assets = 'python tools/update_docs_assets.py' diff --git a/pyproject.toml b/pyproject.toml index e555f419..8328079c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -180,9 +180,9 @@ testpaths = ['tests'] [tool.ruff] exclude = ['tests', 'legacy', 'src/easyscience/legacy'] indent-width = 4 -line-length = 99 # See also `max-line-length` in [tool.ruff.lint.pycodestyle] -preview = true # Enable new rules that are not yet stable, like DOC - +line-length = 99 # See also `max-line-length` in [tool.ruff.lint.pycodestyle] +preview = true # Enable new rules that are not yet stable, like DOC +builtins = ['display'] # Clutch-fix/patch to https://github.com/nbQA-dev/nbQA/issues/882 # Formatting options for Ruff [tool.ruff.format] @@ -233,6 +233,9 @@ ignore = [ 'INP001', # https://docs.astral.sh/ruff/rules/implicit-namespace-package/ 'T201', # https://docs.astral.sh/ruff/rules/print/ ] +'docs/docs/tutorials/**' = [ + 'E402', # https://docs.astral.sh/ruff/rules/module-import-not-at-top-of-file/ +] # Specific options for certain rules From 88dd8edf768dd2c3ebd01912ce0559285fa456e7 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 1 Jul 2026 14:36:45 +0200 Subject: [PATCH 2/5] Apply formatting --- .github/workflows/pypi-test.yml | 4 +- CONTRIBUTING.md | 3 +- docs/mkdocs.yml | 8 ++-- pyproject.toml | 4 +- src/easyscience/fitting/fitter.py | 33 ++++++++------ .../fitting/minimizers/minimizer_bumps.py | 44 +++++++++++-------- src/easyscience/fitting/multi_fitter.py | 7 +-- src/easyscience/global_object/logger.py | 32 +++++++++----- 8 files changed, 82 insertions(+), 53 deletions(-) diff --git a/.github/workflows/pypi-test.yml b/.github/workflows/pypi-test.yml index f002bc61..b8edabe4 100644 --- a/.github/workflows/pypi-test.yml +++ b/.github/workflows/pypi-test.yml @@ -43,7 +43,9 @@ jobs: frozen: false - name: Init pixi project - run: pixi init --platform linux-64 --platform osx-arm64 --platform win-64 easyscience + run: + pixi init --platform linux-64 --platform osx-arm64 --platform win-64 + easyscience - name: Configure pixi platforms working-directory: easyscience diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ca8a1bc1..64104f8c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,8 +42,7 @@ Please make sure you follow the EasyScience organization-wide If you are not planning to contribute code, you may want to: - 🐞 Report a bug β€” see [Reporting Issues](#11-reporting-issues) -- πŸ›‘ Report a security issue β€” see - [Security Issues](#12-security-issues) +- πŸ›‘ Report a security issue β€” see [Security Issues](#12-security-issues) - πŸ’¬ Ask a question or start a discussion at [Project Discussions](https://github.com/easyscience/core/discussions) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 7839de1a..ead39f54 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -167,11 +167,11 @@ plugins: summary: true relative_crossrefs: true scoped_crossrefs: true - filters: ["!^_[^_]", "!__repr__", "!__dir__"] # This is the default filter minus __repr__ and __dir__ + filters: ['!^_[^_]', '!__repr__', '!__dir__'] # This is the default filter minus __repr__ and __dir__ inventories: - - url: https://scipp.github.io/objects.inv - - url: https://numpy.org/doc/stable/objects.inv - - url: https://easyscience.github.io/core/latest/objects.inv + - url: https://scipp.github.io/objects.inv + - url: https://numpy.org/doc/stable/objects.inv + - url: https://easyscience.github.io/core/latest/objects.inv - search # Determines additional directories to watch when running mkdocs serve diff --git a/pyproject.toml b/pyproject.toml index 8328079c..67ddcaf8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -182,7 +182,9 @@ exclude = ['tests', 'legacy', 'src/easyscience/legacy'] indent-width = 4 line-length = 99 # See also `max-line-length` in [tool.ruff.lint.pycodestyle] preview = true # Enable new rules that are not yet stable, like DOC -builtins = ['display'] # Clutch-fix/patch to https://github.com/nbQA-dev/nbQA/issues/882 +builtins = [ + 'display', +] # Clutch-fix/patch to https://github.com/nbQA-dev/nbQA/issues/882 # Formatting options for Ruff [tool.ruff.format] diff --git a/src/easyscience/fitting/fitter.py b/src/easyscience/fitting/fitter.py index 38f91ddb..7cb948e0 100644 --- a/src/easyscience/fitting/fitter.py +++ b/src/easyscience/fitting/fitter.py @@ -433,20 +433,24 @@ def mcmc_sample( progress_callback: Optional[Callable[[dict], Optional[bool]]] = None, abort_test: Optional[Callable[[], bool]] = None, ) -> dict: - """Run Bayesian MCMC sampling using the BUMPS DREAM sampler. + """ + Run Bayesian MCMC sampling using the BUMPS DREAM sampler. Works with both a plain ``Fitter`` (single dataset) and a ``MultiFitter`` (multiple datasets) via polymorphic dispatch: - ``_precompute_reshaping`` and ``_fit_function_wrapper`` are resolved - on the concrete subclass at call time, so multi-dataset flattening - is handled automatically when called on a ``MultiFitter`` instance. + ``_precompute_reshaping`` and ``_fit_function_wrapper`` are + resolved on the concrete subclass at call time, so multi-dataset + flattening is handled automatically when called on a + ``MultiFitter`` instance. Parameters ---------- x : np.ndarray - Independent variable array (or list of arrays for ``MultiFitter``). + Independent variable array (or list of arrays for + ``MultiFitter``). y : np.ndarray - Dependent variable array (or list of arrays for ``MultiFitter``). + Dependent variable array (or list of arrays for + ``MultiFitter``). weights : np.ndarray Weight array (or list of arrays for ``MultiFitter``). samples : int, default=10000 @@ -459,16 +463,19 @@ def mcmc_sample( population : Optional[int], default=None BUMPS DREAM population count (number of parallel chains). vectorized : bool, default=False - When ``True``, each x array may be multi-dimensional (e.g. an - ``(N, M, 2)`` grid for a 2D model) and is left as-is. When - ``False`` (default), each x array is expected to be 1-D. + When ``True``, each x array may be multi-dimensional (e.g. + an ``(N, M, 2)`` grid for a 2D model) and is left as-is. + When ``False`` (default), each x array is expected to be + 1-D. sampler_kwargs : Optional[dict], default=None - Additional keyword arguments forwarded to the BUMPS DREAM sampler. + Additional keyword arguments forwarded to the BUMPS DREAM + sampler. progress_callback : Optional[Callable[[dict], Optional[bool]]], default=None - Optional callback invoked at each DREAM generation. The payload - dict includes ``iteration`` and ``sampling: True``. + Optional callback invoked at each DREAM generation. The + payload dict includes ``iteration`` and ``sampling: True``. abort_test : Optional[Callable[[], bool]], default=None - Optional callable that returns ``True`` to abort sampling early. + Optional callable that returns ``True`` to abort sampling + early. Returns ------- diff --git a/src/easyscience/fitting/minimizers/minimizer_bumps.py b/src/easyscience/fitting/minimizers/minimizer_bumps.py index 40b303f9..b2b0694a 100644 --- a/src/easyscience/fitting/minimizers/minimizer_bumps.py +++ b/src/easyscience/fitting/minimizers/minimizer_bumps.py @@ -118,9 +118,9 @@ def fit( ``iteration`` carries the BUMPS optimizer step index. By default, None. abort_test : Callable[[], bool] | None, default=None - Optional callback that returns ``True`` to signal that the fit - should be aborted. Called periodically during the - BUMPS optimizer iteration loop. + Optional callback that returns ``True`` to signal that the + fit should be aborted. Called periodically during the BUMPS + optimizer iteration loop. minimizer_kwargs : dict | None, default=None Additional keyword arguments passed to the BUMPS minimizer. By default, None. @@ -393,12 +393,14 @@ def mcmc_sample( progress_callback: Callable[[dict], bool | None] | None = None, abort_test: Callable[[], bool] | None = None, ) -> dict: - """Run Bayesian MCMC sampling using the BUMPS DREAM sampler. + """ + Run Bayesian MCMC sampling using the BUMPS DREAM sampler. - Builds a BUMPS `FitProblem` from the current model and runs the DREAM - sampler. This is the public minimizer-level entry point for Bayesian - sampling; the higher-level `MultiFitter.mcmc_sample` delegates to this - method after flattening multi-dataset arrays. + Builds a BUMPS ``FitProblem`` from the current model and runs + the DREAM sampler. This is the public minimizer-level entry + point for Bayesian sampling; the higher-level + ``MultiFitter.mcmc_sample`` delegates to this method after + flattening multi-dataset arrays. Parameters ---------- @@ -417,15 +419,16 @@ def mcmc_sample( population : int | None, default=None BUMPS DREAM population count (number of parallel chains). sampler_kwargs : dict | None, default=None - Additional keyword arguments forwarded to `bumps.fitters.fit`. + Additional keyword arguments forwarded to + ``bumps.fitters.fit``. progress_callback : Callable[[dict], bool | None] | None, default=None Optional callback for progress updates during sampling. The - payload dict includes ``iteration`` (DREAM generation number) and - ``sampling: True``. + payload dict includes ``iteration`` (DREAM generation + number) and ``sampling: True``. abort_test : Callable[[], bool] | None, default=None - Optional callback that returns ``True`` to signal that sampling - should be aborted. Called periodically during the DREAM sampling - loop. + Optional callback that returns ``True`` to signal that + sampling should be aborted. Called periodically during the + DREAM sampling loop. Returns ------- @@ -439,7 +442,8 @@ def mcmc_sample( If the input shapes or weights are invalid, or if ``progress_callback`` is not callable. FitError - If DREAM sampling was aborted by the user (via ``abort_test``). + If DREAM sampling was aborted by the user (via + ``abort_test``). Exception Re-raised from DREAM fitting if any unexpected error occurs (parameter values are restored beforehand). @@ -545,11 +549,13 @@ def mcmc_sample( def _build_sample_progress_payload( self, problem, iteration: int, point: np.ndarray, nllf: float ) -> dict: - """Build a progress payload for Bayesian DREAM sampling steps. + """ + Build a progress payload for Bayesian DREAM sampling steps. - Called by :class:`BumpsProgressMonitor` at each DREAM generation. - The payload includes ``sampling: True`` so downstream consumers can - distinguish sampling progress from classical fitting progress. + Called by :class:`BumpsProgressMonitor` at each DREAM + generation. The payload includes ``sampling: True`` so + downstream consumers can distinguish sampling progress from + classical fitting progress. """ payload = self._build_progress_payload(problem, iteration, point, nllf) payload['sampling'] = True diff --git a/src/easyscience/fitting/multi_fitter.py b/src/easyscience/fitting/multi_fitter.py index 92af9d9e..39d73193 100644 --- a/src/easyscience/fitting/multi_fitter.py +++ b/src/easyscience/fitting/multi_fitter.py @@ -98,9 +98,10 @@ def _precompute_reshaping( weights : list[np.ndarray] | None Optional weights for each dataset. vectorized : bool - When ``True``, each x array may be multi-dimensional (e.g. an - ``(N, M, 2)`` grid for a 2D model) and is left as-is. When - ``False`` (default), each x array is expected to be 1-D. + When ``True``, each x array may be multi-dimensional (e.g. + an ``(N, M, 2)`` grid for a 2D model) and is left as-is. + When ``False`` (default), each x array is expected to be + 1-D. Returns ------- diff --git a/src/easyscience/global_object/logger.py b/src/easyscience/global_object/logger.py index 7914f133..087f5ea8 100644 --- a/src/easyscience/global_object/logger.py +++ b/src/easyscience/global_object/logger.py @@ -19,7 +19,10 @@ def _parse_log_level(level: int | str) -> int: - """Convert a level number or name into a numeric level, raising on an unknown name.""" + """ + Convert a level number or name into a numeric level, raising on an + unknown name. + """ if isinstance(level, str): stripped = level.strip() if stripped.isdigit(): @@ -36,7 +39,10 @@ def _parse_log_level(level: int | str) -> int: def _env_log_level(raw: str | None, default: int) -> int: - """Parse the EASYSCIENCE_LOG_LEVEL env var, falling back to *default* on an unset/bad value.""" + """ + Parse the EASYSCIENCE_LOG_LEVEL env var, falling back to *default* + on an unset/bad value. + """ if raw is None: return default try: @@ -91,7 +97,10 @@ def critical(self, msg: str, *args, **kwargs) -> None: self.logger.critical(msg, *args, **kwargs) def exception(self, msg: str, *args, **kwargs) -> None: - """Log an ERROR-level message with traceback on the package-root logger.""" + """ + Log an ERROR-level message with traceback on the package-root + logger. + """ self.logger.exception(msg, *args, **kwargs) # -- public API ------------------------------------------------------- @@ -119,7 +128,8 @@ def level(self, value: int | str) -> None: value : int | str Logging level β€” a number (e.g. ``logging.WARNING``) or a level name (e.g. ``'ERROR'``). A string that is not a - recognised level name or numeric string raises ``ValueError``. + recognised level name or numeric string raises + ``ValueError``. """ self.logger.setLevel(_parse_log_level(value)) @@ -149,8 +159,8 @@ def getLogger(self, logger_name: str) -> logging.Logger: @contextlib.contextmanager def at_level(self, level: int | str) -> Iterator[None]: """ - Context manager that temporarily sets the package-root logger - to *level*, restoring the previous level on exit. + Context manager that temporarily sets the package-root logger to + *level*, restoring the previous level on exit. Parameters ---------- @@ -160,12 +170,12 @@ def at_level(self, level: int | str) -> Iterator[None]: Yields ------ - None + Iterator[None] Control is handed back to the ``with`` block with the temporary level applied. - Example - ------- + Examples + -------- Setting the log-level only within the context: ```python @@ -188,5 +198,7 @@ def suspend(self): self.logger.setLevel(logging.CRITICAL + 1) def resume(self): - """Restore the level captured by the most recent suspend call.""" + """ + Restore the level captured by the most recent suspend call. + """ self.level = self._level_before_suspend From 0cf97bc5de8017324e719adc639a52f8e0b58ba5 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 1 Jul 2026 14:37:29 +0200 Subject: [PATCH 3/5] Apply hot-fix --- .copier-answers.yml | 2 +- pixi.toml | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index b58039fb..7bbfb882 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,6 +1,6 @@ # WARNING: Do not edit this file manually. # Any changes will be overwritten by Copier. -_commit: v0.13.0 +_commit: v0.13.1 _src_path: gh:easyscience/templates lib_docs_url: https://easyscience.github.io/core lib_doi: 10.5281/zenodo.18163581 diff --git a/pixi.toml b/pixi.toml index 93b7d9a0..a3237349 100644 --- a/pixi.toml +++ b/pixi.toml @@ -5,7 +5,19 @@ [workspace] # Supported platforms for the lock file (pixi.lock) -platforms = ['win-64', 'linux-64', 'osx-arm64'] +platforms = [ + 'win-64', + # Set minimum supported version for glibc to be 2.35 to ensure packages + # like `crysfml` that only have wheels for glibc 2.35+ + # (manylinux_2_35_x86_64) are used. + #libc = { family = 'glibc', version = '2.35' } + { platform = 'linux-64', glibc = '2.35' }, + # Set minimum supported version for macOS to be 14.0 to ensure packages + # like `scipp` that only have wheels for macOS 14.0+ (macosx_14_0_arm64) + # are used instead of building from source. This is a workaround for + # Pixi, see https://github.com/prefix-dev/pixi/issues/5667 + { platform = 'osx-arm64', macos = '14.0' }, +] # Channels for fetching packages channels = ['nodefaults', 'conda-forge'] @@ -19,13 +31,6 @@ channels = ['nodefaults', 'conda-forge'] [activation.env] PYTHONIOENCODING = 'utf-8' -[system-requirements] -# Set minimum supported version for macOS to be 14.0 to ensure packages -# like `scipp` that only have wheels for macOS 14.0+ (macosx_14_0_arm64) -# are used instead of building from source. This is a workaround for -# Pixi, see https://github.com/prefix-dev/pixi/issues/5667 -macos = '14.0' - # Non-default features: # Set specific Python versions to be used in CI testing. From 00f3c44205171e0f9f83100530306e356bca69a0 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 1 Jul 2026 14:48:16 +0200 Subject: [PATCH 4/5] Annotate logger at_level as Generator --- src/easyscience/global_object/logger.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/easyscience/global_object/logger.py b/src/easyscience/global_object/logger.py index 087f5ea8..c0c7f87c 100644 --- a/src/easyscience/global_object/logger.py +++ b/src/easyscience/global_object/logger.py @@ -4,7 +4,7 @@ import contextlib import logging import os -from collections.abc import Iterator +from collections.abc import Generator PACKAGE_LOGGER_NAME = 'easyscience' _LOG_LEVEL_ENV_VAR = 'EASYSCIENCE_LOG_LEVEL' @@ -157,7 +157,7 @@ def getLogger(self, logger_name: str) -> logging.Logger: return logging.getLogger(logger_name) @contextlib.contextmanager - def at_level(self, level: int | str) -> Iterator[None]: + def at_level(self, level: int | str) -> Generator[None, None, None]: """ Context manager that temporarily sets the package-root logger to *level*, restoring the previous level on exit. @@ -170,7 +170,7 @@ def at_level(self, level: int | str) -> Iterator[None]: Yields ------ - Iterator[None] + None Control is handed back to the ``with`` block with the temporary level applied. From d01ee991f6d4abb7909af12bfa3eb9325ab10245 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 1 Jul 2026 14:53:47 +0200 Subject: [PATCH 5/5] Fix typo in project name --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9a95e0c1..776ed94f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -211,7 +211,7 @@ jobs: echo "πŸ”ΉπŸ”ΈπŸ”ΉπŸ”ΈπŸ”Ή Python: $py_ver πŸ”ΉπŸ”ΈπŸ”ΉπŸ”ΈπŸ”Ή" echo "Initializing pixi project" - pixi init --platform linux-64 --platform osx-arm64 --platform win-64 eeasyscience_py$py_ver + pixi init --platform linux-64 --platform osx-arm64 --platform win-64 easyscience_py$py_ver cd easyscience_py$py_ver echo "Configure pixi platforms"