rust-sasa-python 0.7.2__tar.gz → 0.7.4__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.
@@ -0,0 +1,228 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, master, radical]
6
+ tags: ["*"]
7
+ pull_request:
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ # Keep the build backend and dev dependency in pyproject.toml in sync with this pin.
14
+ env:
15
+ UV_VERSION: "0.13.8"
16
+ MATURIN_VERSION: "1.16.0"
17
+ RUST_TOOLCHAIN: "1.100.0"
18
+
19
+ defaults:
20
+ run:
21
+ shell: bash
22
+
23
+ jobs:
24
+ linux:
25
+ name: Linux ${{ matrix.platform.target }} / Python ${{ matrix.python }}
26
+ runs-on: ubuntu-24.04
27
+ strategy:
28
+ fail-fast: false
29
+ matrix:
30
+ python: ["3.11", "3.12", "3.13", "3.14"]
31
+ platform:
32
+ - target: x86_64
33
+ container: quay.io/pypa/manylinux2014_x86_64@sha256:e6a785657009c612fe2a85fa933051d03a50ba62b1c5e47d62abcab546a2e423
34
+ - target: x86
35
+ container: quay.io/pypa/manylinux2014_i686@sha256:7ff084c274da66ed891df826b97cd5bb1b1d36db2cc86e4f052ce47cb4b69ead
36
+ steps:
37
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
38
+ with:
39
+ persist-credentials: false
40
+ - uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
41
+ with:
42
+ version: ${{ env.UV_VERSION }}
43
+ enable-cache: false
44
+ - name: Select container interpreter
45
+ env:
46
+ PYTHON_VERSION: ${{ matrix.python }}
47
+ run: |
48
+ abi="cp${PYTHON_VERSION//./}"
49
+ echo "CONTAINER_PYTHON=/opt/python/$abi-$abi/bin/python" >> "$GITHUB_ENV"
50
+ - name: Export locked test dependencies
51
+ run: uv export --locked --extra dev --no-emit-project --prune maturin --output-file test-requirements.txt
52
+ - name: Build wheel
53
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
54
+ with:
55
+ target: ${{ matrix.platform.target }}
56
+ container: ${{ matrix.platform.container }}
57
+ manylinux: "2014"
58
+ maturin-version: ${{ env.MATURIN_VERSION }}
59
+ rust-toolchain: ${{ env.RUST_TOOLCHAIN }}
60
+ args: --release --locked --out dist --interpreter ${{ env.CONTAINER_PYTHON }}
61
+ - name: Install and test wheel in target architecture
62
+ env:
63
+ CONTAINER_IMAGE: ${{ matrix.platform.container }}
64
+ run: |
65
+ docker run --rm -v "$GITHUB_WORKSPACE:/io:ro" -w /io \
66
+ -e CONTAINER_PYTHON "$CONTAINER_IMAGE" bash -euo pipefail -c '
67
+ "$CONTAINER_PYTHON" -m venv /tmp/wheel-test
68
+ /tmp/wheel-test/bin/python -m pip install --require-hashes -r test-requirements.txt
69
+ /tmp/wheel-test/bin/python -m pip install --no-deps --no-index --find-links dist rust-sasa-python
70
+ /tmp/wheel-test/bin/python -m pytest tests/ -v -p no:cacheprovider
71
+ '
72
+ - name: Upload tested wheel
73
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
74
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
75
+ with:
76
+ name: wheels-linux-${{ matrix.platform.target }}-${{ matrix.python }}
77
+ path: dist/*.whl
78
+ if-no-files-found: error
79
+
80
+ native:
81
+ name: ${{ matrix.platform.name }} / Python ${{ matrix.python }}
82
+ runs-on: ${{ matrix.platform.runner }}
83
+ strategy:
84
+ fail-fast: false
85
+ matrix:
86
+ python: ["3.11", "3.12", "3.13", "3.14"]
87
+ platform:
88
+ - name: windows-x64
89
+ runner: windows-2022
90
+ target: x64
91
+ python-arch: x64
92
+ - name: windows-x86
93
+ runner: windows-2022
94
+ target: x86
95
+ python-arch: x86
96
+ - name: macos-x86_64
97
+ runner: macos-15-intel
98
+ target: x86_64
99
+ python-arch: x64
100
+ - name: macos-aarch64
101
+ runner: macos-15
102
+ target: aarch64
103
+ python-arch: arm64
104
+ steps:
105
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
106
+ with:
107
+ persist-credentials: false
108
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
109
+ id: python
110
+ with:
111
+ python-version: ${{ matrix.python }}
112
+ architecture: ${{ matrix.platform.python-arch }}
113
+ - uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
114
+ with:
115
+ version: ${{ env.UV_VERSION }}
116
+ enable-cache: false
117
+ - name: Build wheel
118
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
119
+ with:
120
+ target: ${{ matrix.platform.target }}
121
+ maturin-version: ${{ env.MATURIN_VERSION }}
122
+ rust-toolchain: ${{ env.RUST_TOOLCHAIN }}
123
+ args: --release --locked --out dist --interpreter python
124
+ - name: Install locked test dependencies and wheel
125
+ env:
126
+ UV_PYTHON: ${{ steps.python.outputs.python-path }}
127
+ run: |
128
+ uv sync --locked --extra dev --no-install-project
129
+ # UV_PYTHON selects the base interpreter; install into the project venv.
130
+ uv pip install --python .venv --no-deps --no-index --find-links dist rust-sasa-python
131
+ - name: Test installed wheel
132
+ env:
133
+ UV_PYTHON: ${{ steps.python.outputs.python-path }}
134
+ run: uv run --no-sync pytest tests/ -v
135
+ - name: Upload tested wheel
136
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
137
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
138
+ with:
139
+ name: wheels-${{ matrix.platform.name }}-${{ matrix.python }}
140
+ path: dist/*.whl
141
+ if-no-files-found: error
142
+
143
+ sdist:
144
+ runs-on: ubuntu-24.04
145
+ steps:
146
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
147
+ with:
148
+ persist-credentials: false
149
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
150
+ id: python
151
+ with:
152
+ python-version: "3.11"
153
+ - uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
154
+ with:
155
+ version: ${{ env.UV_VERSION }}
156
+ enable-cache: false
157
+ - name: Build sdist
158
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
159
+ with:
160
+ maturin-version: ${{ env.MATURIN_VERSION }}
161
+ rust-toolchain: ${{ env.RUST_TOOLCHAIN }}
162
+ command: sdist
163
+ args: --out dist
164
+ - name: Install and test sdist
165
+ env:
166
+ UV_PYTHON: ${{ steps.python.outputs.python-path }}
167
+ MATURIN_PEP517_ARGS: "--locked"
168
+ run: |
169
+ uv sync --locked --extra dev --no-install-project
170
+ uv pip install --python .venv --no-deps --no-build-isolation dist/*.tar.gz
171
+ uv run --no-sync pytest tests/ -v
172
+ - name: Upload tested sdist
173
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
174
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
175
+ with:
176
+ name: wheels-sdist
177
+ path: dist/*.tar.gz
178
+ if-no-files-found: error
179
+
180
+ # Preserve the existing required status-check name while gating on artifact tests.
181
+ test:
182
+ name: Test Suite
183
+ runs-on: ubuntu-24.04
184
+ needs: [linux, native, sdist]
185
+ if: always()
186
+ permissions: {}
187
+ steps:
188
+ - name: Require all distribution tests to pass
189
+ env:
190
+ RESULTS: ${{ join(needs.*.result, ',') }}
191
+ run: test "$RESULTS" = 'success,success,success'
192
+
193
+ release:
194
+ name: Release
195
+ runs-on: ubuntu-24.04
196
+ environment:
197
+ name: publishing
198
+ permissions:
199
+ id-token: write
200
+ needs: [linux, native, sdist, test]
201
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
202
+ concurrency:
203
+ group: pypi-publishing
204
+ cancel-in-progress: false
205
+ steps:
206
+ - name: Require protected release tag
207
+ env:
208
+ REF_PROTECTED: ${{ github.ref_protected }}
209
+ run: |
210
+ if [ "$REF_PROTECTED" != true ]; then
211
+ echo '::error::Protect v* tags with a repository ruleset before publishing. See .github/PUBLISHING.md.'
212
+ exit 1
213
+ fi
214
+ - name: Install uv
215
+ uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
216
+ with:
217
+ version: ${{ env.UV_VERSION }}
218
+ enable-cache: false
219
+ - name: Download tested distributions
220
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
221
+ with:
222
+ pattern: wheels-*
223
+ merge-multiple: true
224
+ path: dist/
225
+ - name: Generate PEP 740 attestations
226
+ uses: astral-sh/attest-action@39b6ce43875c196a579e31635b11aa2a2036384a # v0.0.7
227
+ - name: Publish
228
+ run: uv publish --trusted-publishing always
@@ -160,12 +160,6 @@ dependencies = [
160
160
  "hashbrown",
161
161
  ]
162
162
 
163
- [[package]]
164
- name = "indoc"
165
- version = "2.0.5"
166
- source = "registry+https://github.com/rust-lang/crates.io-index"
167
- checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
168
-
169
163
  [[package]]
170
164
  name = "libc"
171
165
  version = "0.2.153"
@@ -180,28 +174,18 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
180
174
 
181
175
  [[package]]
182
176
  name = "libmimalloc-sys"
183
- version = "0.1.44"
177
+ version = "0.1.49"
184
178
  source = "registry+https://github.com/rust-lang/crates.io-index"
185
- checksum = "667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870"
179
+ checksum = "6a45a52f43e1c16f667ccfe4dd8c85b7f7c204fd5e3bf46c5b0db9a5c3c0b8e9"
186
180
  dependencies = [
187
181
  "cc",
188
- "libc",
189
- ]
190
-
191
- [[package]]
192
- name = "memoffset"
193
- version = "0.9.1"
194
- source = "registry+https://github.com/rust-lang/crates.io-index"
195
- checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
196
- dependencies = [
197
- "autocfg",
198
182
  ]
199
183
 
200
184
  [[package]]
201
185
  name = "mimalloc"
202
- version = "0.1.48"
186
+ version = "0.1.52"
203
187
  source = "registry+https://github.com/rust-lang/crates.io-index"
204
- checksum = "e1ee66a4b64c74f4ef288bcbb9192ad9c3feaad75193129ac8509af543894fd8"
188
+ checksum = "2d4139bb28d14ad1facf21d5eb8825051b326e172d216b39f6d31df53cc97862"
205
189
  dependencies = [
206
190
  "libmimalloc-sys",
207
191
  ]
@@ -237,9 +221,9 @@ dependencies = [
237
221
 
238
222
  [[package]]
239
223
  name = "once_cell"
240
- version = "1.19.0"
224
+ version = "1.21.4"
241
225
  source = "registry+https://github.com/rust-lang/crates.io-index"
242
- checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
226
+ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
243
227
 
244
228
  [[package]]
245
229
  name = "paste"
@@ -287,9 +271,9 @@ dependencies = [
287
271
 
288
272
  [[package]]
289
273
  name = "pulp"
290
- version = "0.22.2"
274
+ version = "0.22.3"
291
275
  source = "registry+https://github.com/rust-lang/crates.io-index"
292
- checksum = "2e205bb30d5b916c55e584c22201771bcf2bad9aabd5d4127f38387140c38632"
276
+ checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a"
293
277
  dependencies = [
294
278
  "bytemuck",
295
279
  "cfg-if",
@@ -304,42 +288,38 @@ dependencies = [
304
288
 
305
289
  [[package]]
306
290
  name = "pulp-wasm-simd-flag"
307
- version = "0.1.0"
291
+ version = "0.1.1"
308
292
  source = "registry+https://github.com/rust-lang/crates.io-index"
309
- checksum = "40e24eee682d89fb193496edf918a7f407d30175b2e785fe057e4392dfd182e0"
293
+ checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740"
310
294
 
311
295
  [[package]]
312
296
  name = "pyo3"
313
- version = "0.25.1"
297
+ version = "0.30.1"
314
298
  source = "registry+https://github.com/rust-lang/crates.io-index"
315
- checksum = "8970a78afe0628a3e3430376fc5fd76b6b45c4d43360ffd6cdd40bdde72b682a"
299
+ checksum = "229ca13b8a15bb0d1487b81ab975bfcd97513416499a8312011b6036e42e0de4"
316
300
  dependencies = [
317
- "indoc",
318
301
  "libc",
319
- "memoffset",
320
302
  "once_cell",
321
303
  "portable-atomic",
322
304
  "pyo3-build-config",
323
305
  "pyo3-ffi",
324
306
  "pyo3-macros",
325
- "unindent",
326
307
  ]
327
308
 
328
309
  [[package]]
329
310
  name = "pyo3-build-config"
330
- version = "0.25.1"
311
+ version = "0.30.1"
331
312
  source = "registry+https://github.com/rust-lang/crates.io-index"
332
- checksum = "458eb0c55e7ece017adeba38f2248ff3ac615e53660d7c71a238d7d2a01c7598"
313
+ checksum = "70130e2b6dd1ee589a8788026a429561ca5c40fa7a2fa7914c2282eddae24700"
333
314
  dependencies = [
334
- "once_cell",
335
315
  "target-lexicon",
336
316
  ]
337
317
 
338
318
  [[package]]
339
319
  name = "pyo3-ffi"
340
- version = "0.25.1"
320
+ version = "0.30.1"
341
321
  source = "registry+https://github.com/rust-lang/crates.io-index"
342
- checksum = "7114fe5457c61b276ab77c5055f206295b812608083644a5c5b2640c3102565c"
322
+ checksum = "5e7ff73c555c286d212d4ce7e5fbda845a973c4f61bd5f160f5f2c3c2a04d1c4"
343
323
  dependencies = [
344
324
  "libc",
345
325
  "pyo3-build-config",
@@ -347,27 +327,26 @@ dependencies = [
347
327
 
348
328
  [[package]]
349
329
  name = "pyo3-macros"
350
- version = "0.25.1"
330
+ version = "0.30.1"
351
331
  source = "registry+https://github.com/rust-lang/crates.io-index"
352
- checksum = "a8725c0a622b374d6cb051d11a0983786448f7785336139c3c94f5aa6bef7e50"
332
+ checksum = "c46d2e5862c7bb8207e3b639f713dda3c499933444784154c11d013c5a691b60"
353
333
  dependencies = [
354
334
  "proc-macro2 1.0.95",
355
335
  "pyo3-macros-backend",
356
- "quote 1.0.36",
357
- "syn",
336
+ "quote 1.0.47",
337
+ "syn 3.0.10",
358
338
  ]
359
339
 
360
340
  [[package]]
361
341
  name = "pyo3-macros-backend"
362
- version = "0.25.1"
342
+ version = "0.30.1"
363
343
  source = "registry+https://github.com/rust-lang/crates.io-index"
364
- checksum = "4109984c22491085343c05b0dbc54ddc405c3cf7b4374fc533f5c3313a572ccc"
344
+ checksum = "38b89f066f2ae72a2aef52d1537ca2fcd104440ebfadee06e97aa90738a25b9b"
365
345
  dependencies = [
366
346
  "heck",
367
347
  "proc-macro2 1.0.95",
368
- "pyo3-build-config",
369
- "quote 1.0.36",
370
- "syn",
348
+ "quote 1.0.47",
349
+ "syn 3.0.10",
371
350
  ]
372
351
 
373
352
  [[package]]
@@ -381,9 +360,9 @@ dependencies = [
381
360
 
382
361
  [[package]]
383
362
  name = "quote"
384
- version = "1.0.36"
363
+ version = "1.0.47"
385
364
  source = "registry+https://github.com/rust-lang/crates.io-index"
386
- checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
365
+ checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
387
366
  dependencies = [
388
367
  "proc-macro2 1.0.95",
389
368
  ]
@@ -449,10 +428,9 @@ dependencies = [
449
428
 
450
429
  [[package]]
451
430
  name = "rust-sasa-python"
452
- version = "0.7.2"
431
+ version = "0.7.4"
453
432
  dependencies = [
454
433
  "mimalloc",
455
- "num-complex",
456
434
  "pdbtbx",
457
435
  "pulp",
458
436
  "pyo3",
@@ -485,8 +463,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
485
463
  checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
486
464
  dependencies = [
487
465
  "proc-macro2 1.0.95",
488
- "quote 1.0.36",
489
- "syn",
466
+ "quote 1.0.47",
467
+ "syn 2.0.104",
490
468
  ]
491
469
 
492
470
  [[package]]
@@ -518,8 +496,8 @@ checksum = "c1c97747dbf44bb1ca44a561ece23508e99cb592e862f22222dcf42f51d1e451"
518
496
  dependencies = [
519
497
  "heck",
520
498
  "proc-macro2 1.0.95",
521
- "quote 1.0.36",
522
- "syn",
499
+ "quote 1.0.47",
500
+ "syn 2.0.104",
523
501
  ]
524
502
 
525
503
  [[package]]
@@ -535,15 +513,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
535
513
  checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40"
536
514
  dependencies = [
537
515
  "proc-macro2 1.0.95",
538
- "quote 1.0.36",
516
+ "quote 1.0.47",
517
+ "unicode-ident",
518
+ ]
519
+
520
+ [[package]]
521
+ name = "syn"
522
+ version = "3.0.10"
523
+ source = "registry+https://github.com/rust-lang/crates.io-index"
524
+ checksum = "4ae9ccbea3a7b0b09443036490c8f34a8b1b760fd345e5c0dae0aac718faea79"
525
+ dependencies = [
526
+ "proc-macro2 1.0.95",
527
+ "quote 1.0.47",
539
528
  "unicode-ident",
540
529
  ]
541
530
 
542
531
  [[package]]
543
532
  name = "target-lexicon"
544
- version = "0.13.2"
533
+ version = "0.13.5"
545
534
  source = "registry+https://github.com/rust-lang/crates.io-index"
546
- checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a"
535
+ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
547
536
 
548
537
  [[package]]
549
538
  name = "unicode-ident"
@@ -557,12 +546,6 @@ version = "0.1.0"
557
546
  source = "registry+https://github.com/rust-lang/crates.io-index"
558
547
  checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
559
548
 
560
- [[package]]
561
- name = "unindent"
562
- version = "0.2.3"
563
- source = "registry+https://github.com/rust-lang/crates.io-index"
564
- checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
565
-
566
549
  [[package]]
567
550
  name = "version_check"
568
551
  version = "0.9.5"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rust-sasa-python"
3
- version = "0.7.2"
3
+ version = "0.7.4"
4
4
  edition = "2024"
5
5
  readme = "README.md"
6
6
 
@@ -11,8 +11,7 @@ crate-type = ["cdylib"]
11
11
 
12
12
  [dependencies]
13
13
  pdbtbx = "0.12.0"
14
- pyo3 = "0.25.1"
14
+ pyo3 = "0.30.1"
15
15
  rust-sasa = "0.9.2"
16
- mimalloc = "0.1.47"
17
- num-complex = "0.4.6"
18
- pulp = "0.22.2"
16
+ mimalloc = "0.1.52"
17
+ pulp = "0.22.3"
@@ -1,35 +1,41 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rust-sasa-python
3
- Version: 0.7.2
3
+ Version: 0.7.4
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
7
7
  Requires-Dist: pytest>=8.4.1 ; extra == 'dev'
8
- Requires-Dist: maturin>=1.5,<2.0 ; extra == 'dev'
8
+ Requires-Dist: maturin==1.16.0 ; extra == 'dev'
9
9
  Provides-Extra: dev
10
10
  License-File: LICENSE.md
11
- Summary: An ultra-fast package for computing Solvent Accessible Surface Area (SASA/ASA) for proteins
12
- **46X** faster than Biopython, **7X** faster than Freesasa
11
+ Summary: An ultra-fast package for computing Solvent Accessible Surface Area (SASA/ASA) for proteins **46X** faster than Biopython, **7X** faster than Freesasa
13
12
  Author: Max Campbell
14
13
  Requires-Python: >=3.11
15
14
  Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
16
15
 
17
16
  # rust-sasa-python
18
17
 
19
- A high-performance **Python library** for computing SASA (Solvent Accessible Surface Area) using Rust as the backend. This library provides a clean, Pythonic interface to the fast RustSASA calculation engine.
18
+ A high-performance **Python library** for computing SASA (Solvent Accessible Surface Area) using Rust as the backend. This library provides a clean, Pythonic interface to the fast RustSASA calculation engine. If you use RustSASA in your research, please [cite it](https://github.com/maxall41/RustSASA#how-to-cite).
20
19
 
21
20
  ## Features
22
21
 
23
- - 🦀 **Powered by [RustSASA](https://github.com/maxall41/RustSASA)**: Leverages Rust's performance and safety.
24
- - ⚡️ **Ludicrous Speed**: **63X** faster than Biopython, **5X** faster than Freesasa.
25
- - 🐍 **Pythonic Interface**: Clean, intuitive API.
26
- - 🔧 **Configurable**: Customizable probe radius and sampling points.
27
- - 📁 **PDB and mmCIF SUPPORT**: Supports both PDB and mmCIF files.
22
+ - **Powered by [RustSASA](https://github.com/maxall41/RustSASA)**: Leverages Rust's performance and safety.
23
+ - **Ludicrous Speed**: **63X** faster than Biopython, **5X** faster than Freesasa.
24
+ - **Pythonic Interface**: Clean, intuitive API.
25
+ - **Configurable**: Customizable probe radius and sampling points.
26
+ - **PDB and mmCIF SUPPORT**: Supports both PDB and mmCIF files.
28
27
 
29
28
  ## Installation
30
29
 
31
- ```bash
30
+ ```shell
31
+ # PyPI
32
32
  pip install rust-sasa-python
33
+
34
+ # conda
35
+ conda install -c conda-forge rust-sasa-python
36
+
37
+ # mamba
38
+ mamba install -c conda-forge rust-sasa-python
33
39
  ```
34
40
 
35
41
  ## Quick Start
@@ -1,19 +1,26 @@
1
1
  # rust-sasa-python
2
2
 
3
- A high-performance **Python library** for computing SASA (Solvent Accessible Surface Area) using Rust as the backend. This library provides a clean, Pythonic interface to the fast RustSASA calculation engine.
3
+ A high-performance **Python library** for computing SASA (Solvent Accessible Surface Area) using Rust as the backend. This library provides a clean, Pythonic interface to the fast RustSASA calculation engine. If you use RustSASA in your research, please [cite it](https://github.com/maxall41/RustSASA#how-to-cite).
4
4
 
5
5
  ## Features
6
6
 
7
- - 🦀 **Powered by [RustSASA](https://github.com/maxall41/RustSASA)**: Leverages Rust's performance and safety.
8
- - ⚡️ **Ludicrous Speed**: **63X** faster than Biopython, **5X** faster than Freesasa.
9
- - 🐍 **Pythonic Interface**: Clean, intuitive API.
10
- - 🔧 **Configurable**: Customizable probe radius and sampling points.
11
- - 📁 **PDB and mmCIF SUPPORT**: Supports both PDB and mmCIF files.
7
+ - **Powered by [RustSASA](https://github.com/maxall41/RustSASA)**: Leverages Rust's performance and safety.
8
+ - **Ludicrous Speed**: **63X** faster than Biopython, **5X** faster than Freesasa.
9
+ - **Pythonic Interface**: Clean, intuitive API.
10
+ - **Configurable**: Customizable probe radius and sampling points.
11
+ - **PDB and mmCIF SUPPORT**: Supports both PDB and mmCIF files.
12
12
 
13
13
  ## Installation
14
14
 
15
- ```bash
15
+ ```shell
16
+ # PyPI
16
17
  pip install rust-sasa-python
18
+
19
+ # conda
20
+ conda install -c conda-forge rust-sasa-python
21
+
22
+ # mamba
23
+ mamba install -c conda-forge rust-sasa-python
17
24
  ```
18
25
 
19
26
  ## Quick Start
@@ -1,5 +1,5 @@
1
1
  [build-system]
2
- requires = ["maturin>=1.5,<2.0"]
2
+ requires = ["maturin==1.16.0"]
3
3
  build-backend = "maturin"
4
4
 
5
5
  [project]
@@ -16,7 +16,7 @@ readme = "README.md"
16
16
  authors = [{ name = "Max Campbell" }]
17
17
 
18
18
  [project.optional-dependencies]
19
- dev = ["pytest>=8.4.1", "maturin>=1.5,<2.0"]
19
+ dev = ["pytest>=8.4.1", "maturin==1.16.0"]
20
20
 
21
21
  [tool.maturin]
22
22
  features = ["pyo3/extension-module"]
@@ -12,7 +12,7 @@ mod simd;
12
12
  #[global_allocator]
13
13
  static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
14
14
 
15
- #[pyclass]
15
+ #[pyclass(from_py_object)]
16
16
  #[derive(Clone)]
17
17
  pub struct Protein {
18
18
  #[pyo3(get)]
@@ -33,7 +33,7 @@ impl Protein {
33
33
  }
34
34
  }
35
35
 
36
- #[pyclass]
36
+ #[pyclass(from_py_object)]
37
37
  #[derive(Clone)]
38
38
  pub struct Residue {
39
39
  #[pyo3(get)]
@@ -56,7 +56,7 @@ impl Residue {
56
56
  }
57
57
  }
58
58
 
59
- #[pyclass]
59
+ #[pyclass(from_py_object)]
60
60
  #[derive(Clone)]
61
61
  pub struct Chain {
62
62
  #[pyo3(get)]
@@ -72,7 +72,7 @@ impl Chain {
72
72
  }
73
73
  }
74
74
 
75
- #[pyclass]
75
+ #[pyclass(from_py_object)]
76
76
  #[derive(Clone)]
77
77
  pub struct SASACalculator {
78
78
  pdb_path: String,
@@ -22,22 +22,23 @@ wheels = [
22
22
 
23
23
  [[package]]
24
24
  name = "maturin"
25
- version = "1.9.1"
25
+ version = "1.16.0"
26
26
  source = { registry = "https://pypi.org/simple" }
27
- sdist = { url = "https://files.pythonhosted.org/packages/94/f7/73cf2ae0d6db943a627d28c09f5368735fce6b8b2ad1e1f6bcda2632c80a/maturin-1.9.1.tar.gz", hash = "sha256:97b52fb19d20c1fdc70e4efdc05d79853a4c9c0051030c93a793cd5181dc4ccd", size = 209757, upload-time = "2025-07-08T04:54:43.877Z" }
27
+ sdist = { url = "https://files.pythonhosted.org/packages/bd/71/eb078174335ff30bde1be2ad54fb6256db4b160eb3efa81163fa30f8c814/maturin-1.16.0.tar.gz", hash = "sha256:13e69ca12542999d8c5467131de72a49bb76e4c284b9a45c5783df7c0fcb3a8a", size = 396641, upload-time = "2026-10-29T14:09:43.096Z" }
28
28
  wheels = [
29
- { url = "https://files.pythonhosted.org/packages/48/f2/de43e8954092bd957fbdfbc5b978bf8be40f27aec1a4ebd65e57cfb3ec8a/maturin-1.9.1-py3-none-linux_armv6l.whl", hash = "sha256:fe8f59f9e387fb19635eab6b7381ef718e5dc7a328218e6da604c91f206cbb72", size = 8270244, upload-time = "2025-07-08T04:54:17.962Z" },
30
- { url = "https://files.pythonhosted.org/packages/b8/72/36966375c2c2bb2d66df4fa756cfcd54175773719b98d4b26a6b4d1f0bfc/maturin-1.9.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6a9c9d176f6df3a8ec1a4c9c72c8a49674ed13668a03c9ead5fab983bbeeb624", size = 16053959, upload-time = "2025-07-08T04:54:21.153Z" },
31
- { url = "https://files.pythonhosted.org/packages/c4/40/4e0da87e563333ff1605fef15bed5858c2a41c0c0404e47f20086f214473/maturin-1.9.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e14eedbc4369dda1347ce9ddc183ade7c513d9975b7ea2b9c9e4211fb74f597a", size = 8407170, upload-time = "2025-07-08T04:54:23.351Z" },
32
- { url = "https://files.pythonhosted.org/packages/d9/27/4b29614964c10370effcdfcf34ec57126c9a4b921b7a2c42a94ae3a59cb0/maturin-1.9.1-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:2f05f07bc887e010c44d32a088aea4f36a2104e301f51f408481e4e9759471a7", size = 8258775, upload-time = "2025-07-08T04:54:25.596Z" },
33
- { url = "https://files.pythonhosted.org/packages/e0/5b/b15ad53e1e6733d8798ce903d25d9e05aa3083b2544f1a6f863ea01dd50d/maturin-1.9.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:e7eb54db3aace213420cd545b24a149842e8d6b1fcec046d0346f299d8adfc34", size = 8787295, upload-time = "2025-07-08T04:54:27.154Z" },
34
- { url = "https://files.pythonhosted.org/packages/72/d8/b97f4767786eae63bb6b700b342766bcea88da98796bfee290bcddd99fd8/maturin-1.9.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:9d037a37b8ef005eebdea61eaf0e3053ebcad3b740162932fbc120db5fdf5653", size = 8053283, upload-time = "2025-07-08T04:54:28.953Z" },
35
- { url = "https://files.pythonhosted.org/packages/95/45/770fc005bceac81f5905c96f37c36f65fa9c3da3f4aa8d4e4d2a883aa967/maturin-1.9.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:7c26fb60d80e6a72a8790202bb14dbef956b831044f55d1ce4e2c2e915eb6124", size = 8127120, upload-time = "2025-07-08T04:54:30.779Z" },
36
- { url = "https://files.pythonhosted.org/packages/2f/a6/be684b4fce58f8b3a9d3b701c23961d5fe0e1710ed484e2216441997e74f/maturin-1.9.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:e0a2c546c123ed97d1ee0c9cc80a912d9174913643c737c12adf4bce46603bb3", size = 10569627, upload-time = "2025-07-08T04:54:32.54Z" },
37
- { url = "https://files.pythonhosted.org/packages/24/ad/7f8a9d8a1b79c2ed6291aaaa22147c98efee729b23df2803c319dd658049/maturin-1.9.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5dde6fbcc36a1173fe74e6629fee36e89df76236247b64b23055f1f820bdf35", size = 8934678, upload-time = "2025-07-08T04:54:34.529Z" },
38
- { url = "https://files.pythonhosted.org/packages/59/5f/97ff670cb718a40ee21faf38e07e0d773573180de98ee453142e5f932052/maturin-1.9.1-py3-none-win32.whl", hash = "sha256:69d9f752f33a3c95062014f464cbd715e83a175f4601b76a9ce3db6ea18df976", size = 7261272, upload-time = "2025-07-08T04:54:36.584Z" },
39
- { url = "https://files.pythonhosted.org/packages/a6/07/c99058a73d0f7d8e8c87bf60c48a96c44f42ff4ef6a6ae4ca3821605bdd2/maturin-1.9.1-py3-none-win_amd64.whl", hash = "sha256:c8b71cf0f6a5f712ac1466641d520e2ce3fbe44104319a55d875cc8326dcdd61", size = 8280274, upload-time = "2025-07-08T04:54:38.343Z" },
40
- { url = "https://files.pythonhosted.org/packages/06/3d/74e75874b75fc82e4774f2ed78ad546fda3e127bae4a971db3611bdab285/maturin-1.9.1-py3-none-win_arm64.whl", hash = "sha256:0e6e2ddc83999ac3999576b06649a327536a51d57c917fa01416e40f53106bda", size = 6936614, upload-time = "2025-07-08T04:54:41.888Z" },
29
+ { url = "https://files.pythonhosted.org/packages/c0/f8/235d4a8b3d61af3c7744582ae9e6ccb8f096e9f68f06fe62d7d03e5d7b2d/maturin-1.16.0-py3-none-linux_armv6l.whl", hash = "sha256:deacbb204a20326862e194c7df4958e0514a0411c9a3ccf228a00067c11b5c7e", size = 10425070, upload-time = "2026-10-29T14:09:06.221Z" },
30
+ { url = "https://files.pythonhosted.org/packages/fb/d5/f49a90d8c489dc5f134654ec91d12a78a51599fdc8c2b5a1bc2391bca0ac/maturin-1.16.0-py3-none-macosx_10_12_universal2.macosx_10_12_x86_64.macosx_11_0_arm64.whl", hash = "sha256:131fcc17ddb3ccc48aa183d2172ebf994c322b858e1b9694fb8744d783df66f6", size = 19839189, upload-time = "2026-10-29T14:09:09.441Z" },
31
+ { url = "https://files.pythonhosted.org/packages/d2/8e/d65633d7c25484cb82735a51e15bc969f9874a13557e2b352d27df574c20/maturin-1.16.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2216d731c9324869d3bff72c0c73009bb6e640b3fa7d340174ae70dc874d1d9f", size = 10271659, upload-time = "2026-10-29T14:09:12.596Z" },
32
+ { url = "https://files.pythonhosted.org/packages/0a/dc/e77f490557cb5e045a75c3d18a7965425ac576235c970dfff4d903eb2c74/maturin-1.16.0-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:837db2f4d93d4899c3ac393fb3cc9eebf35b6002336e5d574f4a4fb6c49fe283", size = 10763361, upload-time = "2026-10-29T14:09:16.11Z" },
33
+ { url = "https://files.pythonhosted.org/packages/fa/eb/535564a4211105fd64611fa4f9437c8925eded26a97d58de84565f5aebfa/maturin-1.16.0-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:399fadcd4af39532a173e010240c34930eacc1bb1746bb179863481c68bcf1ab", size = 10442856, upload-time = "2026-10-29T14:09:18.64Z" },
34
+ { url = "https://files.pythonhosted.org/packages/45/5b/570e13ce81f103be6609c067a06c5bac08da5af0cf7ea700c9ae43419be9/maturin-1.16.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:e285ec9eb10243d45d10417178cb2eb76e0cbb184d0aa4378b503489fa12ee78", size = 10298796, upload-time = "2026-10-29T14:09:21.385Z" },
35
+ { url = "https://files.pythonhosted.org/packages/88/a6/26b40c31c354359fe4e49398113d018694c7035968fe1b569bb13c3905af/maturin-1.16.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:609228d639c5b888dc41364cbd318547a59f027481f53cba85838f46da4b3f02", size = 10268023, upload-time = "2026-10-29T14:09:23.94Z" },
36
+ { url = "https://files.pythonhosted.org/packages/2b/19/faca1784d917c2eecd498648dff6a0179b299c8142cc448ea5b1183545ec/maturin-1.16.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:7001fd3ac591820d01f2fa041552c367ec587c98649d9f10a817cc7f28e59062", size = 13739038, upload-time = "2026-10-29T14:09:26.662Z" },
37
+ { url = "https://files.pythonhosted.org/packages/36/c1/d67e77aa07100e3b2d4c0d9ef6922646d9c4bab25cc04f91023aefc72418/maturin-1.16.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b0573a146803f24566f5b301a4572a8e49bcab4917175407c730da13b46e134", size = 11100193, upload-time = "2026-10-29T14:09:29.659Z" },
38
+ { url = "https://files.pythonhosted.org/packages/76/44/ccef52f02ab0e1f7258bc8fe0140b4991c6287458ef883af1027f946a253/maturin-1.16.0-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:c16d3589cbddda9420237fdb1394b1a9b36483c0bce83b23de6118c908a8e940", size = 10663849, upload-time = "2026-10-29T14:09:32.183Z" },
39
+ { url = "https://files.pythonhosted.org/packages/6e/9b/3104f62dbb428f9e26e35cba2c80cfc42ba9bb1dc4968882c19d1bfe594b/maturin-1.16.0-py3-none-win32.whl", hash = "sha256:9e221c047931caa79283cc0c2278904ae1b25880dde3574b0447657d72907689", size = 9124894, upload-time = "2026-10-29T14:09:34.857Z" },
40
+ { url = "https://files.pythonhosted.org/packages/63/b8/c25ce706c4797ee1663bcf1f386ffe91d8a3b3589700a135a204b49bc4b0/maturin-1.16.0-py3-none-win_amd64.whl", hash = "sha256:9d43a2adf51a2794e907a8f7dbad06eb114d5edb0909c73c1fa9040f15e584e9", size = 10575645, upload-time = "2026-10-29T14:09:37.864Z" },
41
+ { url = "https://files.pythonhosted.org/packages/eb/74/f69aba8b22539e5ed58323d4a6ee974afd9edda238489c73926cc0fc9d51/maturin-1.16.0-py3-none-win_arm64.whl", hash = "sha256:95f34ce53249fb7095ff4f2aff64d2562c511d6edf3e216c15dbffcd82b72b4f", size = 9886475, upload-time = "2026-10-29T14:09:40.603Z" },
41
42
  ]
42
43
 
43
44
  [[package]]
@@ -95,7 +96,7 @@ dev = [
95
96
 
96
97
  [package.metadata]
97
98
  requires-dist = [
98
- { name = "maturin", marker = "extra == 'dev'", specifier = ">=1.5,<2.0" },
99
+ { name = "maturin", marker = "extra == 'dev'", specifier = "==1.16.0" },
99
100
  { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.4.1" },
100
101
  ]
101
102
  provides-extras = ["dev"]
@@ -1,150 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
- - master
8
- - radical
9
- tags:
10
- - "*"
11
- pull_request:
12
- workflow_dispatch:
13
-
14
- permissions:
15
- contents: read
16
-
17
- jobs:
18
- linux:
19
- runs-on: ${{ matrix.platform.runner }}
20
- strategy:
21
- matrix:
22
- platform:
23
- - runner: ubuntu-latest
24
- target: x86_64
25
- - runner: ubuntu-latest
26
- target: x86
27
- steps:
28
- - uses: actions/checkout@v4
29
- - uses: actions/setup-python@v5
30
- with:
31
- python-version: "3.13"
32
- - name: Build wheels
33
- uses: PyO3/maturin-action@v1
34
- with:
35
- target: ${{ matrix.platform.target }}
36
- args: --release --out dist --find-interpreter
37
- sccache: "true"
38
- manylinux: auto
39
- - name: Upload wheels
40
- uses: actions/upload-artifact@v4
41
- with:
42
- name: wheels-linux-${{ matrix.platform.target }}
43
- path: dist
44
-
45
- windows:
46
- runs-on: ${{ matrix.platform.runner }}
47
- strategy:
48
- matrix:
49
- platform:
50
- - runner: windows-latest
51
- target: x64
52
- - runner: windows-latest
53
- target: x86
54
- steps:
55
- - uses: actions/checkout@v4
56
- - uses: actions/setup-python@v5
57
- with:
58
- python-version: "3.13"
59
- architecture: ${{ matrix.platform.target }}
60
- - name: Build wheels
61
- uses: PyO3/maturin-action@v1
62
- with:
63
- target: ${{ matrix.platform.target }}
64
- args: --release --out dist --find-interpreter
65
- sccache: "true"
66
- - name: Upload wheels
67
- uses: actions/upload-artifact@v4
68
- with:
69
- name: wheels-windows-${{ matrix.platform.target }}
70
- path: dist
71
-
72
- macos:
73
- runs-on: ${{ matrix.platform.runner }}
74
- strategy:
75
- matrix:
76
- platform:
77
- - runner: macos-latest
78
- target: x86_64
79
- - runner: macos-14
80
- target: aarch64
81
- steps:
82
- - uses: actions/checkout@v4
83
- - uses: actions/setup-python@v5
84
- with:
85
- python-version: "3.13"
86
- - name: Build wheels
87
- uses: PyO3/maturin-action@v1
88
- with:
89
- target: ${{ matrix.platform.target }}
90
- args: --release --out dist --find-interpreter
91
- sccache: "true"
92
- - name: Upload wheels
93
- uses: actions/upload-artifact@v4
94
- with:
95
- name: wheels-macos-${{ matrix.platform.target }}
96
- path: dist
97
-
98
- sdist:
99
- runs-on: ubuntu-latest
100
- steps:
101
- - uses: actions/checkout@v4
102
- - name: Build sdist
103
- uses: PyO3/maturin-action@v1
104
- with:
105
- command: sdist
106
- args: --out dist
107
- - name: Upload sdist
108
- uses: actions/upload-artifact@v4
109
- with:
110
- name: wheels-sdist
111
- path: dist
112
-
113
- test:
114
- name: Test Suite
115
- runs-on: ${{ matrix.os }}
116
- strategy:
117
- matrix:
118
- os: [ubuntu-latest, windows-latest, macos-latest]
119
- steps:
120
- - uses: actions/checkout@v4
121
- - name: Install uv
122
- uses: astral-sh/setup-uv@v3
123
- with:
124
- version: "latest"
125
- - name: Set up Python
126
- run: uv python install 3.13
127
- - name: Install dependencies
128
- run: |
129
- uv add --dev pytest maturin
130
- - name: Build and install package
131
- run: |
132
- uv run maturin develop --release
133
- - name: Run tests
134
- run: |
135
- uv run pytest tests/ -v
136
-
137
- release:
138
- name: Release
139
- runs-on: ubuntu-latest
140
- needs: [linux, windows, macos, sdist, test]
141
- if: startsWith(github.ref, 'refs/tags/v')
142
- steps:
143
- - uses: actions/download-artifact@v4
144
- - name: Publish to PyPI
145
- uses: PyO3/maturin-action@v1
146
- env:
147
- MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
148
- with:
149
- command: upload
150
- args: --non-interactive --skip-existing wheels-*/*