1111from .text_rendering import get_name
1212
1313
14+ MAX_DEPTH = 5 # max code depth, otherwise we get too big file
15+
16+
1417class Node (FactoryData ):
1518 __slots__ = (
1619 "dependencies" ,
@@ -106,7 +109,6 @@ def make_args(args: list[str], kwargs: dict[str, str]) -> str:
106109 FactoryType .VALUE : VALUE ,
107110 FactoryType .CONTEXT : CONTEXT ,
108111 FactoryType .ALIAS : ALIAS ,
109- None : GO_PARENT ,
110112}
111113FUNC_TEMPLATE = """
112114{async_}def {func_name}(getter, exits, context):
@@ -116,19 +118,19 @@ def make_args(args: list[str], kwargs: dict[str, str]) -> str:
116118"""
117119
118120IF_TEMPLATE = """
119- if {var} := cache_getter({key}, None):
120- pass # cache found
121- else:
121+ if ({var} := cache_getter({key}, ...)) is ...:
122122 {deps}
123123 {body}
124124 {cache}
125125"""
126126CACHE = "context[{key}] = {var}"
127127
128-
128+ builtins = { getattr ( __builtins__ , name ): name for name in dir ( __builtins__ )}
129129def make_name (obj : Any , ns : dict [Any , str ]) -> str :
130+ if obj in builtins :
131+ return builtins [obj ]
130132 if isinstance (obj , DependencyKey ):
131- key = get_name (obj .type_hint , include_module = False ) + obj .component
133+ key = get_name (obj .type_hint , include_module = False ) + "_" + obj .component
132134 else :
133135 key = get_name (obj , include_module = False )
134136 key = re .sub (r"\W" , "_" , key )
@@ -153,24 +155,33 @@ def make_var(node: Node, ns: dict[Any, str]):
153155
154156
155157def make_if (
156- node : Node , node_var : str , ns : dict [Any , str ], is_async : bool ,
158+ node : Node , node_var : str , ns : dict [Any , str ],
159+ is_async : bool ,
160+ depth : int ,
157161) -> str :
158162 node_key = ns [node .provides ]
159163 node_source = ns [node .source ]
164+ if depth > MAX_DEPTH or node .type is None :
165+ if is_async :
166+ return GO_PARENT .format (
167+ var = node_var ,
168+ key = node_real_key ,
169+ )
170+ else :
171+ return GO_PARENT .format (
172+ var = node_var ,
173+ key = node_key ,
174+ )
160175
161176 deps = "" .join (
162- make_if (dep , make_var (dep , ns ), ns , is_async )
177+ make_if (dep , make_var (dep , ns ), ns , is_async , depth + 1 )
163178 for dep in node .dependencies
164179 )
165180 deps += "" .join (
166- make_if (dep , make_var (dep , ns ), ns , is_async )
181+ make_if (dep , make_var (dep , ns ), ns , is_async , depth + 1 )
167182 for dep in node .kw_dependencies .values ()
168183 )
169184 deps = indent (deps , " " )
170- if node .cache :
171- cache = CACHE .format (var = node_var , key = node_key )
172- else :
173- cache = "# no cache"
174185
175186 args = [make_var (dep , ns ) for dep in node .dependencies ]
176187 kwargs = {
@@ -192,6 +203,7 @@ def make_if(
192203 )
193204
194205 if node .cache :
206+ cache = CACHE .format (var = node_var , key = node_key )
195207 body_str = indent (body_str , " " )
196208 return IF_TEMPLATE .format (
197209 var = node_var ,
@@ -201,14 +213,14 @@ def make_if(
201213 cache = cache ,
202214 )
203215 else :
204- return "\n " .join ([deps , body_str , cache ])
216+ return "\n " .join ([deps , body_str ])
205217
206218
207219def make_func (
208220 node : Node , ns : dict [Any , str ], func_name : str , is_async : bool ,
209221) -> str :
210222 node_var = make_var (node , ns )
211- body = make_if (node , node_var , ns , is_async )
223+ body = make_if (node , node_var , ns , is_async , 0 )
212224 body = indent (body , " " )
213225 return FUNC_TEMPLATE .format (
214226 async_ = "async " if is_async else "" ,
0 commit comments