rostran/providers/ros/yaml_util.py (55 lines of code) (raw):
from ruamel.yaml import YAML, ScalarNode, SequenceNode, MappingNode
yaml = YAML()
yaml.preserve_quotes = True
ROS_FUNCTION_NAMES = {
"MergeMap", "Sub", "Base64Decode", "Indent", "Base64", "If", "EachMemberIn", "FormatTime", "Length",
"Not", "Replace", "Min", "Equals", "Test", "Split", "Join", "ListMerge", "Or", "ResourceFacade",
"SelectMapList", "MergeMapToList", "Select", "Calculate", "FindInMap", "MarketplaceImage", "GetAZs",
"Any", "Contains", "Add", "Str", "GetAtt", "Base64Encode", "GetStackOutput", "TransformNamespace", "Jq",
"Max", "MemberListToMap", "Index", "Cidr", "GetJsonValue", "Ref", "And", "Avg", "MatchPattern"
}
def make_constructor(fun_name):
if fun_name == 'Ref':
tag_name = fun_name
else:
tag_name = 'Fn::{}'.format(fun_name)
if fun_name == 'GetAtt':
def get_attribute_constructor(loader, node):
if isinstance(node, ScalarNode):
value = loader.construct_scalar(node)
try:
split_value = value.split('.')
if len(split_value) == 2:
resource, attribute = split_value
elif len(split_value) >= 3:
if split_value[-2] == 'Outputs':
resource = '.'.join(split_value[:-2])
attribute = '.'.join(split_value[-2:])
else:
resource = '.'.join(split_value[:-1])
attribute = split_value[-1]
else:
raise ValueError
return {tag_name: [resource, attribute]}
except ValueError:
raise ValueError('Resolve !GetAtt error. Value: {}'.format(value))
elif isinstance(node, SequenceNode):
values = loader.construct_sequence(node)
return {tag_name: values}
else:
value = loader.construct_object(node)
return {tag_name: value}
return get_attribute_constructor
def construct(loader, node):
if isinstance(node, ScalarNode):
value = loader.construct_scalar(node)
elif isinstance(node, SequenceNode):
value = loader.construct_sequence(node)
elif isinstance(node, MappingNode):
value = loader.construct_mapping(node)
else:
value = loader.construct_object(node)
return {tag_name: value}
return construct
for f in ROS_FUNCTION_NAMES:
yaml.constructor.add_constructor('!{}'.format(f), make_constructor(f))