Beispiel #1
0
    def transform_iter(self, node, results):
        """Call six.(iter|view)items() and friends."""
        # Make sure six is imported.
        libmodernize.touch_import(None, u'six', node)

        # Copy of self.transform() from fissix.fix_dict with some changes to
        # use the six.* methods.

        head = results['head']
        method = results['method'][0]  # Extract node for method name
        tail = results['tail']
        syms = self.syms
        method_name = method.value
        name = fixer_util.Name(u'six.' + method_name, prefix=node.prefix)
        assert method_name.startswith((u'iter', u'view')), repr(method)
        assert method_name[4:] in (u'keys', u'items', u'values'), repr(method)
        head = [n.clone() for n in head]
        tail = [n.clone() for n in tail]
        new = pytree.Node(syms.power, head)
        new.prefix = u''
        new = fixer_util.Call(name, [new])
        if tail:
            new = pytree.Node(syms.power, [new] + tail)
        new.prefix = node.prefix
        return new
Beispiel #2
0
    def transform_iter(self, node, results):
        """Call six.(iter|view)items() and friends."""
        # Make sure six is imported.
        libmodernize.touch_import(None, "six", node)

        # Copy of self.transform() from fissix.fix_dict with some changes to
        # use the six.* methods.

        head = results["head"]
        method = results["method"][0]  # Extract node for method name
        tail = results["tail"]
        syms = self.syms
        method_name = method.value
        name = fixer_util.Name("six." + method_name, prefix=node.prefix)
        assert method_name.startswith(("iter", "view")), repr(method)
        assert method_name[4:] in ("keys", "items", "values"), repr(method)
        head = [n.clone() for n in head]
        tail = [n.clone() for n in tail]
        new = pytree.Node(syms.power, head)
        new.prefix = ""
        new = fixer_util.Call(name, [new])
        if tail:
            new = pytree.Node(syms.power, [new] + tail)
        new.prefix = node.prefix
        return new
Beispiel #3
0
 def test_pre_order(self):
     l1 = pytree.Leaf(100, "foo")
     l2 = pytree.Leaf(100, "bar")
     l3 = pytree.Leaf(100, "fooey")
     c1 = pytree.Node(1000, [l1, l2])
     n1 = pytree.Node(1000, [c1, l3])
     self.assertEqual(list(n1.pre_order()), [n1, c1, l1, l2, l3])
Beispiel #4
0
    def test_changed(self):
        l1 = pytree.Leaf(100, "f")
        self.assertFalse(l1.was_changed)
        l1.changed()
        self.assertTrue(l1.was_changed)

        l1 = pytree.Leaf(100, "f")
        n1 = pytree.Node(1000, [l1])
        self.assertFalse(n1.was_changed)
        n1.changed()
        self.assertTrue(n1.was_changed)

        l1 = pytree.Leaf(100, "foo")
        l2 = pytree.Leaf(100, "+")
        l3 = pytree.Leaf(100, "bar")
        n1 = pytree.Node(1000, [l1, l2, l3])
        n2 = pytree.Node(1000, [n1])
        self.assertFalse(l1.was_changed)
        self.assertFalse(n1.was_changed)
        self.assertFalse(n2.was_changed)

        n1.changed()
        self.assertTrue(n1.was_changed)
        self.assertTrue(n2.was_changed)
        self.assertFalse(l1.was_changed)
Beispiel #5
0
 def test_wildcard(self):
     # Build a tree for testing
     l1 = pytree.Leaf(100, "foo")
     l2 = pytree.Leaf(100, "bar")
     l3 = pytree.Leaf(100, "foo")
     n1 = pytree.Node(1000, [l1, l2])
     n2 = pytree.Node(1000, [l3])
     root = pytree.Node(1000, [n1, n2])
     # Build a pattern
     pl = pytree.LeafPattern(100, "foo", name="pl")
     pn = pytree.NodePattern(1000, [pl], name="pn")
     pw = pytree.WildcardPattern([[pn], [pl, pl]], name="pw")
     r = {}
     self.assertFalse(pw.match_seq([root], r))
     self.assertEqual(r, {})
     self.assertFalse(pw.match_seq([n1], r))
     self.assertEqual(r, {})
     self.assertTrue(pw.match_seq([n2], r))
     # These are easier to debug
     self.assertEqual(sorted(r.keys()), ["pl", "pn", "pw"])
     self.assertEqual(r["pl"], l1)
     self.assertEqual(r["pn"], n2)
     self.assertEqual(r["pw"], [n2])
     # But this is equivalent
     self.assertEqual(r, {"pl": l1, "pn": n2, "pw": [n2]})
     r = {}
     self.assertTrue(pw.match_seq([l1, l3], r))
     self.assertEqual(r, {"pl": l3, "pw": [l1, l3]})
     self.assertIs(r["pl"], l3)
     r = {}
