def convert_join(sep, parts): """ Fix a Join ;) """ plain_string = True args = ODict() for i, part in enumerate(parts): part = clean(part) if isinstance(part, dict): plain_string = False if "Ref" in part: parts[i] = "${{{}}}".format(part["Ref"]) elif "Fn::GetAtt" in part: params = part["Fn::GetAtt"] parts[i] = "${{{}}}".format(".".join(params)) else: for name, value in args.items(): if value == part: param_name = name break else: param_name = "Param{}".format(len(args) + 1) args[param_name] = part parts[i] = "${{{}}}".format(param_name) else: parts[i] = part.replace("${", "${!") source = sep.join(parts) if plain_string: return source if args: return ODict(( ("Fn::Sub", [source, args]), )) return ODict(( ("Fn::Sub", source), ))
def map_representer(dumper, value): """ Deal with !Ref style function format and OrderedDict """ value = ODict(value.items()) if len(value.keys()) == 1: key = list(value.keys())[0] if key in CONVERTED_SUFFIXES: return fn_representer(dumper, key, value[key]) if key.startswith(FN_PREFIX): return fn_representer(dumper, key[4:], value[key]) return dumper.represent_mapping(TAG_MAP, value, flow_style=False)
def convert_join(value): """ Fix a Join ;) """ if not isinstance(value, list) or len(value) != 2: # Cowardly refuse return value sep, parts = value[0], value[1] if isinstance(parts, six.string_types): return parts if not isinstance(parts, list): # This looks tricky, just return the join as it was return { "Fn::Join": value, } plain_string = True args = ODict() new_parts = [] for part in parts: part = clean(part) if isinstance(part, dict): plain_string = False if "Ref" in part: new_parts.append("${{{}}}".format(part["Ref"])) elif "Fn::GetAtt" in part: params = part["Fn::GetAtt"] new_parts.append("${{{}}}".format(".".join(params))) else: for key, val in args.items(): # we want to bail if a conditional can evaluate to AWS::NoValue if isinstance(val, dict): if "Fn::If" in val and "AWS::NoValue" in str(val["Fn::If"]): return { "Fn::Join": value, } if val == part: param_name = key break else: param_name = "Param{}".format(len(args) + 1) args[param_name] = part new_parts.append("${{{}}}".format(param_name)) elif isinstance(part, six.string_types): new_parts.append(part.replace("${", "${!")) else: # Doing something weird; refuse return { "Fn::Join": value } source = sep.join(new_parts) if plain_string: return source if args: return ODict(( ("Fn::Sub", [source, args]), )) return ODict(( ("Fn::Sub", source), ))