python
software/python · 0 open · 10 done
Small, clean, joyful — and now complete: the binding surfaces the full C ABI (evaluator + node registry, geometry arrays, matrix/spectrum getters, world-matrix/visibility, metadata enumeration, encoding detection), and every mutator fails loudly rather than swallowing errors. 24/24 tests green. Shipped in 0.1.1 (macOS universal2 + manylinux x86_64).
Resolved in 0.1.1. Bound the node-graph evaluator: new Evaluator (constructed from a Document + optional NodeRegistry + time, with output_float(slot)) and NodeRegistry classes over kinogaki_evaluator_* / kinogaki_node_registry_*. Added to __all__.
Resolved in 0.1.1. Bound the geometry-array accessors: Handle.set_float_array / set_int_array / set_float2_array and get_float_array / get_int_array / get_float2_array (the cap=0 count-query then sized-fill contract). Variable-length point/index/scalar arrays now round-trip from Python.
Resolved in 0.1.1. Added get_matrix/require_matrix and get_spectrum/require_spectrum (delegating to _get_floatN), so matrix(6) and spectrum(32) are readable, not just settable.
Resolved in 0.1.1. Bound the transform-query surface: Handle.world_matrix(time) (composed 6-float affine, or None) and Handle.is_visible(time) over kinogaki_world_matrix/kinogaki_is_visible.
Resolved in 0.1.1. set / set_meta / connect / disconnect now check the C return and raise PrismError on failure, matching append/rename. One uniform policy — a bad slot path or a set on a missing element fails loudly instead of looking like success.
Resolved in 0.1.1. Bound metadata enumeration (Handle.metadata_keys() / metadata() over metadata_count/metadata_key) and a module-level detect_encoding(data) -> 'text'|'binary'|'package'.
Resolved in 0.1.1. Added error-path and round-trip tests: matrix/spectrum round-trip, geometry-array round-trip, metadata enumeration + overwrite, worldmatrix/visibility, Evaluator output, detectencoding (incl. junk-raises), raising mutators, deserialize-garbage / illegal-name raises, eval of a non-numeric slot is None, rename with connection-endpoint fixup, and __eq__ negative. 24/24 green; the self-runner now supplies tmp_path.
Resolved 2026-06-20. Wheels now build and publish for macOS universal2 (native) and manylinux x86_64 (Docker + auditwheel, static libstdc++), driven by the one-command release.sh which installs each wheel into a clean env and renders a document before upload. pip install kinogaki now works on the Linux box and Apple Silicon/Intel Macs. Windows and Linux aarch64 remain deferred (no CI yet) and fail cleanly with "no matching distribution" rather than a broken install.
Resolved 2026-06-20. The README install section is now backed by real published wheels, with a supported-platform matrix (macOS universal2, manylinux x8664; Windows/aarch64 deferred). The `KINOGAKICORE_LIB` override is documented. Remaining nits are cosmetic.
Verified clean in the audit. The ctypes layer is cordoned at module top behind leading-underscore helpers; the public Element/Connection/Handle/Document API touches C only through them, and byref/c_float never leak into public signatures. Methods read as verbs (the noun accessors elements()/connections() are accepted Python idiom). No file approaches 1000 lines.