def get_key_from_data_object(self, key: str) -> ast.Call:
     return ast.Call(
         func=ast.Attribute(value=ast.Name(id="data"), attr="get"),
         args=[ast.Str(s=key)],
         keywords=[],
         starargs=None,
         kwargs=None,
     )
Beispiel #2
0
 def _make_field(self, field: str, args: List, keywords: List) -> ast.Call:
     return ast.Call(
         func=ast.Attribute(value=ast.Name(id="fields_"), attr=field),
         args=args,
         keywords=keywords,
         starargs=None,
         kwargs=None,
     )
    def get_klass_constructor(self, properties: PropertiesType,
                              requireds: RequiredType) -> ast.FunctionDef:
        # Prepare body
        fn_body = []

        # Default value for `data` argument
        if len(properties) > 0:
            fn_body.append(
                ast.Assign(
                    targets=[ast.Name(id="data")],
                    value=ast.BoolOp(op=ast.Or(),
                                     values=[
                                         ast.Name(id="data"),
                                         ast.Dict(keys=[], values=[])
                                     ]),
                ))

        for key in sorted(properties.keys()):
            # Get default value
            property_ = properties[key]
            is_required = key in requireds

            value = self.get_member_value(key,
                                          property_,
                                          is_required=is_required)

            # Build assign expression
            attribute = ast.Assign(
                targets=[ast.Attribute(value=ast.Name(id="self"), attr=key)],
                value=value)

            # Add to body
            fn_body.append(attribute)

        # Bundle function arguments and keywords
        fn_arguments = ast.arguments(
            args=[
                ast.arg(arg="self", annotation=None),
                ast.arg(arg="data", annotation=None)
            ],
            vararg=None,
            kwarg=None,
            kwonlyargs=[],
            kw_defaults=[],
            defaults=[ast.NameConstant(value=None)],
        )

        # Generate class constructor
        fn_init = ast.FunctionDef(name="__init__",
                                  args=fn_arguments,
                                  body=fn_body,
                                  decorator_list=[],
                                  returns=None)

        # Return constructor
        return fn_init
    def _get_dict_comprehension_for_property(self, key, property_):
        # key, value
        comp_key = ast.Name(id="k")
        comp_value = ast.Call(
            func=ast.Name(id="Value"),
            args=[ast.Name(id="v")],
            keywords=[],
            starargs=None,
            kwargs=None,
        )

        generator = ast.comprehension(
            target=ast.Tuple(elts=[ast.Name(
                id="k"), ast.Name(id="v")]),
            iter=ast.Call(
                func=ast.Attribute(
                    value=self.get_key_with_default_for_data_object(
                        key, property_),
                    attr="iteritems",
                ),
                args=[],
                keywords=[],
                starargs=None,
                kwargs=None,
            ),
            ifs=[],
            is_async=0,
        )

        # Dit comprehension
        dict_comp = ast.DictComp(key=comp_key,
                                 value=comp_value,
                                 generators=[generator])

        # Return node
        return dict_comp