preppers 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.
@@ -0,0 +1,306 @@
1
+ # This file is autogenerated by maturin v1.7.8
2
+ # with updates for CodeArtifact by @sjust-seerbio 2024-12-18
3
+ #
4
+ # To update, run
5
+ #
6
+ # maturin generate-ci github -m python/Cargo.toml --pytest
7
+ #
8
+ # but be sure to preserve CodeArtifact behavior!
9
+ #
10
+ name: CI
11
+
12
+ on:
13
+ push:
14
+ branches:
15
+ - main
16
+ - master
17
+ tags:
18
+ - '*'
19
+ pull_request:
20
+ workflow_dispatch:
21
+
22
+ permissions:
23
+ contents: read
24
+
25
+ jobs:
26
+ linux:
27
+ runs-on: ${{ matrix.platform.runner }}
28
+ strategy:
29
+ matrix:
30
+ platform:
31
+ - runner: ubuntu-22.04
32
+ target: x86_64
33
+ - runner: ubuntu-22.04
34
+ target: x86
35
+ - runner: ubuntu-22.04
36
+ target: aarch64
37
+ - runner: ubuntu-22.04
38
+ target: armv7
39
+ - runner: ubuntu-22.04
40
+ target: s390x
41
+ - runner: ubuntu-22.04
42
+ target: ppc64le
43
+ steps:
44
+ - uses: actions/checkout@v4
45
+ - uses: dtolnay/rust-toolchain@stable
46
+ if: ${{ startsWith(matrix.platform.target, 'x86_64') }}
47
+ - name: Run Rust unit tests
48
+ if: ${{ startsWith(matrix.platform.target, 'x86_64') }}
49
+ run:
50
+ cargo test
51
+ - uses: actions/setup-python@v5
52
+ with:
53
+ python-version: 3.x
54
+ - name: Build wheels
55
+ uses: PyO3/maturin-action@v1
56
+ with:
57
+ target: ${{ matrix.platform.target }}
58
+ args: --release --out dist --find-interpreter --manifest-path python/Cargo.toml
59
+ sccache: 'true'
60
+ manylinux: auto
61
+ - name: Upload wheels
62
+ uses: actions/upload-artifact@v4
63
+ with:
64
+ name: wheels-linux-${{ matrix.platform.target }}
65
+ path: dist
66
+ - name: pytest
67
+ if: ${{ startsWith(matrix.platform.target, 'x86_64') }}
68
+ shell: bash
69
+ run: |
70
+ set -e
71
+ python3 -m venv .venv
72
+ source .venv/bin/activate
73
+ pip install preppers --find-links dist --force-reinstall
74
+ pip install pytest
75
+ cd python && pytest
76
+ - name: pytest
77
+ if: ${{ !startsWith(matrix.platform.target, 'x86') && matrix.platform.target != 'ppc64' }}
78
+ uses: uraimo/run-on-arch-action@v2
79
+ with:
80
+ arch: ${{ matrix.platform.target }}
81
+ distro: ubuntu22.04
82
+ githubToken: ${{ github.token }}
83
+ install: |
84
+ apt-get update
85
+ apt-get install -y --no-install-recommends python3 python3-pip
86
+ pip3 install -U pip pytest
87
+ run: |
88
+ set -e
89
+ pip3 install preppers --find-links dist --force-reinstall
90
+ cd python && pytest
91
+
92
+ musllinux:
93
+ runs-on: ${{ matrix.platform.runner }}
94
+ strategy:
95
+ matrix:
96
+ platform:
97
+ - runner: ubuntu-22.04
98
+ target: x86_64
99
+ - runner: ubuntu-22.04
100
+ target: x86
101
+ - runner: ubuntu-22.04
102
+ target: aarch64
103
+ - runner: ubuntu-22.04
104
+ target: armv7
105
+ steps:
106
+ - uses: actions/checkout@v4
107
+ - uses: actions/setup-python@v5
108
+ with:
109
+ python-version: 3.x
110
+ - name: Build wheels
111
+ uses: PyO3/maturin-action@v1
112
+ with:
113
+ target: ${{ matrix.platform.target }}
114
+ args: --release --out dist --find-interpreter --manifest-path python/Cargo.toml
115
+ sccache: 'true'
116
+ manylinux: musllinux_1_2
117
+ - name: Upload wheels
118
+ uses: actions/upload-artifact@v4
119
+ with:
120
+ name: wheels-musllinux-${{ matrix.platform.target }}
121
+ path: dist
122
+ - name: pytest
123
+ if: ${{ startsWith(matrix.platform.target, 'x86_64') }}
124
+ uses: addnab/docker-run-action@v3
125
+ with:
126
+ image: alpine:latest
127
+ options: -v ${{ github.workspace }}:/io -w /io
128
+ run: |
129
+ set -e
130
+ apk add py3-pip py3-virtualenv
131
+ python3 -m virtualenv .venv
132
+ source .venv/bin/activate
133
+ pip install preppers --no-index --find-links dist --force-reinstall
134
+ pip install pytest
135
+ cd python && pytest
136
+ - name: pytest
137
+ if: ${{ !startsWith(matrix.platform.target, 'x86') }}
138
+ uses: uraimo/run-on-arch-action@v2
139
+ with:
140
+ arch: ${{ matrix.platform.target }}
141
+ distro: alpine_latest
142
+ githubToken: ${{ github.token }}
143
+ install: |
144
+ apk add py3-virtualenv
145
+ run: |
146
+ set -e
147
+ python3 -m virtualenv .venv
148
+ source .venv/bin/activate
149
+ pip install pytest
150
+ pip install preppers --find-links dist --force-reinstall
151
+ cd python && pytest
152
+
153
+ windows:
154
+ runs-on: ${{ matrix.platform.runner }}
155
+ strategy:
156
+ matrix:
157
+ platform:
158
+ - runner: windows-latest
159
+ target: x64
160
+ - runner: windows-latest
161
+ target: x86
162
+ steps:
163
+ - uses: actions/checkout@v4
164
+ - uses: dtolnay/rust-toolchain@stable
165
+ if: ${{ startsWith(matrix.platform.target, 'x64') }}
166
+ - name: Run Rust unit tests
167
+ if: ${{ startsWith(matrix.platform.target, 'x64') }}
168
+ run:
169
+ cargo test
170
+ - uses: actions/setup-python@v5
171
+ with:
172
+ python-version: 3.x
173
+ architecture: ${{ matrix.platform.target }}
174
+ - name: Build wheels
175
+ uses: PyO3/maturin-action@v1
176
+ with:
177
+ target: ${{ matrix.platform.target }}
178
+ args: --release --out dist --find-interpreter --manifest-path python/Cargo.toml
179
+ sccache: 'true'
180
+ - name: Upload wheels
181
+ uses: actions/upload-artifact@v4
182
+ with:
183
+ name: wheels-windows-${{ matrix.platform.target }}
184
+ path: dist
185
+ - name: pytest
186
+ if: ${{ !startsWith(matrix.platform.target, 'aarch64') }}
187
+ shell: bash
188
+ run: |
189
+ set -e
190
+ python3 -m venv .venv
191
+ source .venv/Scripts/activate
192
+ pip install preppers --find-links dist --force-reinstall
193
+ pip install pytest
194
+ cd python && pytest
195
+
196
+ macos:
197
+ runs-on: ${{ matrix.platform.runner }}
198
+ strategy:
199
+ matrix:
200
+ platform:
201
+ - runner: macos-15-intel
202
+ target: x86_64
203
+ - runner: macos-15
204
+ target: aarch64
205
+ steps:
206
+ - uses: actions/checkout@v4
207
+ - uses: actions/setup-python@v5
208
+ with:
209
+ python-version: 3.x
210
+ - uses: dtolnay/rust-toolchain@stable
211
+ - name: Run Rust unit tests
212
+ run:
213
+ cargo test
214
+ - name: Build wheels
215
+ uses: PyO3/maturin-action@v1
216
+ with:
217
+ target: ${{ matrix.platform.target }}
218
+ args: --release --out dist --find-interpreter --manifest-path python/Cargo.toml
219
+ sccache: 'true'
220
+ - name: Upload wheels
221
+ uses: actions/upload-artifact@v4
222
+ with:
223
+ name: wheels-macos-${{ matrix.platform.target }}
224
+ path: dist
225
+ - name: pytest
226
+ run: |
227
+ set -e
228
+ python3 -m venv .venv
229
+ source .venv/bin/activate
230
+ pip install preppers --find-links dist --force-reinstall
231
+ pip install pytest
232
+ cd python && pytest
233
+
234
+ sdist:
235
+ runs-on: ubuntu-latest
236
+ steps:
237
+ - uses: actions/checkout@v4
238
+ - name: Build sdist
239
+ uses: PyO3/maturin-action@v1
240
+ with:
241
+ command: sdist
242
+ args: --out dist --manifest-path python/Cargo.toml
243
+ - name: Upload sdist
244
+ uses: actions/upload-artifact@v4
245
+ with:
246
+ name: wheels-sdist
247
+ path: dist
248
+
249
+ release:
250
+ name: Release
251
+ runs-on: [self-hosted, aws-master, X64]
252
+ if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }}
253
+ needs: [linux, musllinux, windows, macos, sdist]
254
+ permissions:
255
+ # Use to sign the release artifacts
256
+ id-token: write
257
+ # Used to upload release artifacts
258
+ contents: write
259
+ # Used to generate artifact attestation
260
+ attestations: write
261
+ steps:
262
+ - uses: actions/setup-python@v5
263
+ with:
264
+ python-version: 3.x
265
+ - uses: actions/download-artifact@v4
266
+ - name: Generate artifact attestation
267
+ uses: actions/attest-build-provenance@v1
268
+ with:
269
+ subject-path: 'wheels-*/*'
270
+ - name: Clear old pip creds
271
+ run: pip config unset global.index-url || true
272
+ - name: Log into AWS CodeArtifact
273
+ run: echo "MATURIN_PASSWORD=$(aws codeartifact get-authorization-token --domain seer --query authorizationToken --output text)" >> $GITHUB_ENV
274
+ - name: Publish to CodeArtifact
275
+ if: ${{ startsWith(github.ref, 'refs/tags/') }}
276
+ uses: PyO3/maturin-action@v1
277
+ env:
278
+ MATURIN_REPOSITORY_URL: https://seer-718843040700.d.codeartifact.us-west-2.amazonaws.com/pypi/seer_ds/
279
+ MATURIN_USERNAME: aws
280
+ with:
281
+ command: upload
282
+ args: --non-interactive --skip-existing wheels-*/*
283
+
284
+ pypi-release:
285
+ name: Publish to PyPI
286
+ runs-on: ubuntu-latest
287
+ if: ${{ startsWith(github.ref, 'refs/tags/') }}
288
+ needs: [linux, musllinux, windows, macos, sdist]
289
+ environment:
290
+ name: pypi
291
+ url: https://pypi.org/p/preppers
292
+ permissions:
293
+ contents: read
294
+ # Used for PyPI Trusted Publishing
295
+ id-token: write
296
+ steps:
297
+ - name: Download built distributions
298
+ uses: actions/download-artifact@v4
299
+ with:
300
+ pattern: wheels-*
301
+ path: dist
302
+ merge-multiple: true
303
+ - name: Publish to PyPI
304
+ uses: pypa/gh-action-pypi-publish@release/v1
305
+ with:
306
+ packages-dir: dist/
@@ -0,0 +1,5 @@
1
+ /target
2
+
3
+ Cargo.lock
4
+
5
+ .idea
@@ -0,0 +1,10 @@
1
+ [package]
2
+ name = "preppers"
3
+ version = "0.2.0"
4
+ edition = "2021"
5
+ readme = "README.md"
6
+
7
+ [dependencies]
8
+ argh = "0.1.12"
9
+ blart = "=0.3.0"
10
+ fancy-regex = "0.17.0"
@@ -0,0 +1,209 @@
1
+ **LICENSE**
2
+
3
+ Use of the Fulcrum Pipeline™ framework software, including any portion
4
+ thereof, is licensed under a Mandatory Grant-Back Apache 2.0 license, as
5
+ modified by the Commons Clause (collectively, the "**License**").
6
+
7
+ You may not use the Fulcrum Pipeline™ software, including any portion
8
+ thereof, except in compliance with the License. See the entire License
9
+ for specific language governing permissions and limitations under the
10
+ License.
11
+
12
+ ------------------------------------------------------------------------
13
+
14
+ **Mandatory Grant-Back** **Apache 2.0 License, as modified by the Commons Clause May 2026**
15
+
16
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
17
+
18
+ **1. Definitions**.
19
+
20
+ "**License**" shall mean the terms and conditions for use,
21
+ reproduction, and distribution as defined by Sections 1 through 10 of
22
+ this document.
23
+
24
+ "**Licensor**" shall mean the copyright owner or entity authorized by
25
+ the copyright owner that is granting the License.
26
+
27
+ "**Original Licensor**" shall mean Seer, Inc., or any assignee of or
28
+ successor in interest to Seer, Inc.
29
+
30
+ "**Legal Entity**" shall mean the union of the acting entity and all
31
+ other entities that control, are controlled by, or are under common
32
+ control with that entity. For the purposes of this definition,
33
+ "**control**" means (i) the power, direct or indirect, to cause the
34
+ direction or management of such entity, whether by contract or
35
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
36
+ outstanding shares, or (iii) beneficial ownership of such entity.
37
+
38
+ "**You**" (or "**Your**") shall mean an individual or Legal Entity
39
+ exercising permissions granted by this License.
40
+
41
+ "**Source**" form shall mean the preferred form for making
42
+ modifications, including but not limited to software source code,
43
+ documentation source, and configuration files.
44
+
45
+ "**Object**" form shall mean any form resulting from mechanical
46
+ transformation or translation of a Source form, including but not
47
+ limited to compiled object code, generated documentation, and
48
+ conversions to other media types.
49
+
50
+ "**Work**" shall mean the work of authorship, whether in Source or
51
+ Object form, made available under the License, as indicated by a
52
+ copyright notice that is included in or attached to the work.
53
+
54
+ "**Derivative Works**" shall mean any work, whether in Source or
55
+ Object form, that is based on (or derived from) the Work and for which
56
+ the editorial revisions, annotations, elaborations, or other
57
+ modifications represent, as a whole, an original work of authorship. For
58
+ the purposes of this License, Derivative Works shall not include works,
59
+ including known or novel plugins, that remain separable from, or merely
60
+ link (or bind by name) to the interfaces of, the Work and Derivative
61
+ Works thereof.
62
+
63
+ "**Contribution**" shall mean any work of authorship, including the
64
+ original version of the Work and any modifications or additions to that
65
+ Work or Derivative Works thereof, that is intentionally submitted to
66
+ Licensor for inclusion in the Work by the copyright owner or by an
67
+ individual or Legal Entity authorized to submit on behalf of the
68
+ copyright owner. For the purposes of this definition, "**submitted**"
69
+ means any form of electronic, verbal, or written communication sent to
70
+ the Licensor or its representatives, including but not limited to
71
+ communication on electronic mailing lists, source code control systems,
72
+ and issue tracking systems that are managed by, or on behalf of, the
73
+ Licensor for the purpose of discussing and improving the Work.
74
+
75
+ "**Contributor**" shall mean Licensor and any individual or Legal
76
+ Entity on behalf of whom a Contribution has been received by Licensor
77
+ and subsequently incorporated within the Work.
78
+
79
+ "**Sell**" shall mean practicing any or all of the rights granted to
80
+ You under the License to provide to third parties, for a fee or other
81
+ consideration (including without limitation fees for hosting or
82
+ consulting/ support services related to the Work or modified Work,
83
+ including Derivative Work(s) thereof), a product or service whose value
84
+ derives, entirely or substantially, from the functionality of the Work,
85
+ modified Work, or Derivative Work(s).
86
+
87
+ **2. Grant of Copyright License**. Subject to the terms and conditions
88
+ of this License, each Contributor hereby grants to You a perpetual,
89
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright
90
+ license to reproduce, prepare Derivative Works of, publicly display,
91
+ publicly perform, sublicense, and distribute the Work and such
92
+ Derivative Works in Source or Object form.
93
+
94
+ **3. Grant of Patent License**. Subject to the terms and conditions of
95
+ this License, each Contributor hereby grants to You a perpetual,
96
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except
97
+ as stated in this section) patent license to make, have made, use, offer
98
+ to sell, sell, import, and otherwise transfer the Work, where such
99
+ license applies only to those patent claims licensable by such
100
+ Contributor that are necessarily infringed by their Contribution(s)
101
+ alone or by combination of their Contribution(s) with the Work to which
102
+ such Contribution(s) was submitted. If You institute patent litigation
103
+ against any entity (including a cross-claim or counterclaim in a
104
+ lawsuit) alleging that the Work or a Contribution incorporated within
105
+ the Work constitutes direct or contributory patent infringement, then
106
+ any patent licenses granted to You under this License for that Work
107
+ shall terminate as of the date such litigation is filed.
108
+
109
+ **4. Redistribution**. You may reproduce and distribute copies of the
110
+ Work or Derivative Works thereof in any medium, with or without
111
+ modifications, and in Source or Object form, provided that You meet the
112
+ following conditions:
113
+
114
+ a) You must give any other recipients of the Work or Derivative Works a
115
+ copy of this License; and
116
+
117
+ b) You must cause any modified files to carry prominent notices stating
118
+ that You changed the files; and
119
+
120
+ c) You must retain, in the Source form of any Derivative Works that You
121
+ distribute, all copyright, patent, trademark, and attribution
122
+ notices from the Source form of the Work, excluding those notices
123
+ that do not pertain to any part of the Derivative Works; and
124
+
125
+ d) If the Work includes a "**NOTICE**" text file as part of its
126
+ distribution, then any Derivative Works that You distribute must
127
+ include a readable copy of the attribution notices contained within
128
+ such NOTICE file, excluding those notices that do not pertain to any
129
+ part of the Derivative Works, in at least one of the following
130
+ places: within a NOTICE text file distributed as part of the
131
+ Derivative Works; within the Source form or documentation, if
132
+ provided along with the Derivative Works; or, within a display
133
+ generated by the Derivative Works, if and wherever such third-party
134
+ notices normally appear. The contents of the NOTICE file are for
135
+ informational purposes only and do not modify the License. You may
136
+ add Your own attribution notices within Derivative Works that You
137
+ distribute, alongside or as an addendum to the NOTICE text from the
138
+ Work, provided that such additional attribution notices cannot be
139
+ construed as modifying the License.
140
+
141
+ e) To the extent that You generate any Derivative Works or otherwise
142
+ modify the Work, You must submit such modified Work or Derivative
143
+ Work(s) to the Original Licensor and such submitted modified Work or
144
+ Derivative Work(s) shall constitute a Contribution as defined
145
+ herein.
146
+
147
+ You may add Your own copyright statement to Your modifications and may
148
+ provide additional or different license terms and conditions for use,
149
+ reproduction, or distribution of Your modifications, provided Your use,
150
+ reproduction, and distribution of the modified Work (or Derivative Work)
151
+ otherwise complies with the conditions stated in this License.
152
+
153
+ **5. Submission of Contributions**. Unless You explicitly state
154
+ otherwise, any Contribution intentionally submitted for inclusion in the
155
+ Work by You to the Licensor shall be under the terms and conditions of
156
+ this License, without any additional terms or conditions; provided that
157
+ (a) any Contribution to Original Licensor shall carry with it a
158
+ perpetual, worldwide, non-exclusive, no-charge, royalty-free,
159
+ irrevocable copyright license to reproduce, prepare Derivative Works of,
160
+ publicly display, publicly perform, sublicense, and distribute such
161
+ Contribution in Source or Object form, and (b) Original Licensor's use
162
+ of such Contribution shall not be subject to Section 10 of this License.
163
+
164
+ **6. Trademarks**. This License does not grant permission to use the
165
+ trade names, trademarks, service marks, or product names of the
166
+ Licensor, except as required for reasonable and customary use in
167
+ describing the origin of the Work and reproducing the content of the
168
+ NOTICE file.
169
+
170
+ **7. Disclaimer of Warranty**. Unless required by applicable law or
171
+ agreed to in writing, Licensor provides the Work (and each Contributor
172
+ provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR
173
+ CONDITIONS OF ANY KIND, either express or implied, including, without
174
+ limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
175
+ MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely
176
+ responsible for determining the appropriateness of using or
177
+ redistributing the Work and assume any risks associated with Your
178
+ exercise of permissions under this License.
179
+
180
+ **8. Limitation of Liability**. In no event and under no legal theory,
181
+ whether in tort (including negligence), contract, or otherwise, unless
182
+ required by applicable law (such as deliberate and grossly negligent
183
+ acts) or agreed to in writing, shall any Contributor be liable to You
184
+ for damages, including any direct, indirect, special, incidental, or
185
+ consequential damages of any character arising as a result of this
186
+ License or out of the use or inability to use the Work (including but
187
+ not limited to damages for loss of goodwill, work stoppage, computer
188
+ failure or malfunction, or any and all other commercial damages or
189
+ losses), even if such Contributor has been advised of the possibility of
190
+ such damages.
191
+
192
+ **9. Accepting Warranty or Additional Liability**. While redistributing
193
+ the Work or Derivative Works thereof, You may choose to offer, and
194
+ charge a fee for, acceptance of support, warranty, indemnity, or other
195
+ liability obligations and/or rights consistent with this License.
196
+ However, in accepting such obligations, You may act only on Your own
197
+ behalf and on Your sole responsibility, not on behalf of any other
198
+ Contributor, and only if You agree to indemnify, defend, and hold each
199
+ Contributor harmless for any liability incurred by, or claims asserted
200
+ against, such Contributor by reason of your accepting any such warranty
201
+ or additional liability.
202
+
203
+ **10. "Commons Clause" License Condition.** The Work is provided to You
204
+ by the Licensor under the License, subject to the following condition.
205
+ Without limiting other conditions in the License, the grant of rights
206
+ under the License will not include, and the License does not grant to
207
+ You, the right to Sell the Work or Derivative Works thereof. Any license
208
+ notice or attribution required by the License must also include this
209
+ Commons Clause License Condition.
@@ -0,0 +1,7 @@
1
+ Metadata-Version: 2.4
2
+ Name: preppers
3
+ Version: 0.2.0
4
+ Classifier: Programming Language :: Rust
5
+ Classifier: Programming Language :: Python :: Implementation :: CPython
6
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
7
+ Requires-Python: >=3.8
@@ -0,0 +1,82 @@
1
+ <img alt="preppers logo" src="./static/preppers-logo.jpeg" height="128" align="left" style="margin: 8px">
2
+
3
+ **Preppers** is a tool for *pr*otein to *pep*tide mapping, written in *R*u*s*t.
4
+ It is designed for extreme speed and efficiency, using the *adaptive radix tree* implementation from [`blart`](https://github.com/declanvk/blart).
5
+
6
+ ## Usage
7
+
8
+ ### As a Python library
9
+
10
+ For ease of use, Preppers includes Python bindings which can be installed
11
+ from AWS CodeArtifact.
12
+
13
+ To install, run:
14
+
15
+ ```shell
16
+ aws codeartifact login --tool pip --repository seer_ds --domain seer --domain-owner 718843040700 --region us-west-2
17
+ pip install preppers
18
+ ```
19
+
20
+ and then in your Python code:
21
+
22
+ ```python
23
+ import preppers
24
+ ```
25
+
26
+ ### As a command line tool
27
+
28
+ **Coming soon!**
29
+
30
+ For now, you can clone this repo and run:
31
+
32
+ ```shell
33
+ cargo run --example annotate_fasta $PEPTIDES_FILE $FASTA_FILE
34
+ ```
35
+
36
+ where `$PEPTIDES_FILE` is a file containing a list of peptides, one per line, and `$FASTA_FILE` is a FASTA file containing protein sequences.
37
+
38
+ > [!TIP]
39
+ > To set up a Rust environment, follow the instructions [here](https://www.rust-lang.org/tools/install).
40
+
41
+ ### As a Rust library
42
+
43
+ To use Preppers in a Rust project, reference this repository in your `Cargo.toml`:
44
+
45
+ ```toml
46
+ [dependencies]
47
+ preppers = { git = "ssh://git@github.com/seerbio/preppers.git" }
48
+ ```
49
+
50
+ ## Running tests
51
+
52
+ This package includes tests for functionality in Rust and Python.
53
+
54
+ Rust tests:
55
+
56
+ ```shell
57
+ cargo test
58
+ ```
59
+
60
+ Python tests:
61
+ ```shell
62
+ maturin develop --release -m python/Cargo.toml
63
+ cd python
64
+ pytest
65
+ ```
66
+
67
+ > [!TIP]
68
+ > For development, you will need to first install a Rust environment by following the instructions [here](https://www.rust-lang.org/tools/install).
69
+ >
70
+ > To install `maturin`, create a virtual environment and run `pip install maturin`.
71
+
72
+ ## Releasing a new version
73
+
74
+ 1. Update the version in `Cargo.toml` and `python/Cargo.toml`; these should match! Be sure to update the dependency version as well!
75
+
76
+ > [!IMPORTANT]
77
+ > Be sure to pick an appropriate [semantic version](https://semver.org/) for the new release!
78
+
79
+ 2. Commit the changes and push/merge to the `main` branch (this may require a PR).
80
+ 3. Create a new release in GitHub with the same version number using the format `vX.Y.Z`.
81
+ Click "auto-generate release notes" to automatically document merged PRs.
82
+ 4. GitHub Actions will automatically build and publish the new version to CodeArtifact.