oxihipo 0.1.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 (136) hide show
  1. oxihipo-0.1.0/.github/workflows/ci.yml +38 -0
  2. oxihipo-0.1.0/.github/workflows/docs.yml +69 -0
  3. oxihipo-0.1.0/.github/workflows/wheels.yml +181 -0
  4. oxihipo-0.1.0/.gitignore +37 -0
  5. oxihipo-0.1.0/CHANGELOG.md +46 -0
  6. oxihipo-0.1.0/Cargo.lock +634 -0
  7. oxihipo-0.1.0/Cargo.toml +75 -0
  8. oxihipo-0.1.0/LICENSE +21 -0
  9. oxihipo-0.1.0/PKG-INFO +295 -0
  10. oxihipo-0.1.0/README.md +389 -0
  11. oxihipo-0.1.0/RELEASING.md +75 -0
  12. oxihipo-0.1.0/docs/compression-benchmark.typ +508 -0
  13. oxihipo-0.1.0/examples/bench_columns.rs +60 -0
  14. oxihipo-0.1.0/examples/bench_decoders.rs +271 -0
  15. oxihipo-0.1.0/examples/bench_event_tags.rs +170 -0
  16. oxihipo-0.1.0/examples/bench_par.rs +87 -0
  17. oxihipo-0.1.0/examples/bench_read_compression.rs +407 -0
  18. oxihipo-0.1.0/examples/bench_scan.rs +71 -0
  19. oxihipo-0.1.0/examples/clas12.rs +86 -0
  20. oxihipo-0.1.0/examples/columns.rs +69 -0
  21. oxihipo-0.1.0/examples/list_populated_banks.rs +96 -0
  22. oxihipo-0.1.0/examples/parallel.rs +70 -0
  23. oxihipo-0.1.0/examples/read.rs +71 -0
  24. oxihipo-0.1.0/examples/recook_by_bank.rs +327 -0
  25. oxihipo-0.1.0/examples/skim.rs +69 -0
  26. oxihipo-0.1.0/examples/tag_and_skim.rs +134 -0
  27. oxihipo-0.1.0/examples/write.rs +75 -0
  28. oxihipo-0.1.0/examples/write_array.rs +102 -0
  29. oxihipo-0.1.0/proptest-regressions/compress.txt +7 -0
  30. oxihipo-0.1.0/py/.gitignore +14 -0
  31. oxihipo-0.1.0/py/Cargo.lock +458 -0
  32. oxihipo-0.1.0/py/Cargo.toml +48 -0
  33. oxihipo-0.1.0/py/README.md +256 -0
  34. oxihipo-0.1.0/py/build.rs +18 -0
  35. oxihipo-0.1.0/py/examples/analysis.py +42 -0
  36. oxihipo-0.1.0/py/examples/bench_columns.py +51 -0
  37. oxihipo-0.1.0/py/examples/bench_compression.py +120 -0
  38. oxihipo-0.1.0/py/examples/bench_rdataframe.py +164 -0
  39. oxihipo-0.1.0/py/examples/parallel.py +56 -0
  40. oxihipo-0.1.0/py/examples/quickstart.py +40 -0
  41. oxihipo-0.1.0/py/examples/rdataframe.py +58 -0
  42. oxihipo-0.1.0/py/examples/streaming.py +36 -0
  43. oxihipo-0.1.0/py/src/bin/gen_sample.rs +81 -0
  44. oxihipo-0.1.0/py/src/error.rs +63 -0
  45. oxihipo-0.1.0/py/src/lib.rs +808 -0
  46. oxihipo-0.1.0/py/tests/data/sample.hipo +0 -0
  47. oxihipo-0.1.0/py/tests/data/sample_none.hipo +0 -0
  48. oxihipo-0.1.0/py/tests/test_oxihipo.py +825 -0
  49. oxihipo-0.1.0/pyproject.toml +61 -0
  50. oxihipo-0.1.0/python/oxihipo/__init__.py +1321 -0
  51. oxihipo-0.1.0/python/oxihipo/_oxihipo.pyi +88 -0
  52. oxihipo-0.1.0/python/oxihipo/_parallel.py +161 -0
  53. oxihipo-0.1.0/python/oxihipo/py.typed +0 -0
  54. oxihipo-0.1.0/rust-toolchain.toml +4 -0
  55. oxihipo-0.1.0/rustfmt.toml +2 -0
  56. oxihipo-0.1.0/src/compress.rs +538 -0
  57. oxihipo-0.1.0/src/error.rs +113 -0
  58. oxihipo-0.1.0/src/event/bank.rs +653 -0
  59. oxihipo-0.1.0/src/event/build.rs +566 -0
  60. oxihipo-0.1.0/src/event/composite.rs +308 -0
  61. oxihipo-0.1.0/src/event/ctx.rs +507 -0
  62. oxihipo-0.1.0/src/event/event.rs +292 -0
  63. oxihipo-0.1.0/src/event/mod.rs +27 -0
  64. oxihipo-0.1.0/src/event/owned.rs +821 -0
  65. oxihipo-0.1.0/src/event/row_typed.rs +166 -0
  66. oxihipo-0.1.0/src/lib.rs +197 -0
  67. oxihipo-0.1.0/src/prelude.rs +12 -0
  68. oxihipo-0.1.0/src/read/chain.rs +1158 -0
  69. oxihipo-0.1.0/src/read/columns.rs +786 -0
  70. oxihipo-0.1.0/src/read/filter.rs +294 -0
  71. oxihipo-0.1.0/src/read/inner.rs +347 -0
  72. oxihipo-0.1.0/src/read/iter.rs +369 -0
  73. oxihipo-0.1.0/src/read/mod.rs +17 -0
  74. oxihipo-0.1.0/src/read/source.rs +146 -0
  75. oxihipo-0.1.0/src/schema/dict.rs +196 -0
  76. oxihipo-0.1.0/src/schema/handle.rs +333 -0
  77. oxihipo-0.1.0/src/schema/mod.rs +10 -0
  78. oxihipo-0.1.0/src/schema/parse.rs +292 -0
  79. oxihipo-0.1.0/src/schema/types.rs +394 -0
  80. oxihipo-0.1.0/src/tag.rs +440 -0
  81. oxihipo-0.1.0/src/wire/by_bank.rs +672 -0
  82. oxihipo-0.1.0/src/wire/bytes.rs +117 -0
  83. oxihipo-0.1.0/src/wire/constants.rs +177 -0
  84. oxihipo-0.1.0/src/wire/event_index.rs +148 -0
  85. oxihipo-0.1.0/src/wire/file_header.rs +193 -0
  86. oxihipo-0.1.0/src/wire/mod.rs +17 -0
  87. oxihipo-0.1.0/src/wire/per_column.rs +653 -0
  88. oxihipo-0.1.0/src/wire/record.rs +404 -0
  89. oxihipo-0.1.0/src/wire/record_header.rs +250 -0
  90. oxihipo-0.1.0/src/write/bank.rs +56 -0
  91. oxihipo-0.1.0/src/write/mod.rs +11 -0
  92. oxihipo-0.1.0/src/write/record.rs +790 -0
  93. oxihipo-0.1.0/src/write/row.rs +26 -0
  94. oxihipo-0.1.0/src/write/writer.rs +767 -0
  95. oxihipo-0.1.0/tests/all_formats.rs +216 -0
  96. oxihipo-0.1.0/tests/chain.rs +242 -0
  97. oxihipo-0.1.0/tests/chain_parallel.rs +227 -0
  98. oxihipo-0.1.0/tests/columns.rs +451 -0
  99. oxihipo-0.1.0/tests/corruption.rs +125 -0
  100. oxihipo-0.1.0/tests/end_to_end.rs +366 -0
  101. oxihipo-0.1.0/tests/event_tag.rs +519 -0
  102. oxihipo-0.1.0/tests/macros.rs +249 -0
  103. oxihipo-0.1.0/tests/no_alloc.rs +188 -0
  104. oxihipo-0.1.0/tests/per_column.rs +225 -0
  105. oxihipo-0.1.0/tests/round_trip.rs +748 -0
  106. oxihipo-0.1.0/tests/skim.rs +124 -0
  107. oxihipo-0.1.0/website/.gitignore +20 -0
  108. oxihipo-0.1.0/website/docs/design/event-tagging.md +127 -0
  109. oxihipo-0.1.0/website/docs/design/python-binding.md +482 -0
  110. oxihipo-0.1.0/website/docs/design/python-vs-rust-benchmark.md +68 -0
  111. oxihipo-0.1.0/website/docs/getting-started/python.md +88 -0
  112. oxihipo-0.1.0/website/docs/getting-started/rust.md +82 -0
  113. oxihipo-0.1.0/website/docs/intro.md +76 -0
  114. oxihipo-0.1.0/website/docs/performance/benchmarks.md +172 -0
  115. oxihipo-0.1.0/website/docs/performance/compression.md +244 -0
  116. oxihipo-0.1.0/website/docs/performance/shared-filesystems.md +82 -0
  117. oxihipo-0.1.0/website/docs/python/how-it-works.md +96 -0
  118. oxihipo-0.1.0/website/docs/python/parallel.md +82 -0
  119. oxihipo-0.1.0/website/docs/python/rdataframe.md +172 -0
  120. oxihipo-0.1.0/website/docs/python/reading.md +212 -0
  121. oxihipo-0.1.0/website/docs/python/streaming.md +73 -0
  122. oxihipo-0.1.0/website/docs/python/writing.md +75 -0
  123. oxihipo-0.1.0/website/docs/rust/design.md +86 -0
  124. oxihipo-0.1.0/website/docs/rust/reading.md +182 -0
  125. oxihipo-0.1.0/website/docs/rust/writing.md +218 -0
  126. oxihipo-0.1.0/website/docusaurus.config.js +119 -0
  127. oxihipo-0.1.0/website/package-lock.json +19533 -0
  128. oxihipo-0.1.0/website/package.json +46 -0
  129. oxihipo-0.1.0/website/sidebars.js +51 -0
  130. oxihipo-0.1.0/website/src/components/HomepageFeatures/index.js +100 -0
  131. oxihipo-0.1.0/website/src/components/HomepageFeatures/styles.module.css +36 -0
  132. oxihipo-0.1.0/website/src/css/custom.css +42 -0
  133. oxihipo-0.1.0/website/src/pages/index.js +144 -0
  134. oxihipo-0.1.0/website/src/pages/index.module.css +110 -0
  135. oxihipo-0.1.0/website/static/.nojekyll +0 -0
  136. oxihipo-0.1.0/website/static/img/favicon.ico +0 -0
