Ejemplo n.º 1
0
    def parse(self, parser):
        node = jinja2.nodes.Macro(lineno=next(parser.stream).lineno)
        materialization_name = \
            parser.parse_assign_target(name_only=True).name

        adapter_name = 'default'
        node.args = []
        node.defaults = []

        while parser.stream.skip_if('comma'):
            target = parser.parse_assign_target(name_only=True)

            if target.name == 'default':
                pass

            elif target.name == 'adapter':
                parser.stream.expect('assign')
                value = parser.parse_expression()
                adapter_name = value.value

            else:
                dbt.exceptions.invalid_materialization_argument(
                    materialization_name, target.name)

        node.name = dbt.utils.get_materialization_macro_name(
            materialization_name, adapter_name)

        node.body = parser.parse_statements(('name:endmaterialization', ),
                                            drop_needle=True)

        return node
Ejemplo n.º 2
0
    def parse(self, parser):
        node = jinja2.nodes.Macro(lineno=next(parser.stream).lineno)
        materialization_name = \
            parser.parse_assign_target(name_only=True).name

        adapter_name = 'default'
        node.args = []
        node.defaults = []

        while parser.stream.skip_if('comma'):
            target = parser.parse_assign_target(name_only=True)

            if target.name == 'default':
                pass

            elif target.name == 'adapter':
                parser.stream.expect('assign')
                value = parser.parse_expression()
                adapter_name = value.value

            else:
                dbt.exceptions.invalid_materialization_argument(
                    materialization_name, target.name)

        node.name = dbt.utils.get_materialization_macro_name(
            materialization_name, adapter_name)

        node.body = parser.parse_statements(('name:endmaterialization',),
                                            drop_needle=True)

        return node
Ejemplo n.º 3
0
 def _parse_load(self, parser, type):
     lineno = next(parser.stream).lineno
     parser.stream.expect('name:as')
     target = parser.parse_assign_target(name_only=True).name
     body_nodes = parser.parse_statements(('name:endload', ),
                                          drop_needle=True)
     # Since Jinja 2.10, the AssignBlock node has a filter field that could
     # directly be used to apply a filter. Unfortunately, this would make our
     # code incompatible with earlier versions of Jinja, so we set it to None
     # if it exists and add a separate FilterNode.
     if 'filter' in jinja2.nodes.AssignBlock.fields:
         assign_block_node = jinja2.nodes.AssignBlock(jinja2.nodes.Name(
             target, 'store', lineno=lineno),
                                                      None,
                                                      body_nodes,
                                                      lineno=lineno)
     else:
         assign_block_node = jinja2.nodes.AssignBlock(jinja2.nodes.Name(
             target, 'store', lineno=lineno),
                                                      body_nodes,
                                                      lineno=lineno)
     filter_name = 'load_' + type
     filter_node = jinja2.nodes.Filter(jinja2.nodes.Name(target,
                                                         'load',
                                                         lineno=lineno),
                                       filter_name, [], [],
                                       None,
                                       None,
                                       lineno=lineno)
     assign_node = jinja2.nodes.Assign(jinja2.nodes.Name(target,
                                                         'store',
                                                         lineno=lineno),
                                       filter_node,
                                       lineno=lineno)
     return [assign_block_node, assign_node]
Ejemplo n.º 4
0
 def _parse_import(self, parser, type):
     # We do not use parser.parse_import here because it is not clear whether
     # that function is part of the stable API (the documentation does not
     # mention that method).
     lineno = next(parser.stream).lineno
     import_node = jinja2.nodes.Import(lineno=lineno)
     import_node.template = parser.parse_expression()
     parser.stream.expect('name:as')
     import_node.target = parser.parse_assign_target(name_only=True).name
     if (parser.stream.current.test_any('name:with', 'name:without')
             and parser.stream.look().test('name:context')):
         import_node.with_context = next(parser.stream).value == 'with'
         parser.stream.skip()
     else:
         import_node.with_context = False
     # The import node will take care of loading the referenced template and
     # making its contents available under the specified variable name. We
     # still have to transform the variable by deserializing the JSON or YAML
     # string. We do this by applying the appropriate filter on the variable
     # and assigning the result back to the variable.
     filter_name = 'load_' + type
     filter_node = jinja2.nodes.Filter(jinja2.nodes.Name(import_node.target,
                                                         'load',
                                                         lineno=lineno),
                                       filter_name, [], [],
                                       None,
                                       None,
                                       lineno=lineno)
     assign_node = jinja2.nodes.Assign(jinja2.nodes.Name(import_node.target,
                                                         'store',
                                                         lineno=lineno),
                                       filter_node,
                                       lineno=lineno)
     return [import_node, assign_node]
Ejemplo n.º 5
0
    def parse(self, parser):
        node = jinja2.nodes.Macro(lineno=next(parser.stream).lineno)
        operation_name = \
            parser.parse_assign_target(name_only=True).name

        node.args = []
        node.defaults = []

        while parser.stream.skip_if('comma'):
            target = parser.parse_assign_target(name_only=True)

        node.name = dbt.utils.get_operation_macro_name(operation_name)

        node.body = parser.parse_statements(('name:endoperation', ),
                                            drop_needle=True)

        return node
Ejemplo n.º 6
0
    def parse(self, parser):
        node = jinja2.nodes.Macro(lineno=next(parser.stream).lineno)
        docs_name = parser.parse_assign_target(name_only=True).name

        node.args = []
        node.defaults = []
        node.name = dbt.utils.get_docs_macro_name(docs_name)
        node.body = parser.parse_statements(('name:enddocs', ),
                                            drop_needle=True)
        return node
Ejemplo n.º 7
0
    def parse(self, parser):
        node = jinja2.nodes.Macro(lineno=next(parser.stream).lineno)
        test_name = parser.parse_assign_target(name_only=True).name

        parser.parse_signature(node)
        node.defaults = []
        node.name = get_test_macro_name(test_name)
        node.body = parser.parse_statements(('name:endtest', ),
                                            drop_needle=True)
        return node
Ejemplo n.º 8
0
    def parse(self, parser):
        node = jinja2.nodes.Macro(lineno=next(parser.stream).lineno)
        docs_name = parser.parse_assign_target(name_only=True).name

        node.args = []
        node.defaults = []
        node.name = dbt.utils.get_docs_macro_name(docs_name)
        node.body = parser.parse_statements(('name:enddocs',),
                                            drop_needle=True)
        return node
Ejemplo n.º 9
0
 def _parse_qblock(self, parser, lineno):
     name = parser.parse_assign_target(name_only=True).name
     body = parser.parse_statements(['name:endqblock'], drop_needle=True)
     return nodes.If(
         nodes.Compare(  # test
             nodes.Const(name),
             [nodes.Operand('in', nodes.Name('__blocks__', 'load'))]),
         body,
         [],  # elif_
         []  # orelse
     ).set_lineno(lineno)
Ejemplo n.º 10
0
 def _parse_query(self, parser, lineno):
     name = parser.parse_assign_target(with_tuple=False).name
     body = parser.parse_statements(['name:endquery'], drop_needle=True)
     # name, params, defaults, body
     return nodes.Macro(name, [nodes.Name('__blocks__', 'param')], [],
                        body).set_lineno(lineno)