def modify(self, base, additional): t0 = RedBaron(base) t1 = RedBaron(additional) d = OrderedDict() used = set() for node in t0.find_all("def", recursive=False): used.add(node.name) d[node.name] = node for node in t1.find_all("def", recursive=False): if node.name in used: original = d[node.name] self.on_update(node.name, node, original) else: newnode = self.on_create(node.name, node) if newnode is not None: t0.append(newnode) d[node.name] = newnode self.on_additional(t0, d) return t0
def merge(source, delta): if isinstance(source, six.string_types): source = RedBaron(source) if isinstance(delta, six.string_types): delta = RedBaron(delta) if isinstance(source, DictNode) and isinstance(delta, DictNode): # two dictionaries source_value = source.to_python() delta_value = delta.to_python() source_value.update(delta_value) return RedBaron(str_format(source_value))[0].dumps() if isinstance(source, (ListNode, TupleNode)) and isinstance( delta, (ListNode, TupleNode)): # two lists source_value = source.to_python() delta_value = delta.to_python() value = merge_lists(source_value, delta_value) return RedBaron(str_format(value))[0].dumps() if isinstance(source, LiteralyEvaluable) and isinstance( delta, LiteralyEvaluable): # all other literals -> take new value return delta elif isinstance(source, FromImportNode) and isinstance( delta, FromImportNode): targets = merge_lists([str(x) for x in source.targets], [str(x) for x in delta.targets]) source.targets = ",".join(targets) return source if isinstance(source, AssignmentNode) and isinstance( delta, AssignmentNode): source.value = merge(source.value, delta.value) return source if isinstance(source, ImportNode) and isinstance(delta, ImportNode): return delta if isinstance(source, ReturnNode) and isinstance(delta, ReturnNode): return delta if hasattr(source, "node_list") and hasattr(delta, "node_list"): # two node lists for delta_node in delta: found = False delta_id = get_id(delta_node) if delta_id: for i, source_node in enumerate(source): source_id = get_id(source_node) if source_node.type == delta_node.type and delta_id == source_id: # found node with matching id # => replace with merged node source[i] = merge(source_node, delta_node) found = True break if not found: # no matching node, append to list source.append(delta_node) return source.dumps() raise Exception("Can't merge %s into %s" % (delta, source))
def test_root_as_line_proxy_list_append(): red = RedBaron("a\nb\nc\n") red.append("c") assert red.dumps() == "a\nb\nc\nc\n"
def test_root_as_line_proxy_list_append(): red = RedBaron("a\nb\nc\n") red.append("c") assert red.dumps() == "a\nb\nc\nc\n"
def test_dont_add_newlines_after_import(): red = RedBaron("import a\n\nimport b\n\npouet\n") red.append("plop") assert red.dumps() == "import a\n\nimport b\n\npouet\nplop\n"
def test_dont_add_newlines_after_import(): red = RedBaron("import a\n\nimport b\n\npouet\n") red.append("plop") assert red.dumps() == "import a\n\nimport b\n\npouet\nplop\n"