22import tempfile
33from pathlib import Path
44
5+ from catkin_pkg .package import Dependency
6+
57import pytest
68from pixi_build_backend .types .intermediate_recipe import Script
79
1012from pixi_build_ros .utils import (
1113 convert_package_xml_to_catkin_package ,
1214 package_xml_to_conda_requirements ,
13- rosdep_to_conda_package_name ,
15+ rosdep_to_conda_package_spec ,
1416 PackageMapEntry ,
1517)
1618from pixi_build_backend .types .platform import Platform
@@ -197,7 +199,7 @@ def test_robostack_target_platform_linux(package_map: dict[str, PackageMapEntry]
197199 linux_platform = Platform ("linux-64" )
198200
199201 # Test packages with platform-specific mappings
200- acl_packages = rosdep_to_conda_package_name ( "acl" , distro , linux_platform , package_map )
202+ acl_packages = rosdep_to_conda_package_spec ( Dependency ( name = "acl" ) , distro , linux_platform , package_map )
201203 assert acl_packages == ["libacl" ], f"Expected ['libacl'] for acl on Linux, got { acl_packages } "
202204
203205
@@ -207,7 +209,7 @@ def test_robostack_target_platform_osx(package_map: dict[str, PackageMapEntry],
207209 osx_platform = Platform ("osx-64" )
208210
209211 # Test packages with platform-specific mappings
210- acl_packages = rosdep_to_conda_package_name ( "acl" , distro , osx_platform , package_map )
212+ acl_packages = rosdep_to_conda_package_spec ( Dependency ( name = "acl" ) , distro , osx_platform , package_map )
211213 assert acl_packages == [], f"Expected [] for acl on macOS, got { acl_packages } "
212214
213215
@@ -217,7 +219,7 @@ def test_robostack_target_platform_windows(package_map: dict[str, PackageMapEntr
217219 win_platform = Platform ("win-64" )
218220
219221 # Test packages with platform-specific mappings
220- binutils_packages = rosdep_to_conda_package_name ( "binutils" , distro , win_platform , package_map )
222+ binutils_packages = rosdep_to_conda_package_spec ( Dependency ( name = "binutils" ) , distro , win_platform , package_map )
221223 assert binutils_packages == [], f"Expected [] for binutils on Windows, got { binutils_packages } "
222224
223225
@@ -228,9 +230,9 @@ def test_robostack_target_platform_cross_platform(package_map: dict[str, Package
228230 win_platform = Platform ("win-64" )
229231
230232 # libudev-dev has different packages for each platform
231- linux_udev = rosdep_to_conda_package_name ( "libudev-dev" , distro , linux_platform , package_map )
232- osx_udev = rosdep_to_conda_package_name ( "libudev-dev" , distro , osx_platform , package_map )
233- win_udev = rosdep_to_conda_package_name ( "libudev-dev" , distro , win_platform , package_map )
233+ linux_udev = rosdep_to_conda_package_spec ( Dependency ( name = "libudev-dev" ) , distro , linux_platform , package_map )
234+ osx_udev = rosdep_to_conda_package_spec ( Dependency ( name = "libudev-dev" ) , distro , osx_platform , package_map )
235+ win_udev = rosdep_to_conda_package_spec ( Dependency ( name = "libudev-dev" ) , distro , win_platform , package_map )
234236
235237 assert linux_udev == [
236238 "libusb" ,
@@ -240,9 +242,9 @@ def test_robostack_target_platform_cross_platform(package_map: dict[str, Package
240242 assert win_udev == ["libusb" ], f"Expected ['libusb'] for libudev-dev on Windows, got { win_udev } "
241243
242244 # libomp-dev has different OpenMP implementations per platform
243- linux_omp = rosdep_to_conda_package_name ( "libomp-dev" , distro , linux_platform , package_map )
244- osx_omp = rosdep_to_conda_package_name ( "libomp-dev" , distro , osx_platform , package_map )
245- win_omp = rosdep_to_conda_package_name ( "libomp-dev" , distro , win_platform , package_map )
245+ linux_omp = rosdep_to_conda_package_spec ( Dependency ( name = "libomp-dev" ) , distro , linux_platform , package_map )
246+ osx_omp = rosdep_to_conda_package_spec ( Dependency ( name = "libomp-dev" ) , distro , osx_platform , package_map )
247+ win_omp = rosdep_to_conda_package_spec ( Dependency ( name = "libomp-dev" ) , distro , win_platform , package_map )
246248
247249 assert linux_omp == ["libgomp" ], f"Expected ['libgomp'] for libomp-dev on Linux, got { linux_omp } "
248250 assert osx_omp == ["llvm-openmp" ], f"Expected ['llvm-openmp'] for libomp-dev on macOS, got { osx_omp } "
@@ -256,9 +258,9 @@ def test_robostack_require_opengl_handling(package_map: dict[str, PackageMapEntr
256258 win_platform = Platform ("win-64" )
257259
258260 # opengl package has REQUIRE_OPENGL handling
259- linux_opengl = rosdep_to_conda_package_name ( "opengl" , distro , linux_platform , package_map )
260- osx_opengl = rosdep_to_conda_package_name ( "opengl" , distro , osx_platform , package_map )
261- win_opengl = rosdep_to_conda_package_name ( "opengl" , distro , win_platform , package_map )
261+ linux_opengl = rosdep_to_conda_package_spec ( Dependency ( name = "opengl" ) , distro , linux_platform , package_map )
262+ osx_opengl = rosdep_to_conda_package_spec ( Dependency ( name = "opengl" ) , distro , osx_platform , package_map )
263+ win_opengl = rosdep_to_conda_package_spec ( Dependency ( name = "opengl" ) , distro , win_platform , package_map )
262264
263265 # According to the code, REQUIRE_OPENGL should be replaced with actual packages on Linux
264266 # and should add xorg packages for linux/osx/unix platforms
@@ -279,12 +281,66 @@ def test_robostack_require_opengl_handling(package_map: dict[str, PackageMapEntr
279281def test_spec_with_entry_in_map (package_map : dict [str , PackageMapEntry ], distro : Distro ):
280282 """Test using a specifier string with a package which has already defined one in the package map"""
281283 with pytest .raises (ValueError ) as excinfo :
282- rosdep_to_conda_package_name ("xtensor" , distro , Platform .current (), package_map , spec_str = "==2.0" )
284+ rosdep_to_conda_package_spec (
285+ Dependency (name = "xtensor" , version_eq = "2.0" ), distro , Platform .current (), package_map
286+ )
283287 assert "Version specifier can only be used for a package without constraint already present" in str (excinfo )
284288
285289
286290def test_spec_with_multiple_entries_in_map (package_map : dict [str , PackageMapEntry ], distro : Distro ):
287291 """Test using a specifier string with a package which has multiple packages defined one in the package map"""
288292 with pytest .raises (ValueError ) as excinfo :
289- rosdep_to_conda_package_name ("boost" , distro , Platform .current (), package_map , spec_str = "==2.0" )
293+ rosdep_to_conda_package_spec (
294+ Dependency (name = "boost" , version_eq = "2.0" ), distro , Platform .current (), package_map
295+ )
290296 assert "Version specifier can only be used for one package" in str (excinfo )
297+
298+
299+ def test_rosdep_to_conda_package_spec_doesnt_add_matchspec_for_special_rosdeps ():
300+ distro = Distro ("jazzy" )
301+ host_platform = Platform ("linux-64" )
302+ dep = Dependency (name = "ament_cmake" , version_eq = "1.2.3" )
303+
304+ packages = rosdep_to_conda_package_spec (dep , distro , host_platform , {})
305+
306+ assert packages == ["ros-jazzy-ament-cmake==1.2.3" ]
307+
308+
309+ def test_rosdep_to_conda_package_spec_adds_matchspec_for_distro_packages ():
310+ distro = Distro ("jazzy" )
311+ host_platform = Platform ("linux-64" )
312+ dep = Dependency (name = "rclcpp" , version_gte = "18.0.0" , version_lt = "20.0.0" )
313+
314+ packages = rosdep_to_conda_package_spec (dep , distro , host_platform , {})
315+
316+ assert packages == ["ros-jazzy-rclcpp >=18.0.0,<20.0.0" ]
317+
318+
319+ def test_rosdep_to_conda_package_spec_adds_matchspec_for_ros_package_map_entries ():
320+ distro = Distro ("jazzy" )
321+ host_platform = Platform ("linux-64" )
322+ package_map : dict [str , PackageMapEntry ] = {"custom_ros_dep" : {"ros" : ["foo_util" ]}}
323+ dep = Dependency (name = "custom_ros_dep" , version_gte = "3.1" )
324+
325+ packages = rosdep_to_conda_package_spec (dep , distro , host_platform , package_map )
326+
327+ assert packages == ["ros-jazzy-foo-util >=3.1" ]
328+
329+
330+ def test_rosdep_to_conda_package_spec_adds_matchspec_for_unknown_dependencies ():
331+ distro = Distro ("jazzy" )
332+ host_platform = Platform ("linux-64" )
333+ dep = Dependency (name = "customlib" , version_gt = "1.0.0" )
334+
335+ packages = rosdep_to_conda_package_spec (dep , distro , host_platform , {})
336+
337+ assert packages == ["ros-jazzy-customlib >1.0.0" ]
338+
339+
340+ def test_rosdep_to_conda_package_spec_exception ():
341+ distro = Distro ("jazzy" )
342+ host_platform = Platform ("linux-64" )
343+ dep = Dependency (name = "rclcpp" , version_gt = "18.0.0" , version_gte = "20.0.0" )
344+
345+ with pytest .raises (ValueError , match = ".* `>` and `>=`" ):
346+ rosdep_to_conda_package_spec (dep , distro , host_platform , {})
0 commit comments