mirror of
https://github.com/ruvnet/RuView
synced 2026-06-24 12:43:18 +00:00
de0712d435
scripts/c6-presence-watcher.py and friends carry a Python port of
`wifi_densepose_bfld::PrivacyClass`. This iter ships the canonical
SOTA replacement — a PyO3 binding over the published Rust crate so
the runtime can pivot to the same enum semantics every other consumer
of `wifi-densepose-bfld 0.3.0` already uses.
New file: `python/src/bindings/privacy_gate.rs` (~155 LOC)
- `#[pyclass] PrivacyClass {Raw, Derived, Anonymous, Restricted}`
- `.allows_network`, `.allows_matter`, `.allows_hap`, `.as_u8` getters
- `PrivacyClass.from_u8(v)` / `PrivacyClass.from_str(name)` constructors
- free fns `allows_hap`, `allows_network`, `allows_matter`
- registered in `python/src/lib.rs` via `bindings::privacy_gate::register`
Cargo.toml gains `wifi-densepose-bfld = { version = "0.3.0", path = ... }`
as a hard dep; numpy + pyo3 + the existing core/vitals deps unchanged.
ADR-125 §2.1.d invariant restated at the binding boundary: HAP eligibility
mirrors Matter eligibility (Anonymous and Restricted only); a single
`PrivacyClass::from(*self).allows_matter()` call is the gate truth-source.
Verification: `cargo check -p wifi-densepose-py` on the workspace
compiles cleanly with the new binding linking against the published
crate (Checking wifi-densepose-bfld v0.3.0 ✓, Checking
wifi-densepose-py v2.0.0-alpha.1 ✓).
Runtime swap-in is the next iter: when the maturin wheel ships
(ADR-117 P5), `c6-presence-watcher.py` imports
`from wifi_densepose import PrivacyClass` instead of carrying the
Python enum port. Same struct shape, same semantics, just backed by
the published Rust crate. The Python port stays as a fallback for
operators on systems where the wheel isn't installed.
Refs ADR-118 §2.1, ADR-125 §2.1.d, ADR-117 §5.7 (binding strategy).
Co-Authored-By: claude-flow <ruv@ruv.net>
56 lines
2.7 KiB
TOML
56 lines
2.7 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" }
|
||
|
||
# ADR-118 BFLD core — PrivacyClass enum + identity_risk scoring +
|
||
# privacy gate. Exposed to Python via bindings/privacy_gate.rs so the
|
||
# c6-presence-watcher.py runtime (currently using a Python port of the
|
||
# same semantics) can switch to the canonical Rust implementation when
|
||
# the wheel ships. ADR-125 §2.1.d invariant enforcement lives here.
|
||
wifi-densepose-bfld = { version = "0.3.0", path = "../v2/crates/wifi-densepose-bfld" }
|
||
|
||
# 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.
|