def format_annotated(self, item, expand_args): """Wrapper for :meth:format preserving *AnnotatedString* flags Calls :meth:format to format *item* into a new string and copies flags from original item. This is used by :meth:expand """ updated = self.format(item, **expand_args) if isinstance(item, AnnotatedString): updated = AnnotatedString(updated) try: updated.flags = deepcopy(item.flags) except TypeError: log.debug("Failed to deepcopy flags for item {} with flags{}" "".format(item, item.flags)) updated.flags = copy(item.flags) return updated
def partially_expand(f, wildcards): """Expand the wildcards in f from the ones present in wildcards This is done by replacing all wildcard delimiters by `{{` or `}}` that are not in `wildcards.keys()`. """ # perform the partial expansion from f's string representation s = str(f).replace("{", "{{").replace("}", "}}") for key in wildcards.keys(): s = s.replace("{{{{{}}}}}".format(key), "{{{}}}".format(key)) # build result anno_s = AnnotatedString(s) anno_s.flags = f.flags return IOFile(anno_s, f.rule)
def expand(self, item, fields, rec=-1): if isinstance(item, str): updated = self.format(item, **fields) if isinstance(item, AnnotatedString): updated = AnnotatedString(updated) try: updated.flags = deepcopy(item.flags) except TypeError as e: log.debug( "Failed to deepcopy flags for item {} with flags{}" "".format(item, item.flags)) updated.flags = copy(item.flags) item = updated elif hasattr(item, '__call__'): # function _item = item def late_expand(*args, **kwargs): return self.expand(_item(*args, **kwargs), {'wc': args[0]}, rec=rec + 1) item = late_expand elif isinstance(item, int): pass elif isinstance(item, dict): for key, value in item.items(): item[key] = self.expand(value, fields, rec=rec + 1) elif isinstance(item, list): for i, subitem in enumerate(item): item[i] = self.expand(subitem, fields, rec=rec + 1) elif isinstance(item, tuple): return (self.expand(subitem, fields, rec=rec + 1) for subitem in item) else: raise ValueError("unable to expand item '{}' with fields '{}'" "".format(repr(item), repr(fields))) return item
def partially_expand(f, wildcards): """Expand the wildcards in f from the ones present in wildcards This is done by replacing all wildcard delimiters by `{{` or `}}` that are not in `wildcards.keys()`. """ # perform the partial expansion from f's string representation s = str(f).replace('{', '{{').replace('}', '}}') for key in wildcards.keys(): s = s.replace('{{{{{}}}}}'.format(key), '{{{}}}'.format(key)) # build result anno_s = AnnotatedString(s) anno_s.flags = f.flags return IOFile(anno_s, f.rule)