Beispiel #6
0
    def transform(self, node, results):
        single = results.get("single")
        if single:
            # Make a fake listmaker
            fake = pytree.Node(syms.listmaker, [single.clone()])
            single.replace(fake)
            items = fake
        else:
            items = results["items"]

        # Build the contents of the literal
        literal = [pytree.Leaf(token.LBRACE, "{")]
        literal.extend(n.clone() for n in items.children)
        literal.append(pytree.Leaf(token.RBRACE, "}"))
        # Set the prefix of the right brace to that of the ')' or ']'
        literal[-1].prefix = items.next_sibling.prefix
        maker = pytree.Node(syms.dictsetmaker, literal)
        maker.prefix = node.prefix

        # If the original was a one tuple, we need to remove the extra comma.
        if len(maker.children) == 4:
            n = maker.children[2]
            n.remove()
            maker.children[-1].prefix = n.prefix

        # Finally, replace the set call with our shiny new literal.
        return maker
Beispiel #7
0
 def test_basic_patterns(self):
     # Build a tree
     l1 = pytree.Leaf(100, "foo")
     l2 = pytree.Leaf(100, "bar")
     l3 = pytree.Leaf(100, "foo")
     n1 = pytree.Node(1000, [l1, l2])
     n2 = pytree.Node(1000, [l3])
     root = pytree.Node(1000, [n1, n2])
     # Build a pattern matching a leaf
     pl = pytree.LeafPattern(100, "foo", name="pl")
     r = {}
     self.assertFalse(pl.match(root, results=r))
     self.assertEqual(r, {})
     self.assertFalse(pl.match(n1, results=r))
     self.assertEqual(r, {})
     self.assertFalse(pl.match(n2, results=r))
     self.assertEqual(r, {})
     self.assertTrue(pl.match(l1, results=r))
     self.assertEqual(r, {"pl": l1})
     r = {}
     self.assertFalse(pl.match(l2, results=r))
     self.assertEqual(r, {})
     # Build a pattern matching a node
     pn = pytree.NodePattern(1000, [pl], name="pn")
     self.assertFalse(pn.match(root, results=r))
     self.assertEqual(r, {})
     self.assertFalse(pn.match(n1, results=r))
     self.assertEqual(r, {})
     self.assertTrue(pn.match(n2, results=r))
     self.assertEqual(r, {"pn": n2, "pl": l3})
     r = {}
     self.assertFalse(pn.match(l1, results=r))
     self.assertEqual(r, {})
     self.assertFalse(pn.match(l2, results=r))
     self.assertEqual(r, {})
Beispiel #8
0
    def test_node_prev_sibling(self):
        n1 = pytree.Node(1000, [])
        n2 = pytree.Node(1000, [])
        p1 = pytree.Node(1000, [n1, n2])

        self.assertIs(n2.prev_sibling, n1)
        self.assertEqual(n1.prev_sibling, None)
        self.assertEqual(p1.prev_sibling, None)
Beispiel #9
0
    def test_leaves(self):
        l1 = pytree.Leaf(100, "foo")
        l2 = pytree.Leaf(100, "bar")
        l3 = pytree.Leaf(100, "fooey")
        n2 = pytree.Node(1000, [l1, l2])
        n3 = pytree.Node(1000, [l3])
        n1 = pytree.Node(1000, [n2, n3])

        self.assertEqual(list(n1.leaves()), [l1, l2, l3])
Beispiel #10
0
 def test_node_recursive_equality(self):
     l1 = pytree.Leaf(100, "foo")
     l2 = pytree.Leaf(100, "foo")
     n1 = pytree.Node(1000, [l1])
     n2 = pytree.Node(1000, [l2])
     self.assertEqual(n1, n2)
     l3 = pytree.Leaf(100, "bar")
     n3 = pytree.Node(1000, [l3])
     self.assertNotEqual(n1, n3)