@@ -0,0 +1,38 @@
1
+ name: ci
2
+
3
+ on:
4
+ push:
5
+ branches: [master, main]
6
+ pull_request:
7
+
8
+ env:
9
+ CARGO_TERM_COLOR: always
10
+ RUSTFLAGS: -D warnings
11
+
12
+ jobs:
13
+ test:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v5
17
+ - uses: dtolnay/rust-toolchain@stable
18
+ with:
19
+ components: rustfmt, clippy
20
+ - uses: Swatinem/rust-cache@v2
21
+ - run: cargo fmt --check
22
+ - run: cargo clippy --all-targets -- -D warnings
23
+ - run: cargo test --all-targets
24
+ # High-level smoke test: `cargo test` compiles the examples but never runs
25
+ # them, so a runtime break (panic, bad logic) ships silently. Drive the
26
+ # core examples end-to-end — write → read → recook to Lz4PerBank → read
27
+ # back, tag-and-skim round-trip, plus a small all-format encode/read sweep.
28
+ - name: Smoke-run examples
29
+ run: |
30
+ cargo run --example write -- /tmp/demo.hipo
31
+ cargo run --example read -- /tmp/demo.hipo
32
+ cargo run --example recook_by_bank -- /tmp/demo.hipo /tmp/demo_bybank.hipo
33
+ cargo run --example read -- /tmp/demo_bybank.hipo
34
+ cargo run --example tag_and_skim -- /tmp/tagdemo
35
+ cargo run --example bench_read_compression -- 3000 1
36
+ - run: cargo doc --no-deps
37
+ env:
38
+ RUSTDOCFLAGS: -D warnings
@@ -0,0 +1,69 @@
1
+ name: docs
2
+
3
+ # Build the Docusaurus site on every PR (so a broken link or bad MDX fails
4
+ # review, not main), and deploy to GitHub Pages on push to main.
5
+ #
6
+ # ONE-TIME SETUP: GitHub Pages must be enabled for the repo with its source set
7
+ # to "GitHub Actions" (Settings → Pages → Build and deployment → Source).
8
+ # This workflow deliberately does not use `configure-pages`' `enablement: true`,
9
+ # because that input requires a token with `administration:write` (a PAT or App
10
+ # token) — the default GITHUB_TOKEN cannot enable Pages.
11
+ on:
12
+ push:
13
+ branches: [main]
14
+ paths:
15
+ - 'website/**'
16
+ - '.github/workflows/docs.yml'
17
+ pull_request:
18
+ paths:
19
+ - 'website/**'
20
+ - '.github/workflows/docs.yml'
21
+ workflow_dispatch:
22
+
23
+ permissions:
24
+ contents: read
25
+
26
+ concurrency:
27
+ group: docs-${{ github.ref }}
28
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
29
+
30
+ defaults:
31
+ run:
32
+ working-directory: website
33
+
34
+ jobs:
35
+ build:
36
+ name: build
37
+ runs-on: ubuntu-latest
38
+ steps:
39
+ - uses: actions/checkout@v5
40
+ - uses: actions/setup-node@v7
41
+ with:
42
+ node-version: 22
43
+ cache: npm
44
+ cache-dependency-path: website/package-lock.json
45
+ - name: Install dependencies
46
+ run: npm ci
47
+ # `onBrokenLinks: 'throw'` means a dead cross-reference fails here.
48
+ - name: Build
49
+ run: npm run build
50
+ - name: Upload Pages artifact
51
+ if: github.event_name != 'pull_request'
52
+ uses: actions/upload-pages-artifact@v5
53
+ with:
54
+ path: website/build
55
+
56
+ deploy:
57
+ name: deploy
58
+ if: github.event_name != 'pull_request'
59
+ needs: build
60
+ runs-on: ubuntu-latest
61
+ environment:
62
+ name: github-pages
63
+ url: ${{ steps.deployment.outputs.page_url }}
64
+ permissions:
65
+ pages: write # to deploy
66
+ id-token: write # to verify the deployment origin
67
+ steps:
68
+ - id: deployment
69
+ uses: actions/deploy-pages@v5
@@ -0,0 +1,181 @@
1
+ name: wheels
2
+
3
+ # Build (and, on a tag, publish) the `oxihipo` Python wheels. The extension is
4
+ # abi3 (one wheel per OS/arch works on CPython >= 3.13) and pure-Rust
5
+ # (default-features = false), so the aarch64 / cross builds need no C toolchain.
6
+ on:
7
+ push:
8
+ branches: [main, master]
9
+ tags: ["v*"]
10
+ pull_request:
11
+ workflow_dispatch:
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ concurrency:
17
+ group: wheels-${{ github.ref }}
18
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
19
+
20
+ defaults:
21
+ run:
22
+ shell: bash
23
+
24
+ jobs:
25
+ # Native build + the full pytest suite on each OS — fast confidence that the
26
+ # binding imports and behaves, before spending time on the cross wheels.
27
+ test:
28
+ name: test (${{ matrix.os }})
29
+ runs-on: ${{ matrix.os }}
30
+ strategy:
31
+ fail-fast: false
32
+ matrix:
33
+ os: [ubuntu-latest, macos-14, windows-latest]
34
+ steps:
35
+ - uses: actions/checkout@v5
36
+ - uses: actions/setup-python@v6
37
+ with:
38
+ python-version: "3.13"
39
+ - uses: dtolnay/rust-toolchain@stable
40
+ - uses: Swatinem/rust-cache@v2
41
+ with:
42
+ workspaces: py
43
+ - name: Build the extension (native)
44
+ working-directory: py
45
+ run: |
46
+ python -m pip install --upgrade pip maturin
47
+ maturin build --release --out dist -i python
48
+ - name: Install wheel + test dependencies
49
+ run: |
50
+ python -m pip install numpy awkward pandas pyarrow pytest "mypy~=2.3"
51
+ python -m pip install --no-index --find-links py/dist oxihipo --no-deps
52
+ - name: Run the binding's test suite
53
+ run: python -m pytest py/tests -q
54
+ - name: Type-check the pure-Python package (mypy)
55
+ working-directory: py
56
+ run: python -m mypy
57
+ - name: Check the compiled stub matches the extension (stubtest)
58
+ working-directory: py
59
+ run: python -m mypy.stubtest oxihipo._oxihipo
60
+ - name: Assert the py.typed marker ships in the wheel (PEP 561)
61
+ run: |
62
+ python - <<'PY'
63
+ import glob, zipfile
64
+ whl = sorted(glob.glob("py/dist/*.whl"))[-1]
65
+ names = zipfile.ZipFile(whl).namelist()
66
+ assert any(n.endswith("oxihipo/py.typed") for n in names), \
67
+ f"py.typed missing from {whl}: {names}"
68
+ print("py.typed present in", whl)
69
+ PY
70
+
71
+ linux:
72
+ name: wheels linux ${{ matrix.target }}
73
+ runs-on: ubuntu-latest
74
+ strategy:
75
+ fail-fast: false
76
+ matrix:
77
+ target: [x86_64, aarch64]
78
+ steps:
79
+ - uses: actions/checkout@v5
80
+ - uses: PyO3/maturin-action@v1
81
+ with:
82
+ working-directory: py
83
+ target: ${{ matrix.target }}
84
+ manylinux: auto
85
+ args: --release --out dist
86
+ sccache: "true"
87
+ - uses: actions/upload-artifact@v5
88
+ with:
89
+ name: wheels-linux-${{ matrix.target }}
90
+ path: py/dist
91
+
92
+ macos:
93
+ name: wheels macos ${{ matrix.target }}
94
+ runs-on: macos-14
95
+ strategy:
96
+ fail-fast: false
97
+ matrix:
98
+ target: [x86_64, aarch64]
99
+ steps:
100
+ - uses: actions/checkout@v5
101
+ - uses: PyO3/maturin-action@v1
102
+ with:
103
+ working-directory: py
104
+ target: ${{ matrix.target }}
105
+ args: --release --out dist
106
+ sccache: "true"
107
+ - uses: actions/upload-artifact@v5
108
+ with:
109
+ name: wheels-macos-${{ matrix.target }}
110
+ path: py/dist
111
+
112
+ windows:
113
+ name: wheels windows
114
+ runs-on: windows-latest
115
+ steps:
116
+ - uses: actions/checkout@v5
117
+ - uses: PyO3/maturin-action@v1
118
+ with:
119
+ working-directory: py
120
+ target: x64
121
+ args: --release --out dist
122
+ sccache: "true"
123
+ - uses: actions/upload-artifact@v5
124
+ with:
125
+ name: wheels-windows-x64
126
+ path: py/dist
127
+
128
+ sdist:
129
+ name: sdist
130
+ runs-on: ubuntu-latest
131
+ steps:
132
+ - uses: actions/checkout@v5
133
+ - uses: PyO3/maturin-action@v1
134
+ with:
135
+ working-directory: py
136
+ command: sdist
137
+ args: --out dist
138
+ - uses: actions/upload-artifact@v5
139
+ with:
140
+ name: wheels-sdist
141
+ path: py/dist
142
+
143
+ # Fail fast if the pushed tag doesn't match the packaged version, before the
144
+ # (irreversible) publish. `v0.1.0` must match `version` in py/pyproject.toml.
145
+ tag-check:
146
+ name: tag matches version
147
+ if: startsWith(github.ref, 'refs/tags/v')
148
+ runs-on: ubuntu-latest
149
+ steps:
150
+ - uses: actions/checkout@v5
151
+ - name: Assert tag == pyproject version
152
+ run: |
153
+ tag="${GITHUB_REF_NAME#v}"
154
+ proj=$(grep -m1 '^version' py/pyproject.toml | sed -E 's/.*"([^"]+)".*/\1/')
155
+ echo "tag=$tag pyproject=$proj"
156
+ test "$tag" = "$proj" || { echo "::error::tag v$tag does not match py/pyproject.toml version $proj"; exit 1; }
157
+
158
+ # Publish to PyPI on a version tag via Trusted Publishing (OIDC) — no stored
159
+ # token. One-time setup: on PyPI add a "pending publisher" for project
160
+ # `oxihipo`, repo `mathieuouillon/oxihipo`, workflow `wheels.yml`, environment
161
+ # `pypi`. The OIDC `id-token` below is exchanged for a short-lived upload
162
+ # credential; PEP 740 attestations are generated automatically.
163
+ release:
164
+ name: publish to PyPI
165
+ runs-on: ubuntu-latest
166
+ if: startsWith(github.ref, 'refs/tags/v')
167
+ needs: [tag-check, test, linux, macos, windows, sdist]
168
+ environment:
169
+ name: pypi
170
+ url: https://pypi.org/p/oxihipo
171
+ permissions:
172
+ id-token: write # mint the OIDC token Trusted Publishing verifies
173
+ steps:
174
+ - uses: actions/download-artifact@v5
175
+ with:
176
+ pattern: wheels-*
177
+ path: dist
178
+ merge-multiple: true # flatten every artifact into dist/
179
+ - uses: pypa/gh-action-pypi-publish@release/v1
180
+ with:
181
+ packages-dir: dist
@@ -0,0 +1,37 @@
1
+ # Build artifacts
2
+ /target
3
+ **/*.rs.bk
4
+
5
+ # Profiling
6
+ *.profraw
7
+ *.profdata
8
+ perf.data*
9
+ flamegraph.svg
10
+
11
+ # Editor backups & swap files
12
+ *~
13
+ *.swp
14
+ *.swo
15
+
16
+ # IDE state
17
+ .idea/
18
+
19
+ # OS metadata
20
+ .DS_Store
21
+ Thumbs.db
22
+
23
+ # Local fixtures (large data files kept outside the repo)
24
+ fixtures/large/
25
+
26
+ # Analysis / example output artifacts
27
+ /out
28
+
29
+ # Generated docs (build from the .typ source with `typst compile`)
30
+ /docs/*.pdf
31
+
32
+ # Local env / secrets
33
+ .env
34
+ .env.local
35
+
36
+ # Local tooling
37
+ .claude/
@@ -0,0 +1,46 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project
5
+ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). While the
6
+ version is below `1.0.0`, minor releases may contain breaking changes.
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.0] - 2026-07-20
11
+
12
+ First public release: a pure-Rust HIPO (CLAS12) v6 reader and writer, with a
13
+ columnar, [uproot](https://uproot.readthedocs.io)-shaped Python binding whose
14
+ columns come back as zero-copy [Awkward](https://awkward-array.org) arrays.
15
+
16
+ ### Added
17
+
18
+ - **Python reading** — `open` a file / directory / glob / list; `arrays`,
19
+ `array`, and a raw-NumPy `numpy` accessor; `library=` backends `ak` (default),
20
+ `np`, `pd` (pandas), and `arrow` (pyarrow); bank proxies (`f["REC::Particle"]`),
21
+ `filter_name` globs, `entry_start`/`entry_stop`, and discovery (`keys`,
22
+ `typenames`, `show`).
23
+ - **Bounded-memory streaming** — `iterate(step_size=…)` in event- or byte-sized,
24
+ record/file-aligned chunks; multi-process reading with `workers=N` for
25
+ I/O-bound parallel filesystems.
26
+ - **Python writing** — `create` a new file or `recreate` to *decorate* an
27
+ existing one with a derived bank (verbatim event copy); columnar `new_bank` /
28
+ `extend` from NumPy or Awkward, scalar and fixed-length `T#N` array columns.
29
+ - **Event tags** — pushdown `filtered(event_tag=…/event_tag_any=…)`, the
30
+ `event_tags()` column, a persisted name↔bit registry (`tag_names`, filter by
31
+ name), tag-and-skim (`skim(tags=…, tag_names=…)`), and in-place
32
+ `set_event_tag` / `set_event_tags` for uncompressed files.
33
+ - **ROOT RDataFrame bridge** — `rdataframe` / `iterate_rdataframe` feed a
34
+ selection to ROOT's RDataFrame through Awkward's generated (no-copy)
35
+ `RDataSource`; optional `oxihipo[root]` extra.
36
+ - **Compression** — six formats (`none`, `lz4`, `lz4best`, `gzip`, `lz4perbank`,
37
+ `lz4percolumn`); `skim` re-compresses and defaults to `lz4percolumn`.
38
+ - **Rust core** — HIPO v6 reader/writer, `Chain` with pushdown filters, typed
39
+ bank rows and the `bank_row!` / `clas12` helpers, and a columnar `read_columns`
40
+ materializer behind a released GIL.
41
+ - **Packaging** — `abi3` wheels (one per OS/arch, CPython ≥ 3.13) for Linux
42
+ (x86_64/aarch64), macOS (x86_64/aarch64), and Windows (x64), plus an sdist;
43
+ PEP 561 typed (`py.typed`, checked stub).
44
+
45
+ [Unreleased]: https://github.com/mathieuouillon/oxihipo/compare/v0.1.0...HEAD
46
+ [0.1.0]: https://github.com/mathieuouillon/oxihipo/releases/tag/v0.1.0