Skip to content

Commit 4f23a07

Browse files
committed
Fix failing CI
1 parent 82665a2 commit 4f23a07

11 files changed

Lines changed: 57 additions & 40 deletions

File tree

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ Notes:
224224
Snake-style `Test_<Filename_Stem_TitleCase>`, mirroring the filename. Each underscore-separated segment is TitleCase. Common acronyms stay uppercase when separate segments. **Do not** use CamelCase here; snake-style is the deliberate convention for these long compound names.
225225

226226
-`Test_Cli_Install_Core_In_Uvenv_Correctness`
227-
-`Test_Uv_Pip_Install_Isaaclab_All_Isaacsim_Trains_Cartpole`
227+
-`Test_Uv_Pip_Install_Isaaclab_Isaacsim_Rl_Trains_Cartpole`
228228
-`TestCliInstallCoreInUvenvCorrectness`
229229

230230
#### Method naming (strict)

docs/_extensions/isaaclab_docs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ def run(self) -> list[nodes.Node]:
216216
content = f"""\
217217
.. code-block:: bash
218218
219-
uv pip install "isaaclab[isaacsim,all]" \\
219+
uv pip install "isaaclab[isaacsim,sb3,skrl,rsl-rl]" \\
220220
--overrides "{overrides_url}" \\
221221
--extra-index-url https://pypi.nvidia.com \\
222222
--index-strategy unsafe-best-match --prerelease=allow
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Removed
2+
^^^^^^^
3+
4+
* **Breaking:** Removed the aggregate ``all`` extra. Request the extras you need by name
5+
instead, for example ``uv pip install "isaaclab[isaacsim,sb3,skrl,rsl-rl]"`` in place of
6+
``uv pip install "isaaclab[isaacsim,all]"``, or ``uv run --extra sb3 --extra skrl`` in place
7+
of ``uv run --extra all``. See :ref:`installation-optional-extras` for the full extras table.

source/isaaclab/test/cli/test_uv_run_pyproject.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,14 @@ def test_uv_run_exposes_centralized_feature_extras():
6161
"teleop",
6262
"rlinf",
6363
"tetrahedralization",
64-
"all",
6564
}
6665
assert expected_extras <= set(optional_dependencies)
6766

6867
# The Newton viewer GUI is part of the base install, so there is no ``newton`` extra.
6968
assert "newton" not in optional_dependencies
7069
assert "rtx" not in optional_dependencies
70+
# Each extra is requested by name; there is no aggregate ``all`` extra.
71+
assert "all" not in optional_dependencies
7172

7273
# Concrete third-party deps live in the extras (not subpackage self-references).
7374
# ``ov`` installs both Omniverse backends; ``ovphysx`` / ``ovrtx`` select one.
@@ -82,14 +83,18 @@ def test_uv_run_exposes_centralized_feature_extras():
8283
assert any(dep.startswith("ovstage") for dep in optional_dependencies["ovrtx"])
8384

8485

85-
def test_tetrahedralization_is_explicit_and_excluded_from_all():
86+
def test_tetrahedralization_is_explicit_extra_only():
8687
"""TetWild and its visualization stack are installed only when requested."""
8788
project = _root_pyproject()["project"]
8889
optional = project["optional-dependencies"]
8990

9091
assert not any(dep.startswith("pytetwild") for dep in project["dependencies"])
9192
assert optional["tetrahedralization"] == ["pytetwild[all]>=0.3.0,<0.4"]
92-
assert not any("tetrahedralization" in dep or dep.startswith("pytetwild") for dep in optional["all"])
93+
# No other extra pulls PyTetWild in transitively.
94+
for name, deps in optional.items():
95+
if name == "tetrahedralization":
96+
continue
97+
assert not any("tetrahedralization" in dep or dep.startswith("pytetwild") for dep in deps)
9398

9499

95100
def test_version_single_source_matches_literal_pins():
@@ -190,7 +195,6 @@ def test_uv_run_isaacsim_extra_handles_dependency_conflicts():
190195
conflict_groups = [{entry["extra"] for entry in group} for group in pyproject["tool"]["uv"]["conflicts"]]
191196
for extra in ("ov", "ovphysx"):
192197
assert {"isaacsim", extra} in conflict_groups, f"isaacsim must declare a conflict with '{extra}'"
193-
assert {"isaacsim", "all"} not in conflict_groups
194198
# ``test`` is no longer forked away: the coverage override reconciles it with Isaac Sim.
195199
assert {"isaacsim", "test"} not in conflict_groups
196200
# ``mimic`` is no longer forked away either: robomimic dropped its lxml constraint, so
@@ -217,7 +221,6 @@ def test_uv_run_teleop_co_resolves_with_isaacsim():
217221
# The historical lxml split is gone: robomimic no longer constrains lxml, so the teleop
218222
# and imitation-learning stacks co-resolve.
219223
assert {"teleop", "mimic"} not in conflict_groups
220-
assert {"teleop", "all"} not in conflict_groups
221224

222225

223226
def test_uv_run_teleop_extra_bundles_isaacsim():
@@ -242,7 +245,7 @@ def test_uv_run_teleop_extra_bundles_isaacsim():
242245
# Only the packaging split is real; the overrides reconcile everything else.
243246
for extra in ("ov", "ovphysx"):
244247
assert {"teleop", extra} in conflict_groups, f"teleop must declare a conflict with '{extra}'"
245-
for extra in ("mimic", "all", "viser", "test"):
248+
for extra in ("mimic", "viser", "test"):
246249
assert {"teleop", extra} not in conflict_groups
247250
# ``--extra teleop --extra test`` must keep working so the teleop suite stays runnable.
248251
assert {"teleop", "test"} not in conflict_groups

source/isaaclab/test/cli/test_wheel_builder_metadata.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,9 @@ def test_wheel_builder_rsl_rl_pin_matches_root_pyproject(tmp_path):
9696
assert core_pins == [expected_pin]
9797

9898
optional_dependencies = generated["project"]["optional-dependencies"]
99-
# RSL-RL ships in its own ``rsl-rl`` extra and in the aggregate ``all`` extra.
100-
for extra_name in ("rsl-rl", "all"):
101-
rsl_rl_pins = [dep for dep in optional_dependencies[extra_name] if dep.startswith("rsl-rl-lib==")]
102-
assert rsl_rl_pins == [expected_pin]
99+
# RSL-RL is also exposed through its own ``rsl-rl`` extra.
100+
rsl_rl_pins = [dep for dep in optional_dependencies["rsl-rl"] if dep.startswith("rsl-rl-lib==")]
101+
assert rsl_rl_pins == [expected_pin]
103102

104103

105104
def test_wheel_builder_keeps_tetrahedralization_explicit(tmp_path):
@@ -110,7 +109,10 @@ def test_wheel_builder_keeps_tetrahedralization_explicit(tmp_path):
110109

111110
assert not any(dep.startswith("pytetwild") for dep in project["dependencies"])
112111
assert optional_dependencies["tetrahedralization"] == ["pytetwild[all]>=0.3.0,<0.4"]
113-
assert not any(dep.startswith("pytetwild") for dep in optional_dependencies["all"])
112+
for name, deps in optional_dependencies.items():
113+
if name == "tetrahedralization":
114+
continue
115+
assert not any(dep.startswith("pytetwild") for dep in deps)
114116

115117

116118
def test_wheel_builder_uv_overrides_match_root_pyproject(tmp_path):

source/isaaclab/test/install_ci/misc/test_wheel_builder_smoke.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
Setup:
88
- bash tools/wheel_builder/build.sh
99
- ./isaaclab.sh -u
10-
- uv pip install <wheel>[all]
10+
- uv pip install <wheel>[sb3,skrl,rsl-rl]
1111
Tests:
1212
- import isaaclab -> verify importable
1313
- from isaaclab import __version__ -> verify version matches wheel filename
@@ -19,7 +19,7 @@
1919
- python -m isaaclab --help -> verify CLI functional
2020
- import pinocchio -> verify importable
2121
- python -c "import importlib.util; raise SystemExit(importlib.util.find_spec('pytetwild') is not None)"
22-
-> verify the all extra omits tetrahedralization dependencies
22+
-> verify the RL extras omit tetrahedralization dependencies
2323
"""
2424