Beispiel #11
0
    def test_depth(self):
        l1 = pytree.Leaf(100, "foo")
        l2 = pytree.Leaf(100, "bar")
        n2 = pytree.Node(1000, [l1, l2])
        n3 = pytree.Node(1000, [])
        n1 = pytree.Node(1000, [n2, n3])

        self.assertEqual(l1.depth(), 2)
        self.assertEqual(n3.depth(), 1)
        self.assertEqual(n1.depth(), 0)
Beispiel #12
0
    def test_get_suffix(self):
        l1 = pytree.Leaf(100, "foo", prefix="a")
        l2 = pytree.Leaf(100, "bar", prefix="b")
        n1 = pytree.Node(1000, [l1, l2])

        self.assertEqual(l1.get_suffix(), l2.prefix)
        self.assertEqual(l2.get_suffix(), "")
        self.assertEqual(n1.get_suffix(), "")

        l3 = pytree.Leaf(100, "bar", prefix="c")
        n2 = pytree.Node(1000, [n1, l3])

        self.assertEqual(n1.get_suffix(), l3.prefix)
        self.assertEqual(l3.get_suffix(), "")
        self.assertEqual(n2.get_suffix(), "")
Beispiel #13
0
 def test_generate_matches(self):
     la = pytree.Leaf(1, "a")
     lb = pytree.Leaf(1, "b")
     lc = pytree.Leaf(1, "c")
     ld = pytree.Leaf(1, "d")
     le = pytree.Leaf(1, "e")
     lf = pytree.Leaf(1, "f")
     leaves = [la, lb, lc, ld, le, lf]
     root = pytree.Node(1000, leaves)
     pa = pytree.LeafPattern(1, "a", "pa")
     pb = pytree.LeafPattern(1, "b", "pb")
     pc = pytree.LeafPattern(1, "c", "pc")
     pd = pytree.LeafPattern(1, "d", "pd")
     pe = pytree.LeafPattern(1, "e", "pe")
     pf = pytree.LeafPattern(1, "f", "pf")
     pw = pytree.WildcardPattern(
         [[pa, pb, pc], [pd, pe], [pa, pb], [pc, pd], [pe, pf]],
         min=1,
         max=4,
         name="pw",
     )
     self.assertEqual([x[0] for x in pw.generate_matches(leaves)], [3, 5, 2, 4, 6])
     pr = pytree.NodePattern(type=1000, content=[pw], name="pr")
     matches = list(pytree.generate_matches([pr], [root]))
     self.assertEqual(len(matches), 1)
     c, r = matches[0]
     self.assertEqual(c, 1)
     self.assertEqual(str(r["pr"]), "abcdef")
     self.assertEqual(r["pw"], [la, lb, lc, ld, le, lf])
     for c in "abcdef":
         self.assertEqual(r["p" + c], pytree.Leaf(1, c))
Beispiel #14
0
def build_new_name_node(*, old_node, attach: bool, new_name: str, old_name: str = None):
    # build new node from new_name
    if '.' in new_name:
        children = []
        for part in bowler_helpers.dotted_parts(new_name):
            if part == '.':
                children.append(fixer_util.Dot())
            else:
                children.append(fixer_util.Name(part))
    else:
        children = [fixer_util.Name(new_name)]

    # attach to the new node subimports from the old module
    if attach and type(old_node) is fissix_pytree.Node:
        original_name_size = len(bowler_helpers.dotted_parts(old_name))
        for part in old_node.children[original_name_size:]:
            if part.value == '.':
                children.append(fixer_util.Dot())
            else:
                children.append(fixer_util.Name(part.value))

    return fissix_pytree.Node(
        type=fixer_util.syms.dotted_name,
        children=children,
        prefix=old_node.prefix,
    )
Beispiel #15
0
    def test_remove_parentless(self):
        n1 = pytree.Node(1000, [])
        n1.remove()
        self.assertEqual(n1.parent, None)

        l1 = pytree.Leaf(100, "foo")
        l1.remove()
        self.assertEqual(l1.parent, None)
Beispiel #16
0
 def test_node_prefix(self):
     l1 = pytree.Leaf(100, "foo")
     self.assertEqual(l1.prefix, "")
     n1 = pytree.Node(1000, [l1])
     self.assertEqual(n1.prefix, "")
     n1.prefix = " "
     self.assertEqual(n1.prefix, " ")
     self.assertEqual(l1.prefix, " ")
