diff --git a/rosidl_adapter/rosidl_adapter/resource/__init__.py b/rosidl_adapter/rosidl_adapter/resource/__init__.py index ce3335853..b629021a1 100644 --- a/rosidl_adapter/rosidl_adapter/resource/__init__.py +++ b/rosidl_adapter/rosidl_adapter/resource/__init__.py @@ -18,6 +18,12 @@ import em +try: + from em import Configuration + em_has_configuration = True +except ImportError: + em_has_configuration = False + def expand_template(template_name, data, output_file, encoding='utf-8'): content = evaluate_template(template_name, data) @@ -45,18 +51,31 @@ def evaluate_template(template_name, data): output = StringIO() try: - _interpreter = em.Interpreter( - output=output, - options={ - em.BUFFERED_OPT: True, - em.RAW_OPT: True, - }) - + if em_has_configuration: + config = Configuration( + defaultRoot=template_path, + defaultStdout=output, + deleteOnError=True, + rawErrors=True, + useProxy=True) + _interpreter = em.Interpreter( + config=config, + dispatcher=False) + else: + _interpreter = em.Interpreter( + output=output, + options={ + em.BUFFERED_OPT: True, + em.RAW_OPT: True, + }) with open(template_path, 'r') as h: content = h.read() _interpreter.invoke( 'beforeFile', name=template_name, file=h, locals=data) - _interpreter.string(content, template_path, locals=data) + if em_has_configuration: + _interpreter.string(content, locals=data) + else: + _interpreter.string(content, template_path, locals=data) _interpreter.invoke('afterFile') return output.getvalue() @@ -66,7 +85,8 @@ def evaluate_template(template_name, data): file=sys.stderr) raise finally: - _interpreter.shutdown() + if _interpreter is not None: + _interpreter.shutdown() _interpreter = None @@ -78,7 +98,10 @@ def _evaluate_template(template_name, **kwargs): 'beforeInclude', name=template_path, file=h, locals=kwargs) content = h.read() try: - _interpreter.string(content, template_path, kwargs) + if em_has_configuration: + _interpreter.string(content, locals=kwargs) + else: + _interpreter.string(content, template_path, kwargs) except Exception as e: # noqa: F841 print( f"{e.__class__.__name__} processing template '{template_name}': " diff --git a/rosidl_pycommon/rosidl_pycommon/__init__.py b/rosidl_pycommon/rosidl_pycommon/__init__.py index 3fecd8c72..36d887113 100644 --- a/rosidl_pycommon/rosidl_pycommon/__init__.py +++ b/rosidl_pycommon/rosidl_pycommon/__init__.py @@ -20,6 +20,13 @@ import sys import em + +try: + from em import Configuration + em_has_configuration = True +except ImportError: + em_has_configuration = False + from rosidl_parser.definition import IdlLocator from rosidl_parser.parser import parse_idl_file @@ -146,20 +153,31 @@ def expand_template( template_basepath = template_name.parent template_name = template_name.name - global interpreter - output = StringIO() - interpreter = em.Interpreter( - output=output, - options={ - em.BUFFERED_OPT: True, - em.RAW_OPT: True, - }, - ) - global template_prefix_path template_prefix_path.append(template_basepath) template_path = get_template_path(template_name) + global interpreter + output = StringIO() + if em_has_configuration: + config = Configuration( + defaultRoot=template_path, + defaultStdout=output, + deleteOnError=True, + rawErrors=True, + useProxy=True) + interpreter = em.Interpreter( + config=config, + dispatcher=False) + else: + interpreter = em.Interpreter( + output=output, + options={ + em.BUFFERED_OPT: True, + em.RAW_OPT: True, + }, + ) + # create copy before manipulating data = dict(data) _add_helper_functions(data) @@ -169,7 +187,10 @@ def expand_template( template_content = h.read() interpreter.invoke( 'beforeFile', name=template_name, file=h, locals=data) - interpreter.string(template_content, template_path, locals=data) + if em_has_configuration: + interpreter.string(template_content, locals=data) + else: + interpreter.string(template_content, template_path, locals=data) interpreter.invoke('afterFile') except Exception as e: # noqa: F841 if os.path.exists(output_file): @@ -218,7 +239,10 @@ def _expand_template(template_name, **kwargs): 'beforeInclude', name=str(template_path), file=h, locals=kwargs) content = h.read() try: - interpreter.string(content, str(template_path), kwargs) + if em_has_configuration: + interpreter.string(content, locals=kwargs) + else: + interpreter.string(content, template_path, locals=kwargs) except Exception as e: # noqa: F841 print(f"{e.__class__.__name__} in template '{template_path}': {e}", file=sys.stderr)