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.
Files changed (44) hide show
  1. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/CHANGELOG.md +54 -1
  2. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/Cargo.lock +1 -1
  3. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/Cargo.toml +1 -1
  4. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/PKG-INFO +20 -3
  5. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/README.md +19 -2
  6. rustytree_xarray-0.2.0/assets/logo-banner-dark.png +0 -0
  7. rustytree_xarray-0.2.0/assets/logo-banner-dark.svg +25 -0
  8. rustytree_xarray-0.2.0/assets/logo-banner-light.png +0 -0
  9. rustytree_xarray-0.2.0/assets/logo-banner-light.svg +25 -0
  10. rustytree_xarray-0.2.0/assets/logo.png +0 -0
  11. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/docs/release-process.md +11 -3
  12. rustytree_xarray-0.2.0/notebooks/klot_demo.ipynb +5386 -0
  13. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/pyproject.toml +1 -1
  14. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/python/rustytree/__init__.py +1 -1
  15. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/python/rustytree/backend.py +94 -4
  16. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_backend_entrypoint.py +236 -0
  17. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_phase1_scaffold.py +1 -1
  18. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_to_rust_source.py +13 -0
  19. rustytree_xarray-0.1.0/notebooks/klot_demo.ipynb +0 -4118
  20. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/.github/workflows/ci.yml +0 -0
  21. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/.github/workflows/release.yml +0 -0
  22. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/.gitignore +0 -0
  23. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/LICENSE +0 -0
  24. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/docs/architecture.md +0 -0
  25. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/docs/contributing.md +0 -0
  26. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/docs/usage.md +0 -0
  27. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/python/rustytree/_array.py +0 -0
  28. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/array.rs +0 -0
  29. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/dtype_dispatch.rs +0 -0
  30. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/error.rs +0 -0
  31. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/glob.rs +0 -0
  32. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/icechunk_store.rs +0 -0
  33. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/lib.rs +0 -0
  34. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/node.rs +0 -0
  35. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/runtime.rs +0 -0
  36. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/store.rs +0 -0
  37. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/url.rs +0 -0
  38. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/src/walk.rs +0 -0
  39. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/conftest.py +0 -0
  40. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_chunks.py +0 -0
  41. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_eager_fetch.py +0 -0
  42. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_icechunk.py +0 -0
  43. {rustytree_xarray-0.1.0 → rustytree_xarray-0.2.0}/tests/test_lazy.py +0 -0
  44. {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.1.0...HEAD
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
@@ -3346,7 +3346,7 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
3346
3346
 
3347
3347
  [[package]]
3348
3348
  name = "rustytree"
3349
- version = "0.1.0"
3349
+ version = "0.2.0"
3350
3350
  dependencies = [
3351
3351
  "futures",
3352
3352
  "icechunk",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rustytree"
3
- version = "0.1.0"
3
+ version = "0.2.0"
4
4
  edition = "2024"
5
5
  rust-version = "1.91.1"
6
6
  license = "Apache-2.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rustytree-xarray
3
- Version: 0.1.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
- # rustytree
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
- > Rust-backed xarray DataTree backend for fast Zarr (incl. icechunk) access from object storage.
35
+ [![CI](https://github.com/aladinor/rustytree/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/aladinor/rustytree/actions/workflows/ci.yml)
36
+ [![PyPI version](https://img.shields.io/pypi/v/rustytree-xarray.svg)](https://pypi.org/project/rustytree-xarray/)
37
+ [![Python versions](https://img.shields.io/pypi/pyversions/rustytree-xarray.svg)](https://pypi.org/project/rustytree-xarray/)
38
+ [![License](https://img.shields.io/pypi/l/rustytree-xarray.svg)](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
- # rustytree
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
- > Rust-backed xarray DataTree backend for fast Zarr (incl. icechunk) access from object storage.
6
+ [![CI](https://github.com/aladinor/rustytree/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/aladinor/rustytree/actions/workflows/ci.yml)
7
+ [![PyPI version](https://img.shields.io/pypi/v/rustytree-xarray.svg)](https://pypi.org/project/rustytree-xarray/)
8
+ [![Python versions](https://img.shields.io/pypi/pyversions/rustytree-xarray.svg)](https://pypi.org/project/rustytree-xarray/)
9
+ [![License](https://img.shields.io/pypi/l/rustytree-xarray.svg)](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):