Install ovphysx wheel by default in --install#5780
Conversation
The ovphysx wheel is now publicly available on PyPI, so promote it from
the opt-in `ov[ovphysx]` extra into the default `./isaaclab.sh --install`
flow, mirroring how the newton wheel is treated. The OVRTX renderer
wheel stays opt-in via `--install 'ov[ovrtx]'` or `--install 'ov[all]'`.
Concretely, drop `ov` from MANUAL_EXTRA_FEATURES and make an empty `ov`
selector install just the ovphysx extra (full `ov[all]` and `ov[ovrtx]`
behavior is unchanged). With the wheel guaranteed in every standard
install, also remove the `pytest.importorskip("ovphysx.types")` guards
from the isaaclab_ovphysx test suite -- a missing wheel should now be a
hard failure, not a silent skip.
There was a problem hiding this comment.
Code Review Summary
This is a well-structured PR that promotes the ovphysx wheel from opt-in to default installation, aligning with how the Newton wheel is already treated. The implementation is clean and the test updates are thorough.
✅ Strengths
-
Consistent design pattern: Following the existing Newton wheel approach makes the codebase more predictable and the install experience more uniform.
-
Improved test reliability: Removing the
importorskipguards means missing theovphysxwheel in CI will now fail loudly rather than silently skipping tests — this catches real regressions rather than masking them. -
Good documentation: Both changelog fragments clearly explain the change, and the help text in
__init__.pyis updated to reflect the new behavior. -
Comprehensive test updates: All 8 test files were updated to remove the skip guards, and
test_install_command_parsing.pyincludes a new test (test_all_installs_ov_with_default_ovphysx_selector) to verify the auto-install path.
💭 Minor Observations
-
No version pin on ovphysx (noted by author): The PR description mentions
setup.pyhas"ovphysx": ["ovphysx"]with no version constraint. This is fine for now, but consider adding a minimum version pin once a stable release is identified to prevent potential compatibility issues. -
CI job monitoring (noted by author): Since
isaaclab_ovwill now actually exercise the ovphysx tests, worth watching the first few CI runs to catch any previously-hidden issues. This is already acknowledged in the test plan.
🔍 Implementation Notes
The logic change in _install_ov_extra_dependencies() is clean:
- Empty selector → defaults to
{"ovphysx"} - Non-empty selector → validates and processes as before
- OVRTX remains opt-in via explicit
ov[ovrtx]orov[all]
The behavior for explicit selectors (ov[ovrtx], ov[all], ov[ovphysx]) is unchanged, which minimizes risk for users who already use those.
Overall this is a straightforward, well-tested change that improves the default user experience while maintaining backward compatibility for explicit install commands.
Greptile SummaryThis PR promotes the
Confidence Score: 4/5Safe to merge; install logic, dispatch tests, and guard removal are all internally consistent. The only thing worth a follow-up is a redundant module-level import left in one helper test file. The install-CLI changes are correct and well-covered by the updated test suite. The guard-removal sweep across the seven test files is clean — import pytest is dropped only in files that had no remaining pytest.* API calls, and pytest fixtures like monkeypatch/caplog are injected by the framework without a direct import. The one minor leftover is a duplicated MockOvPhysxBindingSet import inside test_mock_binding_set_rigid_object_shapes in test_articulation_helpers.py, which was pre-existing but is more visible now that the module-level import sits right above it. No functional defects found. source/isaaclab_ovphysx/test/assets/test_articulation_helpers.py — has a redundant inner import of MockOvPhysxBindingSet that mirrors the module-level import added by this PR. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A["./isaaclab.sh --install [token]"] --> B{token?}
B -- "all / empty" --> C[Auto-install VALID_EXTRA_FEATURES minus MANUAL_EXTRA_FEATURES]
C --> D["newton, rl, visualizer, ov (empty selector)"]
D --> E["_install_ov_extra_dependencies('')"]
E --> F["selectors = {'ovphysx'}"]
F --> G["pip install isaaclab_ovphysx[ovphysx]"]
B -- "ov" --> E
B -- "ov[ovrtx]" --> H["_install_ov_extra_dependencies('ovrtx')"]
H --> I["selectors = {'ovrtx'}"]
I --> J["pip install isaaclab_ov[ovrtx]"]
B -- "ov[all]" --> K["_install_ov_extra_dependencies('all')"]
K --> L["selectors expanded to {'ovrtx','ovphysx'}"]
L --> G
L --> J
B -- "none" --> O["Core submodules only — no extras"]
B -- "contrib" --> P["MANUAL: requires explicit flag, never auto-installed"]
|
kellyguo11
left a comment
There was a problem hiding this comment.
is making ovphysx installable by default mostly for the CI tests? I feel like it could be kept as an optional dependency from user perspective, but we can force an install of it for our CI jobs?
Pure refactor; behavior unchanged. Enables the follow-up commit to invoke the helper twice per file for the device_split marker without duplicating the ~200-line retry/timeout/parse pipeline.
Resolves the ovphysx<=0.3.7 gap G5 device lock for any CI test file that opts in via 'pytestmark = pytest.mark.device_split'. Each pass gets its own subprocess, its own JUnit XML, and the merged counts are written under the original file key so the summary table is unchanged.
Avoids the ovphysx<=0.3.7 gap G5 device-lock failure surfaced by PR 5780 in the isaaclab_ov CI job. The conftest device_split runner splits this file into separate CPU and GPU subprocesses.
Avoids the ovphysx<=0.3.7 gap G5 device-lock failure on the test_no_contact_reporting case that runs after GPU-parametrized cases in the isaaclab_ov CI job.
Yes it's mostly for CI tests. Sure we could leave that optional and handle it similarly to OvRTX in the CI. |
Two tiny cleanups on the device_split CI machinery added in this PR: * Remove _PassContext.is_cold_cache_test — set by the caller but never read by _run_one_pass; the cold-cache buffer is applied to timeout and startup_deadline before the dataclass is built, so the field was purely informational. * Add a presence check before appending to failed_tests so a device_split file failing on both CPU and GPU passes only appears once in the 'failed tests:' debug print (exit code is unaffected; it derives from test_status keys).
Description
Promote the publicly available
ovphysxPyPI wheel out of the manualov[ovphysx]extra and into the default./isaaclab.sh --installflow, mirroring how the newton wheel is treated. The OVRTX renderer wheel stays opt-in via--install 'ov[ovrtx]'or--install 'ov[all]'.Concretely:
MANUAL_EXTRA_FEATURESdrops"ov"(it now only contains"contrib"), so theovfeature is part of the automatic-i/-i allset alongsidenewton,rl, andvisualizer._install_ov_extra_dependencies("")no longer prints a help message and returns; it now installsisaaclab_ovphysx[ovphysx]. Explicitov[ovrtx],ov[ovphysx], andov[all]behavior is unchanged.--installhelp text and thecommand_installdocstring are updated to reflect the new default.pytest.importorskip("ovphysx.types", reason="ovphysx wheel not installed")guards (9 sites) and one innerimportorskip("isaaclab_ovphysx.tensor_types")call are removed from theisaaclab_ovphysxtest suite. Theisaaclab_ovCI job (whosefilter-pattern: "isaaclab_ov"already collects these tests) now exercises them for real instead of silently skipping.No new required dependency is added;
source/isaaclab_ovphysx/setup.pyalready declaredEXTRAS_REQUIRE = {"ovphysx": ["ovphysx"]}. The extra remains unpinned for now — pinning a minimum version is a sensible follow-up once we lock in a release.Fixes # (n/a)
Type of change
Strictly, the default install footprint grows by one PyPI wheel and previously-skipped tests now run, so downstream consumers of
--installsee new behavior — but no public API is removed or renamed and all existingov[...]selectors continue to work as before.Screenshots
N/A — install-CLI and test-gating change.
Checklist
pre-commitchecks with./isaaclab.sh --format--helptext andcommand_installdocstring updated)test_all_installs_ov_with_default_ovphysx_selectorplus updates totest_manual_extra_featuresandtest_all_does_not_install_manual_extra_dependencies; 51/51 pass intest_install_command_parsing.py)source/<pkg>/changelog.d/for every touched package —source/isaaclab/changelog.d/antoiner-ovphysx-default-install.rstandsource/isaaclab_ovphysx/changelog.d/antoiner-ovphysx-default-install.rstCONTRIBUTORS.mdor my name already exists there