2525
from __future__ import annotations
@@ -36,6 +36,7 @@ class Test_Wheel_Builder_Smoke(UV_Mixin):
3636
"""Test building the isaaclab wheel and installing it in a uv environment."""
3737

3838
_wheel: str = ""
39+
_extras: str = "[sb3,skrl,rsl-rl]"
3940

4041
@classmethod
4142
def setup_class(cls):
@@ -67,7 +68,7 @@ def _build_and_install_wheel(self, isaaclab_root):
6768
cls.env_path = self.env_path
6869
cls.python = self.python
6970
cls.cli_script = self.cli_script
70-
result = self.run_in_uv_env(["uv", "pip", "install", cls._wheel + "[all]"])
71+
result = self.run_in_uv_env(["uv", "pip", "install", cls._wheel + cls._extras])
7172
assert result.returncode == 0, f"uv pip install wheel failed:\n{result.stdout}\n{result.stderr}"
7273

7374
yield
@@ -134,13 +135,15 @@ def test_pinocchio_importable(self):
134135
result = self.run_in_uv_env(["python", "-c", "import pinocchio as pin; print(pin.__version__)"])
135136
assert result.returncode == 0, f"import pinocchio failed:\n{result.stdout}\n{result.stderr}"
136137

137-
def test_install_all_omits_tetrahedralization_dependencies(self):
138-
"""Verify the wheel's all extra does not install pytetwild."""
138+
def test_install_rl_extras_omits_tetrahedralization_dependencies(self):
139+
"""Verify the wheel's RL extras do not install pytetwild."""
139140
result = self.run_in_uv_env(
140141
[
141142
"python",
142143
"-c",
143144
"import importlib.util; raise SystemExit(importlib.util.find_spec('pytetwild') is not None)",
144145
]
145146
)
146-
assert result.returncode == 0, f"pytetwild should not be installed by [all]:\n{result.stdout}\n{result.stderr}"
147+
assert result.returncode == 0, (
148+
f"pytetwild should not be installed by {self._extras}:\n{result.stdout}\n{result.stderr}"
149+
)

