Exemple #1
0
 def test_keywords_to_dict(self):
   keywords = parsing.parse_expression('f(a=b, c=1, d=\'e\')').keywords
   d = ast_util.keywords_to_dict(keywords)
   # Make sure we generate a usable dict node by attaching it to a variable and
   # compiling everything.
   node = parsing.parse_str('def f(b): pass').body[0]
   node.body.append(ast.Return(d))
   result, _ = parsing.ast_to_object(node)
   self.assertDictEqual(result.f(3), {'a': 3, 'c': 1, 'd': 'e'})
Exemple #2
0
    def test_replace_expression_context(self):
        template = """
      def test_fn():
        foo
    """

        node = templates.replace(
            template, foo=parsing.parse_expression('a + 2 * b / -c'))[0]
        self.assertIsInstance(node.body[0].left.ctx, gast.Load)
        self.assertIsInstance(node.body[0].right.left.right.ctx, gast.Load)
Exemple #3
0
    def test_replace_name_with_dict(self):
        template = """
      def test_fn():
        return foo['bar']
    """

        source = parsing.parse_expression('{\'bar\': 3}')
        node = templates.replace(template, foo=source)[0]
        result, _ = parsing.ast_to_object(node)
        self.assertEqual(3, result.test_fn())
Exemple #4
0
    def test_replace_index(self):
        template = """
      def test_fn():
        foo = 0
    """

        node = templates.replace(
            template, foo=parsing.parse_expression('foo(a[b]).bar'))[0]
        function_call_arg = node.body[0].targets[0].value.args[0]
        self.assertIsInstance(function_call_arg.ctx, gast.Load)
        self.assertIsInstance(function_call_arg.slice.value.ctx, gast.Load)
Exemple #5
0
    def test_replace_tuple_context(self):
        template = """
      def test_fn(foo):
        foo = 0
    """

        node = templates.replace(template,
                                 foo=parsing.parse_expression('(a, b)'))[0]
        self.assertIsInstance(node.body[0].targets[0].ctx, gast.Store)
        self.assertIsInstance(node.body[0].targets[0].elts[0].ctx, gast.Store)
        self.assertIsInstance(node.body[0].targets[0].elts[1].ctx, gast.Store)
Exemple #6
0
    def test_replace_attribute_context(self):
        template = """
      def test_fn(foo):
        foo = 0
    """

        node = templates.replace(template,
                                 foo=parsing.parse_expression('a.b.c'))[0]
        self.assertIsInstance(node.body[0].targets[0].ctx, gast.Store)
        self.assertIsInstance(node.body[0].targets[0].value.ctx, gast.Load)
        self.assertIsInstance(node.body[0].targets[0].value.value.ctx,
                              gast.Load)
Exemple #7
0
    def test_replace_complex_context(self):
        template = """
      def test_fn():
        foo = 0
    """

        node = templates.replace(
            template, foo=parsing.parse_expression('bar(([a, b],)).baz'))[0]
        self.assertIsInstance(node.body[0].targets[0].ctx, gast.Store)
        function_call_arg = node.body[0].targets[0].value.args[0]
        self.assertIsInstance(function_call_arg.elts[0].ctx, gast.Load)
        self.assertIsInstance(function_call_arg.elts[0].elts[0].ctx, gast.Load)
        self.assertIsInstance(function_call_arg.elts[0].elts[1].ctx, gast.Load)
Exemple #8
0
    def test_replace_name_with_call(self):
        template = """
      def test_fn():
        b = 5
        def g(a):
          return 3 * a
        def f():
          return g
        return foo
    """

        source = parsing.parse_expression('f()(b)')
        node = templates.replace(template, foo=source)[0]
        result, _ = parsing.ast_to_object(node)
        self.assertEqual(15, result.test_fn())
Exemple #9
0
    def test_replace_call_keyword(self):
        template = """
      def test_fn():
        def f(a, d, f):
          return a + d + f
        return f(1, kws=None)
    """

        source = parsing.parse_expression('f(d=3, f=5)')
        node = templates.replace(template, kws=source.keywords)[0]
        result, _ = parsing.ast_to_object(node)
        self.assertEqual(9, result.test_fn())

        with self.assertRaises(ValueError):
            templates.replace(template, kws=[])
            templates.replace(template, kws=1)
Exemple #10
0
def apply_to_single_assignments(targets, values, apply_fn):
    """Applies a function to each individual assignment.

  This function can process a possibly-unpacked (e.g. a, b = c, d) assignment.
  It tries to break down the unpacking if possible. In effect, it has the same
  effect as passing the assigned values in SSA form to apply_fn.

  Examples:

  The following will result in apply_fn(a, c), apply_fn(b, d):

      a, b = c, d

  The following will result in apply_fn(a, c[0]), apply_fn(b, c[1]):

      a, b = c

  The following will result in apply_fn(a, (b, c)):

      a = b, c

  It uses the visitor pattern to allow subclasses to process single
  assignments individually.

  Args:
    targets: Union[List[ast.AST, ...], Tuple[ast.AST, ...], ast.AST, should be
      used with the targets field of an ast.Assign node
    values: ast.AST
    apply_fn: Callable[[ast.AST, ast.AST], None], called with the respective
      nodes of each single assignment
  """
    if not isinstance(targets, (list, tuple)):
        targets = (targets, )
    for target in targets:
        if isinstance(target, (gast.Tuple, gast.List)):
            for i in range(len(target.elts)):
                target_el = target.elts[i]
                if isinstance(values, (gast.Tuple, gast.List)):
                    value_el = values.elts[i]
                else:
                    idx = parsing.parse_expression(str(i))
                    value_el = gast.Subscript(values,
                                              gast.Index(idx),
                                              ctx=gast.Load())
                apply_to_single_assignments(target_el, value_el, apply_fn)
        else:
            apply_fn(target, values)
Exemple #11
0
 def assertNoMatch(self, target_str, pattern_str):
   node = parsing.parse_expression(target_str)
   pattern = parsing.parse_expression(pattern_str)
   self.assertFalse(ast_util.matches(node, pattern))
Exemple #12
0
 def test_parse_expression(self):
     node = parsing.parse_expression('a.b')
     self.assertEqual('a', node.value.id)
     self.assertEqual('b', node.attr)
Exemple #13
0
def from_str(qn_str):
    node = parsing.parse_expression(qn_str)
    node = resolve(node)
    return anno.getanno(node, anno.Basic.QN)
Exemple #14
0
 def test_function_call_in_list(self):
     template = """
     foo(bar)
 """
     source = parsing.parse_expression('[a(b(1))]')
     templates.replace_as_expression(template, bar=source)