@@ -170,52 +170,53 @@ def _context_factory_body(
170170 ),
171171 )
172172
173-
174173def _selector_factory_body (
175174 builder : FactoryBuilder , source_call : str , factory : Factory ,
176175) -> None :
176+ error_call = builder .call (
177+ builder .global_ (NoActiveFactoryError ),
178+ builder .global_ (factory .provides ),
179+ builder .global_ (factory .when_dependencies , "when_dependencies" ),
180+ )
181+ builder .raise_ (error_call )
182+
183+ ASYNC_TYPES = (FactoryType .ASYNC_FACTORY , FactoryType .ASYNC_GENERATOR )
184+ BODY_GENERATORS = {
185+ FactoryType .FACTORY : _sync_factory_body ,
186+ FactoryType .ASYNC_FACTORY : _async_factory_body ,
187+ FactoryType .GENERATOR : _generator_body ,
188+ FactoryType .ASYNC_GENERATOR : _async_generator_body ,
189+ FactoryType .CONTEXT : _context_factory_body ,
190+ FactoryType .VALUE : _value_factory_body ,
191+ FactoryType .ALIAS : _alias_factory_body ,
192+ FactoryType .SELECTOR : _selector_factory_body ,
193+ }
194+
195+
196+ def _select_when_dependency (
197+ builder : FactoryBuilder ,
198+ factory : Factory ,
199+ ) -> bool :
200+ """return True if there is assignment in any case"""
177201 first = True
178202 for variant in factory .when_dependencies :
179203 condition = builder .when (variant .when_override , factory .when_component )
180204 solved_value = builder .getter (variant .provides )
181205 if first and not condition :
182206 builder .assign_solved (solved_value )
207+ return True
183208 elif first :
184209 with builder .if_ (condition ):
185210 builder .assign_solved (solved_value )
186- first = False
187211 elif not condition :
188212 with builder .else_ ():
189213 builder .assign_solved (solved_value )
190- first = True
214+ return True
191215 else :
192216 with builder .elif_ (condition ):
193217 builder .assign_solved (solved_value )
194- # if-chain not closed with else or not generated at all
195- if not first or not factory .when_dependencies :
196- error_call = builder .call (
197- builder .global_ (NoActiveFactoryError ),
198- builder .global_ (factory .provides ),
199- builder .global_ (factory .when_dependencies , "when_dependencies" ),
200- )
201- if first : # no options at all
202- builder .raise_ (error_call )
203- else :
204- with builder .else_ ():
205- builder .raise_ (error_call )
206-
207-
208- ASYNC_TYPES = (FactoryType .ASYNC_FACTORY , FactoryType .ASYNC_GENERATOR )
209- BODY_GENERATORS = {
210- FactoryType .FACTORY : _sync_factory_body ,
211- FactoryType .ASYNC_FACTORY : _async_factory_body ,
212- FactoryType .GENERATOR : _generator_body ,
213- FactoryType .ASYNC_GENERATOR : _async_generator_body ,
214- FactoryType .CONTEXT : _context_factory_body ,
215- FactoryType .VALUE : _value_factory_body ,
216- FactoryType .ALIAS : _alias_factory_body ,
217- FactoryType .SELECTOR : _selector_factory_body ,
218- }
218+ first = False
219+ return False
219220
220221
221222def compile_factory (* , factory : Factory , is_async : bool ) -> CompiledFactory :
@@ -228,16 +229,22 @@ def compile_factory(*, factory: Factory, is_async: bool) -> CompiledFactory:
228229 builder .register_provides (factory .provides )
229230
230231 with builder .make_getter ():
231- source_call = builder .call (
232- builder .global_ (factory .source ),
233- * (builder .getter (dep ) for dep in factory .dependencies ),
234- ** {
235- name : builder .getter (dep )
236- for name , dep in factory .kw_dependencies .items ()
237- },
238- )
239- body_generator = BODY_GENERATORS [factory .type ]
240- body_generator (builder , source_call , factory )
232+ if not _select_when_dependency (builder , factory ):
233+ source_call = builder .call (
234+ builder .global_ (factory .source ),
235+ * (builder .getter (dep ) for dep in factory .dependencies ),
236+ ** {
237+ name : builder .getter (dep )
238+ for name , dep in factory .kw_dependencies .items ()
239+ },
240+ )
241+ body_generator = BODY_GENERATORS [factory .type ]
242+ if factory .when_dependencies : # conditions generated
243+ with builder .else_ ():
244+ body_generator (builder , source_call , factory )
245+ else : # no options at all
246+ body_generator (builder , source_call , factory )
247+
241248 if factory .cache :
242249 builder .cache ()
243250 builder .return_ ("solved" )
0 commit comments