rustytree-xarray 0.1.0__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/CHANGELOG.md +54 -1
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/Cargo.lock +1 -1
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/Cargo.toml +1 -1
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/PKG-INFO +20 -3
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/README.md +19 -2
- rustytree_xarray-0.2.0/assets/logo-banner-dark.png +0 -0
- rustytree_xarray-0.2.0/assets/logo-banner-dark.svg +25 -0
- rustytree_xarray-0.2.0/assets/logo-banner-light.png +0 -0
- rustytree_xarray-0.2.0/assets/logo-banner-light.svg +25 -0
- rustytree_xarray-0.2.0/assets/logo.png +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/docs/release-process.md +11 -3
- rustytree_xarray-0.2.0/notebooks/klot_demo.ipynb +5386 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/pyproject.toml +1 -1
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/python/rustytree/__init__.py +1 -1
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/python/rustytree/backend.py +94 -4
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_backend_entrypoint.py +236 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_phase1_scaffold.py +1 -1
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_to_rust_source.py +13 -0
- rustytree_xarray-0.1.0/notebooks/klot_demo.ipynb +0 -4118
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/.github/workflows/ci.yml +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/.github/workflows/release.yml +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/.gitignore +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/LICENSE +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/docs/architecture.md +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/docs/contributing.md +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/docs/usage.md +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/python/rustytree/_array.py +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/array.rs +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/dtype_dispatch.rs +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/error.rs +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/glob.rs +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/icechunk_store.rs +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/lib.rs +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/node.rs +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/runtime.rs +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/store.rs +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/url.rs +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/walk.rs +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/conftest.py +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_chunks.py +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_eager_fetch.py +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_icechunk.py +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_lazy.py +0 -0
- {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_walk.py +0 -0
|
@@ -11,6 +11,58 @@ release, that section is renamed to `[x.y.z] - YYYY-MM-DD` and a fresh
|
|
|
11
11
|
|
|
12
12
|
## [Unreleased]
|
|
13
13
|
|
|
14
|
+
## [0.2.0] - 2026-05-08
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- `include_ancestor_coords=True` against an icechunk Session/Store now
|
|
19
|
+
serialises the session snapshot exactly once, instead of once per
|
|
20
|
+
ancestor. Fixes #34 — addresses the audit finding from #33 that
|
|
21
|
+
each `self.open_dataset(...)` call in the ancestor-merge loop was
|
|
22
|
+
re-running `session.as_bytes()`. `_to_rust_source` short-circuits
|
|
23
|
+
on `bytes` input, and `open_datatree` threads its already-serialised
|
|
24
|
+
`source` through the loop. Behaviour-only refactor; measured saving
|
|
25
|
+
is small (~8 µs per depth-2 call against local KLOT, snapshot
|
|
26
|
+
size 600 B), so this is mostly a code-hygiene fix.
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
|
|
30
|
+
- `include_ancestor_coords=True` (default) on
|
|
31
|
+
`xr.open_datatree(..., engine="rustytree", group=...)` for literal
|
|
32
|
+
group paths. Promotes ancestor group datasets into the new root so
|
|
33
|
+
`latitude`/`longitude`/`altitude` (and any other ancestor-level
|
|
34
|
+
coords/vars) are present after a subtree open — matches what users
|
|
35
|
+
get from a full-tree open + slice with
|
|
36
|
+
`inherit="all_coords"`. Glob mode (`group="*/sweep_0"`) is unchanged
|
|
37
|
+
(already correct via `_filter_by_glob`). Set to `False` to keep the
|
|
38
|
+
pre-flag orphaned-subtree behavior.
|
|
39
|
+
|
|
40
|
+
- Logo + README header. New `assets/logo.png` (transparent icon) and a
|
|
41
|
+
light/dark banner pair (`assets/logo-banner-{light,dark}.png` plus
|
|
42
|
+
SVG sources). README replaces the `# rustytree` heading with a
|
|
43
|
+
`<picture>` tag that auto-switches between light and dark variants
|
|
44
|
+
via `prefers-color-scheme`. Palette aligns with the AtmoScale brand
|
|
45
|
+
(cyan `#00D4FF`, deep navy `#0F1724`) with rust-orange tip accents
|
|
46
|
+
on the chunked-cube tree icon. All text passes WCAG AAA on its
|
|
47
|
+
intended background.
|
|
48
|
+
|
|
49
|
+
- Status badges in the README: CI status, PyPI version, supported
|
|
50
|
+
Python versions, and license — all clickable to the relevant page.
|
|
51
|
+
|
|
52
|
+
### Fixed
|
|
53
|
+
|
|
54
|
+
- Accept `zarr_format` and `consolidated` kwargs in
|
|
55
|
+
`xr.open_datatree(..., engine="rustytree")` and
|
|
56
|
+
`xr.open_dataset(..., engine="rustytree")`. Previously the entrypoint
|
|
57
|
+
raised `TypeError: unexpected keyword argument` because the kwargs
|
|
58
|
+
weren't declared. They're now declared on both methods and validated:
|
|
59
|
+
v3-implying values (`zarr_format=3` / `None`, `consolidated=False` /
|
|
60
|
+
`None`) pass through silently; v2-implying values (`zarr_format=2`
|
|
61
|
+
or any non-3 int, `consolidated=True`) raise
|
|
62
|
+
`NotImplementedError` pointing the user at `engine="zarr"`. rustytree
|
|
63
|
+
currently supports Zarr v3 only; the icechunk snapshot plays the
|
|
64
|
+
consolidated-metadata role for icechunk repos.
|
|
65
|
+
|
|
14
66
|
## [0.1.0] - 2026-05-05
|
|
15
67
|
|
|
16
68
|
First tagged release. The engine is end-to-end usable against
|
|
@@ -468,7 +520,8 @@ below.
|
|
|
468
520
|
intentionally not normalized — relative-vs-absolute glob
|
|
469
521
|
semantics differ in `PurePosixPath.match`.
|
|
470
522
|
|
|
471
|
-
[Unreleased]: https://github.com/aladinor/rustytree/compare/v0.
|
|
523
|
+
[Unreleased]: https://github.com/aladinor/rustytree/compare/v0.2.0...HEAD
|
|
524
|
+
[0.2.0]: https://github.com/aladinor/rustytree/compare/v0.1.0...v0.2.0
|
|
472
525
|
[0.1.0]: https://github.com/aladinor/rustytree/releases/tag/v0.1.0
|
|
473
526
|
[#1]: https://github.com/aladinor/rustytree/pull/1
|
|
474
527
|
[#3]: https://github.com/aladinor/rustytree/pull/3
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rustytree-xarray
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Classifier: Development Status :: 3 - Alpha
|
|
5
5
|
Classifier: Intended Audience :: Science/Research
|
|
6
6
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
@@ -27,9 +27,15 @@ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
|
27
27
|
Project-URL: Homepage, https://github.com/aladinor/rustytree
|
|
28
28
|
Project-URL: Repository, https://github.com/aladinor/rustytree
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
<picture>
|
|
31
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/logo-banner-dark.png">
|
|
32
|
+
<img src="assets/logo-banner-light.png" alt="rustytree — Rust-backed xarray DataTree backend" width="720">
|
|
33
|
+
</picture>
|
|
31
34
|
|
|
32
|
-
|
|
35
|
+
[](https://github.com/aladinor/rustytree/actions/workflows/ci.yml)
|
|
36
|
+
[](https://pypi.org/project/rustytree-xarray/)
|
|
37
|
+
[](https://pypi.org/project/rustytree-xarray/)
|
|
38
|
+
[](https://github.com/aladinor/rustytree/blob/main/LICENSE)
|
|
33
39
|
|
|
34
40
|
`rustytree` registers as `xr.open_datatree(engine="rustytree")` and walks Zarr
|
|
35
41
|
v3 hierarchies — both icechunk-backed and vanilla — concurrently in async
|
|
@@ -48,6 +54,17 @@ inference), the recursive multi-node walk, glob `group=` filtering, and
|
|
|
48
54
|
non-recursive single-Dataset opens are all in. See
|
|
49
55
|
[`CHANGELOG.md`](CHANGELOG.md) for the per-PR breakdown.
|
|
50
56
|
|
|
57
|
+
## Compatibility
|
|
58
|
+
|
|
59
|
+
| Surface | Supported | Not supported |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| **Zarr format** | v3 only | v2 — passing `zarr_format=2` or `consolidated=True` raises `NotImplementedError`; use stock `engine="zarr"` for v2 stores |
|
|
62
|
+
| **icechunk** | `icechunk>=2.0` (the current major) | older icechunk releases |
|
|
63
|
+
| **Python** | 3.12, 3.13 | older versions |
|
|
64
|
+
| **Platforms** | manylinux x86_64, manylinux aarch64, macOS arm64 (wheels); other platforms via sdist | Windows / macOS Intel / linux musl wheels (build from source via sdist) |
|
|
65
|
+
|
|
66
|
+
## Install
|
|
67
|
+
|
|
51
68
|
Install from PyPI (the import name stays `rustytree`; the
|
|
52
69
|
distribution name on PyPI is `rustytree-xarray` because `rustytree`
|
|
53
70
|
collides with an unrelated dormant package):
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
<picture>
|
|
2
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/logo-banner-dark.png">
|
|
3
|
+
<img src="assets/logo-banner-light.png" alt="rustytree — Rust-backed xarray DataTree backend" width="720">
|
|
4
|
+
</picture>
|
|
2
5
|
|
|
3
|
-
|
|
6
|
+
[](https://github.com/aladinor/rustytree/actions/workflows/ci.yml)
|
|
7
|
+
[](https://pypi.org/project/rustytree-xarray/)
|
|
8
|
+
[](https://pypi.org/project/rustytree-xarray/)
|
|
9
|
+
[](https://github.com/aladinor/rustytree/blob/main/LICENSE)
|
|
4
10
|
|
|
5
11
|
`rustytree` registers as `xr.open_datatree(engine="rustytree")` and walks Zarr
|
|
6
12
|
v3 hierarchies — both icechunk-backed and vanilla — concurrently in async
|
|
@@ -19,6 +25,17 @@ inference), the recursive multi-node walk, glob `group=` filtering, and
|
|
|
19
25
|
non-recursive single-Dataset opens are all in. See
|
|
20
26
|
[`CHANGELOG.md`](CHANGELOG.md) for the per-PR breakdown.
|
|
21
27
|
|
|
28
|
+
## Compatibility
|
|
29
|
+
|
|
30
|
+
| Surface | Supported | Not supported |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| **Zarr format** | v3 only | v2 — passing `zarr_format=2` or `consolidated=True` raises `NotImplementedError`; use stock `engine="zarr"` for v2 stores |
|
|
33
|
+
| **icechunk** | `icechunk>=2.0` (the current major) | older icechunk releases |
|
|
34
|
+
| **Python** | 3.12, 3.13 | older versions |
|
|
35
|
+
| **Platforms** | manylinux x86_64, manylinux aarch64, macOS arm64 (wheels); other platforms via sdist | Windows / macOS Intel / linux musl wheels (build from source via sdist) |
|
|
36
|
+
|
|
37
|
+
## Install
|
|
38
|
+
|
|
22
39
|
Install from PyPI (the import name stays `rustytree`; the
|
|
23
40
|
distribution name on PyPI is `rustytree-xarray` because `rustytree`
|
|
24
41
|
collides with an unrelated dormant package):
|
|
Binary file
|