bed-reader 1.1.0__tar.gz → 1.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 (115) hide show
  1. bed_reader-1.2.0/.github/dependabot.yml +16 -0
  2. bed_reader-1.2.0/.github/workflows/ci.yml +371 -0
  3. bed_reader-1.2.0/.github/workflows/docs.yml +55 -0
  4. bed_reader-1.2.0/.github/workflows/release.yml +56 -0
  5. {bed_reader-1.1.0 → bed_reader-1.2.0}/.gitignore +0 -1
  6. {bed_reader-1.1.0 → bed_reader-1.2.0}/CHANGELOG.md +22 -0
  7. {bed_reader-1.1.0 → bed_reader-1.2.0}/Cargo.lock +1006 -644
  8. {bed_reader-1.1.0 → bed_reader-1.2.0}/Cargo.toml +10 -6
  9. {bed_reader-1.1.0 → bed_reader-1.2.0}/PKG-INFO +15 -9
  10. {bed_reader-1.1.0 → bed_reader-1.2.0}/README-rust.md +4 -2
  11. {bed_reader-1.1.0 → bed_reader-1.2.0}/README.md +4 -2
  12. bed_reader-1.2.0/RELEASING.md +64 -0
  13. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/_open_bed.py +2 -1
  14. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/test_open_bed.py +16 -1
  15. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/test_open_bed_cloud.py +0 -1
  16. bed_reader-1.2.0/doc/Makefile +177 -0
  17. bed_reader-1.2.0/doc/make +0 -0
  18. bed_reader-1.2.0/doc/make.bat +230 -0
  19. bed_reader-1.2.0/doc/source/_static/placeholder.txt +0 -0
  20. bed_reader-1.2.0/doc/source/cloud_urls.rst +218 -0
  21. bed_reader-1.2.0/doc/source/conf.py +77 -0
  22. bed_reader-1.2.0/doc/source/index.rst +221 -0
  23. {bed_reader-1.1.0 → bed_reader-1.2.0}/pyproject.toml +13 -9
  24. bed_reader-1.2.0/scripts/verify_sdist_wheel.py +82 -0
  25. bed_reader-1.2.0/specs/PYTHON_3_15_WINDOWS_ARM64_SUPPORT_SPEC.md +482 -0
  26. {bed_reader-1.1.0 → bed_reader-1.2.0}/src/bed_cloud.rs +35 -10
  27. {bed_reader-1.1.0 → bed_reader-1.2.0}/src/lib.rs +1 -1
  28. {bed_reader-1.1.0 → bed_reader-1.2.0}/src/tests.rs +6 -1
  29. {bed_reader-1.1.0 → bed_reader-1.2.0}/useful.md +66 -22
  30. bed_reader-1.2.0/uv.lock +1902 -0
  31. bed_reader-1.1.0/.github/workflows/ci.yml +0 -234
  32. bed_reader-1.1.0/.github/workflows/docs.yml +0 -45
  33. bed_reader-1.1.0/_static/_sphinx_javascript_frameworks_compat.js +0 -123
  34. bed_reader-1.1.0/_static/basic.css +0 -903
  35. bed_reader-1.1.0/_static/doctools.js +0 -156
  36. bed_reader-1.1.0/_static/documentation_options.js +0 -14
  37. bed_reader-1.1.0/_static/file.png +0 -0
  38. bed_reader-1.1.0/_static/jquery-3.4.1.js +0 -10598
  39. bed_reader-1.1.0/_static/jquery-3.5.1.js +0 -10872
  40. bed_reader-1.1.0/_static/jquery-3.6.0.js +0 -10881
  41. bed_reader-1.1.0/_static/jquery.js +0 -2
  42. bed_reader-1.1.0/_static/js/badge_only.js +0 -1
  43. bed_reader-1.1.0/_static/js/html5shiv-printshiv.min.js +0 -4
  44. bed_reader-1.1.0/_static/js/html5shiv.min.js +0 -4
  45. bed_reader-1.1.0/_static/js/modernizr.min.js +0 -4
  46. bed_reader-1.1.0/_static/js/theme.js +0 -1
  47. bed_reader-1.1.0/_static/language_data.js +0 -199
  48. bed_reader-1.1.0/_static/minus.png +0 -0
  49. bed_reader-1.1.0/_static/plus.png +0 -0
  50. bed_reader-1.1.0/_static/pygments.css +0 -74
  51. bed_reader-1.1.0/_static/searchtools.js +0 -566
  52. bed_reader-1.1.0/_static/sphinx_highlight.js +0 -144
  53. bed_reader-1.1.0/_static/underscore-1.12.0.js +0 -2027
  54. bed_reader-1.1.0/_static/underscore-1.13.1.js +0 -2042
  55. bed_reader-1.1.0/_static/underscore-1.3.1.js +0 -999
  56. bed_reader-1.1.0/_static/underscore.js +0 -6
  57. {bed_reader-1.1.0 → bed_reader-1.2.0}/AUTHORS.txt +0 -0
  58. {bed_reader-1.1.0 → bed_reader-1.2.0}/LICENSE.md +0 -0
  59. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/__init__.py +0 -0
  60. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/_sample_data.py +0 -0
  61. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/_to_bed.py +0 -0
  62. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/__init__.py +0 -0
  63. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/benchmark/bench2.ipynb +0 -0
  64. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/benchmark/benchmark.py +0 -0
  65. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/500x400_o640_array.memmap +0 -0
  66. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/badfile.bed +0 -0
  67. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/empty.bed +0 -0
  68. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/plink_sim_10s_100v_10pmiss.bed +0 -0
  69. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/plink_sim_10s_100v_10pmiss.bim +0 -0
  70. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/plink_sim_10s_100v_10pmiss.fam +0 -0
  71. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small.bad_bim +0 -0
  72. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small.bed +0 -0
  73. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small.bim +0 -0
  74. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small.bim_bad_positions.bim +0 -0
  75. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small.deb +0 -0
  76. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small.fam +0 -0
  77. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small.fam_bad +0 -0
  78. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small.maf +0 -0
  79. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small.mib +0 -0
  80. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small2_array.memmap +0 -0
  81. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small_array.memmap +0 -0
  82. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small_no_bim.bed +0 -0
  83. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small_no_bim.fam +0 -0
  84. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small_no_fam.bed +0 -0
  85. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small_no_fam.bim +0 -0
  86. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small_too_short.bed +0 -0
  87. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small_too_short.bim +0 -0
  88. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/small_too_short.fam +0 -0
  89. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/smallmode0.bed +0 -0
  90. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/smallmode0.bim +0 -0
  91. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/smallmode0.fam +0 -0
  92. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/smallmodebad.bed +0 -0
  93. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/some_missing.bed +0 -0
  94. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/some_missing.bim +0 -0
  95. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/some_missing.fam +0 -0
  96. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/some_missing.properties.npz +0 -0
  97. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/some_missing.val.npy +0 -0
  98. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/sparse.bed +0 -0
  99. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/sparse.bim +0 -0
  100. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/sparse.fam +0 -0
  101. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/toydata.5chrom.bed +0 -0
  102. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/toydata.5chrom.bim +0 -0
  103. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/data/toydata.5chrom.fam +0 -0
  104. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/registry.txt +0 -0
  105. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/test_file_dot.py +0 -0
  106. {bed_reader-1.1.0 → bed_reader-1.2.0}/bed_reader/tests/test_opt_dep.py +0 -0
  107. {bed_reader-1.1.0 → bed_reader-1.2.0}/build.rs +0 -0
  108. {bed_reader-1.1.0 → bed_reader-1.2.0}/examples/cloud.rs +0 -0
  109. {bed_reader-1.1.0 → bed_reader-1.2.0}/examples/no_cloud.rs +0 -0
  110. {bed_reader-1.1.0 → bed_reader-1.2.0}/setpath.bat +0 -0
  111. {bed_reader-1.1.0 → bed_reader-1.2.0}/src/python_module.rs +0 -0
  112. {bed_reader-1.1.0 → bed_reader-1.2.0}/src/supplemental_documents/cloud_urls_etc.md +0 -0
  113. {bed_reader-1.1.0 → bed_reader-1.2.0}/src/supplemental_documents/options_etc.md +0 -0
  114. {bed_reader-1.1.0 → bed_reader-1.2.0}/tests/tests_api.rs +0 -0
  115. {bed_reader-1.1.0 → bed_reader-1.2.0}/tests/tests_api_cloud.rs +0 -0
