Skip to content

test: enable pytest strict mode and fix duplicate parametrization ids#215

Draft
d-v-b wants to merge 22 commits into
claude/moto-ephemeral-portfrom
claude/pytest9-strict-stacked
Draft

test: enable pytest strict mode and fix duplicate parametrization ids#215
d-v-b wants to merge 22 commits into
claude/moto-ephemeral-portfrom
claude/pytest9-strict-stacked

Conversation

@d-v-b

@d-v-b d-v-b commented Jul 10, 2026

Copy link
Copy Markdown
Owner

🤖 AI text below 🤖

Stacked on #214 — review only the top commit; the base commits are the moto ephemeral-port fix.

What

Adopt pytest 9's strict = true config option (announced in 9.0), which turns on strict_config, strict_markers, strict_xfail, strict_parametrization_ids, and any strictness options future pytest releases add. It replaces three existing settings:

  • --strict-config / --strict-markers in addopts — which pytest silently ignored when passed via addopts until 9.1 (pytest#14442), so these were never actually enforced;
  • xfail_strict = true.

minversion is bumped to 9 to match. Verified enforcement works: an intentionally duplicated parametrization now fails collection.

Duplicate-id fixes surfaced by strict_parametrization_ids

pytest previously deduplicated colliding test ids silently (foo0, foo1). Strict mode makes them collection errors, which surfaced seven parametrizations — including one real coverage bug:

  1. test_dtype/test_npy/test_common.py — the float JSON roundtrip cases paired float("inf") with np.inf (and -inf/nan), but np.inf is a Python float, so three cases per test ran twice and the intended numpy-scalar coverage never existed. Now uses np.float64 scalars with explicit ids, restoring the intended coverage across 5 test functions.
  2. test_dtype/conftest.pyTestInt32/TestUInt32 deliberately include np.dtype("i")/C-uint spellings that compare equal to (and stringify identically to) one of the explicit-endian dtypes on any given platform, but differ on Windows. Rather than dropping that coverage, the class-fixture parametrization hook now suffixes colliding ids with their index (int32-0, int32-2).
  3. test_group.py::test_consistent_signatures — both create_hierarchy pairs got the id create_hierarchy-create_hierarchy; ids now include module + qualname (group.AsyncGroup.create_hierarchy-group.Group.create_hierarchy).
  4. test_array.py::test_scalar_array"a" vs b"a"; explicit id for the bytes case.
  5. test_codecs/test_vlen.pystr builtin vs "str" literal; explicit id for the literal.
  6. test_metadata/test_v2.py::test_parse_zarr_format_invalid3 vs "3"; explicit id for the string case.

Verification

  • Collection clean under both pytest 9.0.3 (current pin) and 9.1.1: 6544 tests, 0 errors.
  • Enforcement probe: a deliberately duplicated parametrize id fails collection with Duplicate parametrization IDs detected.
  • Full suite (-n auto, on top of the test: bind moto server to an ephemeral port to fix xdist deadlock #214 fix): 6196 passed, 277 skipped, 4 xfailed in 65s.
  • Full prek suite (mypy included) green.

🤖 Generated with Claude Code

NIK-TIGER-BILL and others added 17 commits July 1, 2026 15:18
…velopers#4110)

Signed-off-by: NIK-TIGER-BILL <nik.tiger.bill@github.com>
Co-authored-by: NIK-TIGER-BILL <nik.tiger.bill@github.com>
…pers#4102)

Co-authored-by: Davis Bennett <davis.v.bennett@gmail.com>
* chore(deps): bump the actions group across 1 directory with 8 updates (#176)

Bumps the actions group with 8 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [prefix-dev/setup-pixi](https://github.com/prefix-dev/setup-pixi) | `0.9.5` | `0.9.6` |
| [codecov/codecov-action](https://github.com/codecov/codecov-action) | `6.0.0` | `6.0.1` |
| [github/issue-metrics](https://github.com/github/issue-metrics) | `4.2.2` | `4.2.7` |
| [j178/prek-action](https://github.com/j178/prek-action) | `2.0.3` | `2.0.4` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.0` | `7.0.1` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `7.0.0` | `8.0.1` |
| [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) | `1.13.0` | `1.14.0` |
| [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) | `0.5.3` | `0.5.6` |



Updates `prefix-dev/setup-pixi` from 0.9.5 to 0.9.6
- [Release notes](https://github.com/prefix-dev/setup-pixi/releases)
- [Commits](prefix-dev/setup-pixi@1b2de7f...5185adf)

Updates `codecov/codecov-action` from 6.0.0 to 6.0.1
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](codecov/codecov-action@57e3a13...e79a696)

Updates `github/issue-metrics` from 4.2.2 to 4.2.7
- [Release notes](https://github.com/github/issue-metrics/releases)
- [Commits](github-community-projects/issue-metrics@c9e9838...1e38d5e)

Updates `j178/prek-action` from 2.0.3 to 2.0.4
- [Release notes](https://github.com/j178/prek-action/releases)
- [Commits](j178/prek-action@6ad8027...bdca6f1)

Updates `actions/upload-artifact` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v7...043fb46)

Updates `actions/download-artifact` from 7.0.0 to 8.0.1
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v7...3e5f45b)

Updates `pypa/gh-action-pypi-publish` from 1.13.0 to 1.14.0
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](pypa/gh-action-pypi-publish@v1.13.0...cef2210)

Updates `zizmorcore/zizmor-action` from 0.5.3 to 0.5.6
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](zizmorcore/zizmor-action@b1d7e1f...5f14fd0)

---
updated-dependencies:
- dependency-name: prefix-dev/setup-pixi
  dependency-version: 0.9.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: github/issue-metrics
  dependency-version: 4.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: j178/prek-action
  dependency-version: 2.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: pypa/gh-action-pypi-publish
  dependency-version: 1.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.5.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* refactor: dedupe overwrite-check logic in array creation

Extract the repeated "delete existing node if overwriting (and the store
supports deletes), otherwise enforce no existing node" dance into a single
private helper `_prepare_overwrite`, used by `_create_v3`, `_create_v2`, and
`_create_array_metadata`.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: inline single-caller get-selection wrappers

The module-level `_get_orthogonal_selection`, `_get_mask_selection`, and
`_get_coordinate_selection` helpers each constructed an indexer and delegated
to `_get_selection`, and each had exactly one caller (the corresponding
`AsyncArray.get_*_selection` method). Inline the indexer construction into
those methods and delete the wrappers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: unify zarr-dtype access via metadata.dtype

`ArrayV2Metadata.dtype` and `ArrayV3Metadata.dtype` (the latter an alias for
`data_type`) both already return the zarr dtype object, so the repeated
`metadata.dtype if zarr_format == 2 else metadata.data_type` dispatch in
`AsyncArray._zdtype`, `_get_selection`, and `_set_selection` collapses to a
single `metadata.dtype` access.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: make Array.cdata_shape delegate to _chunk_grid_shape

`Array.cdata_shape` and `Array._chunk_grid_shape` had identical bodies; the
public `cdata_shape` now delegates to `_chunk_grid_shape` instead of
duplicating the access.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: inline no-op default_filters_v3

`default_filters_v3` unconditionally returned an empty tuple. Inline that
empty tuple at its two call sites (with a short comment) and delete the
function.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: dedupe contains_group V3 branch via _contains_node_v3

The V3 branch of `contains_group` re-implemented the node-type detection that
`_contains_node_v3` already performs. Replace it with
`(await _contains_node_v3(store_path)) == "group"`, which is behaviorally
identical for all cases (missing document, array, group, malformed/non-object
JSON, and missing node_type key all map to the same result).

`contains_array` is intentionally left unchanged: its V3 branch falls through
to a `ValueError` when a *group* node is present, which `_contains_node_v3`
does not reproduce, so swapping it would change observable behavior.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: extract not-yet-implemented kwarg warning helper

`open_group` and `create` each had repeated
`if x is not None: warnings.warn(f"...not yet implemented...")` blocks. Extract
a `_warn_unimplemented_kwargs` helper taking a name->value mapping. The helper
uses stacklevel=3 to compensate for the extra call frame, so the warning still
points at the same call site (verified: identical message, category, source
location, and emission order).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: fold fill_value extraction into _like_args

`_like_args` now records the source array's fill_value, so `empty_like`,
`full_like`, and `open_like` no longer need to re-check isinstance and
setdefault it. `ones_like`/`zeros_like` drop the inherited fill_value (they
supply their own), preserving exact prior behavior including the existing
duplicate-keyword TypeError when an explicit fill_value is passed. Update the
`_like_args` unit test to include the new key.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: catch UnicodeDecodeError in _contains_node_v3

Routing `contains_group` through the shared `_contains_node_v3` helper
narrowed the exception handling from `(ValueError, KeyError, TypeError)`
to `(KeyError, TypeError, json.JSONDecodeError)`. A non-UTF-8 `zarr.json`
makes `json.loads` raise `UnicodeDecodeError` (a `ValueError` subclass
that is not `json.JSONDecodeError`), so `contains_group` would raise
instead of returning `False` as it did before.

Broaden the guard to `ValueError`, which covers both malformed JSON and
non-UTF-8 bytes, exactly matching the previous behavior (and aligning
`ensure_no_existing_node`, which also routes through this helper). Add
regression tests for the non-UTF-8 case across `contains_array`,
`contains_group`, and `_contains_node_v3`.

Assisted-by: ClaudeCode:claude-opus-4.8

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Assisted-by: GitHub Copilot (GPT-5.3-Codex)
…decs (zarr-developers#4116)

* fix: keep element order when writing F-contiguous chunks with vlen codecs

The numcodecs vlen codecs flatten their input with order='A', so an
F-contiguous object-dtype chunk is encoded in transposed element order
while decode reshapes in C order, silently scrambling the round-trip.
Make both vlen codec wrappers pass a C-contiguous array to numcodecs;
this copies only the object-pointer array and only when the chunk is
not already C-contiguous.

* docs: add changelog entry

* fix: keep element order for numcodecs filter codecs too

The generic numcodecs adapter codecs pass the chunk to numcodecs
unchanged, so F-contiguous chunks hit the same order='A' flattening as
the vlen codecs: Delta, FixedScaleOffset and PackBits all round-trip
transposed data for an F-contiguous chunk that exactly covers the
selection. Apply the same C-contiguity normalization in the array-array
and array-bytes adapter encode paths.

---------

Co-authored-by: Davis Bennett <davis.v.bennett@gmail.com>
…#4122)

Follow-up test-quality cleanup for the zarr-developersgh-3558 fix (zarr-developers#4116):

- Merge test_vlen_string_f_contiguous and test_vlen_bytes_f_contiguous
  into one test parametrized over (dtype, fill_value, elements), matching
  the parametrized style of test_vlen_string in the same file.
- Drop the chunks=(2,2) case: with (3,3) data it produces only partial
  chunks, which the codec pipeline recopies to C order before encoding, so
  it never exercised the F-contiguous path it claimed to cover. Use
  chunks == shape (a single complete chunk) so the F-contiguous buffer
  reaches the codec untouched.
- Build the F-contiguous input directly via reshape(order="F") instead of
  wrapping a C-order reshape in np.asarray(..., order="F"), and assert
  data.flags.f_contiguous so a future simplification can't silently defeat
  the regression guard.
- Add a docstring stating the verified behavior.

Assisted-by: ClaudeCode:claude-opus-4.8
)

Bumps the actions group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [CodSpeedHQ/action](https://github.com/codspeedhq/action) | `4.17.6` | `4.18.1` |
| [actions/setup-python](https://github.com/actions/setup-python) | `6.2.0` | `6.3.0` |
| [actions/cache/restore](https://github.com/actions/cache) | `5.0.5` | `6.1.0` |
| [actions/cache/save](https://github.com/actions/cache) | `5.0.5` | `6.1.0` |
| [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) | `0.5.6` | `0.5.7` |


Updates `CodSpeedHQ/action` from 4.17.6 to 4.18.1
- [Release notes](https://github.com/codspeedhq/action/releases)
- [Changelog](https://github.com/CodSpeedHQ/action/blob/main/CHANGELOG.md)
- [Commits](CodSpeedHQ/action@63f3e98...a4a36bb)

Updates `actions/setup-python` from 6.2.0 to 6.3.0
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](actions/setup-python@a309ff8...ece7cb0)

Updates `actions/cache/restore` from 5.0.5 to 6.1.0
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](actions/cache@27d5ce7...55cc834)

Updates `actions/cache/save` from 5.0.5 to 6.1.0
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](actions/cache@27d5ce7...55cc834)

Updates `zizmorcore/zizmor-action` from 0.5.6 to 0.5.7
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](zizmorcore/zizmor-action@5f14fd0...192e21d)

---
updated-dependencies:
- dependency-name: CodSpeedHQ/action
  dependency-version: 4.18.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: actions/setup-python
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: actions/cache/restore
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/cache/save
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.5.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Davis Bennett <davis.v.bennett@gmail.com>
Bumps [joserfc](https://github.com/authlib/joserfc) from 1.6.5 to 1.6.8.
- [Release notes](https://github.com/authlib/joserfc/releases)
- [Changelog](https://github.com/authlib/joserfc/blob/main/docs/changelog.rst)
- [Commits](authlib/joserfc@1.6.5...1.6.8)

---
updated-dependencies:
- dependency-name: joserfc
  dependency-version: 1.6.8
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.15.15 → v0.15.20](astral-sh/ruff-pre-commit@v0.15.15...v0.15.20)
- [github.com/scientific-python/cookie: 2026.04.04 → 2026.06.18](scientific-python/cookie@2026.04.04...2026.06.18)
- [github.com/numpy/numpydoc: v1.10.0 → v1.11.0rc0](numpy/numpydoc@v1.10.0...v1.11.0rc0)
- [github.com/zizmorcore/zizmor-pre-commit: v1.25.2 → v1.26.1](zizmorcore/zizmor-pre-commit@v1.25.2...v1.26.1)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Remove broken badge

It relies on a CI workflow that had been removed in 2024 by 9e3e8c0.

It's unclear whether it should be replaced by a different CI workflow,
and if so which one.

* Horizontal layout for badges, to save space

* Remove Funding

Co-authored-by: Max Jones <14077947+maxrjones@users.noreply.github.com>

---------

Co-authored-by: Max Jones <14077947+maxrjones@users.noreply.github.com>
Co-authored-by: Davis Bennett <davis.v.bennett@gmail.com>
…rs#4133)

* chore(deps): bump the actions group across 1 directory with 8 updates (#176)

Bumps the actions group with 8 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [prefix-dev/setup-pixi](https://github.com/prefix-dev/setup-pixi) | `0.9.5` | `0.9.6` |
| [codecov/codecov-action](https://github.com/codecov/codecov-action) | `6.0.0` | `6.0.1` |
| [github/issue-metrics](https://github.com/github/issue-metrics) | `4.2.2` | `4.2.7` |
| [j178/prek-action](https://github.com/j178/prek-action) | `2.0.3` | `2.0.4` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.0` | `7.0.1` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `7.0.0` | `8.0.1` |
| [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) | `1.13.0` | `1.14.0` |
| [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) | `0.5.3` | `0.5.6` |



Updates `prefix-dev/setup-pixi` from 0.9.5 to 0.9.6
- [Release notes](https://github.com/prefix-dev/setup-pixi/releases)
- [Commits](prefix-dev/setup-pixi@1b2de7f...5185adf)

Updates `codecov/codecov-action` from 6.0.0 to 6.0.1
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](codecov/codecov-action@57e3a13...e79a696)

Updates `github/issue-metrics` from 4.2.2 to 4.2.7
- [Release notes](https://github.com/github/issue-metrics/releases)
- [Commits](github-community-projects/issue-metrics@c9e9838...1e38d5e)

Updates `j178/prek-action` from 2.0.3 to 2.0.4
- [Release notes](https://github.com/j178/prek-action/releases)
- [Commits](j178/prek-action@6ad8027...bdca6f1)

Updates `actions/upload-artifact` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v7...043fb46)

Updates `actions/download-artifact` from 7.0.0 to 8.0.1
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v7...3e5f45b)

Updates `pypa/gh-action-pypi-publish` from 1.13.0 to 1.14.0
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](pypa/gh-action-pypi-publish@v1.13.0...cef2210)

Updates `zizmorcore/zizmor-action` from 0.5.3 to 0.5.6
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](zizmorcore/zizmor-action@b1d7e1f...5f14fd0)

---
updated-dependencies:
- dependency-name: prefix-dev/setup-pixi
  dependency-version: 0.9.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: github/issue-metrics
  dependency-version: 4.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: j178/prek-action
  dependency-version: 2.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: pypa/gh-action-pypi-publish
  dependency-version: 1.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.5.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* docs: fix CacheStore max_age_seconds docstring default

The docstring documented max_age_seconds as 'int | None' with a default
of None, but the signature defaults to "infinity" and None is rejected
by validation. Also note that cache_store must support deletes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
)

Bumps the actions group with 3 updates: [scientific-python/issue-from-pytest-log-action](https://github.com/scientific-python/issue-from-pytest-log-action), [j178/prek-action](https://github.com/j178/prek-action) and [actions/attest](https://github.com/actions/attest).


Updates `scientific-python/issue-from-pytest-log-action` from 1.5.0 to 1.6.0
- [Release notes](https://github.com/scientific-python/issue-from-pytest-log-action/releases)
- [Commits](scientific-python/issue-from-pytest-log-action@8e905db...87351a8)

Updates `j178/prek-action` from 2.0.4 to 2.0.5
- [Release notes](https://github.com/j178/prek-action/releases)
- [Commits](j178/prek-action@bdca6f1...e98a699)

Updates `actions/attest` from 4.1.0 to 4.1.1
- [Release notes](https://github.com/actions/attest/releases)
- [Changelog](https://github.com/actions/attest/blob/main/RELEASE.md)
- [Commits](actions/attest@59d8942...a1948c3)

---
updated-dependencies:
- dependency-name: scientific-python/issue-from-pytest-log-action
  dependency-version: 1.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: j178/prek-action
  dependency-version: 2.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/attest
  dependency-version: 4.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps): bump the actions group across 1 directory with 8 updates (#176)

Bumps the actions group with 8 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [prefix-dev/setup-pixi](https://github.com/prefix-dev/setup-pixi) | `0.9.5` | `0.9.6` |
| [codecov/codecov-action](https://github.com/codecov/codecov-action) | `6.0.0` | `6.0.1` |
| [github/issue-metrics](https://github.com/github/issue-metrics) | `4.2.2` | `4.2.7` |
| [j178/prek-action](https://github.com/j178/prek-action) | `2.0.3` | `2.0.4` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.0` | `7.0.1` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `7.0.0` | `8.0.1` |
| [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) | `1.13.0` | `1.14.0` |
| [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) | `0.5.3` | `0.5.6` |



Updates `prefix-dev/setup-pixi` from 0.9.5 to 0.9.6
- [Release notes](https://github.com/prefix-dev/setup-pixi/releases)
- [Commits](prefix-dev/setup-pixi@1b2de7f...5185adf)

Updates `codecov/codecov-action` from 6.0.0 to 6.0.1
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](codecov/codecov-action@57e3a13...e79a696)

Updates `github/issue-metrics` from 4.2.2 to 4.2.7
- [Release notes](https://github.com/github/issue-metrics/releases)
- [Commits](github-community-projects/issue-metrics@c9e9838...1e38d5e)

Updates `j178/prek-action` from 2.0.3 to 2.0.4
- [Release notes](https://github.com/j178/prek-action/releases)
- [Commits](j178/prek-action@6ad8027...bdca6f1)

Updates `actions/upload-artifact` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v7...043fb46)

Updates `actions/download-artifact` from 7.0.0 to 8.0.1
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v7...3e5f45b)

Updates `pypa/gh-action-pypi-publish` from 1.13.0 to 1.14.0
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](pypa/gh-action-pypi-publish@v1.13.0...cef2210)

Updates `zizmorcore/zizmor-action` from 0.5.3 to 0.5.6
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](zizmorcore/zizmor-action@b1d7e1f...5f14fd0)

---
updated-dependencies:
- dependency-name: prefix-dev/setup-pixi
  dependency-version: 0.9.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: github/issue-metrics
  dependency-version: 4.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: j178/prek-action
  dependency-version: 2.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: pypa/gh-action-pypi-publish
  dependency-version: 1.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.5.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* ci: stop dependabot updates targeting support/v2

The support/v2 branch's CI is failing for reasons unrelated to actions
bumps (numpy 2.5 deprecation, Windows azurite SSL errors, RTD build),
so the weekly dependabot PRs against it are pure noise. Remove the
target-branch entry so dependabot only tracks main.

Assisted-by: ClaudeCode:claude-fable-5

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…rr-developers#4132)

* chore(deps): bump the actions group across 1 directory with 8 updates (#176)

Bumps the actions group with 8 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [prefix-dev/setup-pixi](https://github.com/prefix-dev/setup-pixi) | `0.9.5` | `0.9.6` |
| [codecov/codecov-action](https://github.com/codecov/codecov-action) | `6.0.0` | `6.0.1` |
| [github/issue-metrics](https://github.com/github/issue-metrics) | `4.2.2` | `4.2.7` |
| [j178/prek-action](https://github.com/j178/prek-action) | `2.0.3` | `2.0.4` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.0` | `7.0.1` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `7.0.0` | `8.0.1` |
| [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) | `1.13.0` | `1.14.0` |
| [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) | `0.5.3` | `0.5.6` |



Updates `prefix-dev/setup-pixi` from 0.9.5 to 0.9.6
- [Release notes](https://github.com/prefix-dev/setup-pixi/releases)
- [Commits](prefix-dev/setup-pixi@1b2de7f...5185adf)

Updates `codecov/codecov-action` from 6.0.0 to 6.0.1
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](codecov/codecov-action@57e3a13...e79a696)

Updates `github/issue-metrics` from 4.2.2 to 4.2.7
- [Release notes](https://github.com/github/issue-metrics/releases)
- [Commits](github-community-projects/issue-metrics@c9e9838...1e38d5e)

Updates `j178/prek-action` from 2.0.3 to 2.0.4
- [Release notes](https://github.com/j178/prek-action/releases)
- [Commits](j178/prek-action@6ad8027...bdca6f1)

Updates `actions/upload-artifact` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v7...043fb46)

Updates `actions/download-artifact` from 7.0.0 to 8.0.1
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v7...3e5f45b)

Updates `pypa/gh-action-pypi-publish` from 1.13.0 to 1.14.0
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](pypa/gh-action-pypi-publish@v1.13.0...cef2210)

Updates `zizmorcore/zizmor-action` from 0.5.3 to 0.5.6
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](zizmorcore/zizmor-action@b1d7e1f...5f14fd0)

---
updated-dependencies:
- dependency-name: prefix-dev/setup-pixi
  dependency-version: 0.9.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: github/issue-metrics
  dependency-version: 4.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: j178/prek-action
  dependency-version: 2.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: pypa/gh-action-pypi-publish
  dependency-version: 1.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.5.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* docs: fix errors and improve consistency across the documentation

A full review of the documentation, verified by executing every runnable
snippet against the current source. Highlights:

Correctness:
- performance.md: fix three claims contradicted by the page's own rendered
  output (memory-order/compression, inverted write_empty_chunks conclusion,
  wrong async.concurrency and threading.max_workers defaults); update stale
  MemoryStore pickle claim
- Make three invisible exec blocks visible (rectilinear enable snippet in
  arrays.md, two config snippets in performance.md)
- storage.md: fix the explicit-S3-filesystem example (endpoint_url misuse,
  missing bucket path)
- config.md: show true defaults (earlier example no longer leaks array.order
  into the session); fix codecs.bytes key
- arrays.md: document all five ArrayConfig options; correct memory:// store
  description; fix wrong column-index comments; remove orphaned example
- v3_migration.md: remove Group.move and dimension_separator from
  not-yet-ported lists (both work); fix truncated store table row; update
  lapsed 2.x support-window and stale work-in-progress framing
- cli.md: document the required cli extra; fix dry-run output; name the
  equivalent functions in zarr.metadata.migrate_v3
- installation.md: correct typing_extensions minimum; document all optional
  dependency groups (remote, gpu, cli, optional, cast-value-rs)
- gpu.md: fix nonexistent zarr.Config.enable_gpu; add installation guidance
- contributing.md: fix docs build output dir and serve URL; drop outdated
  doctest note
- extending.md: custom data types are supported now, not future work
- data_types.md: remove stray doctest output from a source block; use public
  zarr.dtype import; drop dead warnings-suppression boilerplate
- quick-start.md: fix result="html" on a Python-repr output block

Usability:
- Reorder the user-guide nav into a beginner-to-advanced progression
- quick-start.md: add H1 and heading hierarchy, remote-storage install note,
  and a Next steps section
- user-guide/index.md: list the CLI, experimental, and examples pages
- groups.md: explain group/create_group/open_group; document member
  enumeration and deletion
- attributes.md: document bulk updates via update_attributes and deletion
- consolidated_metadata.md: document the public use_consolidated knob
- glossary.md: add Group, Attributes, and Consolidated Metadata entries;
  cover v2 metadata documents
- Add cross-links between related pages throughout; replace "Coming soon"
  stubs with links to existing content
- experimental.md: nest CacheStore sections properly; link the experimental
  API policy
- release-notes.md: normalize version headings and dates

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: add changelog fragment for zarr-developers#4132

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: standardize on American spelling (behaviour -> behavior)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: render test="true" and exec="false" fences as code blocks

Markdown Exec's superfences fence only claims exec="true" blocks. Fences
carrying the repo's other validation markers (test="true", exec="false")
failed superfences validation entirely and their contents spilled into the
page as raw markdown -- most visibly the custom dtype example, where the
included script's PEP 723 header rendered as a series of headings. The GPU
page, the quick-start S3 example, and the exec="false" opt-out blocks were
equally affected.

Add an MkDocs hook that registers a second python fence, tried when
Markdown Exec's declines, which strips the validation attributes and
delegates to the standard superfences highlighter.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: convert rectilinear chunks notebook to a markdown example page

The notebook rendered oddly via mkdocs-jupyter: the PEP 723 dependency
header appeared as the first code cell, a bare ConfigSet repr leaked into
the output, and the page styling did not match the rest of the site. Since
the example cannot execute at build time anyway (it requires an xarray
fork with rectilinear chunk grid support plus remote data), convert it to
a markdown page in the same style as the custom dtype example, with the
captured outputs shown as static blocks and an admonition explaining the
requirements.

The page URL is unchanged. With no notebooks left in the docs, also drop
the mkdocs-jupyter plugin and dependency.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: shorten custom dtype example title to "Custom Data Type"

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: restructure API reference nav to distinguish classes from modules

The API nav was a flat list whose labels came from each page's first
mkdocstrings heading, mixing classes (Array), modules (codecs), and
function groups (create) with no visual distinction, plus accidental
labels like a title-cased Cpu, two literal Index entries, and an API
section nested under API Reference.

Group the nav into Classes / Functions / Modules with explicit titles:
classes as zarr.Array and zarr.Group, function pages as Creating/Opening/
Saving/Loading, and modules by their dotted import path (zarr.storage,
zarr.abc.store, ...), so the naming convention itself distinguishes the
kinds. Also give the four subpackage index pages consistent titles. Page
URLs are unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: flatten API reference nav with kind annotations

Users browsing the API reference don't know in advance whether the thing
they want is a class, function, or module, so grouping the nav by kind
made them guess. Flatten the list back and annotate each entry with its
kind instead: zarr.Array (class), Creating (functions), zarr.storage
(module). Nesting is kept only where it means containment (the abc, api,
buffer, and testing subpackages); their children are unannotated since
context makes them modules.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: use bare function-page names from main in the API nav

create/open/save/load, as on main, rather than invented verb labels;
the (functions) annotation carries the kind.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: render API nav identifiers in monospace

Material passes nav titles through as HTML, so wrap the identifier part
of each API reference nav label in <code>, keeping the (class)/(functions)/
(module) annotations in regular type. Verified the HTML is not escaped in
the sidebar, is stripped from the browser <title>, and behaves in search
like any backticked heading.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: one API nav entry per function, mirroring the flat zarr namespace

The create/open/save/load pages grouped functions by verb, an organization
that doesn't exist in the codebase -- all of these are top-level names in
the flat zarr namespace. Replace them with one page and one nav entry per
function (zarr.create_array, zarr.open_group, ...), alphabetized case-
insensitively alongside the classes and modules, so zarr.Array (class)
sits next to zarr.array (function).

This also adds previously undocumented public functions to the API
reference: zarr.consolidate_metadata and zarr.print_debug_info. The
unimplemented copy/copy_all/copy_store stubs and the deprecated zarr.tree
are deliberately excluded. Old create/open/save/load URLs redirect to
representative function pages.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: use mkdocstrings symbol badges for kind annotations in API nav

The spelled-out (function)/(module)/(class) annotations made 8 of 41
monospace nav entries wrap to two lines. Replace them with the compact
func/mod/class doc-symbol badges that mkdocstrings already renders in
every page's table of contents, joined to the name with a non-breaking
space so badge and name never separate. Verified in the rendered site:
no wrapped entries, badge CSS loads globally, and function-page titles
render as e.g. 'func zarr.open_group'.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…-developers#4138)

* chore(deps): bump the actions group across 1 directory with 8 updates (#176)

Bumps the actions group with 8 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [prefix-dev/setup-pixi](https://github.com/prefix-dev/setup-pixi) | `0.9.5` | `0.9.6` |
| [codecov/codecov-action](https://github.com/codecov/codecov-action) | `6.0.0` | `6.0.1` |
| [github/issue-metrics](https://github.com/github/issue-metrics) | `4.2.2` | `4.2.7` |
| [j178/prek-action](https://github.com/j178/prek-action) | `2.0.3` | `2.0.4` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.0` | `7.0.1` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `7.0.0` | `8.0.1` |
| [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) | `1.13.0` | `1.14.0` |
| [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) | `0.5.3` | `0.5.6` |



Updates `prefix-dev/setup-pixi` from 0.9.5 to 0.9.6
- [Release notes](https://github.com/prefix-dev/setup-pixi/releases)
- [Commits](prefix-dev/setup-pixi@1b2de7f...5185adf)

Updates `codecov/codecov-action` from 6.0.0 to 6.0.1
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](codecov/codecov-action@57e3a13...e79a696)

Updates `github/issue-metrics` from 4.2.2 to 4.2.7
- [Release notes](https://github.com/github/issue-metrics/releases)
- [Commits](github-community-projects/issue-metrics@c9e9838...1e38d5e)

Updates `j178/prek-action` from 2.0.3 to 2.0.4
- [Release notes](https://github.com/j178/prek-action/releases)
- [Commits](j178/prek-action@6ad8027...bdca6f1)

Updates `actions/upload-artifact` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v7...043fb46)

Updates `actions/download-artifact` from 7.0.0 to 8.0.1
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v7...3e5f45b)

Updates `pypa/gh-action-pypi-publish` from 1.13.0 to 1.14.0
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](pypa/gh-action-pypi-publish@v1.13.0...cef2210)

Updates `zizmorcore/zizmor-action` from 0.5.3 to 0.5.6
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](zizmorcore/zizmor-action@b1d7e1f...5f14fd0)

---
updated-dependencies:
- dependency-name: prefix-dev/setup-pixi
  dependency-version: 0.9.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: github/issue-metrics
  dependency-version: 4.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: j178/prek-action
  dependency-version: 2.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: pypa/gh-action-pypi-publish
  dependency-version: 1.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.5.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* test: pass a list, not a generator, to parametrize in test_docs

pytest 9.1 deprecated passing a non-Collection iterable to
@pytest.mark.parametrize (PytestRemovedIn10Warning). find_examples()
returns a generator, and with filterwarnings=error that deprecation
becomes a hard collection error, breaking the doctests env under
pytest 9.1.1 (e.g. the zarr-developers#4137 dependency bump). Materialize it to a
list, matching the existing list(find_examples(...)) usage elsewhere
in this module.

Assisted-by: ClaudeCode:claude-opus-4-8

* doc: add changelog fragment for test_docs parametrize fix

Assisted-by: ClaudeCode:claude-opus-4-8

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…velopers#3984)

* docs: clarify difference between load and open in docstrings

* docs: add changelog entry for load/open clarification

* docs: rename changelog entry to match PR number

* docs: clarify load returns configured buffer prototype, not always NumPy

Signed-off-by: Sai Asish Y <say.apm35@gmail.com>

---------

Signed-off-by: Sai Asish Y <say.apm35@gmail.com>
Co-authored-by: Davis Bennett <davis.v.bennett@gmail.com>
Adopt pytest 9's `strict = true` config option, which enables
strict_config, strict_markers, strict_xfail, strict_parametrization_ids,
and future strictness options. This replaces the --strict-config and
--strict-markers addopts flags (which pytest silently ignored when
passed via addopts before 9.1, pytest#14442) and the separate
xfail_strict setting. minversion is bumped to 9 accordingly.

strict_parametrization_ids surfaced seven parametrizations whose ids
collided, which pytest previously deduplicated silently:

- test_common.py paired float("inf") with np.inf (and -inf/nan), but
  np.inf IS a Python float, so three cases per test ran twice and the
  intended numpy-scalar coverage did not exist. Use np.float64 scalars
  with explicit ids, restoring the intended coverage.
- test_int.py deliberately includes np.dtype("i")/np.dtype("I"),
  which compare equal to one of the explicit-endian dtypes and
  stringify identically. The class-fixture hook in test_dtype/conftest
  now suffixes colliding ids with their index instead of relying on
  pytest's silent deduplication.
- test_group.py test_consistent_signatures id'd both create_hierarchy
  pairs identically; ids now include module and qualname.
- test_array.py ("a" vs b"a"), test_vlen.py (str vs "str"), and
  test_metadata/test_v2.py (3 vs "3") get explicit ids for the
  colliding member.

Assisted-by: ClaudeCode:claude-fable-5
Assisted-by: ClaudeCode:claude-fable-5
d-v-b and others added 3 commits July 10, 2026 14:34
Set faulthandler_timeout=600 with faulthandler_exit_on_timeout (new in
pytest 9): if a single test exceeds 10 minutes, every thread's
traceback is dumped and the run is killed, instead of hanging
indefinitely with no diagnostics. Motivated by the moto fixed-port
deadlock, which hung local -n auto runs at ~98% for hours and required
manual kill -ABRT forensics to diagnose; with this watchdog the same
bug would have failed in 10 minutes with the offending stack in the
log. The ceiling is ~30x the slowest legitimate test (~20s locally) to
stay clear of slow CI runners, coverage overhead, and nightly stateful
hypothesis runs.

Assisted-by: ClaudeCode:claude-fable-5
…th 13 updates (zarr-developers#4137)

Bumps the python-dependencies group with 12 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [numpy](https://github.com/numpy/numpy) | `2.4.6` | `2.5.0` |
| [typing-extensions](https://github.com/python/typing_extensions) | `4.15.0` | `4.16.0` |
| [fsspec](https://github.com/fsspec/filesystem_spec) | `2026.4.0` | `2026.6.0` |
| [obstore](https://github.com/geospatial-jeff/pyasyncio-benchmark) | `0.10.1` | `0.11.0` |
| [typer](https://github.com/fastapi/typer) | `0.26.7` | `0.26.8` |
| [coverage](https://github.com/coveragepy/coveragepy) | `7.14.1` | `7.14.3` |
| [pytest](https://github.com/pytest-dev/pytest) | `9.0.3` | `9.1.1` |
| [pytest-accept](https://github.com/max-sixty/pytest-accept) | `0.2.3` | `0.3.0` |
| [hypothesis](https://github.com/HypothesisWorks/hypothesis) | `6.155.2` | `6.155.7` |
| [uv](https://github.com/astral-sh/uv) | `0.11.20` | `0.11.26` |
| [mkdocstrings-python](https://github.com/mkdocstrings/python) | `2.0.4` | `2.0.5` |
| [ruff](https://github.com/astral-sh/ruff) | `0.15.16` | `0.15.20` |



Updates `numpy` from 2.4.6 to 2.5.0
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](numpy/numpy@v2.4.6...v2.5.0)

Updates `typing-extensions` from 4.15.0 to 4.16.0
- [Release notes](https://github.com/python/typing_extensions/releases)
- [Changelog](https://github.com/python/typing_extensions/blob/main/CHANGELOG.md)
- [Commits](python/typing_extensions@4.15.0...4.16.0)

Updates `fsspec` from 2026.4.0 to 2026.6.0
- [Commits](fsspec/filesystem_spec@2026.4.0...2026.6.0)

Updates `obstore` from 0.10.1 to 0.11.0
- [Commits](https://github.com/geospatial-jeff/pyasyncio-benchmark/commits)

Updates `typer` from 0.26.7 to 0.26.8
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](fastapi/typer@0.26.7...0.26.8)

Updates `coverage` from 7.14.1 to 7.14.3
- [Release notes](https://github.com/coveragepy/coveragepy/releases)
- [Changelog](https://github.com/coveragepy/coveragepy/blob/main/CHANGES.rst)
- [Commits](coveragepy/coveragepy@7.14.1...7.14.3)

Updates `pytest` from 9.0.3 to 9.1.1
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](pytest-dev/pytest@9.0.3...9.1.1)

Updates `pytest-accept` from 0.2.3 to 0.3.0
- [Release notes](https://github.com/max-sixty/pytest-accept/releases)
- [Changelog](https://github.com/max-sixty/pytest-accept/blob/main/CHANGELOG.md)
- [Commits](max-sixty/pytest-accept@0.2.3...0.3.0)

Updates `hypothesis` from 6.155.2 to 6.155.7
- [Release notes](https://github.com/HypothesisWorks/hypothesis/releases)
- [Commits](HypothesisWorks/hypothesis@v6.155.2...v6.155.7)

Updates `uv` from 0.11.20 to 0.11.26
- [Release notes](https://github.com/astral-sh/uv/releases)
- [Changelog](https://github.com/astral-sh/uv/blob/main/CHANGELOG.md)
- [Commits](astral-sh/uv@0.11.20...0.11.26)

Updates `s3fs` from 2026.4.0 to 2026.6.0
- [Changelog](https://github.com/fsspec/s3fs/blob/main/release-procedure.md)
- [Commits](https://github.com/fsspec/s3fs/commits)

Updates `mkdocstrings-python` from 2.0.4 to 2.0.5
- [Release notes](https://github.com/mkdocstrings/python/releases)
- [Changelog](https://github.com/mkdocstrings/python/blob/main/CHANGELOG.md)
- [Commits](mkdocstrings/python@2.0.4...2.0.5)

Updates `ruff` from 0.15.16 to 0.15.20
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](astral-sh/ruff@0.15.16...0.15.20)

---
updated-dependencies:
- dependency-name: numpy
  dependency-version: 2.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python-dependencies
- dependency-name: typing-extensions
  dependency-version: 4.16.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python-dependencies
- dependency-name: fsspec
  dependency-version: 2026.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python-dependencies
- dependency-name: obstore
  dependency-version: 0.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python-dependencies
- dependency-name: typer
  dependency-version: 0.26.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python-dependencies
- dependency-name: coverage
  dependency-version: 7.14.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python-dependencies
- dependency-name: pytest
  dependency-version: 9.1.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python-dependencies
- dependency-name: pytest-accept
  dependency-version: 0.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python-dependencies
- dependency-name: hypothesis
  dependency-version: 6.155.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python-dependencies
- dependency-name: uv
  dependency-version: 0.11.26
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python-dependencies
- dependency-name: s3fs
  dependency-version: 2026.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python-dependencies
- dependency-name: mkdocstrings-python
  dependency-version: 2.0.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python-dependencies
- dependency-name: ruff
  dependency-version: 0.15.20
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Davis Bennett <davis.v.bennett@gmail.com>
…rr-developers#4139)

* chore(deps): bump the actions group across 1 directory with 8 updates (#176)

Bumps the actions group with 8 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [prefix-dev/setup-pixi](https://github.com/prefix-dev/setup-pixi) | `0.9.5` | `0.9.6` |
| [codecov/codecov-action](https://github.com/codecov/codecov-action) | `6.0.0` | `6.0.1` |
| [github/issue-metrics](https://github.com/github/issue-metrics) | `4.2.2` | `4.2.7` |
| [j178/prek-action](https://github.com/j178/prek-action) | `2.0.3` | `2.0.4` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.0` | `7.0.1` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `7.0.0` | `8.0.1` |
| [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) | `1.13.0` | `1.14.0` |
| [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) | `0.5.3` | `0.5.6` |



Updates `prefix-dev/setup-pixi` from 0.9.5 to 0.9.6
- [Release notes](https://github.com/prefix-dev/setup-pixi/releases)
- [Commits](prefix-dev/setup-pixi@1b2de7f...5185adf)

Updates `codecov/codecov-action` from 6.0.0 to 6.0.1
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](codecov/codecov-action@57e3a13...e79a696)

Updates `github/issue-metrics` from 4.2.2 to 4.2.7
- [Release notes](https://github.com/github/issue-metrics/releases)
- [Commits](github-community-projects/issue-metrics@c9e9838...1e38d5e)

Updates `j178/prek-action` from 2.0.3 to 2.0.4
- [Release notes](https://github.com/j178/prek-action/releases)
- [Commits](j178/prek-action@6ad8027...bdca6f1)

Updates `actions/upload-artifact` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v7...043fb46)

Updates `actions/download-artifact` from 7.0.0 to 8.0.1
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v7...3e5f45b)

Updates `pypa/gh-action-pypi-publish` from 1.13.0 to 1.14.0
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](pypa/gh-action-pypi-publish@v1.13.0...cef2210)

Updates `zizmorcore/zizmor-action` from 0.5.3 to 0.5.6
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](zizmorcore/zizmor-action@b1d7e1f...5f14fd0)

---
updated-dependencies:
- dependency-name: prefix-dev/setup-pixi
  dependency-version: 0.9.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: github/issue-metrics
  dependency-version: 4.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: j178/prek-action
  dependency-version: 2.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: pypa/gh-action-pypi-publish
  dependency-version: 1.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.5.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* test: bind moto server to an ephemeral port to fix xdist deadlock

The session-scoped moto_server fixture bound a fixed port (5555). Under
pytest-xdist, session-scoped fixtures run once per worker, so concurrent
workers raced to bind the same port. The losers blocked forever inside
ThreadedMotoServer.start(): its werkzeug thread dies on "Address already
in use" before setting the ready event that start() waits on, and the
wait has no timeout. Any multi-worker run whose s3 tests landed on 2+
workers deadlocked near the end of the suite at 0% CPU. CI never saw
this because it runs the suite single-process.

Bind port 0 instead and yield the actual endpoint from the fixture.
Since the endpoint is now only known at runtime, test_fsspec.py's
module-level endpoint_url constant becomes an endpoint_url fixture
(replacing the s3_base alias), and its consumers take it as a
parameter.

With this fix the full suite completes in ~1 minute under -n auto on a
10-core machine, where it previously hung indefinitely.

Assisted-by: ClaudeCode:claude-fable-5

* doc: add changelog fragment for moto ephemeral-port fix

Assisted-by: ClaudeCode:claude-fable-5

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants