From c872b058a72510bc68f43c8b17a105628250d040 Mon Sep 17 00:00:00 2001 From: Tomoya Fujita Date: Mon, 3 Feb 2025 12:08:53 -0800 Subject: [PATCH 1/2] add yaml dumper representator for str type to keep quotes always. Signed-off-by: Tomoya Fujita --- launch_ros/launch_ros/actions/node.py | 8 ++++++++ launch_ros/launch_ros/utilities/normalize_parameters.py | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/launch_ros/launch_ros/actions/node.py b/launch_ros/launch_ros/actions/node.py index fd684ce21..60f76e838 100644 --- a/launch_ros/launch_ros/actions/node.py +++ b/launch_ros/launch_ros/actions/node.py @@ -373,11 +373,19 @@ def _create_params_file_from_dict(self, params): self.node_name if self.is_node_name_fully_specified() else '/**': {'ros__parameters': params} } + + def quoted_representor(dumper, data): + return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"') + yaml.add_representer(str, quoted_representor) yaml.dump(param_dict, h, default_flow_style=False) return param_file_path def _get_parameter_rule(self, param: 'Parameter', context: LaunchContext): name, value = param.evaluate(context) + + def quoted_representor(dumper, data): + return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"') + yaml.add_representer(str, quoted_representor) return f'{name}:={yaml.dump(value)}' def _perform_substitutions(self, context: LaunchContext) -> None: diff --git a/launch_ros/launch_ros/utilities/normalize_parameters.py b/launch_ros/launch_ros/utilities/normalize_parameters.py index f61957b9c..fb6e4f645 100644 --- a/launch_ros/launch_ros/utilities/normalize_parameters.py +++ b/launch_ros/launch_ros/utilities/normalize_parameters.py @@ -89,6 +89,9 @@ def _normalize_parameter_array_value(value: SomeParameterValue) -> ParameterValu new_value = [] # type: List[SomeSubstitutionsType] for element in value: if isinstance(element, (float, int, bool, str)): + def quoted_representor(dumper, data): + return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"') + yaml.add_representer(str, quoted_representor) new_value.append(yaml.dump(element)) else: new_value.append(element) @@ -149,6 +152,9 @@ def normalize_parameter_dict( elif isinstance(value, ParameterValueDescription): normalized[tuple(name)] = value elif isinstance(value, str): + def quoted_representor(dumper, data): + return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"') + yaml.add_representer(str, quoted_representor) normalized[tuple(name)] = tuple(normalize_to_list_of_substitutions(yaml.dump(value))) elif isinstance(value, Substitution): normalized[tuple(name)] = tuple(normalize_to_list_of_substitutions(value)) From 764d35a7bf6dd2af9f9438946b757cc884984fc1 Mon Sep 17 00:00:00 2001 From: Tomoya Fujita Date: Tue, 4 Feb 2025 09:39:58 -0800 Subject: [PATCH 2/2] representator should be applied to conversion from py dictionary. Signed-off-by: Tomoya Fujita --- launch_ros/launch_ros/actions/node.py | 4 ---- launch_ros/launch_ros/utilities/normalize_parameters.py | 6 ------ 2 files changed, 10 deletions(-) diff --git a/launch_ros/launch_ros/actions/node.py b/launch_ros/launch_ros/actions/node.py index 60f76e838..499f9d91a 100644 --- a/launch_ros/launch_ros/actions/node.py +++ b/launch_ros/launch_ros/actions/node.py @@ -382,10 +382,6 @@ def quoted_representor(dumper, data): def _get_parameter_rule(self, param: 'Parameter', context: LaunchContext): name, value = param.evaluate(context) - - def quoted_representor(dumper, data): - return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"') - yaml.add_representer(str, quoted_representor) return f'{name}:={yaml.dump(value)}' def _perform_substitutions(self, context: LaunchContext) -> None: diff --git a/launch_ros/launch_ros/utilities/normalize_parameters.py b/launch_ros/launch_ros/utilities/normalize_parameters.py index fb6e4f645..f61957b9c 100644 --- a/launch_ros/launch_ros/utilities/normalize_parameters.py +++ b/launch_ros/launch_ros/utilities/normalize_parameters.py @@ -89,9 +89,6 @@ def _normalize_parameter_array_value(value: SomeParameterValue) -> ParameterValu new_value = [] # type: List[SomeSubstitutionsType] for element in value: if isinstance(element, (float, int, bool, str)): - def quoted_representor(dumper, data): - return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"') - yaml.add_representer(str, quoted_representor) new_value.append(yaml.dump(element)) else: new_value.append(element) @@ -152,9 +149,6 @@ def normalize_parameter_dict( elif isinstance(value, ParameterValueDescription): normalized[tuple(name)] = value elif isinstance(value, str): - def quoted_representor(dumper, data): - return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"') - yaml.add_representer(str, quoted_representor) normalized[tuple(name)] = tuple(normalize_to_list_of_substitutions(yaml.dump(value))) elif isinstance(value, Substitution): normalized[tuple(name)] = tuple(normalize_to_list_of_substitutions(value))