test-python-binding
por nvidia
Build and test the NeMo Relay Python binding and worker plugin SDK; use for python/nemo_relay, python/plugin, or crates/python changes
npx skills add https://github.com/nvidia/nemo-relay --skill test-python-bindingBuild And Test Python Binding
Companion Guidance
Use karpathy-guidelines alongside this skill for implementation or review
work. Keep changes scoped, surface assumptions, and define focused validation
before editing.
Use this skill when the change is primarily in python/nemo_relay,
python/plugin, python/tests, crates/python, or Python-facing
docs/examples.
Default Path
- Format changed Python wrapper and test files with
uv run ruff format python python/plugin. - Run focused
pytestfirst when you know the affected area. - Run
just test-python-pluginwhen the Python worker SDK changed. - Run the full Python suite with
just test-pythonbefore review. - If any Rust files changed as part of the Python work, also run
cargo fmt --all,just test-rust, andcargo clippy --workspace --all-targets -- -D warnings. - Use
just build-pythonwhen you want an explicit build-only pass. - Use
just build-python-pluginwhen the Python worker SDK changed. - If the native Rust bridge changed, add the Rust crate tests for
nemo-relay-python.
Python Test Style
- Pytest is used to run tests.
- Do not add
@pytest.mark.asyncioto any test. Async tests are automatically detected and run by the async runner; the decorator is unnecessary clutter. - Do not add a
-> Nonereturn type annotation to test functions. This is not a common convention in pytest and adds unnecessary verbosity. - When mocking a class, do not define a new class. Use
unittest.mock.MagicMockorunittest.mock.AsyncMock, with thespecconstructor argument when necessary. - The name of the mocked class should be prefixed with
mock, notfake. - Prefer pytest fixtures over helper methods.
- Do not repeat fixtures, if a fixture is needed in multiple test files, place it in a
conftest.pyfile. - When creating a fixture follow this pattern:
Only specify the scope argument when the value is something other than "function".@pytest.fixture(name="<fixture_name>"[, scope="<scope>"]) def <fixture_name>_fixture() -> <return_type>: ... - Prefer
pytest.mark.parametrizeover creating individual tests for different input types.
Common Commands
# Focused test loop
uv run pytest -k "<pattern>"
# Focused Python worker plugin SDK suite
just test-python-plugin
# Format Python files
uv run ruff format python python/plugin
# Full Python suite
just test-python
# Required when the Python change also touched Rust code
cargo fmt --all
just test-rust
cargo clippy --workspace --all-targets -- -D warnings
# Rebuild the editable package plus native extension
just build-python
# Rebuild/install the Python worker plugin SDK
just build-python-plugin
# Native extension crate when crates/python changed
cargo test -p nemo-relay-python
When To Escalate
- If
crates/core,crates/adaptive, or shared runtime semantics changed, also usevalidate-change. - If
python/pluginor worker protocol behavior changed, also usemaintain-dynamic-plugins. - If the change is actually about docs only, prefer
contribute-docsplus targeted command checks.
References
pyproject.tomlcrates/python/Cargo.tomlcrates/python/README.mdpython/nemo_relay/README.mdpython/plugin/pyproject.tomlpython/plugin/src/nemo_relay_pluginpython/tests/plugindocs/getting-started/quick-start/python.mdxdocs/contribute/testing-and-docs.mdxvalidate-change