source/isaaclab/test/install_ci/uv_pip/test_uv_pip_install_isaaclab_all_isaacsim_trains_cartpole.py renamed to source/isaaclab/test/install_ci/uv_pip/test_uv_pip_install_isaaclab_isaacsim_rl_trains_cartpole.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
Setup:
88
- (wheel supplied by runner: tools/run_install_ci.py --build-wheel or --wheel <path>)
99
- ./isaaclab.sh -u
10-
- uv pip install <wheel>[all,isaacsim] --overrides uv_pip/uv-overrides.txt
10+
- uv pip install <wheel>[isaacsim,sb3,skrl,rsl-rl] --overrides uv_pip/uv-overrides.txt
1111
--extra-index-url https://pypi.nvidia.com --index-strategy unsafe-best-match --prerelease=allow
1212
- uv pip install --reinstall-package torch --reinstall-package torchvision
1313
torch==<pinned> torchvision==<pinned> --index-url <cu128|cu130>
@@ -31,8 +31,8 @@
3131

3232

3333
@pytest.mark.install_path_uv_pip
34-
class Test_Uv_Pip_Install_Isaaclab_All_Isaacsim_Trains_Cartpole(UV_Mixin):
35-
"""Build the wheel, ``uv pip install <wheel>[all,isaacsim]``, verify cartpole training."""
34+
class Test_Uv_Pip_Install_Isaaclab_Isaacsim_Rl_Trains_Cartpole(UV_Mixin):
35+
"""Build the wheel, ``uv pip install <wheel>[isaacsim,sb3,skrl,rsl-rl]``, verify cartpole training."""
3636

