Exemple #1
0
def _immutable_hook(context: ClassDefContext):
    cls: ClassDef = context.cls
    if not cls.info.has_base(_IMMUTABLE):
        return
    transformer = DataclassTransformer(context)
    transformer.transform()
    attributes = transformer.collect_attributes()
    transformer._freeze(attributes)
Exemple #2
0
def datafile_class_maker_callback(ctx: ClassDefContext) -> None:
    # Inherit all type definitions from dataclasses
    DataclassTransformer(ctx).transform()

    # Define 'objects' as a class propery
    var = Var("objects", AnyType(TypeOfAny.unannotated))
    var.info = ctx.cls.info
    var.is_property = True
    ctx.cls.info.names[var.name] = SymbolTableNode(MDEF, var)

    # Define 'datafile' as an instance property
    var = Var("datafile", AnyType(TypeOfAny.unannotated))
    var.info = ctx.cls.info
    var.is_property = True
    ctx.cls.info.names[var.name] = SymbolTableNode(MDEF, var)
Exemple #3
0
 def __init__(self, ctx: ClassDefContext):
     self._ctx = ctx
     self.dclass = DataclassTransformer(self._ctx)
Exemple #4
0
class TypicTransformer:
    """A transformer for allowing MyPy to recognize typical klasses."""
    def __init__(self, ctx: ClassDefContext):
        self._ctx = ctx
        self.dclass = DataclassTransformer(self._ctx)

    def transform(self) -> None:
        self.dclass.transform()
        self._add_self_tvar_expr(self._ctx)
        jsonschema = _get_decorator_bool_argument(self._ctx, "jsonschema",
                                                  True)
        if jsonschema:
            self.add_schema_method()
        self.add_primitive_method()
        self.add_transmute_method()
        self.add_validate_method()
        self.add_json_method()
        self.add_translate_method()
        self.add_iterate_method()
        self.add_iter_method()

    @staticmethod
    def _get_tvar_name(name: str, info) -> str:
        return f"{info.fullname}.{name}"

    def _get_tvar_self_name(self) -> str:
        return self._get_tvar_name(SELF_TVAR_NAME, self._ctx.cls.info)

    def _add_tvar_expr(self, name: str, ctx):
        info = ctx.cls.info
        obj_type = ctx.api.named_type("__builtins__.object")
        self_tvar_expr = TypeVarExpr(name, self._get_tvar_name(name, info), [],
                                     obj_type)
        info.names[name] = SymbolTableNode(MDEF, self_tvar_expr)

    def _add_self_tvar_expr(self, ctx):
        self._add_tvar_expr(SELF_TVAR_NAME, ctx)

    def _get_tvar_def(self, name: str, ctx):
        obj_type = ctx.api.named_type("__builtins__.object")
        return TypeVarDef(SELF_TVAR_NAME,
                          self._get_tvar_name(name, ctx.cls.info), -1, [],
                          obj_type)

    def add_schema_method(self):
        ctx = self._ctx
        api: SemanticAnalyzer = ctx.api
        return_type_info: SymbolTableNode = api.lookup_fully_qualified(
            "typic.SchemaReturnT")
        self_tvar_def = self._get_tvar_def(SELF_TVAR_NAME, ctx)
        arg_type = api.named_type("__builtins__.bool")
        arg = Argument(Var("primitive", arg_type), arg_type, None,
                       ARG_NAMED_OPT)
        add_method(
            ctx,
            "schema",
            args=[arg],
            return_type=return_type_info.node.target,
            self_type=TypeVarType(self_tvar_def),
            tvar_def=self_tvar_def,
            is_classmethod=True,
        )

    def add_primitive_method(self):
        ctx = self._ctx
        self_tvar_def = self._get_tvar_def(SELF_TVAR_NAME, ctx)
        bool_type = ctx.api.named_type("__builtins__.bool")
        arg = Argument(Var("lazy", bool_type), bool_type, None, ARG_NAMED_OPT)
        add_method(
            ctx,
            "primitive",
            args=[arg],
            return_type=AnyType(TypeOfAny.unannotated),
            self_type=TypeVarType(self_tvar_def),
            tvar_def=self_tvar_def,
        )

    def add_json_method(self):
        ctx = self._ctx
        self_tvar_def = self._get_tvar_def(SELF_TVAR_NAME, ctx)
        bool_type = ctx.api.named_type("__builtins__.bool")
        int_type = ctx.api.named_type("__builtins__.int")
        str_type = ctx.api.named_type("__builtins__.str")
        indent = Argument(Var("indent", int_type), int_type, None,
                          ARG_NAMED_OPT)
        ensure = Argument(Var("ensure_ascii", bool_type), bool_type, None,
                          ARG_NAMED_OPT)
        add_method(
            ctx,
            "tojson",
            args=[indent, ensure],
            return_type=str_type,
            self_type=TypeVarType(self_tvar_def),
            tvar_def=self_tvar_def,
        )

    def add_validate_method(self):
        ctx = self._ctx
        self_tvar_def = self._get_tvar_def(SELF_TVAR_NAME, ctx)
        arg_type = AnyType(TypeOfAny.explicit)
        arg = Argument(Var("obj", arg_type), arg_type, None, ARG_POS)
        add_method(
            ctx,
            "validate",
            args=[arg],
            return_type=TypeVarType(self_tvar_def),
            tvar_def=self_tvar_def,
            is_staticmethod=True,
        )

    def add_transmute_method(self):
        ctx = self._ctx
        self_tvar_def = self._get_tvar_def(SELF_TVAR_NAME, ctx)
        arg_type = AnyType(TypeOfAny.explicit)
        arg = Argument(Var("obj", arg_type), arg_type, None, ARG_POS)
        add_method(
            ctx,
            "transmute",
            args=[arg],
            return_type=TypeVarType(self_tvar_def),
            tvar_def=self_tvar_def,
            is_staticmethod=True,
        )

    def add_translate_method(self):
        ctx = self._ctx
        self_tvar_def = self._get_tvar_def(SELF_TVAR_NAME, ctx)
        r_type = AnyType(TypeOfAny.explicit)
        arg_type = TypeType(r_type)
        arg = Argument(Var("target", arg_type), arg_type, None, ARG_POS)
        add_method(
            ctx,
            "translate",
            args=[arg],
            return_type=r_type,
            self_type=TypeVarType(self_tvar_def),
            tvar_def=self_tvar_def,
        )

    def add_iterate_method(self):
        ctx = self._ctx
        self_tvar_def = self._get_tvar_def(SELF_TVAR_NAME, ctx)
        r_type = AnyType(TypeOfAny.explicit)
        bool_type = ctx.api.named_type("__builtins__.bool")
        arg = Argument(Var("values", bool_type), bool_type, None,
                       ARG_NAMED_OPT)
        add_method(
            ctx,
            "iterate",
            args=[arg],
            return_type=r_type,
            self_type=TypeVarType(self_tvar_def),
            tvar_def=self_tvar_def,
        )

    def add_iter_method(self):
        ctx = self._ctx
        self_tvar_def = self._get_tvar_def(SELF_TVAR_NAME, ctx)
        r_type = AnyType(TypeOfAny.explicit)
        bool_type = ctx.api.named_type("__builtins__.bool")
        arg = Argument(Var("values", bool_type), bool_type, None,
                       ARG_NAMED_OPT)
        add_method(
            ctx,
            "__iter__",
            args=[arg],
            return_type=r_type,
            self_type=TypeVarType(self_tvar_def),
            tvar_def=self_tvar_def,
        )