Beispiel #17
0
    def test_leaf_prev_sibling(self):
        l1 = pytree.Leaf(100, "a")
        l2 = pytree.Leaf(100, "b")
        p1 = pytree.Node(1000, [l1, l2])

        self.assertIs(l2.prev_sibling, l1)
        self.assertEqual(l1.prev_sibling, None)
        self.assertEqual(p1.prev_sibling, None)
Beispiel #18
0
 def test_node_constructor_prefix(self):
     for prefix in ("xyz_", ""):
         l1 = pytree.Leaf(100, "self")
         l2 = pytree.Leaf(100, "foo", prefix="_")
         n1 = pytree.Node(1000, [l1, l2], prefix=prefix)
         self.assertTrue(str(n1), prefix + "self_foo")
         self.assertEqual(n1.prefix, prefix)
         self.assertEqual(l1.prefix, prefix)
         self.assertEqual(l2.prefix, "_")
Beispiel #19
0
    def test_replace_with_list(self):
        l1 = pytree.Leaf(100, "foo")
        l2 = pytree.Leaf(100, "+")
        l3 = pytree.Leaf(100, "bar")
        n1 = pytree.Node(1000, [l1, l2, l3])

        l2.replace([pytree.Leaf(100, "*"), pytree.Leaf(100, "*")])
        self.assertEqual(str(n1), "foo**bar")
        self.assertIsInstance(n1.children, list)
Beispiel #20
0
    def test_node_set_child(self):
        l1 = pytree.Leaf(100, "foo")
        n1 = pytree.Node(1000, [l1])

        l2 = pytree.Leaf(100, "bar")
        n1.set_child(0, l2)
        self.assertEqual(l1.parent, None)
        self.assertEqual(l2.parent, n1)
        self.assertEqual(n1.children, [l2])

        n2 = pytree.Node(1000, [l1])
        n2.set_child(0, n1)
        self.assertEqual(l1.parent, None)
        self.assertEqual(n1.parent, n2)
        self.assertEqual(n2.parent, None)
        self.assertEqual(n2.children, [n1])

        self.assertRaises(IndexError, n1.set_child, 4, l2)
        # I don't care what it raises, so long as it's an exception
        self.assertRaises(Exception, n1.set_child, 0, list)
Beispiel #21
0
 def test_replace(self):
     l1 = pytree.Leaf(100, "foo")
     l2 = pytree.Leaf(100, "+")
     l3 = pytree.Leaf(100, "bar")
     n1 = pytree.Node(1000, [l1, l2, l3])
     self.assertEqual(n1.children, [l1, l2, l3])
     self.assertIsInstance(n1.children, list)
     self.assertFalse(n1.was_changed)
     l2new = pytree.Leaf(100, "-")
     l2.replace(l2new)
     self.assertEqual(n1.children, [l1, l2new, l3])
     self.assertIsInstance(n1.children, list)
     self.assertTrue(n1.was_changed)
Beispiel #22
0
    def test_remove(self):
        l1 = pytree.Leaf(100, "foo")
        l2 = pytree.Leaf(100, "foo")
        n1 = pytree.Node(1000, [l1, l2])
        n2 = pytree.Node(1000, [n1])

        self.assertEqual(n1.remove(), 0)
        self.assertEqual(n2.children, [])
        self.assertEqual(l1.parent, n1)
        self.assertEqual(n1.parent, None)
        self.assertEqual(n2.parent, None)
        self.assertFalse(n1.was_changed)
        self.assertTrue(n2.was_changed)

        self.assertEqual(l2.remove(), 1)
        self.assertEqual(l1.remove(), 0)
        self.assertEqual(n1.children, [])
        self.assertEqual(l1.parent, None)
        self.assertEqual(n1.parent, None)
        self.assertEqual(n2.parent, None)
        self.assertTrue(n1.was_changed)
        self.assertTrue(n2.was_changed)
