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)
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)
def __init__(self, ctx: ClassDefContext): self._ctx = ctx self.dclass = DataclassTransformer(self._ctx)
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, )