kymora 0.7.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.
- kymora-0.7.0/.github/CODEOWNERS +2 -0
- kymora-0.7.0/.github/ISSUE_TEMPLATE/bug_report.yml +50 -0
- kymora-0.7.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
- kymora-0.7.0/.github/ISSUE_TEMPLATE/feature_request.yml +44 -0
- kymora-0.7.0/.github/PULL_REQUEST_TEMPLATE.md +18 -0
- kymora-0.7.0/.github/actions/setup-venv/action.yml +25 -0
- kymora-0.7.0/.github/dependabot.yml +21 -0
- kymora-0.7.0/.github/workflows/benchmark.yml +47 -0
- kymora-0.7.0/.github/workflows/ci.yml +115 -0
- kymora-0.7.0/.github/workflows/docs.yml +43 -0
- kymora-0.7.0/.github/workflows/release.yml +156 -0
- kymora-0.7.0/.gitignore +16 -0
- kymora-0.7.0/CHANGELOG.md +254 -0
- kymora-0.7.0/CITATION.cff +25 -0
- kymora-0.7.0/CLAIMS.md +45 -0
- kymora-0.7.0/CLAUDE.md +67 -0
- kymora-0.7.0/CODE_OF_CONDUCT.md +129 -0
- kymora-0.7.0/CONTRIBUTING.md +143 -0
- kymora-0.7.0/Cargo.lock +370 -0
- kymora-0.7.0/Cargo.toml +22 -0
- kymora-0.7.0/Dockerfile +34 -0
- kymora-0.7.0/LICENSE +21 -0
- kymora-0.7.0/Makefile +28 -0
- kymora-0.7.0/PKG-INFO +297 -0
- kymora-0.7.0/README.md +256 -0
- kymora-0.7.0/SECURITY.md +32 -0
- kymora-0.7.0/arch.md +532 -0
- kymora-0.7.0/benchmarks/LINUX_16VCPU_PLAN.md +89 -0
- kymora-0.7.0/benchmarks/STATE.md +185 -0
- kymora-0.7.0/benchmarks/__init__.py +1 -0
- kymora-0.7.0/benchmarks/adapters/antropy_.md +11 -0
- kymora-0.7.0/benchmarks/adapters/antropy_.py +106 -0
- kymora-0.7.0/benchmarks/adapters/base.py +41 -0
- kymora-0.7.0/benchmarks/adapters/catch22_.md +13 -0
- kymora-0.7.0/benchmarks/adapters/catch22_.py +72 -0
- kymora-0.7.0/benchmarks/adapters/kymora.md +16 -0
- kymora-0.7.0/benchmarks/adapters/kymora.py +97 -0
- kymora-0.7.0/benchmarks/adapters/numba_baseline.md +18 -0
- kymora-0.7.0/benchmarks/adapters/numba_baseline.py +459 -0
- kymora-0.7.0/benchmarks/adapters/numpy_baseline.md +15 -0
- kymora-0.7.0/benchmarks/adapters/numpy_baseline.py +231 -0
- kymora-0.7.0/benchmarks/adapters/sktime_.md +12 -0
- kymora-0.7.0/benchmarks/adapters/sktime_.py +92 -0
- kymora-0.7.0/benchmarks/adapters/tsfel_.md +11 -0
- kymora-0.7.0/benchmarks/adapters/tsfel_.py +95 -0
- kymora-0.7.0/benchmarks/adapters/tsflex_.md +11 -0
- kymora-0.7.0/benchmarks/adapters/tsflex_.py +93 -0
- kymora-0.7.0/benchmarks/adapters/tsfresh_.md +16 -0
- kymora-0.7.0/benchmarks/adapters/tsfresh_.py +105 -0
- kymora-0.7.0/benchmarks/agreement/AGREEMENT_REPORT.md +131 -0
- kymora-0.7.0/benchmarks/agreement/agreement_matrix.json +20256 -0
- kymora-0.7.0/benchmarks/agreement/feature_map.json +459 -0
- kymora-0.7.0/benchmarks/baseline/baseline.json +91 -0
- kymora-0.7.0/benchmarks/bench_ablation.py +111 -0
- kymora-0.7.0/benchmarks/bench_libraries.py +347 -0
- kymora-0.7.0/benchmarks/bench_matrix.py +313 -0
- kymora-0.7.0/benchmarks/bench_ucr_downstream.py +316 -0
- kymora-0.7.0/benchmarks/datasets/generators.py +266 -0
- kymora-0.7.0/benchmarks/datasets/manifest.json +202 -0
- kymora-0.7.0/benchmarks/datasets/real.py +166 -0
- kymora-0.7.0/benchmarks/harness/env.py +276 -0
- kymora-0.7.0/benchmarks/harness/runner.py +387 -0
- kymora-0.7.0/benchmarks/harness/schema.py +79 -0
- kymora-0.7.0/benchmarks/harness/stats.py +118 -0
- kymora-0.7.0/benchmarks/report/REPORT.md +32 -0
- kymora-0.7.0/benchmarks/report/charts/smoke_runtime.svg +31 -0
- kymora-0.7.0/benchmarks/report/make_report.py +241 -0
- kymora-0.7.0/benchmarks/report/results.json +1266 -0
- kymora-0.7.0/benchmarks/reproduce.py +40 -0
- kymora-0.7.0/benchmarks/requirements-antropy.txt +4 -0
- kymora-0.7.0/benchmarks/requirements-catch22.txt +3 -0
- kymora-0.7.0/benchmarks/requirements-kymora.txt +4 -0
- kymora-0.7.0/benchmarks/requirements-numba.txt +4 -0
- kymora-0.7.0/benchmarks/requirements-numpy.txt +3 -0
- kymora-0.7.0/benchmarks/requirements-sktime.txt +7 -0
- kymora-0.7.0/benchmarks/requirements-tsfel.txt +5 -0
- kymora-0.7.0/benchmarks/requirements-tsflex.txt +5 -0
- kymora-0.7.0/benchmarks/requirements-tsfresh.txt +5 -0
- kymora-0.7.0/benchmarks/results/2026-10-04_Aamod/env.json +509 -0
- kymora-0.7.0/benchmarks/results/2026-10-04_Aamod/smoke.jsonl +10 -0
- kymora-0.7.0/benchmarks/results/2026-10-04_reproduce_readme/env.json +523 -0
- kymora-0.7.0/benchmarks/results/2026-10-04_reproduce_readme/readme_reproduce.jsonl +4 -0
- kymora-0.7.0/benchmarks/results/B_032_R1.json +1 -0
- kymora-0.7.0/benchmarks/results/B_032_R2.json +1 -0
- kymora-0.7.0/benchmarks/results/B_040_R1/env.json +529 -0
- kymora-0.7.0/benchmarks/results/B_040_R1/readme_reproduce.jsonl +4 -0
- kymora-0.7.0/benchmarks/results/B_040_R2/env.json +529 -0
- kymora-0.7.0/benchmarks/results/B_040_R2/readme_reproduce.jsonl +4 -0
- kymora-0.7.0/benchmarks/results/B_HEAD_R1/env.json +529 -0
- kymora-0.7.0/benchmarks/results/B_HEAD_R1/readme_reproduce.jsonl +4 -0
- kymora-0.7.0/benchmarks/results/B_HEAD_R2/env.json +529 -0
- kymora-0.7.0/benchmarks/results/B_HEAD_R2/readme_reproduce.jsonl +4 -0
- kymora-0.7.0/benchmarks/results/B_HEAD_probe.json +1 -0
- kymora-0.7.0/benchmarks/results/B_PRE_R1c/env.json +530 -0
- kymora-0.7.0/benchmarks/results/B_PRE_R1c/readme_reproduce.jsonl +4 -0
- kymora-0.7.0/benchmarks/results/B_PRE_R2/env.json +530 -0
- kymora-0.7.0/benchmarks/results/B_PRE_R2/readme_reproduce.jsonl +4 -0
- kymora-0.7.0/benchmarks/results/B_probe_PA2_v032.json +1 -0
- kymora-0.7.0/benchmarks/results/B_probe_PA2_v040.json +1 -0
- kymora-0.7.0/benchmarks/results/B_probe_PA2_vHEAD.json +1 -0
- kymora-0.7.0/benchmarks/results/B_probe_PA2_vPRE.json +1 -0
- kymora-0.7.0/benchmarks/results/B_probe_PA_v040.json +1 -0
- kymora-0.7.0/benchmarks/results/B_probe_PA_vHEAD.json +1 -0
- kymora-0.7.0/benchmarks/results/B_probe_PA_vPRE.json +1 -0
- kymora-0.7.0/benchmarks/results/B_probe_PB_v032.json +1 -0
- kymora-0.7.0/benchmarks/results/B_probe_PB_v040.json +1 -0
- kymora-0.7.0/benchmarks/results/B_probe_PB_vHEAD.json +1 -0
- kymora-0.7.0/benchmarks/results/B_probe_PB_vPRE.json +1 -0
- kymora-0.7.0/benchmarks/results/F1_H1/env.json +529 -0
- kymora-0.7.0/benchmarks/results/F1_H1/readme_reproduce.jsonl +4 -0
- kymora-0.7.0/benchmarks/results/F1_H2/env.json +529 -0
- kymora-0.7.0/benchmarks/results/F1_H2/readme_reproduce.jsonl +4 -0
- kymora-0.7.0/benchmarks/results/F1_P1/env.json +529 -0
- kymora-0.7.0/benchmarks/results/F1_P1/readme_reproduce.jsonl +4 -0
- kymora-0.7.0/benchmarks/results/F1_P2/env.json +529 -0
- kymora-0.7.0/benchmarks/results/F1_P2/readme_reproduce.jsonl +4 -0
- kymora-0.7.0/benchmarks/results/F1_REPORT.md +149 -0
- kymora-0.7.0/benchmarks/results/F1_SUMMARY.json +1 -0
- kymora-0.7.0/benchmarks/results/LOSS_LEDGER.md +147 -0
- kymora-0.7.0/benchmarks/results/ablation_report.md +23 -0
- kymora-0.7.0/benchmarks/results/bench_matrix.json +171 -0
- kymora-0.7.0/benchmarks/results/bench_matrix.md +40 -0
- kymora-0.7.0/benchmarks/results/downstream_report.md +18 -0
- kymora-0.7.0/benchmarks/results/latest.json +53 -0
- kymora-0.7.0/benchmarks/results/latest.md +15 -0
- kymora-0.7.0/benchmarks/setup_venvs.py +59 -0
- kymora-0.7.0/benchmarks/smoke.py +89 -0
- kymora-0.7.0/benchmarks/suites/agreement.py +842 -0
- kymora-0.7.0/benchmarks/suites/l1_root_cause.py +661 -0
- kymora-0.7.0/benchmarks/suites/latency.py +182 -0
- kymora-0.7.0/benchmarks/suites/latency_overhead.py +168 -0
- kymora-0.7.0/benchmarks/suites/make_b3_report.py +356 -0
- kymora-0.7.0/benchmarks/suites/make_competitor_report.py +244 -0
- kymora-0.7.0/benchmarks/suites/memory.py +301 -0
- kymora-0.7.0/benchmarks/suites/reproduce_readme.py +196 -0
- kymora-0.7.0/benchmarks/suites/scaling.py +203 -0
- kymora-0.7.0/benchmarks/suites/sliding.py +336 -0
- kymora-0.7.0/benchmarks/suites/startup.py +385 -0
- kymora-0.7.0/benchmarks/suites/streaming.py +304 -0
- kymora-0.7.0/benchmarks/suites/throughput.py +410 -0
- kymora-0.7.0/benchmarks/suites/throughput_competitors.py +219 -0
- kymora-0.7.0/benchmarks/zenith_baseline.md +48 -0
- kymora-0.7.0/docs/REFACTOR_REPORT.md +82 -0
- kymora-0.7.0/docs/REFACTOR_STATE.md +195 -0
- kymora-0.7.0/docs/RENAME_RELEASE_CHECKLIST.md +46 -0
- kymora-0.7.0/docs/ROADMAP.md +58 -0
- kymora-0.7.0/docs/api.md +324 -0
- kymora-0.7.0/docs/arch_audit.md +89 -0
- kymora-0.7.0/docs/benchmarks.md +86 -0
- kymora-0.7.0/docs/contributing.md +61 -0
- kymora-0.7.0/docs/faq.md +31 -0
- kymora-0.7.0/docs/features.md +128 -0
- kymora-0.7.0/docs/index.md +65 -0
- kymora-0.7.0/docs/install.md +44 -0
- kymora-0.7.0/docs/migrating.md +121 -0
- kymora-0.7.0/docs/naming/NAME_CHECK.md +63 -0
- kymora-0.7.0/docs/nan-policy.md +76 -0
- kymora-0.7.0/docs/parity_matrix.md +861 -0
- kymora-0.7.0/docs/quickstart.md +114 -0
- kymora-0.7.0/docs/redundancy_report.md +22 -0
- kymora-0.7.0/docs/refactor/baseline/SUMMARY.md +41 -0
- kymora-0.7.0/docs/refactor/baseline/api_surface.txt +2 -0
- kymora-0.7.0/docs/refactor/baseline/bench_smoke.txt +14 -0
- kymora-0.7.0/docs/refactor/baseline/cargo_clippy.txt +11 -0
- kymora-0.7.0/docs/refactor/baseline/cargo_test.txt +36 -0
- kymora-0.7.0/docs/refactor/baseline/feature_names.txt +4 -0
- kymora-0.7.0/docs/refactor/baseline/file_classification.txt +251 -0
- kymora-0.7.0/docs/refactor/baseline/golden_hashes.txt +3 -0
- kymora-0.7.0/docs/refactor/baseline/ls_files.txt +240 -0
- kymora-0.7.0/docs/refactor/baseline/mkdocs_build.txt +34 -0
- kymora-0.7.0/docs/refactor/baseline/mypy.txt +16 -0
- kymora-0.7.0/docs/refactor/baseline/name_inventory_raw.txt +218 -0
- kymora-0.7.0/docs/refactor/baseline/pytest.txt +3 -0
- kymora-0.7.0/docs/refactor/baseline/website_build.txt +85 -0
- kymora-0.7.0/docs/refactor/deleted_files.md +65 -0
- kymora-0.7.0/docs/refactor/name_inventory.md +58 -0
- kymora-0.7.0/docs/refactor/naming.md +67 -0
- kymora-0.7.0/docs/refactor/phase1_VERIFICATION.md +59 -0
- kymora-0.7.0/docs/refactor/phase3_VERIFICATION.md +56 -0
- kymora-0.7.0/docs/refactor/phase4_VERIFICATION.md +50 -0
- kymora-0.7.0/docs/refactor/phase5_VERIFICATION.md +82 -0
- kymora-0.7.0/docs/refactor/phase6_VERIFICATION.md +76 -0
- kymora-0.7.0/docs/refactor/phase7_VERIFICATION.md +70 -0
- kymora-0.7.0/docs/refactor/phase8_VERIFICATION.md +59 -0
- kymora-0.7.0/docs/refactor/rename-kymora/INVENTORY.md +99 -0
- kymora-0.7.0/docs/refactor/rename-kymora/NAME_CHECK_RAW.json +155 -0
- kymora-0.7.0/docs/refactor/rename-kymora/deleted_files.md +65 -0
- kymora-0.7.0/docs/refactor/rename-kymora/file_classification.txt +323 -0
- kymora-0.7.0/docs/refactor/rename-kymora/name_occurrences.txt +237 -0
- kymora-0.7.0/docs/refactor/rename-kymora/phase0_VERIFICATION.md +63 -0
- kymora-0.7.0/docs/refactor/rename-kymora/phase3_VERIFICATION.md +50 -0
- kymora-0.7.0/docs/refactor/rename-kymora/phase4_VERIFICATION.md +99 -0
- kymora-0.7.0/docs/refactor/rename-kymora/phase5_VERIFICATION.md +79 -0
- kymora-0.7.0/docs/timeline_progress.md +128 -0
- kymora-0.7.0/docs/validation.md +79 -0
- kymora-0.7.0/landing/.gitignore +7 -0
- kymora-0.7.0/landing/index.html +54 -0
- kymora-0.7.0/landing/package-lock.json +2797 -0
- kymora-0.7.0/landing/package.json +28 -0
- kymora-0.7.0/landing/postcss.config.js +6 -0
- kymora-0.7.0/landing/public/figures/architecture.png +0 -0
- kymora-0.7.0/landing/public/figures/memory.png +0 -0
- kymora-0.7.0/landing/public/figures/scaling.png +0 -0
- kymora-0.7.0/landing/public/figures/speedup.png +0 -0
- kymora-0.7.0/landing/public/figures/throughput.png +0 -0
- kymora-0.7.0/landing/public/robots.txt +4 -0
- kymora-0.7.0/landing/public/sitemap.xml +8 -0
- kymora-0.7.0/landing/src/App.tsx +100 -0
- kymora-0.7.0/landing/src/benchmarks.ts +98 -0
- kymora-0.7.0/landing/src/components/Benchmarks.tsx +217 -0
- kymora-0.7.0/landing/src/components/CTA.tsx +95 -0
- kymora-0.7.0/landing/src/components/Features.tsx +146 -0
- kymora-0.7.0/landing/src/components/Footer.tsx +172 -0
- kymora-0.7.0/landing/src/components/Hero.tsx +624 -0
- kymora-0.7.0/landing/src/components/HowItWorks.tsx +222 -0
- kymora-0.7.0/landing/src/components/Nav.tsx +184 -0
- kymora-0.7.0/landing/src/components/Rails.tsx +216 -0
- kymora-0.7.0/landing/src/components/RandomHighlight.tsx +372 -0
- kymora-0.7.0/landing/src/components/RowType.tsx +840 -0
- kymora-0.7.0/landing/src/index.css +974 -0
- kymora-0.7.0/landing/src/main.tsx +10 -0
- kymora-0.7.0/landing/tailwind.config.js +53 -0
- kymora-0.7.0/landing/tsconfig.json +20 -0
- kymora-0.7.0/landing/tsconfig.node.json +10 -0
- kymora-0.7.0/landing/vercel.json +15 -0
- kymora-0.7.0/landing/vite.config.ts +7 -0
- kymora-0.7.0/mkdocs.yml +60 -0
- kymora-0.7.0/paper/README.md +46 -0
- kymora-0.7.0/paper/figures/architecture.pdf +0 -0
- kymora-0.7.0/paper/figures/architecture.png +0 -0
- kymora-0.7.0/paper/figures/memory.pdf +0 -0
- kymora-0.7.0/paper/figures/memory.png +0 -0
- kymora-0.7.0/paper/figures/scaling.pdf +0 -0
- kymora-0.7.0/paper/figures/scaling.png +0 -0
- kymora-0.7.0/paper/figures/speedup.pdf +0 -0
- kymora-0.7.0/paper/figures/speedup.png +0 -0
- kymora-0.7.0/paper/figures/throughput.pdf +0 -0
- kymora-0.7.0/paper/figures/throughput.png +0 -0
- kymora-0.7.0/paper/generate_figures.py +410 -0
- kymora-0.7.0/paper/main.tex +648 -0
- kymora-0.7.0/paper/paper.bib +74 -0
- kymora-0.7.0/paper/paper.md +76 -0
- kymora-0.7.0/paper/references.bib +170 -0
- kymora-0.7.0/patent/patent_disclosure.md +143 -0
- kymora-0.7.0/pyproject.toml +46 -0
- kymora-0.7.0/python/kymora/__init__.py +160 -0
- kymora-0.7.0/python/kymora/_core.pyi +180 -0
- kymora-0.7.0/python/kymora/py.typed +1 -0
- kymora-0.7.0/python/kymora/select.py +294 -0
- kymora-0.7.0/python/kymora/tune.py +112 -0
- kymora-0.7.0/reproduce.sh +26 -0
- kymora-0.7.0/src/error.rs +101 -0
- kymora-0.7.0/src/exec.rs +167 -0
- kymora-0.7.0/src/extract.rs +101 -0
- kymora-0.7.0/src/features/entropy.rs +78 -0
- kymora-0.7.0/src/features/mod.rs +233 -0
- kymora-0.7.0/src/features/multistream.rs +200 -0
- kymora-0.7.0/src/features/spectral.rs +121 -0
- kymora-0.7.0/src/features/stats.rs +174 -0
- kymora-0.7.0/src/features/streaming.rs +370 -0
- kymora-0.7.0/src/features/temporal.rs +313 -0
- kymora-0.7.0/src/features/views.rs +169 -0
- kymora-0.7.0/src/ffi.rs +851 -0
- kymora-0.7.0/src/intermediates.rs +313 -0
- kymora-0.7.0/src/kernels/fft.rs +260 -0
- kymora-0.7.0/src/kernels/mod.rs +6 -0
- kymora-0.7.0/src/kernels/perm.rs +55 -0
- kymora-0.7.0/src/kernels/reduce.rs +819 -0
- kymora-0.7.0/src/kernels/sort.rs +510 -0
- kymora-0.7.0/src/lib.rs +30 -0
- kymora-0.7.0/src/pipeline.rs +250 -0
- kymora-0.7.0/src/plan.rs +160 -0
- kymora-0.7.0/src/registry.rs +1134 -0
- kymora-0.7.0/src/scratch.rs +70 -0
- kymora-0.7.0/tests/fixtures/tsfresh_777_names.json +779 -0
- kymora-0.7.0/tests/golden/core33_names.json +35 -0
- kymora-0.7.0/tests/golden/core33_output.json +359 -0
- kymora-0.7.0/tests/property/test_properties.py +261 -0
- kymora-0.7.0/tests/reference/test_validation.py +174 -0
- kymora-0.7.0/tests/test_features.py +180 -0
- kymora-0.7.0/tests/test_invariants.py +131 -0
- kymora-0.7.0/tests/test_nan_policy.py +217 -0
- kymora-0.7.0/tests/test_phase2.py +69 -0
- kymora-0.7.0/tests/test_phase3.py +154 -0
- kymora-0.7.0/tests/test_phase4.py +203 -0
- kymora-0.7.0/tests/test_phase5.py +178 -0
- kymora-0.7.0/tests/test_python_api.py +172 -0
- kymora-0.7.0/tests/test_streaming.py +58 -0
- kymora-0.7.0/tests/test_zenith.py +136 -0
- kymora-0.7.0/tools/check_snippets.py +117 -0
- kymora-0.7.0/tools/feature_redundancy_analysis.py +183 -0
- kymora-0.7.0/tools/name_check.py +172 -0
- kymora-0.7.0/tools/rename_to_kymora.py +222 -0
- kymora-0.7.0/tools/run_phase0_baseline.py +111 -0
- kymora-0.7.0/tools/validation_report.py +152 -0
- kymora-0.7.0/vercel.json +19 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Something produces wrong values, crashes, or fails to install
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for the report. For a wrong-value report, the most useful thing
|
|
10
|
+
you can include is what you expected and how you computed it — a
|
|
11
|
+
numpy/scipy expression turns the report straight into a test case.
|
|
12
|
+
- type: input
|
|
13
|
+
id: version
|
|
14
|
+
attributes:
|
|
15
|
+
label: kymora version
|
|
16
|
+
description: "`python -c \"import kymora; print(kymora.__version__)\"`"
|
|
17
|
+
placeholder: "0.5.0"
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: env
|
|
22
|
+
attributes:
|
|
23
|
+
label: Environment
|
|
24
|
+
description: OS, Python version, install method, architecture
|
|
25
|
+
placeholder: |
|
|
26
|
+
Windows 11, Python 3.14.6, pip install kymora, x86_64
|
|
27
|
+
validations:
|
|
28
|
+
required: true
|
|
29
|
+
- type: textarea
|
|
30
|
+
id: what-happened
|
|
31
|
+
attributes:
|
|
32
|
+
label: What happened
|
|
33
|
+
description: Actual behaviour, error message / stack trace
|
|
34
|
+
validations:
|
|
35
|
+
required: true
|
|
36
|
+
- type: textarea
|
|
37
|
+
id: expected
|
|
38
|
+
attributes:
|
|
39
|
+
label: What you expected
|
|
40
|
+
description: Expected values and how you computed them (numpy/scipy expression is ideal)
|
|
41
|
+
validations:
|
|
42
|
+
required: true
|
|
43
|
+
- type: textarea
|
|
44
|
+
id: repro
|
|
45
|
+
attributes:
|
|
46
|
+
label: Minimal reproduction
|
|
47
|
+
description: Smallest runnable snippet that shows the problem
|
|
48
|
+
render: python
|
|
49
|
+
validations:
|
|
50
|
+
required: true
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: true
|
|
2
|
+
links:
|
|
3
|
+
- name: Security report (private)
|
|
4
|
+
url: https://github.com/Aamodx6/Kymora/security/advisories/new
|
|
5
|
+
about: Vulnerability reports — never file these as public issues
|
|
6
|
+
- name: Documentation
|
|
7
|
+
url: https://aamodx6.github.io/Kymora/
|
|
8
|
+
about: Install, quickstart, API reference
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
name: Feature proposal
|
|
2
|
+
description: Propose a change before writing code (required for new features)
|
|
3
|
+
title: "[Proposal]: "
|
|
4
|
+
labels: ["proposal"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
The 33-feature catalog is **closed on purpose** — the low-redundancy set
|
|
10
|
+
*is* the product differentiation. PRs that add a feature without an
|
|
11
|
+
accepted proposal may be closed on scope grounds regardless of quality
|
|
12
|
+
(see CONTRIBUTING.md → "Adding a feature"). Refactors, docs, and
|
|
13
|
+
platform fixes do not need a proposal — open a regular issue or PR.
|
|
14
|
+
- type: textarea
|
|
15
|
+
id: problem
|
|
16
|
+
attributes:
|
|
17
|
+
label: Problem
|
|
18
|
+
description: What are you trying to do that the library cannot express today?
|
|
19
|
+
validations:
|
|
20
|
+
required: true
|
|
21
|
+
- type: textarea
|
|
22
|
+
id: proposal
|
|
23
|
+
attributes:
|
|
24
|
+
label: Proposed change
|
|
25
|
+
description: What should be added/changed, and the public API shape if any
|
|
26
|
+
validations:
|
|
27
|
+
required: true
|
|
28
|
+
- type: textarea
|
|
29
|
+
id: redundancy
|
|
30
|
+
attributes:
|
|
31
|
+
label: Redundancy assessment
|
|
32
|
+
description: >
|
|
33
|
+
For feature proposals: how does this differ from the existing 33
|
|
34
|
+
(correlation with the closest existing feature, or why it measures
|
|
35
|
+
something none of them do)?
|
|
36
|
+
- type: checkboxes
|
|
37
|
+
id: checks
|
|
38
|
+
attributes:
|
|
39
|
+
label: Checklist
|
|
40
|
+
options:
|
|
41
|
+
- label: I searched existing issues for duplicates
|
|
42
|
+
required: true
|
|
43
|
+
- label: I read CONTRIBUTING.md (architecture rules, feature policy)
|
|
44
|
+
required: true
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
## What & why
|
|
2
|
+
|
|
3
|
+
<!-- Explain *why*, not just what — the diff shows the what. -->
|
|
4
|
+
|
|
5
|
+
## Checklist
|
|
6
|
+
|
|
7
|
+
- [ ] One logical change per PR (a feature and a refactor is two PRs)
|
|
8
|
+
- [ ] New behaviour has a test that fails without the change
|
|
9
|
+
- [ ] `pytest tests/ -q` passes (after rebuilding: `maturin develop --release`)
|
|
10
|
+
- [ ] `cargo test --no-default-features`, `cargo fmt --all -- --check`,
|
|
11
|
+
`cargo clippy --no-default-features --all-targets -- -D warnings` pass
|
|
12
|
+
- [ ] `python tools/validation_report.py` passes (feature behaviour unchanged)
|
|
13
|
+
- [ ] Version impact noted below per the CONTRIBUTING versioning table
|
|
14
|
+
(feature order/length is public API)
|
|
15
|
+
|
|
16
|
+
## Version impact
|
|
17
|
+
|
|
18
|
+
<!-- patch / minor / major / none — see CONTRIBUTING.md → Versioning policy -->
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
name: 'Set up virtualenv'
|
|
2
|
+
description: 'Create .venv, put its bin dir on PATH, export VIRTUAL_ENV (maturin requires a venv)'
|
|
3
|
+
|
|
4
|
+
runs:
|
|
5
|
+
using: composite
|
|
6
|
+
steps:
|
|
7
|
+
- name: Create a virtualenv (maturin requires one)
|
|
8
|
+
shell: bash
|
|
9
|
+
run: |
|
|
10
|
+
python -m venv .venv
|
|
11
|
+
# Native tools (maturin) cannot read the MSYS-style path bash reports
|
|
12
|
+
# on Windows, so emit a Windows path there via `pwd -W`.
|
|
13
|
+
if [ -d .venv/bin ]; then
|
|
14
|
+
root="$PWD"; bin="$root/.venv/bin"
|
|
15
|
+
else
|
|
16
|
+
root="$(pwd -W)"; bin="$root/.venv/Scripts"
|
|
17
|
+
fi
|
|
18
|
+
echo "$bin" >> "$GITHUB_PATH"
|
|
19
|
+
echo "VIRTUAL_ENV=$root/.venv" >> "$GITHUB_ENV"
|
|
20
|
+
- name: Confirm the venv is the active interpreter
|
|
21
|
+
shell: bash
|
|
22
|
+
run: |
|
|
23
|
+
# A wrong path here would silently install into the runner's Python and
|
|
24
|
+
# test a different build than the one maturin produced.
|
|
25
|
+
python -c "import sys; assert sys.prefix.replace(chr(92), '/').endswith('/.venv'), sys.prefix"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: github-actions
|
|
4
|
+
directory: /
|
|
5
|
+
schedule:
|
|
6
|
+
interval: weekly
|
|
7
|
+
groups:
|
|
8
|
+
actions:
|
|
9
|
+
patterns: ["*"]
|
|
10
|
+
|
|
11
|
+
- package-ecosystem: cargo
|
|
12
|
+
directory: /
|
|
13
|
+
schedule:
|
|
14
|
+
interval: weekly
|
|
15
|
+
groups:
|
|
16
|
+
cargo:
|
|
17
|
+
patterns: ["*"]
|
|
18
|
+
|
|
19
|
+
# pip/PyPI is intentionally absent: dependencies live in pyproject.toml
|
|
20
|
+
# behind the maturin backend; Renovate/dependabot pip support for that
|
|
21
|
+
# layout is limited and the runtime dep set is numpy-only.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: Benchmark
|
|
2
|
+
|
|
3
|
+
# Manual / weekly, never gating. Publishes numbers a stranger can reproduce on a
|
|
4
|
+
# known runner instead of one laptop.
|
|
5
|
+
on:
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
n_series:
|
|
9
|
+
description: "Number of series"
|
|
10
|
+
default: "1000"
|
|
11
|
+
n_steps:
|
|
12
|
+
description: "Steps per series"
|
|
13
|
+
default: "500"
|
|
14
|
+
schedule:
|
|
15
|
+
- cron: "37 4 * * 1"
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
bench:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
timeout-minutes: 90
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v7
|
|
23
|
+
- uses: actions/setup-python@v7
|
|
24
|
+
with:
|
|
25
|
+
python-version: "3.12"
|
|
26
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
27
|
+
- uses: Swatinem/rust-cache@v2
|
|
28
|
+
- uses: ./.github/actions/setup-venv
|
|
29
|
+
- run: |
|
|
30
|
+
python -m pip install --upgrade pip maturin
|
|
31
|
+
python -m pip install -e ".[bench]"
|
|
32
|
+
maturin develop --release
|
|
33
|
+
- name: Record runner spec
|
|
34
|
+
run: |
|
|
35
|
+
echo "cores: $(nproc)" | tee -a "$GITHUB_STEP_SUMMARY"
|
|
36
|
+
python -c "import platform;print('python:', platform.python_version())" | tee -a "$GITHUB_STEP_SUMMARY"
|
|
37
|
+
- run: |
|
|
38
|
+
python benchmarks/bench_libraries.py \
|
|
39
|
+
--n-series ${{ github.event.inputs.n_series || '1000' }} \
|
|
40
|
+
--n-steps ${{ github.event.inputs.n_steps || '500' }} \
|
|
41
|
+
--json benchmarks/results/latest.json \
|
|
42
|
+
--markdown benchmarks/results/latest.md
|
|
43
|
+
- run: cat benchmarks/results/latest.md >> "$GITHUB_STEP_SUMMARY"
|
|
44
|
+
- uses: actions/upload-artifact@v7
|
|
45
|
+
with:
|
|
46
|
+
name: benchmark-results
|
|
47
|
+
path: benchmarks/results/
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
concurrency:
|
|
10
|
+
group: ci-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
env:
|
|
14
|
+
CARGO_TERM_COLOR: always
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
rust:
|
|
18
|
+
name: rust (fmt, clippy, unit tests)
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v7
|
|
22
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
23
|
+
with:
|
|
24
|
+
components: rustfmt, clippy
|
|
25
|
+
- uses: Swatinem/rust-cache@v2
|
|
26
|
+
- run: cargo fmt --all -- --check
|
|
27
|
+
# The pyo3 extension-module feature omits libpython at link time, which
|
|
28
|
+
# breaks `cargo test` binaries; test the pure-Rust core without it.
|
|
29
|
+
- run: cargo clippy --no-default-features --all-targets -- -D warnings
|
|
30
|
+
- run: cargo test --no-default-features
|
|
31
|
+
|
|
32
|
+
test:
|
|
33
|
+
name: py${{ matrix.python }} on ${{ matrix.os }}
|
|
34
|
+
runs-on: ${{ matrix.os }}
|
|
35
|
+
strategy:
|
|
36
|
+
fail-fast: false
|
|
37
|
+
matrix:
|
|
38
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
39
|
+
python: ["3.11", "3.12", "3.13"]
|
|
40
|
+
steps:
|
|
41
|
+
- uses: actions/checkout@v7
|
|
42
|
+
- uses: actions/setup-python@v7
|
|
43
|
+
with:
|
|
44
|
+
python-version: ${{ matrix.python }}
|
|
45
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
46
|
+
- uses: Swatinem/rust-cache@v2
|
|
47
|
+
with:
|
|
48
|
+
key: ${{ matrix.os }}-${{ matrix.python }}
|
|
49
|
+
- uses: ./.github/actions/setup-venv
|
|
50
|
+
- name: Install package and test deps
|
|
51
|
+
run: |
|
|
52
|
+
python -m pip install --upgrade pip
|
|
53
|
+
python -m pip install maturin
|
|
54
|
+
python -m pip install -e ".[test]"
|
|
55
|
+
- name: Build extension in release mode
|
|
56
|
+
run: maturin develop --release
|
|
57
|
+
- name: Run tests
|
|
58
|
+
run: python -m pytest tests/ -q
|
|
59
|
+
|
|
60
|
+
validation-report:
|
|
61
|
+
name: reference-validation report
|
|
62
|
+
runs-on: ubuntu-latest
|
|
63
|
+
steps:
|
|
64
|
+
- uses: actions/checkout@v7
|
|
65
|
+
- uses: actions/setup-python@v7
|
|
66
|
+
with:
|
|
67
|
+
python-version: "3.12"
|
|
68
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
69
|
+
- uses: Swatinem/rust-cache@v2
|
|
70
|
+
- uses: ./.github/actions/setup-venv
|
|
71
|
+
- run: |
|
|
72
|
+
python -m pip install --upgrade pip maturin
|
|
73
|
+
python -m pip install -e ".[test]"
|
|
74
|
+
maturin develop --release
|
|
75
|
+
- run: python tools/validation_report.py --out validation-report.md
|
|
76
|
+
- name: Publish report to the job summary
|
|
77
|
+
run: cat validation-report.md >> "$GITHUB_STEP_SUMMARY"
|
|
78
|
+
- uses: actions/upload-artifact@v7
|
|
79
|
+
with:
|
|
80
|
+
name: validation-report
|
|
81
|
+
path: validation-report.md
|
|
82
|
+
|
|
83
|
+
typecheck:
|
|
84
|
+
name: mypy against the type stubs
|
|
85
|
+
runs-on: ubuntu-latest
|
|
86
|
+
steps:
|
|
87
|
+
- uses: actions/checkout@v7
|
|
88
|
+
- uses: actions/setup-python@v7
|
|
89
|
+
with:
|
|
90
|
+
python-version: "3.12"
|
|
91
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
92
|
+
- uses: Swatinem/rust-cache@v2
|
|
93
|
+
- uses: ./.github/actions/setup-venv
|
|
94
|
+
- run: |
|
|
95
|
+
python -m pip install --upgrade pip maturin mypy pandas-stubs
|
|
96
|
+
python -m pip install -e ".[pandas]"
|
|
97
|
+
maturin develop --release
|
|
98
|
+
- run: mypy python/kymora
|
|
99
|
+
|
|
100
|
+
snippets:
|
|
101
|
+
name: README + docs snippets execute
|
|
102
|
+
runs-on: ubuntu-latest
|
|
103
|
+
steps:
|
|
104
|
+
- uses: actions/checkout@v4
|
|
105
|
+
- uses: actions/setup-python@v5
|
|
106
|
+
with:
|
|
107
|
+
python-version: "3.12"
|
|
108
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
109
|
+
- uses: Swatinem/rust-cache@v2
|
|
110
|
+
- uses: ./.github/actions/setup-venv
|
|
111
|
+
- run: |
|
|
112
|
+
python -m pip install --upgrade pip maturin scikit-learn
|
|
113
|
+
python -m pip install -e ".[test]"
|
|
114
|
+
maturin develop --release
|
|
115
|
+
- run: python tools/check_snippets.py
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: Docs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths: ["docs/**", "mkdocs.yml", ".github/workflows/docs.yml", "README.md"]
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
pages: write
|
|
12
|
+
id-token: write
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: pages
|
|
16
|
+
cancel-in-progress: false
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
build:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v7
|
|
23
|
+
- uses: actions/setup-python@v7
|
|
24
|
+
with:
|
|
25
|
+
python-version: "3.12"
|
|
26
|
+
# Docs need only mkdocs itself — the primary path used to install the
|
|
27
|
+
# project (maturin backend, no Rust here) with --no-deps, which could
|
|
28
|
+
# never bring mkdocs in; this installs exactly the pyproject docs floors.
|
|
29
|
+
- run: python -m pip install --upgrade pip && python -m pip install "mkdocs>=1.6" "mkdocs-material>=9.5"
|
|
30
|
+
- run: mkdocs build --strict
|
|
31
|
+
- uses: actions/upload-pages-artifact@v5
|
|
32
|
+
with:
|
|
33
|
+
path: site
|
|
34
|
+
|
|
35
|
+
deploy:
|
|
36
|
+
needs: build
|
|
37
|
+
runs-on: ubuntu-latest
|
|
38
|
+
environment:
|
|
39
|
+
name: github-pages
|
|
40
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
41
|
+
steps:
|
|
42
|
+
- id: deployment
|
|
43
|
+
uses: actions/deploy-pages@v5
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Wheels are built on every push to main (so a broken build surfaces before a
|
|
4
|
+
# tag), and published to PyPI only when a GitHub Release is published.
|
|
5
|
+
on:
|
|
6
|
+
push:
|
|
7
|
+
branches: [main]
|
|
8
|
+
tags: ["v*"]
|
|
9
|
+
release:
|
|
10
|
+
types: [published]
|
|
11
|
+
workflow_dispatch:
|
|
12
|
+
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
linux:
|
|
18
|
+
name: wheel ${{ matrix.target }} (manylinux)
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
target: [x86_64, aarch64]
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v7
|
|
26
|
+
- uses: actions/setup-python@v7
|
|
27
|
+
with:
|
|
28
|
+
python-version: "3.12"
|
|
29
|
+
- name: Build wheel
|
|
30
|
+
uses: PyO3/maturin-action@v1
|
|
31
|
+
with:
|
|
32
|
+
target: ${{ matrix.target }}
|
|
33
|
+
args: --release --out dist
|
|
34
|
+
manylinux: "2014"
|
|
35
|
+
# aarch64 needs emulation/cross; x86_64 builds natively.
|
|
36
|
+
sccache: "true"
|
|
37
|
+
- uses: actions/upload-artifact@v7
|
|
38
|
+
with:
|
|
39
|
+
name: wheels-linux-${{ matrix.target }}
|
|
40
|
+
path: dist
|
|
41
|
+
|
|
42
|
+
macos:
|
|
43
|
+
name: wheel ${{ matrix.target }} (macOS)
|
|
44
|
+
runs-on: macos-latest
|
|
45
|
+
strategy:
|
|
46
|
+
fail-fast: false
|
|
47
|
+
matrix:
|
|
48
|
+
target: [x86_64, aarch64]
|
|
49
|
+
steps:
|
|
50
|
+
- uses: actions/checkout@v7
|
|
51
|
+
- uses: actions/setup-python@v7
|
|
52
|
+
with:
|
|
53
|
+
python-version: "3.12"
|
|
54
|
+
- uses: PyO3/maturin-action@v1
|
|
55
|
+
with:
|
|
56
|
+
target: ${{ matrix.target }}
|
|
57
|
+
args: --release --out dist
|
|
58
|
+
sccache: "true"
|
|
59
|
+
- uses: actions/upload-artifact@v7
|
|
60
|
+
with:
|
|
61
|
+
name: wheels-macos-${{ matrix.target }}
|
|
62
|
+
path: dist
|
|
63
|
+
|
|
64
|
+
windows:
|
|
65
|
+
name: wheel x64 (Windows)
|
|
66
|
+
runs-on: windows-latest
|
|
67
|
+
steps:
|
|
68
|
+
- uses: actions/checkout@v7
|
|
69
|
+
- uses: actions/setup-python@v7
|
|
70
|
+
with:
|
|
71
|
+
python-version: "3.12"
|
|
72
|
+
architecture: x64
|
|
73
|
+
- uses: PyO3/maturin-action@v1
|
|
74
|
+
with:
|
|
75
|
+
target: x64
|
|
76
|
+
args: --release --out dist
|
|
77
|
+
sccache: "true"
|
|
78
|
+
- uses: actions/upload-artifact@v7
|
|
79
|
+
with:
|
|
80
|
+
name: wheels-windows-x64
|
|
81
|
+
path: dist
|
|
82
|
+
|
|
83
|
+
sdist:
|
|
84
|
+
name: sdist
|
|
85
|
+
runs-on: ubuntu-latest
|
|
86
|
+
steps:
|
|
87
|
+
- uses: actions/checkout@v7
|
|
88
|
+
- uses: PyO3/maturin-action@v1
|
|
89
|
+
with:
|
|
90
|
+
command: sdist
|
|
91
|
+
args: --out dist
|
|
92
|
+
- uses: actions/upload-artifact@v7
|
|
93
|
+
with:
|
|
94
|
+
name: wheels-sdist
|
|
95
|
+
path: dist
|
|
96
|
+
|
|
97
|
+
smoke-test:
|
|
98
|
+
name: install wheel and import (${{ matrix.os }}, py${{ matrix.python }})
|
|
99
|
+
needs: [linux, macos, windows]
|
|
100
|
+
runs-on: ${{ matrix.os }}
|
|
101
|
+
strategy:
|
|
102
|
+
fail-fast: false
|
|
103
|
+
matrix:
|
|
104
|
+
include:
|
|
105
|
+
- {os: ubuntu-latest, python: "3.13", artifact: wheels-linux-x86_64}
|
|
106
|
+
- {os: macos-latest, python: "3.13", artifact: wheels-macos-aarch64}
|
|
107
|
+
- {os: windows-latest, python: "3.13", artifact: wheels-windows-x64}
|
|
108
|
+
steps:
|
|
109
|
+
- uses: actions/checkout@v7
|
|
110
|
+
- uses: actions/setup-python@v7
|
|
111
|
+
with:
|
|
112
|
+
python-version: ${{ matrix.python }}
|
|
113
|
+
- uses: actions/download-artifact@v8
|
|
114
|
+
with:
|
|
115
|
+
name: ${{ matrix.artifact }}
|
|
116
|
+
path: dist
|
|
117
|
+
# Installs from the built wheel only — no Rust toolchain on this runner,
|
|
118
|
+
# so a missing/incompatible wheel fails here instead of at a user's pip.
|
|
119
|
+
- name: Install from wheel
|
|
120
|
+
shell: bash
|
|
121
|
+
run: |
|
|
122
|
+
# Dependencies come from PyPI; kymora itself must come from the
|
|
123
|
+
# freshly built wheel, so install it with --no-index --no-deps.
|
|
124
|
+
python -m pip install --upgrade pip
|
|
125
|
+
python -m pip install "numpy>=1.24"
|
|
126
|
+
python -m pip install --no-index --no-deps --find-links dist kymora
|
|
127
|
+
- name: Import and extract outside the source tree
|
|
128
|
+
shell: bash
|
|
129
|
+
run: |
|
|
130
|
+
cd "$(mktemp -d)"
|
|
131
|
+
python -c "
|
|
132
|
+
import numpy as np, kymora
|
|
133
|
+
X = np.random.default_rng(0).standard_normal((64, 128))
|
|
134
|
+
f = kymora.extract_features(X)
|
|
135
|
+
assert f.shape == (64, len(kymora.feature_names())), f.shape
|
|
136
|
+
assert np.isfinite(f).all()
|
|
137
|
+
print('ok', kymora.__version__, f.shape)
|
|
138
|
+
"
|
|
139
|
+
|
|
140
|
+
publish:
|
|
141
|
+
name: publish to PyPI
|
|
142
|
+
if: github.event_name == 'release' && github.event.action == 'published'
|
|
143
|
+
needs: [linux, macos, windows, sdist, smoke-test]
|
|
144
|
+
runs-on: ubuntu-latest
|
|
145
|
+
environment: pypi
|
|
146
|
+
permissions:
|
|
147
|
+
# Trusted Publishing (OIDC) — no PyPI API token is stored in this repo.
|
|
148
|
+
id-token: write
|
|
149
|
+
steps:
|
|
150
|
+
- uses: actions/download-artifact@v8
|
|
151
|
+
with:
|
|
152
|
+
pattern: wheels-*
|
|
153
|
+
merge-multiple: true
|
|
154
|
+
path: dist
|
|
155
|
+
- run: ls -l dist
|
|
156
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|