From 544417b2632f7282989998ecedfb01f5158231ae Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Tue, 24 Mar 2026 18:23:07 -0700 Subject: [PATCH 1/9] fix regressions (#959) Signed-off-by: Michael Carlstrom --- launch_pytest/launch_pytest/plugin.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/launch_pytest/launch_pytest/plugin.py b/launch_pytest/launch_pytest/plugin.py index 45b07534b..3dd66d05c 100644 --- a/launch_pytest/launch_pytest/plugin.py +++ b/launch_pytest/launch_pytest/plugin.py @@ -418,7 +418,6 @@ def wrap_generator(func, event_loop, on_shutdown): gen = None def shutdown(): - nonlocal gen if gen is None: skip('shutdown test skipped because the test failed before') on_shutdown() @@ -469,7 +468,6 @@ def wrap_asyncgen(func, event_loop, on_shutdown): agen = None def shutdown(**kwargs): - nonlocal agen if agen is None: skip('shutdown test skipped because the test failed before') on_shutdown() From aec653a77cc1112597d3f4bfa9fa0cc339243aae Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Mon, 30 Mar 2026 18:59:24 -0700 Subject: [PATCH 2/9] Fix test_io_tests for Ubuntu26 (#960) * fix test_io_tests Signed-off-by: Michael Carlstrom * Fix other test case Signed-off-by: Michael Carlstrom --------- Signed-off-by: Michael Carlstrom --- .../test_io_handler_and_assertions.py | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/launch_testing/test/launch_testing/test_io_handler_and_assertions.py b/launch_testing/test/launch_testing/test_io_handler_and_assertions.py index 68f262f98..b2a6ba2dd 100644 --- a/launch_testing/test/launch_testing/test_io_handler_and_assertions.py +++ b/launch_testing/test/launch_testing/test_io_handler_and_assertions.py @@ -126,9 +126,9 @@ def test_EXPECTED_TEXT_is_present(self): self.assertTrue(any(contains_ready)) def test_process_names(self): - self.assertIn('terminating_proc.py-1', self.proc_output.process_names()) - self.assertIn('terminating_proc.py-2', self.proc_output.process_names()) - self.assertIn('terminating_proc.py-3', self.proc_output.process_names()) + self.assertIn(self.proc_1.name, self.proc_output.process_names()) + self.assertIn(self.proc_2.name, self.proc_output.process_names()) + self.assertIn(self.proc_3.name, self.proc_output.process_names()) def test_processes(self): self.assertIn(self.proc_1, self.proc_output.processes()) @@ -143,18 +143,18 @@ def test_assertInStdout_notices_no_matching_proc(self): print(cm.exception) # Make sure the assertion method lists the names of the process it does have: - self.assertIn('terminating_proc.py-1', str(cm.exception)) - self.assertIn('terminating_proc.py-2', str(cm.exception)) - self.assertIn('terminating_proc.py-3', str(cm.exception)) + self.assertIn(self.proc_1.name, str(cm.exception)) + self.assertIn(self.proc_2.name, str(cm.exception)) + self.assertIn(self.proc_3.name, str(cm.exception)) def test_assertInStdout_notices_too_many_matching_procs(self): with self.assertRaisesRegex(Exception, 'Found multiple processes') as cm: assertInStdout(self.proc_output, self.EXPECTED_TEXT, 'terminating_proc.py') # Make sure the assertion method lists the names of the duplicate procs: - self.assertIn('terminating_proc.py-1', str(cm.exception)) - self.assertIn('terminating_proc.py-2', str(cm.exception)) - self.assertIn('terminating_proc.py-3', str(cm.exception)) + self.assertIn(self.proc_1.name, str(cm.exception)) + self.assertIn(self.proc_2.name, str(cm.exception)) + self.assertIn(self.proc_3.name, str(cm.exception)) def test_strict_proc_matching_false(self): assertInStdout( @@ -168,7 +168,7 @@ def test_regex_matching(self): assertInStdout( self.proc_output, re.compile(r'Called with arguments \S+'), - 'terminating_proc.py-2' + self.proc_2.name ) def test_arguments_disambiguate_processes(self): @@ -181,7 +181,7 @@ def test_arguments_disambiguate_processes(self): def test_asserts_on_missing_text(self): with self.assertRaisesRegex(AssertionError, self.NOT_FOUND_TEXT): - assertInStdout(self.proc_output, self.NOT_FOUND_TEXT, 'terminating_proc.py-1') + assertInStdout(self.proc_output, self.NOT_FOUND_TEXT, self.proc_1.name) def test_asserts_on_missing_text_by_proc(self): with self.assertRaisesRegex(AssertionError, self.NOT_FOUND_TEXT): From b51d67a0fb3c572a8255855ac73364ca53ed3691 Mon Sep 17 00:00:00 2001 From: Auguste Lalande Date: Wed, 1 Apr 2026 01:31:08 -0600 Subject: [PATCH 3/9] Correct typos (#961) Signed-off-by: augustelalande --- launch/launch/actions/execute_local.py | 2 +- launch/launch/actions/execute_process.py | 4 ++-- launch/launch/actions/for_loop.py | 4 ++-- launch/launch/launch_introspector.py | 4 ++-- launch/launch/substitutions/environment_variable.py | 2 +- launch/launch/substitutions/string_join_substitution.py | 4 ++-- launch/launch/utilities/type_utils.py | 2 +- .../launch_testing/asserts/assert_sequential_output.py | 2 +- launch_testing/launch_testing/markers.py | 2 +- launch_testing/launch_testing/test_runner.py | 2 +- .../test/launch_testing/test_io_handler_and_assertions.py | 2 +- launch_testing/test/launch_testing/test_resolve_process.py | 4 ++-- launch_xml/test/launch_xml/test_for_loop.py | 4 ++-- launch_yaml/test/launch_yaml/test_for_loop.py | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/launch/launch/actions/execute_local.py b/launch/launch/actions/execute_local.py index 107d86c30..a5b485d31 100644 --- a/launch/launch/actions/execute_local.py +++ b/launch/launch/actions/execute_local.py @@ -709,7 +709,7 @@ def execute(self, context: LaunchContext) -> None: self.__shutdown_future = context.asyncio_loop.create_future() self.__logger = launch.logging.get_logger(name) if name is None: - raise RuntimeError('Cannot get Ouput Loggers with None name') + raise RuntimeError('Cannot get Output Loggers with None name') if not isinstance(self.__output, dict): self.__stdout_logger, self.__stderr_logger = \ launch.logging.get_output_loggers( diff --git a/launch/launch/actions/execute_process.py b/launch/launch/actions/execute_process.py index b9f74511e..c74d062d8 100644 --- a/launch/launch/actions/execute_process.py +++ b/launch/launch/actions/execute_process.py @@ -409,8 +409,8 @@ def parse( if 'additional_env' not in ignore: # Conditions won't be allowed in the `env` tag. - # If that feature is needed, `set_enviroment_variable` and - # `unset_enviroment_variable` actions should be used. + # If that feature is needed, `set_environment_variable` and + # `unset_environment_variable` actions should be used. env = entity.get_attr('env', data_type=List[Entity], optional=True) if env is not None: kwargs['additional_env'] = { diff --git a/launch/launch/actions/for_loop.py b/launch/launch/actions/for_loop.py index 9f320a9aa..0f70a3f0e 100644 --- a/launch/launch/actions/for_loop.py +++ b/launch/launch/actions/for_loop.py @@ -111,7 +111,7 @@ def generate_launch_description(): - log_info: message: "'$(for-var name)' id=$(for-var id)" - The above examples would ouput the following log messages by default: + The above examples would output the following log messages by default: .. code-block:: text @@ -306,7 +306,7 @@ def generate_launch_description(): - log_info: message: i=$(index i) - The above examples would ouput the following log messages by default: + The above examples would output the following log messages by default: .. code-block:: text diff --git a/launch/launch/launch_introspector.py b/launch/launch/launch_introspector.py index 05865947c..5cdf28d2d 100644 --- a/launch/launch/launch_introspector.py +++ b/launch/launch/launch_introspector.py @@ -32,9 +32,9 @@ from .utilities import normalize_to_list_of_substitutions -def indent(lines: List[Text], indention: Text = ' ') -> List[Text]: +def indent(lines: List[Text], indentation: Text = ' ') -> List[Text]: """Indent a list of strings and return them.""" - return ['{}{}'.format(indention, line) for line in lines] + return ['{}{}'.format(indentation, line) for line in lines] def tree_like_indent(lines: List[Text]) -> List[Text]: diff --git a/launch/launch/substitutions/environment_variable.py b/launch/launch/substitutions/environment_variable.py index d9de2a99c..6b40544ca 100644 --- a/launch/launch/substitutions/environment_variable.py +++ b/launch/launch/substitutions/environment_variable.py @@ -69,7 +69,7 @@ def __init__( @classmethod def parse(cls, data: Sequence[SomeSubstitutionsType] ) -> Tuple[Type['EnvironmentVariable'], Dict[str, Any]]: - """Parse `EnviromentVariable` substitution.""" + """Parse `EnvironmentVariable` substitution.""" if len(data) < 1 or len(data) > 2: raise TypeError('env substitution expects 1 or 2 arguments') kwargs = {'name': data[0]} diff --git a/launch/launch/substitutions/string_join_substitution.py b/launch/launch/substitutions/string_join_substitution.py index 50dda3a27..169ffe8bc 100644 --- a/launch/launch/substitutions/string_join_substitution.py +++ b/launch/launch/substitutions/string_join_substitution.py @@ -30,7 +30,7 @@ class StringJoinSubstitution(Substitution): This takes in a list of string components as substitutions. The substitutions for each string component are performed and concatenated, - and then all string components are joined with a specified delimiter as seperation. + and then all string components are joined with a specified delimiter as separation. For example: @@ -76,7 +76,7 @@ def __init__( Create a StringJoinSubstitution. :param substitutions: the list of string component substitutions to join - :param delimiter: the text inbetween two consecutive components (default no text) + :param delimiter: the text in between two consecutive components (default no text) """ from ..utilities import normalize_to_list_of_substitutions diff --git a/launch/launch/utilities/type_utils.py b/launch/launch/utilities/type_utils.py index 135414298..da6a503ad 100644 --- a/launch/launch/utilities/type_utils.py +++ b/launch/launch/utilities/type_utils.py @@ -349,7 +349,7 @@ def get_typed_value( # Unfortunately, mypy is unable to correctly infer that `is_substitution` can -# only return True when the passed tpe is either a substitution or a mixed +# only return True when the passed type is either a substitution or a mixed # list of strings and substitutions. Indeed, there is no way that I could find # using overloads to describe "anything else than the above two types". # Can be redone properly with TypeIs once mypy version 1.10+ is available on all platforms diff --git a/launch_testing/launch_testing/asserts/assert_sequential_output.py b/launch_testing/launch_testing/asserts/assert_sequential_output.py index 35c1a825b..686395035 100644 --- a/launch_testing/launch_testing/asserts/assert_sequential_output.py +++ b/launch_testing/launch_testing/asserts/assert_sequential_output.py @@ -69,7 +69,7 @@ def assertInStdout(self, msg): def get_nearby_lines(self): - # This works by concatinating a few of the process_io outputs that we received, then + # This works by concatenating a few of the process_io outputs that we received, then # searching forward and backward for two return-lines in each direction, then returning # just that portion to give context about where a failure happened diff --git a/launch_testing/launch_testing/markers.py b/launch_testing/launch_testing/markers.py index d07096708..9c5cbcc0f 100644 --- a/launch_testing/launch_testing/markers.py +++ b/launch_testing/launch_testing/markers.py @@ -30,7 +30,7 @@ def retry_on_failure(*, times, delay=None): """ Mark a test case to be retried up to `times` on AssertionError. - :param times: The number of times to rety the test. + :param times: The number of times to retry the test. :param delay: The time to wait between retries, in seconds. A value of None will result in zero delay. """ diff --git a/launch_testing/launch_testing/test_runner.py b/launch_testing/launch_testing/test_runner.py index 5a1de18b7..0e93a596e 100644 --- a/launch_testing/launch_testing/test_runner.py +++ b/launch_testing/launch_testing/test_runner.py @@ -225,7 +225,7 @@ def __init__(self, """ Create an LaunchTestRunner object. - :param callable gen_launch_description_fn: A function that returns a ros2 LaunchDesription + :param callable gen_launch_description_fn: A function that returns a ros2 LaunchDescription for launching the processes under test. This function should take a callable as a parameter which will be called when the processes under test are ready for the test to start diff --git a/launch_testing/test/launch_testing/test_io_handler_and_assertions.py b/launch_testing/test/launch_testing/test_io_handler_and_assertions.py index b2a6ba2dd..076e32554 100644 --- a/launch_testing/test/launch_testing/test_io_handler_and_assertions.py +++ b/launch_testing/test/launch_testing/test_io_handler_and_assertions.py @@ -106,7 +106,7 @@ def test_only_one_process_had_arguments(self): matches = [t for t in text_lines if 'Called with arguments' in t] print('Called with arguments: {}'.format(matches)) - # Two process have args, because thats how process names are passed down + # Two process have args, because that's how process names are passed down self.assertEqual(2, len(matches)) matches_extra = [t for t in matches if '--extra' in t] diff --git a/launch_testing/test/launch_testing/test_resolve_process.py b/launch_testing/test/launch_testing/test_resolve_process.py index 3ebfc3b4d..5c6558021 100644 --- a/launch_testing/test/launch_testing/test_resolve_process.py +++ b/launch_testing/test/launch_testing/test_resolve_process.py @@ -48,7 +48,7 @@ def test_unlaunched_process_lookup(self): process=lookup_obj ) - # We'll get a good error mesasge here because there were no substitutions in + # We'll get a good error message here because there were no substitutions in # the execute process cmd - it's all text self.assertIn('python -c', str(cm.exception)) @@ -69,7 +69,7 @@ def test_backward_compatible_unlaunched_process_lookup(self): process=lookup_obj ) - # We'll get a good error mesasge here because there were no substitutions in + # We'll get a good error message here because there were no substitutions in # the execute process cmd - it's all text self.assertIn('python -c', str(cm.exception)) diff --git a/launch_xml/test/launch_xml/test_for_loop.py b/launch_xml/test/launch_xml/test_for_loop.py index 3f044ccd6..7072cd441 100644 --- a/launch_xml/test/launch_xml/test_for_loop.py +++ b/launch_xml/test/launch_xml/test_for_loop.py @@ -57,7 +57,7 @@ def test_for_each(): # 2 OpaqueFunction # N user-defined entities # 1 OpaqueFunction - # = 3 + N entitites/iteration + # = 3 + N entities/iteration assert len(actions) == 3 * (3 + 1) assert isinstance(actions[0], OpaqueFunction) assert isinstance(actions[1], OpaqueFunction) @@ -128,7 +128,7 @@ def test_for_loop(): # 2 OpaqueFunction # N user-defined entities # 1 OpaqueFunction - # = 3 + N entitites/iteration + # = 3 + N entities/iteration assert len(actions_for_each) == 2 * (3 + 1) assert isinstance(actions_for_each[0], OpaqueFunction) assert isinstance(actions_for_each[1], OpaqueFunction) diff --git a/launch_yaml/test/launch_yaml/test_for_loop.py b/launch_yaml/test/launch_yaml/test_for_loop.py index 716bd4cce..d19b5245f 100644 --- a/launch_yaml/test/launch_yaml/test_for_loop.py +++ b/launch_yaml/test/launch_yaml/test_for_loop.py @@ -57,7 +57,7 @@ def test_for_each(): # 2 OpaqueFunction # N user-defined entities # 1 OpaqueFunction - # = 3 + N entitites/iteration + # = 3 + N entities/iteration assert len(actions) == 3 * (3 + 1) assert isinstance(actions[0], OpaqueFunction) assert isinstance(actions[1], OpaqueFunction) @@ -132,7 +132,7 @@ def test_for_loop(): # 2 OpaqueFunction # N user-defined entities # 1 OpaqueFunction - # = 3 + N entitites/iteration + # = 3 + N entities/iteration assert len(actions_for_each) == 2 * (3 + 1) assert isinstance(actions_for_each[0], OpaqueFunction) assert isinstance(actions_for_each[1], OpaqueFunction) From 5cd4b7238098067577462c3a2ed191d021c2e3b2 Mon Sep 17 00:00:00 2001 From: Alejandro Hernandez Cordero Date: Thu, 9 Apr 2026 11:19:23 +0200 Subject: [PATCH 4/9] Changelog Signed-off-by: Alejandro Hernandez Cordero --- launch/CHANGELOG.rst | 8 ++++++++ launch_pytest/CHANGELOG.rst | 6 ++++++ launch_testing/CHANGELOG.rst | 7 +++++++ launch_testing_ament_cmake/CHANGELOG.rst | 3 +++ launch_xml/CHANGELOG.rst | 6 ++++++ launch_yaml/CHANGELOG.rst | 6 ++++++ test_launch_testing/CHANGELOG.rst | 3 +++ 7 files changed, 39 insertions(+) diff --git a/launch/CHANGELOG.rst b/launch/CHANGELOG.rst index 19df8eb15..abac5d0a8 100644 --- a/launch/CHANGELOG.rst +++ b/launch/CHANGELOG.rst @@ -2,6 +2,14 @@ Changelog for package launch ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +3.9.7 (2026-04-09) +------------------ +* Correct typos (`#961 `_) +* hotfix (`#950 `_) +* Declare Boolean Launch Argument (`#944 `_) +* Support frontends for PathJoinSubstitution (`#943 `_) +* Contributors: Auguste Lalande, Christophe Bedard, David V. Lu!!, Michael Carlstrom + 3.9.6 (2026-01-12) ------------------ * test python substitution with submodules (`#688 `_) diff --git a/launch_pytest/CHANGELOG.rst b/launch_pytest/CHANGELOG.rst index 366890ef8..0929cac22 100644 --- a/launch_pytest/CHANGELOG.rst +++ b/launch_pytest/CHANGELOG.rst @@ -2,6 +2,12 @@ Changelog for package launch_pytest ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +3.9.7 (2026-04-09) +------------------ +* fix regressions (`#959 `_) +* fix: add get_launch_test_fixture_scope for pytest compatibility (`#949 `_) +* Contributors: Daisuke Nishimatsu, Michael Carlstrom + 3.9.6 (2026-01-12) ------------------ diff --git a/launch_testing/CHANGELOG.rst b/launch_testing/CHANGELOG.rst index 4494e1bc2..6131e77a7 100644 --- a/launch_testing/CHANGELOG.rst +++ b/launch_testing/CHANGELOG.rst @@ -2,6 +2,13 @@ Changelog for package launch_testing ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +3.9.7 (2026-04-09) +------------------ +* Correct typos (`#961 `_) +* Fix test_io_tests for Ubuntu26 (`#960 `_) +* Fix flake8 (`#952 `_) +* Contributors: Auguste Lalande, Michael Carlstrom + 3.9.6 (2026-01-12) ------------------ diff --git a/launch_testing_ament_cmake/CHANGELOG.rst b/launch_testing_ament_cmake/CHANGELOG.rst index fc58d5638..9461dd747 100644 --- a/launch_testing_ament_cmake/CHANGELOG.rst +++ b/launch_testing_ament_cmake/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package launch_testing_ament_cmake ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +3.9.7 (2026-04-09) +------------------ + 3.9.6 (2026-01-12) ------------------ diff --git a/launch_xml/CHANGELOG.rst b/launch_xml/CHANGELOG.rst index 025fe2e73..2bcd755bc 100644 --- a/launch_xml/CHANGELOG.rst +++ b/launch_xml/CHANGELOG.rst @@ -2,6 +2,12 @@ Changelog for package launch_xml ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +3.9.7 (2026-04-09) +------------------ +* Correct typos (`#961 `_) +* Support frontends for PathJoinSubstitution (`#943 `_) +* Contributors: Auguste Lalande, Christophe Bedard + 3.9.6 (2026-01-12) ------------------ * Capture the environment variables in TimerAction (`#728 `_) diff --git a/launch_yaml/CHANGELOG.rst b/launch_yaml/CHANGELOG.rst index b643dd808..6377429b9 100644 --- a/launch_yaml/CHANGELOG.rst +++ b/launch_yaml/CHANGELOG.rst @@ -2,6 +2,12 @@ Changelog for package launch_yaml ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +3.9.7 (2026-04-09) +------------------ +* Correct typos (`#961 `_) +* Support frontends for PathJoinSubstitution (`#943 `_) +* Contributors: Auguste Lalande, Christophe Bedard + 3.9.6 (2026-01-12) ------------------ * Capture the environment variables in TimerAction (`#728 `_) diff --git a/test_launch_testing/CHANGELOG.rst b/test_launch_testing/CHANGELOG.rst index 603e9e3c7..20ec28a6a 100644 --- a/test_launch_testing/CHANGELOG.rst +++ b/test_launch_testing/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package test_launch_testing ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +3.9.7 (2026-04-09) +------------------ + 3.9.6 (2026-01-12) ------------------ From a5a6dd7eb7865dbc64d0e18f0229b0ebad826082 Mon Sep 17 00:00:00 2001 From: Alejandro Hernandez Cordero Date: Thu, 9 Apr 2026 11:19:28 +0200 Subject: [PATCH 5/9] 3.9.7 --- launch/package.xml | 2 +- launch/setup.py | 2 +- launch_pytest/package.xml | 2 +- launch_pytest/setup.py | 2 +- launch_testing/package.xml | 2 +- launch_testing/setup.py | 2 +- launch_testing_ament_cmake/package.xml | 2 +- launch_xml/package.xml | 2 +- launch_xml/setup.py | 2 +- launch_yaml/package.xml | 2 +- launch_yaml/setup.py | 2 +- test_launch_testing/package.xml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/launch/package.xml b/launch/package.xml index 0c8ee9211..3369bd946 100644 --- a/launch/package.xml +++ b/launch/package.xml @@ -2,7 +2,7 @@ launch - 3.9.6 + 3.9.7 The ROS launch tool. Aditya Pande diff --git a/launch/setup.py b/launch/setup.py index af4628c93..5f3dbb25f 100644 --- a/launch/setup.py +++ b/launch/setup.py @@ -5,7 +5,7 @@ setup( name=package_name, - version='3.9.6', + version='3.9.7', packages=find_packages(exclude=['test']), data_files=[ ('share/' + package_name, ['package.xml']), diff --git a/launch_pytest/package.xml b/launch_pytest/package.xml index d73ea9e6f..852363633 100644 --- a/launch_pytest/package.xml +++ b/launch_pytest/package.xml @@ -2,7 +2,7 @@ launch_pytest - 3.9.6 + 3.9.7 A package to create tests which involve launch files and multiple processes. Aditya Pande diff --git a/launch_pytest/setup.py b/launch_pytest/setup.py index aabd9170d..1892d16cf 100644 --- a/launch_pytest/setup.py +++ b/launch_pytest/setup.py @@ -9,7 +9,7 @@ setup( name=package_name, - version='3.9.6', + version='3.9.7', packages=find_packages(exclude=['test']), data_files=[ ('share/ament_index/resource_index/packages', [f'resource/{package_name}']), diff --git a/launch_testing/package.xml b/launch_testing/package.xml index 69f2c2a07..4bc07d5da 100644 --- a/launch_testing/package.xml +++ b/launch_testing/package.xml @@ -2,7 +2,7 @@ launch_testing - 3.9.6 + 3.9.7 A package to create tests which involve launch files and multiple processes. Aditya Pande diff --git a/launch_testing/setup.py b/launch_testing/setup.py index b1317c224..0700b62e8 100644 --- a/launch_testing/setup.py +++ b/launch_testing/setup.py @@ -6,7 +6,7 @@ setup( name='launch_testing', - version='3.9.6', + version='3.9.7', packages=find_packages(exclude=['test']), data_files=[ ('share/ament_index/resource_index/packages', ['resource/launch_testing']), diff --git a/launch_testing_ament_cmake/package.xml b/launch_testing_ament_cmake/package.xml index 09fcd24c5..1c8706167 100644 --- a/launch_testing_ament_cmake/package.xml +++ b/launch_testing_ament_cmake/package.xml @@ -2,7 +2,7 @@ launch_testing_ament_cmake - 3.9.6 + 3.9.7 A package providing cmake functions for running launch tests from the build. Aditya Pande diff --git a/launch_xml/package.xml b/launch_xml/package.xml index 7438685cc..e5796c358 100644 --- a/launch_xml/package.xml +++ b/launch_xml/package.xml @@ -2,7 +2,7 @@ launch_xml - 3.9.6 + 3.9.7 XML frontend for the launch package. Aditya Pande diff --git a/launch_xml/setup.py b/launch_xml/setup.py index c8f56f284..9b1eb0697 100644 --- a/launch_xml/setup.py +++ b/launch_xml/setup.py @@ -5,7 +5,7 @@ setup( name=package_name, - version='3.9.6', + version='3.9.7', packages=find_packages(exclude=['test']), data_files=[ ('share/' + package_name, ['package.xml']), diff --git a/launch_yaml/package.xml b/launch_yaml/package.xml index 809ab8c97..610c491fb 100644 --- a/launch_yaml/package.xml +++ b/launch_yaml/package.xml @@ -2,7 +2,7 @@ launch_yaml - 3.9.6 + 3.9.7 YAML frontend for the launch package. Aditya Pande diff --git a/launch_yaml/setup.py b/launch_yaml/setup.py index 7c0c7124c..3441dda29 100644 --- a/launch_yaml/setup.py +++ b/launch_yaml/setup.py @@ -5,7 +5,7 @@ setup( name=package_name, - version='3.9.6', + version='3.9.7', packages=find_packages(exclude=['test']), data_files=[ ('share/' + package_name, ['package.xml']), diff --git a/test_launch_testing/package.xml b/test_launch_testing/package.xml index 3608b1c65..2bdb9e321 100644 --- a/test_launch_testing/package.xml +++ b/test_launch_testing/package.xml @@ -2,7 +2,7 @@ test_launch_testing - 3.9.6 + 3.9.7 Tests for the launch_testing package. Aditya Pande From 06308316b46a734188a6688603763185d2b3de54 Mon Sep 17 00:00:00 2001 From: Michael Carroll Date: Tue, 5 May 2026 02:26:44 -0500 Subject: [PATCH 6/9] Fix Pytest 8/9 compatibility and coroutine leaks in launch_pytest (#972) This commit addresses two issues: 1. Renames deprecated path argument to module_path/collection_path in pytest hooks to support Pytest 8/9. 2. Ensures LaunchService run_async task is always awaited by registering the finalizer earlier and passing the task explicitly. Assisted-by: Gemini CLI:2.0-Flash [run_shell_command, replace, git, gh] Signed-off-by: Michael Carroll --- launch/conftest.py | 4 +++- launch_pytest/launch_pytest/fixture.py | 9 ++++++--- launch_pytest/launch_pytest/plugin.py | 15 ++++++++++----- launch_testing/launch_testing/pytest/hooks.py | 18 +++++++++++++----- .../launch_testing/pytest/hookspecs.py | 2 +- 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/launch/conftest.py b/launch/conftest.py index 47348f5e4..879f46712 100644 --- a/launch/conftest.py +++ b/launch/conftest.py @@ -15,7 +15,9 @@ from pathlib import PurePath -def pytest_ignore_collect(path): +def pytest_ignore_collect(collection_path=None, path=None): + if collection_path is not None: + path = collection_path # pytest doctest messes up when trying to import .launch.py packages, ignore them. # It also messes up when trying to import launch.logging.handlers due to conflicts with # logging.handlers, ignore that as well. diff --git a/launch_pytest/launch_pytest/fixture.py b/launch_pytest/launch_pytest/fixture.py index aec03c6ba..93b8c4f7c 100644 --- a/launch_pytest/launch_pytest/fixture.py +++ b/launch_pytest/launch_pytest/fixture.py @@ -27,13 +27,16 @@ def scope_gt(scope1, scope2): from _pytest.fixtures import scopemismatch as scope_gt -def finalize_launch_service(launch_service, eprefix='', auto_shutdown=True): +def finalize_launch_service(launch_service, eprefix='', auto_shutdown=True, task=None): if auto_shutdown: launch_service.shutdown(force_sync=True) loop = launch_service.event_loop if loop is not None and not loop.is_closed(): - rc = loop.run_until_complete(launch_service.task) - assert rc == 0, f"{eprefix} launch service failed when finishing, return code '{rc}'" + if task is None: + task = launch_service.task + if task is not None: + rc = loop.run_until_complete(task) + assert rc == 0, f"{eprefix} launch service failed when finishing, return code '{rc}'" def get_launch_service_fixture(*, scope='function', overridable=True): diff --git a/launch_pytest/launch_pytest/plugin.py b/launch_pytest/launch_pytest/plugin.py index 3dd66d05c..16f6a6d81 100644 --- a/launch_pytest/launch_pytest/plugin.py +++ b/launch_pytest/launch_pytest/plugin.py @@ -119,12 +119,17 @@ def pytest_fixture_setup(fixturedef, request): run_async_task = event_loop.create_task(ls.run_async( shutdown_when_idle=options['shutdown_when_idle'] )) + fixturedef.addfinalizer(functools.partial( + finalize_launch_service, + ls, + eprefix=eprefix, + auto_shutdown=options['auto_shutdown'], + task=run_async_task + )) ready = get_ready_to_test_action(ld) asyncio.set_event_loop(event_loop) event = asyncio.Event() ready._add_callback(lambda: event.set()) - fixturedef.addfinalizer(functools.partial( - finalize_launch_service, ls, eprefix=eprefix, auto_shutdown=options['auto_shutdown'])) run_until_complete(event_loop, event.wait()) # this is guaranteed by the current run_async() implementation, let's check it just in case # it changes in the future @@ -361,7 +366,7 @@ def pytest_pyfunc_call(pyfuncitem): wrap_generator(func, event_loop, on_shutdown) ) shutdown_item._fixtureinfo = shutdown_item.session._fixturemanager.getfixtureinfo( - shutdown_item, shutdown_item.obj, shutdown_item.cls, funcargs=True) + shutdown_item, shutdown_item.obj, shutdown_item.cls) else: pyfuncitem.obj = wrap_generator_fscope(func, event_loop, on_shutdown) elif inspect.isasyncgenfunction(func): @@ -371,7 +376,7 @@ def pytest_pyfunc_call(pyfuncitem): wrap_asyncgen(func, event_loop, on_shutdown) ) shutdown_item._fixtureinfo = shutdown_item.session._fixturemanager.getfixtureinfo( - shutdown_item, shutdown_item.obj, shutdown_item.cls, funcargs=True) + shutdown_item, shutdown_item.obj, shutdown_item.cls) else: pyfuncitem.obj = wrap_asyncgen_fscope(func, event_loop, on_shutdown) elif not getattr(pyfuncitem.obj, '_launch_pytest_wrapped', False): @@ -417,7 +422,7 @@ def wrap_generator(func, event_loop, on_shutdown): """Return wrappers for the normal test and the teardown test for a generator function.""" gen = None - def shutdown(): + def shutdown(**kwargs): if gen is None: skip('shutdown test skipped because the test failed before') on_shutdown() diff --git a/launch_testing/launch_testing/pytest/hooks.py b/launch_testing/launch_testing/pytest/hooks.py index 174c4c476..3726d9570 100644 --- a/launch_testing/launch_testing/pytest/hooks.py +++ b/launch_testing/launch_testing/pytest/hooks.py @@ -189,12 +189,20 @@ def find_launch_test_entrypoint(path): return None -def pytest_pycollect_makemodule(path, parent): +if _pytest_version_ge(8): + def pytest_pycollect_makemodule(module_path, parent): + return _pytest_pycollect_makemodule(module_path, parent) +else: + def pytest_pycollect_makemodule(path, parent): + return _pytest_pycollect_makemodule(path, parent) + + +def _pytest_pycollect_makemodule(path, parent): entrypoint = find_launch_test_entrypoint(path) if entrypoint is not None: ihook = parent.session.gethookproxy(path) module = ihook.pytest_launch_collect_makemodule( - path=path, parent=parent, entrypoint=entrypoint + module_path=path, parent=parent, entrypoint=entrypoint ) if module is not None: return module @@ -216,14 +224,14 @@ def pytest_pycollect_makemodule(path, parent): @pytest.hookimpl(trylast=True) -def pytest_launch_collect_makemodule(path, parent, entrypoint): +def pytest_launch_collect_makemodule(module_path, parent, entrypoint): marks = getattr(entrypoint, 'pytestmark', []) if marks and any(m.name == 'launch_test' for m in marks): if _pytest_version_ge(7): - path = pathlib.Path(path) + path = pathlib.Path(module_path) module = LaunchTestModule.from_parent(parent=parent, path=path) else: - module = LaunchTestModule.from_parent(parent=parent, fspath=path) + module = LaunchTestModule.from_parent(parent=parent, fspath=module_path) for mark in marks: decorator = getattr(pytest.mark, mark.name) decorator = decorator.with_args(*mark.args, **mark.kwargs) diff --git a/launch_testing/launch_testing/pytest/hookspecs.py b/launch_testing/launch_testing/pytest/hookspecs.py index 89249d5ea..52912415e 100644 --- a/launch_testing/launch_testing/pytest/hookspecs.py +++ b/launch_testing/launch_testing/pytest/hookspecs.py @@ -16,6 +16,6 @@ @pytest.hookspec(firstresult=True) -def pytest_launch_collect_makemodule(path, parent, entrypoint): +def pytest_launch_collect_makemodule(module_path, parent, entrypoint): """Make launch test module appropriate for the found test entrypoint.""" pass From 21bc1fc78f84fc1bf739b71d9cfe40e76daff213 Mon Sep 17 00:00:00 2001 From: Michael Carroll Date: Thu, 7 May 2026 10:48:24 -0500 Subject: [PATCH 7/9] Robust pytest_ignore_collect for multi-version Pytest compatibility (#974) * Robust Pytest 7/8/9 compatibility and collection fixes Signed-off-by: Michael Carroll * Robust Pytest 7/8/9 compatibility and collection fixes Signed-off-by: Michael Carroll * More fixes (hopefully working this time). Signed-off-by: Chris Lalancette --------- Signed-off-by: Michael Carroll Signed-off-by: Chris Lalancette Co-authored-by: Chris Lalancette --- launch/conftest.py | 43 +++++--- .../launch/event_handlers/on_process_exit.py | 1 - launch/launch/logging/__init__.py | 2 +- launch/pytest.ini | 4 +- launch_testing/launch_testing/pytest/hooks.py | 98 +++++++++++++------ .../launch_testing/pytest/hookspecs.py | 2 +- 6 files changed, 103 insertions(+), 47 deletions(-) diff --git a/launch/conftest.py b/launch/conftest.py index 879f46712..c12837230 100644 --- a/launch/conftest.py +++ b/launch/conftest.py @@ -12,16 +12,33 @@ # See the License for the specific language governing permissions and # limitations under the License. -from pathlib import PurePath - - -def pytest_ignore_collect(collection_path=None, path=None): - if collection_path is not None: - path = collection_path - # pytest doctest messes up when trying to import .launch.py packages, ignore them. - # It also messes up when trying to import launch.logging.handlers due to conflicts with - # logging.handlers, ignore that as well. - return str(path).endswith(( - '.launch.py', - str(PurePath('logging') / 'handlers.py'), - )) +import pathlib + +import pytest + + +def _pytest_version_ge(major, minor=0, patch=0): + """Return True if pytest version is >= the given version.""" + pytest_version = tuple(int(v) for v in pytest.__version__.split('.')) + return pytest_version >= (major, minor, patch) + + +def _should_ignore(p): + if p is None: + return False + path = pathlib.Path(p) + # Ignore .launch.py files — not valid Python module names. + if path.name.endswith('.launch.py'): + return True + # Ignore launch.logging.handlers — collides with stdlib logging.handlers. + if path.name == 'handlers.py' and path.parent.name == 'logging': + return True + return False + + +if _pytest_version_ge(8): + def pytest_ignore_collect(collection_path, config): + return _should_ignore(collection_path) +else: + def pytest_ignore_collect(path, config): + return _should_ignore(path) diff --git a/launch/launch/event_handlers/on_process_exit.py b/launch/launch/event_handlers/on_process_exit.py index 58b55474d..968e6599a 100644 --- a/launch/launch/event_handlers/on_process_exit.py +++ b/launch/launch/event_handlers/on_process_exit.py @@ -27,7 +27,6 @@ from ..launch_context import LaunchContext from ..some_entities_type import SomeEntitiesType - if TYPE_CHECKING: from ..action import Action # noqa: F401 from ..actions import ExecuteLocal # noqa: F401 diff --git a/launch/launch/logging/__init__.py b/launch/launch/logging/__init__.py index bc058a161..b0bd2b24b 100644 --- a/launch/launch/logging/__init__.py +++ b/launch/launch/logging/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2019 Open Source Robotics Foundation, Inc. +# Copyright 2019 Open Source Robotics Foundation, Inc. # noqa: A005 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/launch/pytest.ini b/launch/pytest.ini index 354fda3cb..0b30d72a5 100644 --- a/launch/pytest.ini +++ b/launch/pytest.ini @@ -1,5 +1,7 @@ [pytest] junit_family=xunit2 -addopts = --doctest-modules +# Disable doctest modules temporarily to avoid ImportPathMismatchError with logging.handlers +# addopts = --doctest-modules timeout=900 timeout_method=thread +pythonpath = test diff --git a/launch_testing/launch_testing/pytest/hooks.py b/launch_testing/launch_testing/pytest/hooks.py index 3726d9570..266a2b416 100644 --- a/launch_testing/launch_testing/pytest/hooks.py +++ b/launch_testing/launch_testing/pytest/hooks.py @@ -174,21 +174,53 @@ def collect(self): def find_launch_test_entrypoint(path): + path_obj = pathlib.Path(path) + # Skip files that are known to cause conflicts or are definitely not tests + if path_obj.name == 'handlers.py' and path_obj.parent.name == 'logging': + return None + + # Only attempt to import files that look like Python modules and are not launch files + # with double extensions (which Pytest 8+ import_path might struggle with) + if not path_obj.name.endswith('.py') or path_obj.name.endswith('.launch.py'): + return None + try: if _pytest_version_ge(8, 1, 0): from _pytest.pathlib import import_path - module = import_path(path, root=None, consider_namespace_packages=False) + module = import_path(path_obj, root=None, consider_namespace_packages=False) elif _pytest_version_ge(7, 0, 0): from _pytest.pathlib import import_path - module = import_path(path, root=None) + module = import_path(path_obj, root=None) else: # Assume we got legacy path in earlier versions of pytest module = path.pyimport() return getattr(module, 'generate_test_description', None) - except SyntaxError: + except Exception: + # Catch all exceptions during import to avoid breaking collection return None +@pytest.hookimpl(tryfirst=True) +def pytest_ignore_collect(collection_path=None, path=None, config=None): + # Pytest 8.x signature: (collection_path, path, config) + # Pytest < 8 signature: (path, config) + p = collection_path or path + if p is None: + return False + + path_obj = pathlib.Path(p) + + # Ignore .launch.py files to avoid collection failures for launch_pytest tests + if path_obj.name.endswith('.launch.py'): + return True + + # Ignore standard library collisions (launch.logging.handlers vs logging.handlers) + if path_obj.name == 'handlers.py' and path_obj.parent.name == 'logging': + return True + + return False + + if _pytest_version_ge(8): def pytest_pycollect_makemodule(module_path, parent): return _pytest_pycollect_makemodule(module_path, parent) @@ -202,41 +234,47 @@ def _pytest_pycollect_makemodule(path, parent): if entrypoint is not None: ihook = parent.session.gethookproxy(path) module = ihook.pytest_launch_collect_makemodule( - module_path=path, parent=parent, entrypoint=entrypoint + module_path=path, path=path, parent=parent, entrypoint=entrypoint ) if module is not None: return module - if _pytest_version_ge(7): - path = pathlib.Path(path) - if path.name == '__init__.py': - return pytest.Package.from_parent(parent, path=path) - return pytest.Module.from_parent(parent=parent, path=path) - elif _pytest_version_ge(5, 4): - if path.basename == '__init__.py': - return pytest.Package.from_parent(parent, fspath=path) - return pytest.Module.from_parent(parent, fspath=path) - else: - # todo: remove fallback once all platforms use pytest >=5.4 - if path.basename == '__init__.py': - return pytest.Package(path, parent) - return pytest.Module(path, parent) + # If it's not a launch test, still return a standard Module/Package + # but only if it matches standard test patterns to avoid aggressive collection. + path_obj = pathlib.Path(path) + if path_obj.name.startswith('test_') or path_obj.name.endswith('_test.py') or \ + path_obj.name == '__init__.py': + if _pytest_version_ge(7): + if path_obj.name == '__init__.py': + return pytest.Package.from_parent(parent, path=path_obj) + return pytest.Module.from_parent(parent=parent, path=path_obj) + elif _pytest_version_ge(5, 4): + if path_obj.name == '__init__.py': + return pytest.Package.from_parent(parent, fspath=path) + return pytest.Module.from_parent(parent, fspath=path) + else: + if path_obj.name == '__init__.py': + return pytest.Package(path, parent) + return pytest.Module(path, parent) + + return None @pytest.hookimpl(trylast=True) -def pytest_launch_collect_makemodule(module_path, parent, entrypoint): +def pytest_launch_collect_makemodule(module_path, path, parent, entrypoint): + p = module_path or path + if _pytest_version_ge(7): + path_obj = pathlib.Path(p) + module = LaunchTestModule.from_parent(parent=parent, path=path_obj) + else: + module = LaunchTestModule.from_parent(parent=parent, fspath=p) + marks = getattr(entrypoint, 'pytestmark', []) - if marks and any(m.name == 'launch_test' for m in marks): - if _pytest_version_ge(7): - path = pathlib.Path(module_path) - module = LaunchTestModule.from_parent(parent=parent, path=path) - else: - module = LaunchTestModule.from_parent(parent=parent, fspath=module_path) - for mark in marks: - decorator = getattr(pytest.mark, mark.name) - decorator = decorator.with_args(*mark.args, **mark.kwargs) - module.add_marker(decorator) - return module + for mark in marks: + decorator = getattr(pytest.mark, mark.name) + decorator = decorator.with_args(*mark.args, **mark.kwargs) + module.add_marker(decorator) + return module def pytest_addhooks(pluginmanager): diff --git a/launch_testing/launch_testing/pytest/hookspecs.py b/launch_testing/launch_testing/pytest/hookspecs.py index 52912415e..c35e5c3b8 100644 --- a/launch_testing/launch_testing/pytest/hookspecs.py +++ b/launch_testing/launch_testing/pytest/hookspecs.py @@ -16,6 +16,6 @@ @pytest.hookspec(firstresult=True) -def pytest_launch_collect_makemodule(module_path, parent, entrypoint): +def pytest_launch_collect_makemodule(module_path, path, parent, entrypoint): """Make launch test module appropriate for the found test entrypoint.""" pass From c9ca51086bd87bc70a52b906c3a71bfd0629d496 Mon Sep 17 00:00:00 2001 From: Shane Loretz Date: Thu, 7 May 2026 18:41:32 +0000 Subject: [PATCH 8/9] changelogs Signed-off-by: Shane Loretz --- launch/CHANGELOG.rst | 6 ++++++ launch_pytest/CHANGELOG.rst | 5 +++++ launch_testing/CHANGELOG.rst | 6 ++++++ launch_testing_ament_cmake/CHANGELOG.rst | 3 +++ launch_xml/CHANGELOG.rst | 3 +++ launch_yaml/CHANGELOG.rst | 3 +++ test_launch_testing/CHANGELOG.rst | 3 +++ 7 files changed, 29 insertions(+) diff --git a/launch/CHANGELOG.rst b/launch/CHANGELOG.rst index abac5d0a8..eaeb8d11d 100644 --- a/launch/CHANGELOG.rst +++ b/launch/CHANGELOG.rst @@ -2,6 +2,12 @@ Changelog for package launch ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* Robust pytest_ignore_collect for multi-version Pytest compatibility (`#974 `_) +* Fix Pytest 8/9 compatibility and coroutine leaks in launch_pytest (`#972 `_) +* Contributors: Michael Carroll + 3.9.7 (2026-04-09) ------------------ * Correct typos (`#961 `_) diff --git a/launch_pytest/CHANGELOG.rst b/launch_pytest/CHANGELOG.rst index 0929cac22..f7a3175b7 100644 --- a/launch_pytest/CHANGELOG.rst +++ b/launch_pytest/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package launch_pytest ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* Fix Pytest 8/9 compatibility and coroutine leaks in launch_pytest (`#972 `_) +* Contributors: Michael Carroll + 3.9.7 (2026-04-09) ------------------ * fix regressions (`#959 `_) diff --git a/launch_testing/CHANGELOG.rst b/launch_testing/CHANGELOG.rst index 6131e77a7..8d6f92258 100644 --- a/launch_testing/CHANGELOG.rst +++ b/launch_testing/CHANGELOG.rst @@ -2,6 +2,12 @@ Changelog for package launch_testing ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* Robust pytest_ignore_collect for multi-version Pytest compatibility (`#974 `_) +* Fix Pytest 8/9 compatibility and coroutine leaks in launch_pytest (`#972 `_) +* Contributors: Michael Carroll + 3.9.7 (2026-04-09) ------------------ * Correct typos (`#961 `_) diff --git a/launch_testing_ament_cmake/CHANGELOG.rst b/launch_testing_ament_cmake/CHANGELOG.rst index 9461dd747..7408c9e46 100644 --- a/launch_testing_ament_cmake/CHANGELOG.rst +++ b/launch_testing_ament_cmake/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package launch_testing_ament_cmake ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 3.9.7 (2026-04-09) ------------------ diff --git a/launch_xml/CHANGELOG.rst b/launch_xml/CHANGELOG.rst index 2bcd755bc..ebe5a51d5 100644 --- a/launch_xml/CHANGELOG.rst +++ b/launch_xml/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package launch_xml ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 3.9.7 (2026-04-09) ------------------ * Correct typos (`#961 `_) diff --git a/launch_yaml/CHANGELOG.rst b/launch_yaml/CHANGELOG.rst index 6377429b9..854c72629 100644 --- a/launch_yaml/CHANGELOG.rst +++ b/launch_yaml/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package launch_yaml ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 3.9.7 (2026-04-09) ------------------ * Correct typos (`#961 `_) diff --git a/test_launch_testing/CHANGELOG.rst b/test_launch_testing/CHANGELOG.rst index 20ec28a6a..9906c2eed 100644 --- a/test_launch_testing/CHANGELOG.rst +++ b/test_launch_testing/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package test_launch_testing ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 3.9.7 (2026-04-09) ------------------ From 07766653112c4d0f8650bc1ced5d5239d303dd27 Mon Sep 17 00:00:00 2001 From: Shane Loretz Date: Thu, 7 May 2026 18:41:47 +0000 Subject: [PATCH 9/9] 3.10.0 --- launch/CHANGELOG.rst | 4 ++-- launch/package.xml | 2 +- launch/setup.py | 2 +- launch_pytest/CHANGELOG.rst | 4 ++-- launch_pytest/package.xml | 2 +- launch_pytest/setup.py | 2 +- launch_testing/CHANGELOG.rst | 4 ++-- launch_testing/package.xml | 2 +- launch_testing/setup.py | 2 +- launch_testing_ament_cmake/CHANGELOG.rst | 4 ++-- launch_testing_ament_cmake/package.xml | 2 +- launch_xml/CHANGELOG.rst | 4 ++-- launch_xml/package.xml | 2 +- launch_xml/setup.py | 2 +- launch_yaml/CHANGELOG.rst | 4 ++-- launch_yaml/package.xml | 2 +- launch_yaml/setup.py | 2 +- test_launch_testing/CHANGELOG.rst | 4 ++-- test_launch_testing/package.xml | 2 +- 19 files changed, 26 insertions(+), 26 deletions(-) diff --git a/launch/CHANGELOG.rst b/launch/CHANGELOG.rst index eaeb8d11d..9e604a2b2 100644 --- a/launch/CHANGELOG.rst +++ b/launch/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package launch ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +3.10.0 (2026-05-07) +------------------- * Robust pytest_ignore_collect for multi-version Pytest compatibility (`#974 `_) * Fix Pytest 8/9 compatibility and coroutine leaks in launch_pytest (`#972 `_) * Contributors: Michael Carroll diff --git a/launch/package.xml b/launch/package.xml index 3369bd946..9a1717f08 100644 --- a/launch/package.xml +++ b/launch/package.xml @@ -2,7 +2,7 @@ launch - 3.9.7 + 3.10.0 The ROS launch tool. Aditya Pande diff --git a/launch/setup.py b/launch/setup.py index 5f3dbb25f..a4d2d0f4c 100644 --- a/launch/setup.py +++ b/launch/setup.py @@ -5,7 +5,7 @@ setup( name=package_name, - version='3.9.7', + version='3.10.0', packages=find_packages(exclude=['test']), data_files=[ ('share/' + package_name, ['package.xml']), diff --git a/launch_pytest/CHANGELOG.rst b/launch_pytest/CHANGELOG.rst index f7a3175b7..899ab38a5 100644 --- a/launch_pytest/CHANGELOG.rst +++ b/launch_pytest/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package launch_pytest ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +3.10.0 (2026-05-07) +------------------- * Fix Pytest 8/9 compatibility and coroutine leaks in launch_pytest (`#972 `_) * Contributors: Michael Carroll diff --git a/launch_pytest/package.xml b/launch_pytest/package.xml index 852363633..724975ebd 100644 --- a/launch_pytest/package.xml +++ b/launch_pytest/package.xml @@ -2,7 +2,7 @@ launch_pytest - 3.9.7 + 3.10.0 A package to create tests which involve launch files and multiple processes. Aditya Pande diff --git a/launch_pytest/setup.py b/launch_pytest/setup.py index 1892d16cf..833986e79 100644 --- a/launch_pytest/setup.py +++ b/launch_pytest/setup.py @@ -9,7 +9,7 @@ setup( name=package_name, - version='3.9.7', + version='3.10.0', packages=find_packages(exclude=['test']), data_files=[ ('share/ament_index/resource_index/packages', [f'resource/{package_name}']), diff --git a/launch_testing/CHANGELOG.rst b/launch_testing/CHANGELOG.rst index 8d6f92258..1e3275769 100644 --- a/launch_testing/CHANGELOG.rst +++ b/launch_testing/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package launch_testing ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +3.10.0 (2026-05-07) +------------------- * Robust pytest_ignore_collect for multi-version Pytest compatibility (`#974 `_) * Fix Pytest 8/9 compatibility and coroutine leaks in launch_pytest (`#972 `_) * Contributors: Michael Carroll diff --git a/launch_testing/package.xml b/launch_testing/package.xml index 4bc07d5da..7d3953fb4 100644 --- a/launch_testing/package.xml +++ b/launch_testing/package.xml @@ -2,7 +2,7 @@ launch_testing - 3.9.7 + 3.10.0 A package to create tests which involve launch files and multiple processes. Aditya Pande diff --git a/launch_testing/setup.py b/launch_testing/setup.py index 0700b62e8..18cbc82c6 100644 --- a/launch_testing/setup.py +++ b/launch_testing/setup.py @@ -6,7 +6,7 @@ setup( name='launch_testing', - version='3.9.7', + version='3.10.0', packages=find_packages(exclude=['test']), data_files=[ ('share/ament_index/resource_index/packages', ['resource/launch_testing']), diff --git a/launch_testing_ament_cmake/CHANGELOG.rst b/launch_testing_ament_cmake/CHANGELOG.rst index 7408c9e46..c1de079ea 100644 --- a/launch_testing_ament_cmake/CHANGELOG.rst +++ b/launch_testing_ament_cmake/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package launch_testing_ament_cmake ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +3.10.0 (2026-05-07) +------------------- 3.9.7 (2026-04-09) ------------------ diff --git a/launch_testing_ament_cmake/package.xml b/launch_testing_ament_cmake/package.xml index 1c8706167..6e3c36326 100644 --- a/launch_testing_ament_cmake/package.xml +++ b/launch_testing_ament_cmake/package.xml @@ -2,7 +2,7 @@ launch_testing_ament_cmake - 3.9.7 + 3.10.0 A package providing cmake functions for running launch tests from the build. Aditya Pande diff --git a/launch_xml/CHANGELOG.rst b/launch_xml/CHANGELOG.rst index ebe5a51d5..3ec37e16e 100644 --- a/launch_xml/CHANGELOG.rst +++ b/launch_xml/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package launch_xml ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +3.10.0 (2026-05-07) +------------------- 3.9.7 (2026-04-09) ------------------ diff --git a/launch_xml/package.xml b/launch_xml/package.xml index e5796c358..5f692fd85 100644 --- a/launch_xml/package.xml +++ b/launch_xml/package.xml @@ -2,7 +2,7 @@ launch_xml - 3.9.7 + 3.10.0 XML frontend for the launch package. Aditya Pande diff --git a/launch_xml/setup.py b/launch_xml/setup.py index 9b1eb0697..4116cf885 100644 --- a/launch_xml/setup.py +++ b/launch_xml/setup.py @@ -5,7 +5,7 @@ setup( name=package_name, - version='3.9.7', + version='3.10.0', packages=find_packages(exclude=['test']), data_files=[ ('share/' + package_name, ['package.xml']), diff --git a/launch_yaml/CHANGELOG.rst b/launch_yaml/CHANGELOG.rst index 854c72629..0108fbc6d 100644 --- a/launch_yaml/CHANGELOG.rst +++ b/launch_yaml/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package launch_yaml ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +3.10.0 (2026-05-07) +------------------- 3.9.7 (2026-04-09) ------------------ diff --git a/launch_yaml/package.xml b/launch_yaml/package.xml index 610c491fb..7f40eee7f 100644 --- a/launch_yaml/package.xml +++ b/launch_yaml/package.xml @@ -2,7 +2,7 @@ launch_yaml - 3.9.7 + 3.10.0 YAML frontend for the launch package. Aditya Pande diff --git a/launch_yaml/setup.py b/launch_yaml/setup.py index 3441dda29..33dabcd87 100644 --- a/launch_yaml/setup.py +++ b/launch_yaml/setup.py @@ -5,7 +5,7 @@ setup( name=package_name, - version='3.9.7', + version='3.10.0', packages=find_packages(exclude=['test']), data_files=[ ('share/' + package_name, ['package.xml']), diff --git a/test_launch_testing/CHANGELOG.rst b/test_launch_testing/CHANGELOG.rst index 9906c2eed..f685baca8 100644 --- a/test_launch_testing/CHANGELOG.rst +++ b/test_launch_testing/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package test_launch_testing ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +3.10.0 (2026-05-07) +------------------- 3.9.7 (2026-04-09) ------------------ diff --git a/test_launch_testing/package.xml b/test_launch_testing/package.xml index 2bdb9e321..1f4a971e3 100644 --- a/test_launch_testing/package.xml +++ b/test_launch_testing/package.xml @@ -2,7 +2,7 @@ test_launch_testing - 3.9.7 + 3.10.0 Tests for the launch_testing package. Aditya Pande