From dc8a5361fb782a93c33a9dd0aab487b799eeefed Mon Sep 17 00:00:00 2001 From: Kemal Yaylali Date: Wed, 30 Sep 2026 12:09:13 +0100 Subject: [PATCH] Prepare for public release on Gitea: simurgarray package names, community files, Gitea templates, pseudonymised P6 probe names --- .gitea/ISSUE_TEMPLATE/bug_report.yaml | 66 +++++++++++++++++++ .gitea/ISSUE_TEMPLATE/config.yaml | 1 + .gitea/ISSUE_TEMPLATE/feature_request.yaml | 24 +++++++ .gitea/pull_request_template.md | 16 +++++ {.github => .gitea}/workflows/ci.yml | 2 +- CHANGELOG.md | 8 +++ CITATION.cff | 26 ++++++++ CODE_OF_CONDUCT.md | 30 +++++++++ CONTRIBUTING.md | 64 ++++++++++++++++++ README.md | 14 +++- SECURITY.md | 33 ++++++++++ SIMURGARRAY_MASTER_PLAN.md | 4 +- blog/04_going_public_plan_and_calendar.md | 8 +-- ...imurgarray_and_the_bird_behind_the_name.md | 2 +- docs/user_guide.md | 6 +- docs/validation/P9.md | 2 +- packaging/conda/simurg-core/meta.yaml | 2 +- packaging/conda/simurg/meta.yaml | 4 +- pyproject.toml | 9 ++- rust/simurg-core/pyproject.toml | 2 +- scripts/build_dist.sh | 6 +- scripts/cloud/tasks/p10.sh | 8 +-- uv.lock | 2 +- 23 files changed, 309 insertions(+), 30 deletions(-) create mode 100644 .gitea/ISSUE_TEMPLATE/bug_report.yaml create mode 100644 .gitea/ISSUE_TEMPLATE/config.yaml create mode 100644 .gitea/ISSUE_TEMPLATE/feature_request.yaml create mode 100644 .gitea/pull_request_template.md rename {.github => .gitea}/workflows/ci.yml (93%) create mode 100644 CITATION.cff create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 SECURITY.md diff --git a/.gitea/ISSUE_TEMPLATE/bug_report.yaml b/.gitea/ISSUE_TEMPLATE/bug_report.yaml new file mode 100644 index 0000000..15f23de --- /dev/null +++ b/.gitea/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,66 @@ +name: Bug report +about: A crash, an error message, or a result that looks wrong +title: "[bug] " +labels: [] +body: + - type: markdown + attributes: + value: | + Thank you for reporting. Please do **not** attach vendor files (IDAT, BPM, CSV, EGT, GTC) or any genetic data of real people. + - type: input + id: version + attributes: + label: SimurgArray version + description: Output of `simurg --version` + validations: + required: true + - type: dropdown + id: platform + attributes: + label: Platform + options: + - Linux x86_64 + - Linux aarch64 (for example Raspberry Pi) + - Docker + - conda + - other + validations: + required: true + - type: input + id: backend + attributes: + label: Backend + description: Output of `python -c "from simurg._core import backend; print(backend())"` + - type: textarea + id: command + attributes: + label: Command + description: The exact command you ran + render: shell + validations: + required: true + - type: textarea + id: what + attributes: + label: What happened, and what you expected + validations: + required: true + - type: textarea + id: log + attributes: + label: Error message or log + description: Add `--debug` for a traceback. Error codes look like `E_...` or `W_...`. + render: text + - type: textarea + id: manifest + attributes: + label: run_manifest.json + description: Paste or attach the run manifest of the run; it lists versions, options and input checksums. + render: json + - type: checkboxes + id: privacy + attributes: + label: Privacy + options: + - label: I did not attach vendor files or genetic data of real people. + required: true diff --git a/.gitea/ISSUE_TEMPLATE/config.yaml b/.gitea/ISSUE_TEMPLATE/config.yaml new file mode 100644 index 0000000..3ba13e0 --- /dev/null +++ b/.gitea/ISSUE_TEMPLATE/config.yaml @@ -0,0 +1 @@ +blank_issues_enabled: false diff --git a/.gitea/ISSUE_TEMPLATE/feature_request.yaml b/.gitea/ISSUE_TEMPLATE/feature_request.yaml new file mode 100644 index 0000000..16315d9 --- /dev/null +++ b/.gitea/ISSUE_TEMPLATE/feature_request.yaml @@ -0,0 +1,24 @@ +name: Feature request +about: Suggest a new capability or a change in behaviour +title: "[feature] " +labels: [] +body: + - type: textarea + id: problem + attributes: + label: What are you trying to do? + description: The research task or workflow, and where SimurgArray gets in the way. + validations: + required: true + - type: textarea + id: proposal + attributes: + label: What would help? + description: Describe the behaviour you would like. Mention spec items (for example CLI-021) if you know them. + validations: + required: true + - type: textarea + id: validation + attributes: + label: How could it be validated? + description: A public dataset, a reference tool or a paper the result could be checked against. diff --git a/.gitea/pull_request_template.md b/.gitea/pull_request_template.md new file mode 100644 index 0000000..801e6f7 --- /dev/null +++ b/.gitea/pull_request_template.md @@ -0,0 +1,16 @@ +## What changes + +## Spec items touched + + + +## How it was validated + + + +## Checklist + +* [ ] `ruff`, `mypy` and `pytest tests/unit` pass +* [ ] `CHANGELOG.md` updated (Unreleased) if users would notice +* [ ] differences from reference tools recorded in `docs/known_unknowns.md` +* [ ] no vendor data, no genetic data of real people, no credentials diff --git a/.github/workflows/ci.yml b/.gitea/workflows/ci.yml similarity index 93% rename from .github/workflows/ci.yml rename to .gitea/workflows/ci.yml index bd59006..8e57e5c 100644 --- a/.github/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,4 +1,4 @@ -# Runs on Gitea Actions (reads .github/workflows) and GitHub Actions. +# Gitea Actions workflow: lint, types, secret scan and unit tests with and without the compiled kernels. name: ci on: push: diff --git a/CHANGELOG.md b/CHANGELOG.md index 38bafa8..8101b60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ ## Unreleased +**Packaging.** The distributions are now `simurgarray` and `simurgarray-core` (the name `simurg` is taken on +PyPI); the `simurg` command and the `simurg` / `simurg_core` import names are unchanged. The conda recipe no longer pins +the kernel package to the Python package's version (it required `simurg-core == 2.0.0` while the kernels are 1.1.0). +Project URLs in the package metadata. + +**Community.** `CONTRIBUTING.md`, `SECURITY.md`, `CODE_OF_CONDUCT.md`, `CITATION.cff`, Gitea issue and pull request +templates; CI moved to `.gitea/workflows/`. Probe names in the P6 oracle examples are replaced by stable pseudonyms. + **Repository tidy-up.** Removed the Phase-0 research notes (`docs/research/`), the P9 benchmark scripts (`bench/`, `scripts/cloud/tasks/p9*.sh`) and a vendor probe-name list that should never have been committed (also purged from the git history). diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..8cd938e --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,26 @@ +cff-version: 1.2.0 +message: "If you use SimurgArray in your research, please cite it as below." +title: "SimurgArray: open analysis of Illumina Infinium genotyping arrays" +type: software +authors: + - family-names: "Yaylali" + given-names: "Kemal" +version: "2.0.0" +date-released: "2026-09-30" +license: MIT +repository-code: "https://gitea.yaylali.uk/kemal/SimurgArray" +url: "https://gitea.yaylali.uk/kemal/SimurgArray" +abstract: >- + SimurgArray takes Illumina Infinium BeadChip scans (IDAT files) to genotype calls, quality control reports, + VCF and PLINK files, and on to copy number, loss of heterozygosity and mosaicism, pharmacogenomics, cluster file + training and methylation control QC. Its genotype calling reproduces the vendor's GTC files byte for byte on + public data, and every difference from reference tools is documented. Research use only. +keywords: + - genotyping + - microarray + - Infinium + - IDAT + - VCF + - copy number + - pharmacogenomics + - bioinformatics diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..0ff76d8 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,30 @@ +# Code of conduct + +SimurgArray is a small scientific project. People who use it or contribute to it come from many fields, countries +and levels of experience. This page says how we treat each other here. + +## Expected + +* Be kind and assume good faith. Most disagreements are about evidence, so bring evidence. +* Criticise code, results and ideas, never people. +* Be patient with newcomers; everyone met their first cluster file once. +* Credit other people's work, including open source projects and papers. +* Respect privacy. Never post genetic data, sample identifiers of real people, or anyone's personal information. + +## Not accepted + +* Harassment, insults, threats, or discriminatory jokes and language, in any form. +* Sexualised language or imagery. +* Publishing someone else's private information without permission. +* Repeatedly derailing discussions or ignoring a request to stop. + +## Scope + +This applies to issues, pull requests, commit messages, documentation and any other space of the project, and to +anyone representing the project elsewhere. + +## Enforcement + +Report problems privately to the maintainer through the contact details on https://gitea.yaylali.uk/kemal. Reports +are handled confidentially. The maintainer may edit or remove contributions and may block people who do not follow +this code, starting with a private warning where that is reasonable. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..94d5955 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,64 @@ +# Contributing to SimurgArray + +Thank you for looking. SimurgArray is a small research project with strict habits, because its main promise is that +every number can be checked. The rules below keep that promise. + +## Before you start + +* Read the item in `SIMURGARRAY_FUNCTIONAL_SPEC.md` that your change touches. Behaviour is defined there item by item + (IDs such as `CLI-021` or `OUT-031`); algorithms and their sources are in `SIMURGARRAY_MASTER_PLAN.md`. +* For anything larger than a small fix, open an issue first and describe the change and how you will validate it. + +## Setting up + +```bash +git clone https://gitea.yaylali.uk/kemal/SimurgArray.git && cd SimurgArray +uv venv && uv pip install -e ".[dev]" +uv pip install ./rust/simurg-core # optional compiled kernels (needs Rust and a C compiler) +uv run pytest tests/unit +``` + +## The checks every change must pass + +```bash +uv run ruff check . && uv run ruff format --check . +uv run mypy +uv run pytest tests/unit +``` + +CI runs the same checks, a secret scan, and the unit tests with and without the compiled kernels on Python 3.12 +and 3.13. If your change touches file formats, calling, QC or outputs, also run the oracle tests +(`uv run pytest tests/oracle`, see the README for the data they need) and say which ones you ran. + +## Rules of the house + +1. **Cite the spec.** Commit messages and tests name the spec items they implement or change. If behaviour changes, + change the spec item in the same commit. +2. **Science modules are pure.** Code under `signal/`, `genotype/`, `cn/`, `qc/`, `pgx/` and `train/` has no file or + network access; the `pipeline/` layer does the I/O. +3. **Every algorithm names its source** in its docstring: a paper, a public technical note, an expired patent, or an + open source project with a compatible licence. +4. **Licences.** Code from MIT, BSD, Apache 2.0 or Unlicense projects may be adapted with attribution in + `THIRD_PARTY_NOTICES.md`. GPL tools are used only as separate programs for comparison; their code is never copied. +5. **Exact by default.** Default mode stays bit exact with the reference outputs. A cleaner numerical choice goes + behind an explicit option. +6. **Never hide a difference.** When SimurgArray and a reference tool disagree, record it in `docs/known_unknowns.md` + with the date, the evidence and what was decided. +7. **No vendor data and no secrets in the repository.** No IDAT, BPM, CSV, EGT or GTC files from a vendor, no + probe name lists derived from them, no patient or participant data, and no credentials of any kind. Test fixtures + are synthetic or openly licensed. `.gitignore` and the CI secret scan help, but the responsibility is yours. +8. **Plain writing.** Documentation follows the voice in `branding/README.md`: short sentences, numbers instead of + adjectives, and every claim next to its limitation. + +## Pull requests + +* One topic per pull request, with tests. +* Describe what changed, which spec items it touches, how you validated it, and any new entry in + `docs/known_unknowns.md`. +* Add a line to the `Unreleased` section of `CHANGELOG.md` for anything a user would notice. + +## Reporting problems + +Use the issue templates. For a wrong or unexpected result, attach the `run_manifest.json` of the run and the exact +command; it records every version, option and input checksum. Please do not attach vendor files or any genetic data +of real people. For security issues see `SECURITY.md`. diff --git a/README.md b/README.md index 9370f05..02aa4f1 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ It runs on anything from a Raspberry Pi to a cloud server. * [Development](#development) * [Repository layout](#repository-layout) * [Documentation](#documentation) +* [Citing](#citing) * [Licence, data and trademarks](#licence-data-and-trademarks) ## Features @@ -76,6 +77,7 @@ Each phase has its own report in `docs/validation/`. * **Python 3.12 or 3.13** on 64 bit Linux (x86_64 or aarch64). Tested on Ubuntu 24.04 and Raspberry Pi OS. * **Memory:** about 2 to 3 GB per worker process for GSA or Omni sized arrays. 8 GB is enough for a Pi with two workers. * **Optional:** Rust and a C compiler for the compiled kernels; Docker or conda for those installs. +* The Python package is called `simurgarray`; the command and the import name are `simurg`. * Only pure Python dependencies are needed (numpy, pyarrow, typer, rich, pyyaml, openpyxl). bcftools and plink2 are **not** required; SimurgArray writes VCF, BCF, indexes and PLINK files itself. They are used only as test oracles. @@ -118,8 +120,8 @@ aarch64 (glibc 2.28 or newer) to `dist/`: ```bash python3 -m venv simurg-env -simurg-env/bin/pip install simurg-2.0.0-py3-none-any.whl \ - simurg_core-1.1.0-cp312-abi3-manylinux_2_28_$(uname -m).whl # the kernel wheel is optional +simurg-env/bin/pip install simurgarray-2.0.0-py3-none-any.whl \ + simurgarray_core-1.1.0-cp312-abi3-manylinux_2_28_$(uname -m).whl # the kernel wheel is optional ``` ### Docker @@ -136,7 +138,7 @@ docker run --rm --user "$(id -u):$(id -g)" -v "$PWD":/work simurg:2.0.0 \ ```bash conda build -c conda-forge --output-folder conda-bld packaging/conda/simurg-core packaging/conda/simurg -conda create -n simurg -c ./conda-bld -c conda-forge simurg simurg-core +conda create -n simurgarray -c ./conda-bld -c conda-forge simurgarray simurgarray-core ``` All installs give identical results on x86_64 and aarch64 (`docs/validation/P10.md`). @@ -340,6 +342,7 @@ examples/ end to end demo branding/ logo, icons, templates and the brand guide blog/ five posts about the project, with featured images packaging/ conda recipes (plus Dockerfile at the root) +.gitea/ CI workflow, issue and pull request templates ``` ## Documentation @@ -350,8 +353,13 @@ packaging/ conda recipes (plus Dockerfile at the root) * [`docs/validation/`](docs/validation/): one report per phase and module * [`docs/known_unknowns.md`](docs/known_unknowns.md): every difference from reference tools, with dates and explanations * [`docs/messages.md`](docs/messages.md): all error and warning codes +* [`CONTRIBUTING.md`](CONTRIBUTING.md), [`SECURITY.md`](SECURITY.md), [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) * [`branding/README.md`](branding/README.md) and [`blog/`](blog/) +## Citing + +If SimurgArray helps your research, please cite it using [`CITATION.cff`](CITATION.cff) (version 2.0.0, 2026). + ## Licence, data and trademarks SimurgArray is released under the [MIT licence](LICENSE). Code adapted from MIT, BSD and Apache licensed projects diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..5ce148d --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,33 @@ +# Security policy + +## Supported versions + +Security fixes go into the latest release. Older releases are not patched; upgrade to the newest version. + +## Reporting a vulnerability + +Please do not open a public issue for a security problem. Contact the maintainer privately through the contact +details on the maintainer's profile page, https://gitea.yaylali.uk/kemal, and include: + +* the SimurgArray version (`simurg --version`), +* what an attacker could do and under which conditions, +* the smallest input or command that shows the problem, without real genetic data. + +You will get an answer within a week. Once a fix is released, the report is credited in `CHANGELOG.md` unless you +prefer otherwise. + +## What counts + +SimurgArray reads files that users download from third parties. Problems worth reporting include: + +* crafted IDAT, BPM, CSV, EGT, GTC, VCF or sample sheet files that crash the reader in an unsafe way, write outside + the output folder, or execute code; +* HTML reports that run script from their input data (reports are meant to be safe to open and share); +* anything that could leak sample sheet metadata or genetic data beyond what the user chose to include. + +## Handling genetic data + +Genotype data are personal data. SimurgArray never sends data anywhere: it has no network access at run time and +its reports embed everything they need. Users are responsible for storing and sharing outputs according to their +consent and data protection rules. The QC report offers `--no-metadata`, `--drop-metadata` and `--keep-metadata` to +control what it contains. diff --git a/SIMURGARRAY_MASTER_PLAN.md b/SIMURGARRAY_MASTER_PLAN.md index 57893f4..8c7546b 100644 --- a/SIMURGARRAY_MASTER_PLAN.md +++ b/SIMURGARRAY_MASTER_PLAN.md @@ -136,8 +136,6 @@ curl -LsSf https://astral.sh/uv/install.sh | sh uv python install 3.12 # Rust (Phase 9) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y -# GitHub CLI (authenticate to avoid API rate limits) -sudo apt install -y gh && gh auth login # Reference/oracle tools (subprocess only) # gtc2vcf plugins for bcftools: build from https://github.com/freeseek/gtc2vcf (instructions in its README) # plink2: https://www.cog-genomics.org/plink/2.0/ @@ -162,7 +160,7 @@ sudo apt install -y gh && gh auth login | maturin + PyO3 (Phase 9) | Rust extension | ### 3.5 Moving the project -The canonical repository is the private Gitea repo **https://gitea.yaylali.uk/kemal/SimurgArray**. +The canonical repository is the Gitea repo **https://gitea.yaylali.uk/kemal/SimurgArray**. ```bash # on the new machine git clone https://gitea.yaylali.uk/kemal/SimurgArray.git && cd SimurgArray diff --git a/blog/04_going_public_plan_and_calendar.md b/blog/04_going_public_plan_and_calendar.md index 79a74c7..bff230d 100644 --- a/blog/04_going_public_plan_and_calendar.md +++ b/blog/04_going_public_plan_and_calendar.md @@ -10,7 +10,7 @@ Publishing code is easy. Publishing it responsibly is a checklist. This post is By public I mean four things: -1. The source code on a public host, with issues and pull requests open. +1. The source code on my own Gitea server, open to everyone, with issues and pull requests open. 2. Installable packages: a Python wheel, the optional Rust kernel wheels, a container image and a conda recipe. 3. Documentation someone can follow without asking me anything. 4. A citable record: a DOI for each release and a short preprint describing the methods and the validation. @@ -33,7 +33,7 @@ The same goes for secrets. The cloud scripts use credentials from the local envi The software reads file formats defined by Illumina and reproduces the behaviour of Illumina's algorithms from public documents and expired patents. Illumina, Infinium, GenCall, GenTrain and GenomeStudio are their trademarks. The documentation will say clearly that SimurgArray is independent and not affiliated with or endorsed by the vendor, and it will use those names only to describe compatibility. -The name SimurgArray itself needs a check on the Python package index, conda channels and container registries before anything is uploaded. If someone else has it, I will be sad for a day and then pick a variant. +The name needed a check on the Python package index, conda channels and container registries before anything is uploaded. It turned out `simurg` on the Python package index already belongs to someone else, so the package is called `simurgarray` while the command stays `simurg`. I was sad for about an hour, which is less than I had budgeted. ### Third party data sources @@ -51,7 +51,7 @@ Every README, report header and PGx output will state that the software is for r ### Engineering hygiene -* Continuous integration on public runners for x86_64 and aarch64: lint, type checks, unit tests. +* Continuous integration on my own Gitea runner: lint, type checks, a secret scan, and unit tests with and without the compiled kernels. * Oracle tests that need large public datasets stay opt in, with a script that downloads everything with checksums. * Issue templates that ask for the command, the software version and the run manifest, because "it gave a wrong genotype" is hard to debug without them. * A contributing guide, a code of conduct and a security policy. @@ -73,7 +73,7 @@ The weeks start on Mondays. Everything below costs nothing except time, apart fr Full history scan for vendor files and secrets. Credential rotation. Provenance pass over ported code. Trademark and disclaimer text in README, user guide and report templates. **Week of October 12: public repository** -Public mirror on a mainstream code host, continuous integration for both architectures, issue templates, contributing guide, code of conduct, security policy. The private Git server stays as my working copy. +Open the repository to everyone on my own Gitea server, where it has lived since the first commit, with continuous integration, issue templates, a contributing guide, a code of conduct and a security policy. No mirror elsewhere: one home is easier to keep honest. **Week of October 19: packages** Check name availability. Upload version 2.0.0 wheels to the Python package index, the image to a public container registry, and submit the conda recipe for review. diff --git a/blog/05_using_simurgarray_and_the_bird_behind_the_name.md b/blog/05_using_simurgarray_and_the_bird_behind_the_name.md index b61001c..3981e09 100644 --- a/blog/05_using_simurgarray_and_the_bird_behind_the_name.md +++ b/blog/05_using_simurgarray_and_the_bird_behind_the_name.md @@ -11,7 +11,7 @@ One small note first. The command examples below use the usual command line opti On any Linux or macOS machine with Python 3.12: ```bash -uv venv && uv pip install simurg-2.0.0-py3-none-any.whl +uv venv && uv pip install simurgarray-2.0.0-py3-none-any.whl simurg --help ``` diff --git a/docs/user_guide.md b/docs/user_guide.md index 0e48ec0..e2476c3 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -37,8 +37,8 @@ Without them the same code runs in pure Python/NumPy; `SIMURG_PURE_PYTHON=1` for `manylinux_2_28` kernel wheels for x86_64 and aarch64, glibc ≥ 2.28): ```bash -python3 -m venv simurg-env && simurg-env/bin/pip install simurg-2.0.0-py3-none-any.whl \ - simurg_core-1.1.0-cp312-abi3-manylinux_2_28_$(uname -m).whl # the second wheel is optional +python3 -m venv simurg-env && simurg-env/bin/pip install simurgarray-2.0.0-py3-none-any.whl \ + simurgarray_core-1.1.0-cp312-abi3-manylinux_2_28_$(uname -m).whl # the second wheel is optional ``` **Docker** (image ≈ 550 MB, kernels included, runs as a non-root user; data stay in the mounted folder): @@ -53,7 +53,7 @@ docker run --rm --user "$(id -u):$(id -g)" -v "$PWD":/work simurg:2.0.0 \ ```bash conda build -c conda-forge --output-folder conda-bld packaging/conda/simurg-core packaging/conda/simurg -conda create -n simurg -c ./conda-bld -c conda-forge simurg simurg-core +conda create -n simurgarray -c ./conda-bld -c conda-forge simurgarray simurgarray-core ``` All four installs give identical results on x86_64 and aarch64 (`docs/validation/P10.md`). diff --git a/docs/validation/P9.md b/docs/validation/P9.md index 395b79e..2ed032b 100644 --- a/docs/validation/P9.md +++ b/docs/validation/P9.md @@ -79,4 +79,4 @@ Manifest loading: GSA 13 s → 3 s, Omni2.5 53 s → 13 s, GDA 40 s → 10 s (Pi * Remaining per-sample time with the kernels (Pi, 1.1 s): normalization fit 0.53 s (many small robust fits per bin), calling 0.24 s, normalize/polar 0.08 s, raw X/Y 0.06 s. A full Rust normalization fit is the next step if needed. * Pi thread scaling is poor (36 samples, 3 workers ≈ 1.7× one core): the Pi 5's memory bandwidth, not the code. -* CI (`.github/workflows/ci.yml`) builds the extension and runs the unit tests with and without it. +* CI (`.gitea/workflows/ci.yml`) builds the extension and runs the unit tests with and without it. diff --git a/packaging/conda/simurg-core/meta.yaml b/packaging/conda/simurg-core/meta.yaml index ac3824b..92678b1 100644 --- a/packaging/conda/simurg-core/meta.yaml +++ b/packaging/conda/simurg-core/meta.yaml @@ -3,7 +3,7 @@ {% set version = load_file_regex(load_file="Cargo.toml", regex_pattern='version = "([^"]+)"', from_recipe_dir=False).group(1) %} package: - name: simurg-core + name: simurgarray-core version: {{ version }} source: diff --git a/packaging/conda/simurg/meta.yaml b/packaging/conda/simurg/meta.yaml index b627427..d5dcec6 100644 --- a/packaging/conda/simurg/meta.yaml +++ b/packaging/conda/simurg/meta.yaml @@ -3,7 +3,7 @@ {% set version = load_file_regex(load_file="src/simurg/__init__.py", regex_pattern='__version__ = "([^"]+)"', from_recipe_dir=False).group(1) %} package: - name: simurg + name: simurgarray version: {{ version }} source: @@ -30,7 +30,7 @@ requirements: - pyarrow >=15 - openpyxl >=3.1 run_constrained: - - simurg-core =={{ version }} + - simurgarray-core >=1.1,<2 test: imports: diff --git a/pyproject.toml b/pyproject.toml index 49f772c..4cdd9bb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["hatchling>=1.27"] build-backend = "hatchling.build" [project] -name = "simurg" +name = "simurgarray" description = "SimurgArray: open research toolkit for Illumina Infinium genotyping BeadChip data" readme = "README.md" license = "MIT" @@ -15,7 +15,6 @@ classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Science/Research", "Operating System :: POSIX :: Linux", - "Operating System :: MacOS", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering :: Bio-Informatics", @@ -40,6 +39,12 @@ dev = [ "types-PyYAML", ] +[project.urls] +Homepage = "https://gitea.yaylali.uk/kemal/SimurgArray" +Documentation = "https://gitea.yaylali.uk/kemal/SimurgArray/src/branch/main/docs/user_guide.md" +Changelog = "https://gitea.yaylali.uk/kemal/SimurgArray/src/branch/main/CHANGELOG.md" +Issues = "https://gitea.yaylali.uk/kemal/SimurgArray/issues" + [project.scripts] simurg = "simurg.cli.main:app" diff --git a/rust/simurg-core/pyproject.toml b/rust/simurg-core/pyproject.toml index 2429209..d34c9dc 100644 --- a/rust/simurg-core/pyproject.toml +++ b/rust/simurg-core/pyproject.toml @@ -3,7 +3,7 @@ requires = ["maturin>=1.7,<2"] build-backend = "maturin" [project] -name = "simurg-core" +name = "simurgarray-core" description = "Compiled kernels for SimurgArray (optional; the pure-Python paths give identical results)" requires-python = ">=3.12" license = "MIT" diff --git a/scripts/build_dist.sh b/scripts/build_dist.sh index 8db7091..9f9ec69 100755 --- a/scripts/build_dist.sh +++ b/scripts/build_dist.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Build the release artifacts into dist/: -# simurg--py3-none-any.whl + simurg-.tar.gz (pure Python) -# simurg_core--cp312-abi3-manylinux_2_28_{aarch64,x86_64}.whl (compiled kernels, Python >= 3.12) +# simurgarray--py3-none-any.whl + simurgarray-.tar.gz (pure Python) +# simurgarray_core--cp312-abi3-manylinux_2_28_{aarch64,x86_64}.whl (compiled kernels, Python >= 3.12) # Portable Linux wheels are linked against glibc 2.28 with `maturin --zig` (cross-compiles the other architecture). # Needs: uv, a Rust toolchain (rustup), ~60 MB for zig on first use. # bash scripts/build_dist.sh [aarch64|x86_64|all] (default: all) @@ -10,7 +10,7 @@ cd "$(dirname "$0")/.." export PATH="$HOME/.cargo/bin:$PATH" WHICH=${1:-all} mkdir -p dist -uv build -o dist # sdist + pure wheel of simurg +uv build -o dist # sdist + pure wheel of simurgarray MATURIN="uvx --from maturin[zig]>=1.7,<2 maturin" for arch in aarch64 x86_64; do [[ $WHICH == all || $WHICH == "$arch" ]] || continue diff --git a/scripts/cloud/tasks/p10.sh b/scripts/cloud/tasks/p10.sh index 1591546..9b207f1 100644 --- a/scripts/cloud/tasks/p10.sh +++ b/scripts/cloud/tasks/p10.sh @@ -29,10 +29,10 @@ ls -la dist echo "=== 2. pip install into fresh venvs $(date -u +%T) ===" PY=/usr/bin/python3 $PY --version -CORE=$(ls dist/simurg_core-*manylinux_2_28_$ARCH.whl 2>/dev/null | head -1) -$PY -m venv $W/fresh && $W/fresh/bin/pip install -q dist/simurg-*-py3-none-any.whl "$CORE" \ +CORE=$(ls dist/simurgarray_core-*manylinux_2_28_$ARCH.whl 2>/dev/null | head -1) +$PY -m venv $W/fresh && $W/fresh/bin/pip install -q dist/simurgarray-*-py3-none-any.whl "$CORE" \ && step pip_install ok || step pip_install FAILED -$PY -m venv $W/pure && $W/pure/bin/pip install -q dist/simurg-*-py3-none-any.whl \ +$PY -m venv $W/pure && $W/pure/bin/pip install -q dist/simurgarray-*-py3-none-any.whl \ && step pip_install_pure ok || step pip_install_pure FAILED $W/fresh/bin/python -c "from simurg._core import backend; print('fresh:', backend())" $W/pure/bin/python -c "from simurg._core import backend; print('pure:', backend())" @@ -87,7 +87,7 @@ if $C/conda install -y -q -n base conda-build > $R/conda.log 2>&1 \ && $C/conda build -c conda-forge --output-folder $W/condabld packaging/conda/simurg-core packaging/conda/simurg \ >> $R/conda.log 2>&1; then step conda_build ok - $C/conda create -y -q -p $W/cenv -c $W/condabld -c conda-forge simurg simurg-core >> $R/conda.log 2>&1 \ + $C/conda create -y -q -p $W/cenv -c $W/condabld -c conda-forge simurgarray simurgarray-core >> $R/conda.log 2>&1 \ && $W/cenv/bin/simurg --version \ && $W/cenv/bin/python -c "from simurg._core import backend; print('conda:', backend())" \ && $W/cenv/bin/simurg genotype --bpm $BPM --egt $EGT --idats $W/tut_fresh/idats --out $W/conda_run/gtc \ diff --git a/uv.lock b/uv.lock index a8f8dc8..74fe9f9 100644 --- a/uv.lock +++ b/uv.lock @@ -656,7 +656,7 @@ wheels = [ ] [[package]] -name = "simurg" +name = "simurgarray" source = { editable = "." } dependencies = [ { name = "numpy" },