From aca27dd2dcc68e6bf5056454491383bdb5032464 Mon Sep 17 00:00:00 2001 From: Emerson Knapp Date: Thu, 23 Oct 2025 16:14:43 +0700 Subject: [PATCH 1/2] Make the directory-finding substitutions into a PathSubstitution for / operator Signed-off-by: Emerson Knapp --- launch/launch/substitutions/launch_log_dir.py | 7 +++---- launch/launch/substitutions/this_launch_file_dir.py | 6 +++--- launch/test/launch/substitutions/test_launch_log_dir.py | 8 ++++++++ .../launch/substitutions/test_this_launch_file_dir.py | 9 +++++++++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/launch/launch/substitutions/launch_log_dir.py b/launch/launch/substitutions/launch_log_dir.py index 0b9a2eecf..54b221c6e 100644 --- a/launch/launch/substitutions/launch_log_dir.py +++ b/launch/launch/substitutions/launch_log_dir.py @@ -21,22 +21,21 @@ from typing import Tuple from typing import Type - +from .path_join_substitution import PathSubstitution from ..frontend.expose import expose_substitution from ..launch_context import LaunchContext from ..logging import launch_config as launch_logging_config from ..some_substitutions_type import SomeSubstitutionsType -from ..substitution import Substitution @expose_substitution('launch_log_dir') @expose_substitution('log_dir') -class LaunchLogDir(Substitution): +class LaunchLogDir(PathSubstitution): """Substitution that returns the absolute path to the current launch log directory.""" def __init__(self) -> None: """Create a LaunchLogDir substitution.""" - super().__init__() + super().__init__(self) @classmethod def parse(cls, data: Sequence[SomeSubstitutionsType] diff --git a/launch/launch/substitutions/this_launch_file_dir.py b/launch/launch/substitutions/this_launch_file_dir.py index 8ef5bd3e8..2f4b8504e 100644 --- a/launch/launch/substitutions/this_launch_file_dir.py +++ b/launch/launch/substitutions/this_launch_file_dir.py @@ -22,20 +22,20 @@ from typing import Type +from .path_join_substitution import PathSubstitution from .substitution_failure import SubstitutionFailure from ..frontend.expose import expose_substitution from ..launch_context import LaunchContext from ..some_substitutions_type import SomeSubstitutionsType -from ..substitution import Substitution @expose_substitution('dirname') -class ThisLaunchFileDir(Substitution): +class ThisLaunchFileDir(PathSubstitution): """Substitution that returns the absolute path to the current launch file.""" def __init__(self) -> None: """Create a ThisLaunchFileDir substitution.""" - super().__init__() + super().__init__(self) @classmethod def parse(cls, data: Sequence[SomeSubstitutionsType] diff --git a/launch/test/launch/substitutions/test_launch_log_dir.py b/launch/test/launch/substitutions/test_launch_log_dir.py index 3211d72f2..13000075d 100644 --- a/launch/test/launch/substitutions/test_launch_log_dir.py +++ b/launch/test/launch/substitutions/test_launch_log_dir.py @@ -32,6 +32,14 @@ def test_launch_log_dir_methods(): assert lld.perform(lc) +def test_launch_log_dir_path(): + test_dir = LaunchLogDir() / 'subdir' + lc = LaunchContext() + result = test_dir.perform(lc) + assert result + assert result.endswith('subdir') + + def test_launch_log_dir_frontend(): """Test launch_log_dir/log_dir frontend substitutions.""" for sub in ('launch_log_dir', 'log_dir'): diff --git a/launch/test/launch/substitutions/test_this_launch_file_dir.py b/launch/test/launch/substitutions/test_this_launch_file_dir.py index d009dcd36..dd1a9651e 100644 --- a/launch/test/launch/substitutions/test_this_launch_file_dir.py +++ b/launch/test/launch/substitutions/test_this_launch_file_dir.py @@ -14,6 +14,8 @@ """Tests for the ThisLaunchFileDir substitution class.""" +import os + from launch import LaunchContext from launch.substitutions import SubstitutionFailure from launch.substitutions import ThisLaunchFileDir @@ -35,3 +37,10 @@ def test_this_launch_file_path_methods(): tlfp.perform(lc) lc.extend_locals({'current_launch_file_directory': 'foo'}) assert tlfp.perform(lc) == 'foo' + + +def test_this_launch_file_dir_pathing(): + test_file = ThisLaunchFileDir() / 'some_launch.xml' + lc = LaunchContext() + lc.extend_locals({'current_launch_file_directory': 'foo'}) + assert test_file.perform(lc) == os.path.join('foo', 'some_launch.xml') From 47d9695791bedb4b2a28e768dee6b3d1875ab0f2 Mon Sep 17 00:00:00 2001 From: Emerson Knapp Date: Mon, 27 Oct 2025 14:59:02 +0800 Subject: [PATCH 2/2] make the super init arg explicit kw Signed-off-by: Emerson Knapp --- launch/launch/substitutions/launch_log_dir.py | 2 +- launch/launch/substitutions/this_launch_file_dir.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/launch/launch/substitutions/launch_log_dir.py b/launch/launch/substitutions/launch_log_dir.py index 54b221c6e..4bb5ec7a0 100644 --- a/launch/launch/substitutions/launch_log_dir.py +++ b/launch/launch/substitutions/launch_log_dir.py @@ -35,7 +35,7 @@ class LaunchLogDir(PathSubstitution): def __init__(self) -> None: """Create a LaunchLogDir substitution.""" - super().__init__(self) + super().__init__(path=self) @classmethod def parse(cls, data: Sequence[SomeSubstitutionsType] diff --git a/launch/launch/substitutions/this_launch_file_dir.py b/launch/launch/substitutions/this_launch_file_dir.py index 2f4b8504e..236b2711d 100644 --- a/launch/launch/substitutions/this_launch_file_dir.py +++ b/launch/launch/substitutions/this_launch_file_dir.py @@ -35,7 +35,7 @@ class ThisLaunchFileDir(PathSubstitution): def __init__(self) -> None: """Create a ThisLaunchFileDir substitution.""" - super().__init__(self) + super().__init__(path=self) @classmethod def parse(cls, data: Sequence[SomeSubstitutionsType]