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
Example #2
0
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))
Example #3
0
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"
Example #4
0
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"
Example #5
0
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"
Example #6
0
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"