@@ -0,0 +1,16 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: "/"
5
+ schedule:
6
+ interval: monthly
7
+ open-pull-requests-limit: 1
8
+ # Version-specific refs hard-code a compiler and may not accept toolchain
9
+ # inputs. Review installer SHA changes manually to preserve MSRV/stable
10
+ # coverage. The `stable` compiler itself still updates on every CI run.
11
+ ignore:
12
+ - dependency-name: dtolnay/rust-toolchain
13
+ groups:
14
+ github-actions:
15
+ patterns:
16
+ - "*"
@@ -0,0 +1,371 @@
1
+ # This file was originally generated by maturin v0.14.17
2
+
3
+ name: CI3
4
+
5
+ # Full CI runs on pull requests, monthly, and for release tags (via
6
+ # workflow_call). Pushes to main are not retested: branch protection requires
7
+ # PRs to be up to date with main and to pass "CI result" before merging.
8
+ # Documentation deployment on main is handled by docs.yml.
9
+ on:
10
+ schedule:
11
+ - cron: '0 0 1 * *'
12
+ pull_request:
13
+ workflow_dispatch:
14
+ workflow_call:
15
+
16
+ env:
17
+ CARGO_TERM_COLOR: always
18
+ PYTHON_VERSIONS: |
19
+ 3.11
20
+ 3.12
21
+ 3.13
22
+ 3.14
23
+ 3.15
24
+ PYTHON_VERSIONS_ARGS: "-i python3.11 -i python3.12 -i python3.13 -i python3.14 -i python3.15"
25
+
26
+ permissions:
27
+ contents: read
28
+
29
+ concurrency:
30
+ group: ci-${{ github.ref }}-${{ github.event_name }}
31
+ cancel-in-progress: true
32
+
33
+ jobs:
34
+
35
+ test_rust:
36
+ name: Test Rust
37
+ strategy:
38
+ fail-fast: false
39
+ matrix:
40
+ os: [ubuntu-latest, ubuntu-24.04-arm, windows-latest, windows-11-arm, macos-15, macos-15-intel]
41
+ runs-on: ${{ matrix.os }}
42
+ steps:
43
+ - name: Checkout
44
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
45
+ - name: Set up Rust (Pinned Version)
46
+ uses: dtolnay/rust-toolchain@cfcaf53ba4c621917ec7f78a66bff7a8848ddad4 # 1.85.0
47
+ with:
48
+ components: clippy, rustfmt, rust-src
49
+ - name: Run Clippy (strict for this pinned version of Rust)
50
+ run: cargo clippy --locked --all-targets --all-features -- -D warnings
51
+ - name: Set up Rust (Latest Stable)
52
+ uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # generic installer
53
+ with:
54
+ toolchain: stable
55
+ components: clippy, rustfmt, rust-src
56
+ - name: Run Clippy (lenient for latest version)
57
+ run: cargo clippy --locked --all-targets --all-features
58
+ - name: Test Rust no-default-features
59
+ run: cargo test --locked --verbose --no-default-features
60
+ - name: Test Rust default features
61
+ run: cargo test --locked --verbose
62
+
63
+
64
+ macos:
65
+ strategy:
66
+ fail-fast: false
67
+ matrix:
68
+ include:
69
+ - target: x86_64
70
+ os: macos-15-intel
71
+ deployment-target: "10.12"
72
+ - target: aarch64
73
+ os: macos-15
74
+ deployment-target: "11.0"
75
+ runs-on: ${{ matrix.os }}
76
+ steps:
77
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
78
+ - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
79
+ with:
80
+ python-version: ${{ env.PYTHON_VERSIONS }}
81
+ - name: Build wheels
82
+ env:
83
+ MACOSX_DEPLOYMENT_TARGET: ${{ matrix.deployment-target }}
84
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1
85
+ with:
86
+ target: ${{ matrix.target }}
87
+ args: --release --locked --out dist ${{ env.PYTHON_VERSIONS_ARGS }}
88
+ - name: Upload wheels
89
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
90
+ with:
91
+ name: wheels-macos-${{ matrix.target }}
92
+ path: dist
93
+
94
+ linux:
95
+ # Native runners keep host build scripts and target C compilers aligned.
96
+ runs-on: ${{ matrix.os }}
97
+ strategy:
98
+ fail-fast: false
99
+ matrix:
100
+ include:
101
+ - target: x86_64
102
+ os: ubuntu-latest
103
+ - target: aarch64
104
+ os: ubuntu-24.04-arm
105
+ steps:
106
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
107
+ - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
108
+ with:
109
+ python-version: ${{ env.PYTHON_VERSIONS }}
110
+
111
+ - name: Build wheels
112
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1
113
+ with:
114
+ target: ${{ matrix.target }}
115
+ args: --release --locked --out dist ${{ env.PYTHON_VERSIONS_ARGS }}
116
+ manylinux: auto
117
+
118
+ - name: Upload wheels
119
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
120
+ with:
121
+ name: wheels-linux-${{ matrix.target }}
122
+ path: dist
123
+
124
+ windows:
125
+ runs-on: ${{ matrix.os }}
126
+ strategy:
127
+ fail-fast: false
128
+ matrix:
129
+ include:
130
+ - os: windows-latest
131
+ target: x64
132
+ architecture: x64
133
+ - os: windows-11-arm
134
+ target: aarch64-pc-windows-msvc
135
+ architecture: arm64
136
+ steps:
137
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
138
+ - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
139
+ with:
140
+ python-version: ${{ env.PYTHON_VERSIONS }}
141
+ architecture: ${{ matrix.architecture }}
142
+ - name: Build wheels
143
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1
144
+ with:
145
+ target: ${{ matrix.target }}
146
+ args: --release --locked --out dist ${{ env.PYTHON_VERSIONS_ARGS }}
147
+ - name: Upload wheels
148
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
149
+ with:
150
+ name: wheels-windows-${{ matrix.target }}
151
+ path: dist
152
+
153
+ sdist:
154
+ runs-on: ubuntu-latest
155
+ steps:
156
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
157
+ - name: Build sdist
158
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1
159
+ with:
160
+ command: sdist
161
+ args: --out dist
162
+ - name: Upload sdist
163
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
164
+ with:
165
+ name: wheels-sdist
166
+ path: dist
167
+
168
+ merge_artifacts:
169
+ name: Merge Artifacts
170
+ needs: [macos, linux, windows, sdist]
171
+ runs-on: ubuntu-latest
172
+ steps:
173
+ - name: Create merged directory
174
+ run: mkdir -p merged_dist
175
+
176
+ - name: Download all artifacts
177
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
178
+ with:
179
+ path: artifacts
180
+ pattern: wheels-*
181
+ merge-multiple: true
182
+
183
+ - name: List downloaded artifacts
184
+ run: find artifacts -type f | sort
185
+
186
+ - name: Copy artifacts to merged directory
187
+ run: cp -r artifacts/* merged_dist/
188
+
189
+ - name: Install uv
190
+ uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
191
+ with:
192
+ version: "0.12.24"
193
+
194
+ - name: Checkout package validation requirements
195
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
196
+ with:
197
+ path: source
198
+
199
+ - name: Validate distribution metadata
200
+ working-directory: source
201
+ run: |
202
+ uv sync --frozen --only-group dev --no-install-project --python 3.14
203
+ uv run --frozen --no-sync twine check --strict ../merged_dist/*
204
+
205
+ - name: Upload merged artifacts
206
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
207
+ with:
208
+ name: wheels-all
209
+ path: merged_dist
210
+
211
+ test_python:
212
+ name: Test Python
213
+ env:
214
+ UV_PYTHON: ${{ matrix.python-version }}
215
+ strategy:
216
+ fail-fast: false
217
+ matrix:
218
+ python-version: ["3.11", "3.12", "3.13", "3.14", "3.15"]
219
+ os: [ubuntu-latest, ubuntu-24.04-arm, windows-latest, windows-11-arm, macos-15, macos-15-intel]
220
+ runs-on: ${{ matrix.os }}
221
+ steps:
222
+ - name: Checkout
223
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
224
+ - name: Install Rust
225
+ uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # generic installer
226
+ with:
227
+ toolchain: stable
228
+ components: clippy, rustfmt, rust-src
229
+ - name: Install Python ${{ matrix.python-version }}
230
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
231
+ with:
232
+ python-version: ${{ matrix.python-version }}
233
+ architecture: ${{ runner.arch == 'ARM64' && 'arm64' || 'x64' }}
234
+ - name: Install uv
235
+ uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
236
+ with:
237
+ version: "0.12.24"
238
+ - name: Pinned Ruff
239
+ run: uvx ruff@0.17.5 check bed_reader
240
+ - name: Install minimal dependencies
241
+ run: uv sync --frozen --extra min_dev
242
+ - name: Run min tests
243
+ shell: bash
244
+ run: |
245
+ if [[ "$RUNNER_OS" != "Windows" ]]; then
246
+ source .venv/bin/activate
247
+ else
248
+ source .venv/Scripts/activate
249
+ fi
250
+ pytest bed_reader/tests/test_opt_dep.py
251
+ - name: Install all dependencies
252
+ run: uv sync --frozen --all-extras
253
+ - name: Run all tests
254
+ shell: bash
255
+ run: |
256
+ if [[ "$RUNNER_OS" != "Windows" ]]; then
257
+ source .venv/bin/activate
258
+ else
259
+ source .venv/Scripts/activate
260
+ fi
261
+ pytest .
262
+
263
+
264
+ artifact-test:
265
+ name: Installed wheel (${{ matrix.os }}, Python ${{ matrix.python-version }})
266
+ needs: merge_artifacts
267
+ runs-on: ${{ matrix.os }}
268
+ timeout-minutes: 30
269
+ strategy:
270
+ fail-fast: false
271
+ matrix:
272
+ os: [ubuntu-latest, ubuntu-24.04-arm, windows-latest, windows-11-arm, macos-15, macos-15-intel]
273
+ python-version: ["3.11", "3.15"]
274
+ steps:
275
+ - name: Checkout test sources
276
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
277
+
278
+ - name: Install stable Python
279
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
280
+ with:
281
+ python-version: ${{ matrix.python-version }}
282
+ architecture: ${{ runner.arch == 'ARM64' && 'arm64' || 'x64' }}
283
+
284
+ - name: Install uv
285
+ uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
286
+ with:
287
+ version: "0.12.24"
288
+
289
+ - name: Download built distributions
290
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
291
+ with:
292
+ name: wheels-all
293
+ path: artifact
294
+
295
+ - name: Install an exact compatible wheel
296
+ run: |
297
+ uv venv --python ${{ matrix.python-version }} .artifact-venv
298
+ uv pip install --python .artifact-venv --no-index --no-deps --only-binary :all: --find-links artifact bed-reader
299
+ uv pip install --python .artifact-venv "bed-reader[samples,sparse,dev]"
300
+
301
+ - name: Test outside the source checkout
302
+ shell: bash
303
+ working-directory: ${{ runner.temp }}
304
+ run: |
305
+ python -c "import pathlib, shutil, sys; shutil.copytree(pathlib.Path(sys.argv[1]) / 'bed_reader' / 'tests', pathlib.Path(sys.argv[2]) / 'bed_reader_artifact_tests')" "$GITHUB_WORKSPACE" "$RUNNER_TEMP"
306
+ uv run --no-project --python "$GITHUB_WORKSPACE/.artifact-venv" python -c "import bed_reader; assert '.artifact-venv' in bed_reader.__file__; print(bed_reader.__file__)"
307
+ uv run --no-project --python "$GITHUB_WORKSPACE/.artifact-venv" python -m pytest --import-mode=importlib --doctest-modules "$RUNNER_TEMP/bed_reader_artifact_tests"
308
+
309
+ sdist-test:
310
+ name: Source distribution (Python ${{ matrix.python-version }})
311
+ needs: sdist
312
+ runs-on: ubuntu-latest
313
+ timeout-minutes: 30
314
+ strategy:
315
+ fail-fast: false
316
+ matrix:
317
+ python-version: ["3.11", "3.15"]
318
+ steps:
319
+ - name: Checkout test sources
320
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
321
+
322
+ - name: Install stable Python
323
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
324
+ with:
325
+ python-version: ${{ matrix.python-version }}
326
+ architecture: ${{ runner.arch == 'ARM64' && 'arm64' || 'x64' }}
327
+
328
+ - name: Install uv
329
+ uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
330
+ with:
331
+ version: "0.12.24"
332
+
333
+ - name: Download source distribution
334
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
335
+ with:
336
+ name: wheels-sdist
337
+ path: artifact
338
+
339
+ - name: Build and install from the source distribution
340
+ run: |
341
+ uv build --wheel --python ${{ matrix.python-version }} --no-sources --out-dir sdist-wheel artifact/*.tar.gz
342
+ uv venv --python ${{ matrix.python-version }} .artifact-venv
343
+ uv pip install --python .artifact-venv --no-index --no-deps --only-binary :all: --find-links sdist-wheel bed-reader
344
+ uv pip install --python .artifact-venv "bed-reader[samples,sparse,dev]"
345
+
346
+ - name: Compare complete direct and sdist-derived wheels
347
+ if: matrix.python-version == '3.11'
348
+ run: uv run --no-project --python 3.11 python scripts/verify_sdist_wheel.py artifact/*.tar.gz
349
+
350
+ - name: Test outside the source checkout
351
+ working-directory: ${{ runner.temp }}
352
+ run: |
353
+ python -c "import pathlib, shutil, sys; shutil.copytree(pathlib.Path(sys.argv[1]) / 'bed_reader' / 'tests', pathlib.Path(sys.argv[2]) / 'bed_reader_artifact_tests')" "$GITHUB_WORKSPACE" "$RUNNER_TEMP"
354
+ uv run --no-project --python "$GITHUB_WORKSPACE/.artifact-venv" python -c "import bed_reader; assert '.artifact-venv' in bed_reader.__file__; print(bed_reader.__file__)"
355
+ uv run --no-project --python "$GITHUB_WORKSPACE/.artifact-venv" python -m pytest --import-mode=importlib --doctest-modules "$RUNNER_TEMP/bed_reader_artifact_tests"
356
+
357
+ ci-result:
358
+ # The single required status check for branch protection. It runs even
359
+ # when other jobs fail, so a failure can never appear as a passing skip.
360
+ name: CI result
361
+ if: always()
362
+ needs: [test_rust, macos, linux, windows, sdist, merge_artifacts, test_python, artifact-test, sdist-test]
363
+ runs-on: ubuntu-latest
364
+ timeout-minutes: 5
365
+ steps:
366
+ - name: Require every CI job to succeed
367
+ env:
368
+ RESULTS: ${{ toJSON(needs.*.result) }}
369
+ run: |
370
+ echo "$RESULTS"
371
+ jq -e 'all(.[]; . == "success")' <<< "$RESULTS"
@@ -0,0 +1,55 @@
1
+ name: Build and Deploy Documentation
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ workflow_dispatch: # This allows manual triggering of the workflow
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ build-and-deploy:
14
+ runs-on: ubuntu-latest
15
+ timeout-minutes: 20
16
+ permissions:
17
+ contents: write
18
+
19
+ steps:
20
+ - name: Checkout the code
21
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
22
+
23
+ - name: Install stable Python
24
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
25
+ with:
26
+ python-version: "3.14"
27
+
28
+ - name: Install uv
29
+ uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
30
+ with:
31
+ version: "0.12.24"
32
+
33
+ - name: Install Rust
34
+ uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # generic installer
35
+ with:
36
+ toolchain: stable
37
+ components: rust-src
38
+
39
+ - name: Setup, Lint, and Test Python
40
+ run: |
41
+ uv sync --frozen --all-extras
42
+ source .venv/bin/activate
43
+ sphinx-build --version # Verify Sphinx is installed
44
+
45
+ - name: Build the Sphinx documentation
46
+ working-directory: ./doc
47
+ run: |
48
+ source ../.venv/bin/activate
49
+ make html SPHINXOPTS="-W --keep-going -E -a"
50
+
51
+ - name: Deploy to GitHub Pages
52
+ uses: peaceiris/actions-gh-pages@84c30a85c19949d7eee79c4ff27748b70285e453 # v4
53
+ with:
54
+ github_token: ${{ secrets.GITHUB_TOKEN }}
55
+ publish_dir: doc/build/html
@@ -0,0 +1,56 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ concurrency:
11
+ group: release-${{ github.ref }}
12
+ cancel-in-progress: false
13
+
14
+ jobs:
15
+ validate-tag:
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
19
+ - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
20
+ with:
21
+ python-version: "3.14"
22
+ - name: Verify Python, Rust, and tag versions agree
23
+ env:
24
+ RELEASE_TAG: ${{ github.ref_name }}
25
+ run: |
26
+ python - <<'PY'
27
+ import os
28
+ from pathlib import Path
29
+ import tomllib
30
+
31
+ python_version = tomllib.loads(Path("pyproject.toml").read_text())["project"]["version"]
32
+ rust_version = tomllib.loads(Path("Cargo.toml").read_text())["package"]["version"]
33
+ assert python_version == rust_version, (python_version, rust_version)
34
+ assert os.environ["RELEASE_TAG"] == f"v{python_version}", os.environ["RELEASE_TAG"]
35
+ PY
36
+
37
+ qualify:
38
+ needs: validate-tag
39
+ uses: ./.github/workflows/ci.yml
40
+
41
+ publish:
42
+ needs: qualify
43
+ runs-on: ubuntu-latest
44
+ environment:
45
+ name: pypi
46
+ url: https://pypi.org/p/bed-reader
47
+ permissions:
48
+ id-token: write
49
+ steps:
50
+ - name: Download the qualified distributions
51
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
52
+ with:
53
+ name: wheels-all
54
+ path: dist
55
+ - name: Publish to PyPI
56
+ uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
@@ -150,4 +150,3 @@ oldCargo.lock
150
150
  bed_reader/Untitled-1.ipynb
151
151
  del.rs
152
152
  src/orig.rs
153
- uv.lock
@@ -5,6 +5,28 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.2.0] - 2026-11-13
9
+
10
+ - Require Python 3.11 or later and prepare Python 3.15 wheels with PyO3 0.30.1,
11
+ Rust NumPy 0.30, and maturin 1.16.
12
+ - Require Rust 1.85 or later. Upgrade cloud-file to 0.3.1 and use its u64 byte
13
+ ranges without narrowing file offsets. Rust callers supplying a CloudFile
14
+ must use cloud-file 0.3.
15
+ - Refresh compatible dependencies and remove the vulnerable quick-xml chain.
16
+ Retain shared ndarray 0.16 and compiler-compatible psm/crc-fast versions in
17
+ the lockfile.
18
+ - Track the uv lockfile, pin CI actions, and test installed wheels and source
19
+ distributions on boundary Python versions, including Linux and Windows ARM64.
20
+ - Preserve caller arrays when replacing missing integer metadata, including
21
+ read-only arrays, and avoid NumPy's invalid NaN-to-integer conversion warning.
22
+ - Prepare a tag-triggered PyPI release workflow that reuses the full CI suite,
23
+ validates metadata, and publishes the qualified artifacts with trusted publishing.
24
+ Compare complete direct and source-derived wheels without ignoring native code.
25
+
26
+ ## [1.1.1] - 2026-06-05
27
+
28
+ - Fix Rust README CI badge.
29
+
8
30
  ## [1.1.0] - 2026-06-04
9
31
 
10
32
  - Add support for Python 3.14.