File tree Expand file tree Collapse file tree 6 files changed +110
-0
lines changed
Expand file tree Collapse file tree 6 files changed +110
-0
lines changed Original file line number Diff line number Diff line change 1+ from typing import (
2+ NewType ,
3+ )
4+
5+
6+ UserId = NewType ('UserId' , int )
7+
8+
9+ def name_by_id (user_id : UserId ) -> str :
10+ return str (user_id )
11+
12+
13+ class SomeClass :
14+ a : int
15+
16+
17+ SomeClassInNewType = NewType ('SomeClassInNewType' , SomeClass )
Original file line number Diff line number Diff line change 1+ from py_codegen .test_fixtures .new_type import (
2+ name_by_id ,
3+ SomeClassInNewType ,
4+ )
5+ from py_codegen .type_extractor .__tests__ .utils import traverse , cleanup
6+ from py_codegen .type_extractor .nodes .ClassFound import ClassFound
7+ from py_codegen .type_extractor .nodes .FunctionFound import FunctionFound
8+ from py_codegen .type_extractor .nodes .NewType import NewTypeFound
9+ from py_codegen .type_extractor .nodes .TypeVarFound import TypeVarFound
10+ from py_codegen .type_extractor .type_extractor import TypeExtractor
11+
12+
13+ def test_newtype ():
14+ type_extractor = TypeExtractor ()
15+ type_extractor .add ()(name_by_id )
16+ type_extractor .add ()(SomeClassInNewType )
17+ cleaned_up = {
18+ key : traverse (value , cleanup )
19+ for (key , value ) in type_extractor .collected_types .items ()
20+ }
21+ user_id_newtype = NewTypeFound (
22+ name = 'UserId' ,
23+ actual = int ,
24+ )
25+ some_class = ClassFound (
26+ name = 'SomeClass' ,
27+ fields = {
28+ 'a' : int ,
29+ }
30+ )
31+ assert cleaned_up == {
32+ 'UserId' : user_id_newtype ,
33+ 'name_by_id' : FunctionFound (
34+ name = 'name_by_id' ,
35+ params = {
36+ 'user_id' : user_id_newtype ,
37+ },
38+ return_type = str ,
39+ ),
40+ 'SomeClass' : some_class ,
41+ 'SomeClassInNewType' : NewTypeFound (
42+ name = 'SomeClassInNewType' ,
43+ actual = some_class ,
44+ ),
45+ }
46+ print (1 )
Original file line number Diff line number Diff line change 44
55from py_codegen .type_extractor .nodes .BaseNodeType import NodeType
66from py_codegen .type_extractor .nodes .FixedGenericFound import FixedGenericFound
7+ from py_codegen .type_extractor .nodes .NewType import NewTypeFound
78from py_codegen .type_extractor .nodes .TypeVarFound import TypeVarFound
89from py_codegen .type_extractor .nodes .TypedDictFound import TypedDictFound
910from py_codegen .type_extractor .nodes .ClassFound import ClassFound
@@ -67,6 +68,12 @@ def traverse(node: NodeType, func: traverse_func_type):
6768 node .original , func
6869 )
6970 return func (typevar_node )
71+ if isinstance (node , NewTypeFound ):
72+ newtype_found = copy (node )
73+ newtype_found .actual = traverse (
74+ node .actual , func
75+ )
76+ return func (newtype_found )
7077 return node
7178
7279
Original file line number Diff line number Diff line change 1+ import inspect
2+
3+ from typing import Set
4+ from py_codegen .type_extractor .__base__ import BaseTypeExtractor
5+
6+ from py_codegen .type_extractor .nodes .BaseNodeType import BaseOption
7+ from py_codegen .type_extractor .nodes .NewType import NewTypeFound
8+
9+
10+ def newtype_found_middleware (
11+ typ ,
12+ type_extractor : BaseTypeExtractor ,
13+ options : Set [BaseOption ],
14+ ):
15+ if not inspect .isfunction (typ ):
16+ return None
17+ if typ .__module__ is not 'typing' :
18+ return None
19+ if typ .__code__ .co_name is not 'new_type' :
20+ return None
21+
22+ newtype_found = NewTypeFound (
23+ name = typ .__name__ ,
24+ actual = type_extractor .rawtype_to_node (typ .__supertype__ ),
25+ )
26+
27+ type_extractor .collected_types [newtype_found .name ] = newtype_found
28+ return newtype_found
Original file line number Diff line number Diff line change 1+ from dataclasses import dataclass
2+ from typing import List
3+
4+ from py_codegen .type_extractor .nodes .BaseNodeType import BaseNodeType , NodeType
5+
6+
7+ @dataclass
8+ class NewTypeFound (BaseNodeType ):
9+ name : str
10+ actual : NodeType
Original file line number Diff line number Diff line change 1919from py_codegen .type_extractor .middlewares .list_found import list_found_middleware
2020from py_codegen .type_extractor .middlewares .literal_found import literal_found_middleware
2121from py_codegen .type_extractor .middlewares .mapping_found import mapping_found_middleware
22+ from py_codegen .type_extractor .middlewares .newtype_found import newtype_found_middleware
2223from py_codegen .type_extractor .middlewares .tuple_found import tuple_found_middleware
2324from py_codegen .type_extractor .middlewares .type_or import typeor_middleware
2425from py_codegen .type_extractor .nodes .BaseNodeType import NodeType , BaseNodeType , BaseOption
@@ -54,6 +55,7 @@ class TypeExtractor(BaseTypeExtractor):
5455 typevar_found_middleware ,
5556 fixed_generic_found_middleware ,
5657 class_found_middleware ,
58+ newtype_found_middleware ,
5759 func_found_middleware ,
5860 none_node_middleware ,
5961 builtin_middleware ,
You can’t perform that action at this time.
0 commit comments