Beispiel #23
0
    def transform(self, node, results):
        # First, find the sys import. We'll just hope it's global scope.
        if "sys_import" in results:
            if self.sys_import is None:
                self.sys_import = results["sys_import"]
            return

        func = results["func"].clone()
        func.prefix = ""
        register = pytree.Node(syms.power, Attr(Name("atexit"), Name("register")))
        call = Call(register, [func], node.prefix)
        node.replace(call)

        if self.sys_import is None:
            # That's interesting.
            self.warning(
                node,
                "Can't find sys import; Please add an atexit "
                "import at the top of your file.",
            )
            return

        # Now add an atexit import after the sys import.
        names = self.sys_import.children[1]
        if names.type == syms.dotted_as_names:
            names.append_child(Comma())
            names.append_child(Name("atexit", " "))
        else:
            containing_stmt = self.sys_import.parent
            position = containing_stmt.children.index(self.sys_import)
            stmt_container = containing_stmt.parent
            new_import = pytree.Node(
                syms.import_name, [Name("import"), Name("atexit", " ")]
            )
            new = pytree.Node(syms.simple_stmt, [new_import])
            containing_stmt.insert_child(position + 1, Newline())
            containing_stmt.insert_child(position + 2, new)
Beispiel #24
0
 def __call__(self, node: 'LN', capture: 'Capture', filename: 'Filename') -> None:
     old_node = capture['module_name']
     new_node = fissix_pytree.Node(
         type=fixer_util.syms.dotted_as_name,
         children=[
             build_new_name_node(
                 old_node=old_node,
                 new_name=self.new_name,
                 attach=False,
             ),
             fixer_util.Name('as', prefix=' '),
             old_node.clone(),
         ],
     )
     old_node.replace(new_node)
Beispiel #25
0
    def test_node_insert_child(self):
        l1 = pytree.Leaf(100, "foo")
        n1 = pytree.Node(1000, [l1])

        l2 = pytree.Leaf(100, "bar")
        n1.insert_child(0, l2)
        self.assertEqual(l2.parent, n1)
        self.assertEqual(n1.children, [l2, l1])

        l3 = pytree.Leaf(100, "abc")
        n1.insert_child(2, l3)
        self.assertEqual(n1.children, [l2, l1, l3])

        # I don't care what it raises, so long as it's an exception
        self.assertRaises(Exception, n1.insert_child, 0, list)
Beispiel #26
0
    def test_node_append_child(self):
        n1 = pytree.Node(1000, [])

        l1 = pytree.Leaf(100, "foo")
        n1.append_child(l1)
        self.assertEqual(l1.parent, n1)
        self.assertEqual(n1.children, [l1])

        l2 = pytree.Leaf(100, "bar")
        n1.append_child(l2)
        self.assertEqual(l2.parent, n1)
        self.assertEqual(n1.children, [l1, l2])

        # I don't care what it raises, so long as it's an exception
        self.assertRaises(Exception, n1.append_child, list)
Beispiel #27
0
 def test_has_key_example(self):
     pattern = pytree.NodePattern(
         331,
         (
             pytree.LeafPattern(7),
             pytree.WildcardPattern(name="args"),
             pytree.LeafPattern(8),
         ),
     )
     l1 = pytree.Leaf(7, "(")
     l2 = pytree.Leaf(3, "x")
     l3 = pytree.Leaf(8, ")")
     node = pytree.Node(331, [l1, l2, l3])
     r = {}
     self.assertTrue(pattern.match(node, r))
     self.assertEqual(r["args"], [l2])
Beispiel #28
0
    def _modify_power(self, node):
        prefix = node.children[0].prefix

        # remove old prefix
        parts = bowler_helpers.dotted_parts(self.old_name)
        for _ in range((len(parts) + 1) // 2):
            node.children.pop(0)

        # add new prefix
        name = self.new_name.split('.', maxsplit=1)[0]
        head = fixer_util.Name(name, prefix=prefix)
        children = []
        for part in bowler_helpers.dotted_parts(self.new_name)[2::2]:
            children.append(fissix_pytree.Node(
                type=fixer_util.syms.trailer,
                children=[fixer_util.Dot(), fixer_util.Name(part)],
            ))
        node.children = [head] + children + node.children
Beispiel #29
0
 def test_node_repr(self):
     l1 = pytree.Leaf(100, "foo")
     l2 = pytree.Leaf(100, "bar", context=(" ", (1, 0)))
     n1 = pytree.Node(1000, [l1, l2])
     self.assertEqual(repr(n1), "Node(1000, [%s, %s])" % (repr(l1), repr(l2)))
Beispiel #30
0
 def test_node_str(self):
     l1 = pytree.Leaf(100, "foo")
     l2 = pytree.Leaf(100, "bar", context=(" ", (1, 0)))
     n1 = pytree.Node(1000, [l1, l2])
     self.assertEqual(str(n1), "foo bar")