mirror of
https://github.com/ruvnet/RuView
synced 2026-06-18 11:43:19 +00:00
2d29359809
P3 — Vital sign extraction bindings (wifi-densepose-vitals): - VitalStatus enum (eq, eq_int, hash, frozen) — Valid/Degraded/Unreliable/Unavailable - VitalEstimate (frozen) — value_bpm + confidence + status - VitalReading (frozen) — HR + BR + signal quality composite - BreathingExtractor — 0.1–0.5 Hz bandpass + zero-crossing - HeartRateExtractor — 0.8–2.0 Hz bandpass + autocorrelation - py.allow_threads on extract() hot loops (Q5 audit confirmed core/vitals/signal are pure-sync — zero tokio deps, safe to release GIL with no embedded runtime needed) - 17 tests covering construction, getters, frozen immutability, esp32_default + explicit ctors, synthetic-signal end-to-end P3.5 — BFLD bindings (forward-compat surface, stub Rust): - BfldKind enum — CompressedHE20/40/80/160 + UncompressedHT20/40 with n_subcarriers, bandwidth_mhz, is_he metadata getters - BfldFrame (frozen) — from_compressed_feedback() accepts numpy Complex64 ndarray [Nr x Nc x Nsc], validates dims against kind, feedback_matrix() returns lossless roundtrip ndarray - BfldReport — aggregates frames, rejects mismatched kinds, computes inverse-CV coherence score - 19 tests covering all 6 PHY variants + numpy roundtrip + dim-mismatch error + aggregation - Real Rust ingestion (wifi-densepose-bfld crate) lands post-v2.0 per ADR-117 §11.11/12 — Python API will not change Total Python test count: 93 (was 57, +36 P3+P3.5). All passing. Refs: docs/adr/ADR-117-pip-wifi-densepose-modernization.md Refs: #785 Co-Authored-By: claude-flow <ruv@ruv.net>
49 lines
2.2 KiB
TOML
49 lines
2.2 KiB
TOML
[package]
|
||
name = "wifi-densepose-py"
|
||
version = "2.0.0-alpha.1"
|
||
# The `python/` crate is intentionally OUTSIDE the `v2/` Cargo
|
||
# workspace (ADR-117 §5.2) so maturin's `python-source` + `module-name`
|
||
# config stays self-contained and `cargo test --workspace` in v2/
|
||
# doesn't have to compile pyo3. Hence no `*.workspace = true`
|
||
# inheritance here — every field is local.
|
||
edition = "2021"
|
||
license = "MIT"
|
||
authors = ["rUv <ruv@ruv.net>", "WiFi-DensePose Contributors"]
|
||
description = "PyO3 bindings for the WiFi-DensePose Rust core — ships as the `wifi-densepose` PyPI wheel (ADR-117)"
|
||
repository = "https://github.com/ruvnet/RuView"
|
||
|
||
# ADR-117 §5.2: the Python wheel's compiled module name is
|
||
# `wifi_densepose._native` (the leading underscore marks it as an internal
|
||
# implementation detail re-exported by the pure-Python facade in
|
||
# `wifi_densepose/__init__.py`). Keeping the name distinct from the crate
|
||
# avoids the maturin gotcha where `wifi_densepose-py` would collide with
|
||
# the user-facing `wifi_densepose` package on import.
|
||
[lib]
|
||
name = "wifi_densepose_native"
|
||
crate-type = ["cdylib", "rlib"]
|
||
path = "src/lib.rs"
|
||
|
||
[dependencies]
|
||
# PyO3 with abi3-py310 — one compiled binary covers Python 3.10, 3.11,
|
||
# 3.12, 3.13, and any future 3.x that keeps the stable ABI (ADR-117 §5.4).
|
||
# Without abi3 we'd need a separate wheel per Python minor version × OS
|
||
# × arch, blowing up the cibuildwheel matrix.
|
||
pyo3 = { version = "0.22", features = ["extension-module", "abi3-py310"] }
|
||
|
||
# Re-export the Rust core types through PyO3 #[pyclass] wrappers in P2.
|
||
# Default-features-off keeps the wheel size below the 5 MB ADR-117 §5.4
|
||
# budget by avoiding optional BLAS/openssl chains.
|
||
wifi-densepose-core = { version = "0.3.0", path = "../v2/crates/wifi-densepose-core" }
|
||
|
||
# P3 — vitals extraction (HR/BR via the 4-stage pipeline). Pure-sync;
|
||
# no tokio (Q5 audited 2026-05-24); safe to wrap in py.allow_threads.
|
||
wifi-densepose-vitals = { version = "0.3.0", path = "../v2/crates/wifi-densepose-vitals" }
|
||
|
||
# numpy bridge — needed for P3.5 BfldFrame (Complex64 ndarray) and for
|
||
# the future P3 CsiFrame numpy round-trip.
|
||
numpy = "0.22"
|
||
|
||
[dev-dependencies]
|
||
# Doc-test infrastructure for the Python-facing examples in the bound
|
||
# Rust functions. Lands properly in P2 once #[pyfunction]s exist to test.
|