3737
@classmethod
3838
def setup_class(cls):
@@ -45,15 +45,15 @@ def setup_class(cls):
4545
@pytest.mark.slow
4646
@pytest.mark.gpu
4747
@pytest.mark.timeout(4800)
48-
def test_uv_pip_install_isaaclab_all_isaacsim_trains_cartpole(
48+
def test_uv_pip_install_isaaclab_isaacsim_rl_trains_cartpole(
4949
self, isaaclab_root, wheel, uv_overrides, cartpole_smoke_script
5050
):
51-
"""Install the runner-supplied wheel with ``[all,isaacsim]`` via ``uv pip``, run cartpole training."""
51+
"""Install the runner-supplied wheel with ``[isaacsim,sb3,skrl,rsl-rl]`` via ``uv pip``, then train."""
5252
try:
53-
# 1. Create the uv env and install the wheel with [all,isaacsim] extras.
53+
# 1. Create the uv env and install the wheel with [isaacsim,sb3,skrl,rsl-rl] extras.
5454
self.create_uv_env(isaaclab_root)
5555

56-
# uv pip install "isaaclab[all,isaacsim]" --extra-index-url https://pypi.nvidia.com
56+
# uv pip install "isaaclab[isaacsim,sb3,skrl,rsl-rl]" --extra-index-url https://pypi.nvidia.com
5757
# --index-strategy unsafe-best-match --prerelease=allow
5858
# NOTE: --index-strategy unsafe-best-match re-resolves torch from PyPI (CPU build),
5959
# overriding any pre-installed CUDA torch. So install isaaclab FIRST, then
@@ -63,7 +63,7 @@ def test_uv_pip_install_isaaclab_all_isaacsim_trains_cartpole(
6363
"uv",
6464
"pip",
6565
"install",
66-
f"{wheel}[all,isaacsim]",
66+
f"{wheel}[isaacsim,sb3,skrl,rsl-rl]",
6767
"--overrides",
6868
str(uv_overrides),
6969
"--extra-index-url",
@@ -76,7 +76,7 @@ def test_uv_pip_install_isaaclab_all_isaacsim_trains_cartpole(
7676
timeout=1800,
7777
)
7878
assert result.returncode == 0, (
79-
f"uv pip install {wheel}[all,isaacsim] failed:\n{result.stdout}\n{result.stderr}"
79+
f"uv pip install {wheel}[isaacsim,sb3,skrl,rsl-rl] failed:\n{result.stdout}\n{result.stderr}"
8080
)
8181

8282
# 2. uv pip install --reinstall-package torch --reinstall-package torchvision

source/isaaclab/test/install_ci/uv_pip/test_uv_pip_install_isaaclab_rl_tasks_imports_rl_tasks.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
Setup:
88
- (wheel supplied by runner: tools/run_install_ci.py --build-wheel or --wheel <path>)
99
- ./isaaclab.sh -u
10-
- uv pip install <wheel>[all]
10+
- uv pip install <wheel>[sb3,skrl,rsl-rl]
1111
Tests:
1212
- python -c "import isaaclab_rl" -> verify isaaclab_rl importable
1313
- python -c "import isaaclab_tasks" -> verify isaaclab_tasks importable
@@ -24,9 +24,10 @@
2424

2525
@pytest.mark.install_path_uv_pip
2626
class Test_Uv_Pip_Install_Isaaclab_Rl_Tasks_Imports_Rl_Tasks(UV_Mixin):
27-
"""``uv pip install <wheel>[all]``: verify RL imports without Isaac Sim."""
27+
"""``uv pip install <wheel>[sb3,skrl,rsl-rl]``: verify RL imports without Isaac Sim."""
2828

2929
_wheel: str = ""
30+
_extras: str = "[sb3,skrl,rsl-rl]"
3031

3132
@classmethod
3233
def setup_class(cls):
@@ -38,18 +39,19 @@ def _install_wheel(self, isaaclab_root, wheel):
3839
cls = self.__class__
3940
cls._wheel = str(wheel)
4041

41-
# Create the uv env and install with the [all] extra (no isaacsim, no NVIDIA flags).
42+
# Create the uv env and install the RL extras (no isaacsim, no NVIDIA flags).
4243
self.create_uv_env(isaaclab_root)
4344
cls.env_path = self.env_path
4445
cls.python = self.python
4546
cls.cli_script = self.cli_script
4647

48+
target = f"{cls._wheel}{cls._extras}"
4749
result = self.run_in_uv_env(
48-
["uv", "pip", "install", f"{cls._wheel}[all]"],
50+
["uv", "pip", "install", target],
4951
cwd=isaaclab_root,
5052
timeout=1200,
5153
)
52-
assert result.returncode == 0, f"uv pip install {cls._wheel}[all] failed:\n{result.stdout}\n{result.stderr}"
54+
assert result.returncode == 0, f"uv pip install {target} failed:\n{result.stdout}\n{result.stderr}"
5355

5456
yield
5557

@@ -60,7 +62,7 @@ def _install_wheel(self, isaaclab_root, wheel):
6062
@pytest.mark.slow
6163
@pytest.mark.timeout(1200)
6264
def test_install_rl_tasks_makes_isaaclab_rl_importable(self):
63-
"""``import isaaclab_rl`` succeeds after ``uv pip install <wheel>[all]``."""
65+
"""``import isaaclab_rl`` succeeds after ``uv pip install <wheel>[sb3,skrl,rsl-rl]``."""
6466
result = self.run_in_uv_env(["python", "-c", "import isaaclab_rl"])
6567
assert result.returncode == 0, f"import isaaclab_rl failed:\n{result.stdout}\n{result.stderr}"
6668

@@ -69,7 +71,7 @@ def test_install_rl_tasks_makes_isaaclab_rl_importable(self):
6971
@pytest.mark.slow
7072
@pytest.mark.timeout(1200)
7173
def test_install_rl_tasks_makes_isaaclab_tasks_importable(self):
72-
"""``import isaaclab_tasks`` succeeds after ``uv pip install <wheel>[all]``."""
74+
"""``import isaaclab_tasks`` succeeds after ``uv pip install <wheel>[sb3,skrl,rsl-rl]``."""
7375
result = self.run_in_uv_env(["python", "-c", "import isaaclab_tasks"])
7476
assert result.returncode == 0, f"import isaaclab_tasks failed:\n{result.stdout}\n{result.stderr}"
7577

@@ -78,6 +80,6 @@ def test_install_rl_tasks_makes_isaaclab_tasks_importable(self):
7880
@pytest.mark.slow
7981
@pytest.mark.timeout(1200)
8082
def test_install_rl_tasks_omits_isaacsim(self):
81-
"""``import isaacsim`` fails after ``uv pip install <wheel>[all]`` (extra not requested)."""
83+
"""``import isaacsim`` fails after installing the RL extras (isaacsim extra not requested)."""
8284
result = self.run_in_uv_env(["python", "-c", "import isaacsim"])
83-
assert result.returncode != 0, "isaacsim should not be installed by [all] extra"
85+
assert result.returncode != 0, f"isaacsim should not be installed by the {self._extras} extras"

source/isaaclab_newton/isaaclab_newton/renderers/newton_warp_renderer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
_PPISP_IMPORT_ERROR_MESSAGE = (
3636
"isaaclab_ppisp is required when CameraCfg.isp_cfg is set. "
37-
"Install Isaac Lab with the 'all' extra (`pip install isaaclab[all]`) or install the "
37+
"It ships with the Isaac Lab wheel (`pip install isaaclab`); otherwise install the "
3838
"isaaclab-ppisp extension from the Isaac Lab source checkout."
3939
)
4040

source/isaaclab_ov/isaaclab_ov/renderers/ovrtx_renderer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@
116116

117117
_PPISP_IMPORT_ERROR_MESSAGE = (
118118
"isaaclab_ppisp is required when CameraCfg.isp_cfg is set. "
119-
"Install Isaac Lab with the 'all' extra (`pip install isaaclab[all]`) or install the "
119+
"It ships with the Isaac Lab wheel (`pip install isaaclab`); otherwise install the "
120120
"isaaclab-ppisp extension from the Isaac Lab source checkout."
121121
)
122122
_READ_GPU_TRANSFORMS_ENV = "ISAAC_LAB_OVRTX_READ_GPU_TRANSFORMS"

0 commit comments

Comments
 (0)