@@ -111,20 +111,21 @@ def create_wizard(self, model):
111111 stages = self ._load_stages (model .get ('Stages' ), env )
112112 return Wizard (start_stage , stages , env , self ._error_handler )
113113
114+ def _load_stage (self , stage , env ):
115+ stage_attrs = {
116+ 'name' : stage .get ('Name' ),
117+ 'prompt' : stage .get ('Prompt' ),
118+ 'retrieval' : stage .get ('Retrieval' ),
119+ 'next_stage' : stage .get ('NextStage' ),
120+ 'resolution' : stage .get ('Resolution' ),
121+ 'interaction' : stage .get ('Interaction' ),
122+ }
123+ creator = self ._cached_creator
124+ interaction = self ._interaction_loader
125+ return Stage (env , creator , interaction , self , ** stage_attrs )
126+
114127 def _load_stages (self , stages , env ):
115- def load_stage (stage ):
116- stage_attrs = {
117- 'name' : stage .get ('Name' ),
118- 'prompt' : stage .get ('Prompt' ),
119- 'retrieval' : stage .get ('Retrieval' ),
120- 'next_stage' : stage .get ('NextStage' ),
121- 'resolution' : stage .get ('Resolution' ),
122- 'interaction' : stage .get ('Interaction' ),
123- }
124- creator = self ._cached_creator
125- loader = self ._interaction_loader
126- return Stage (env , creator , loader , ** stage_attrs )
127- return [load_stage (stage ) for stage in stages ]
128+ return [self ._load_stage (stage , env ) for stage in stages ]
128129
129130
130131class Wizard (object ):
@@ -177,8 +178,10 @@ def execute(self):
177178 raise WizardException ('Stage not found: %s' % current_stage )
178179 try :
179180 self ._push_stage (stage )
180- stage .execute ()
181+ stage_data = stage .execute ()
181182 current_stage = stage .get_next_stage ()
183+ if current_stage is None :
184+ return stage_data
182185 except Exception as err :
183186 stages = [s .name for (s , _ ) in self ._stage_history ]
184187 recovery = self ._error_handler (err , stages )
@@ -199,9 +202,9 @@ def _pop_stages(self, stage_index):
199202class Stage (object ):
200203 """The Stage object. Contains logic to run all steps of the stage."""
201204
202- def __init__ (self , env , creator , interaction_loader , name = None ,
203- prompt = None , retrieval = None , next_stage = None , resolution = None ,
204- interaction = None ):
205+ def __init__ (self , env , creator , interaction_loader , wizard_loader ,
206+ name = None , prompt = None , retrieval = None , next_stage = None ,
207+ resolution = None , interaction = None ):
205208 """Construct a new Stage object.
206209
207210 :type env: :class:`Environment`
@@ -235,6 +238,7 @@ def __init__(self, env, creator, interaction_loader, name=None,
235238 """
236239 self ._env = env
237240 self ._cached_creator = creator
241+ self ._wizard_loader = wizard_loader
238242 self ._interaction_loader = interaction_loader
239243 self .name = name
240244 self .prompt = prompt
@@ -270,6 +274,11 @@ def _handle_request_retrieval(self):
270274 # execute operation passing all parameters
271275 return operation (** parameters )
272276
277+ def _handle_wizard_delegation (self ):
278+ wizard_name = self .retrieval ['Resource' ]
279+ wizard = self ._wizard_loader .load_wizard (wizard_name )
280+ return wizard .execute ()
281+
273282 def _handle_retrieval (self ):
274283 # In case of no retrieval, empty dict
275284 if not self .retrieval :
@@ -278,14 +287,15 @@ def _handle_retrieval(self):
278287 data = self ._handle_static_retrieval ()
279288 elif self .retrieval ['Type' ] == 'Request' :
280289 data = self ._handle_request_retrieval ()
290+ elif self .retrieval ['Type' ] == 'Wizard' :
291+ data = self ._handle_wizard_delegation ()
281292 # Apply JMESPath query if given
282293 if self .retrieval .get ('Path' ):
283294 data = jmespath .search (self .retrieval ['Path' ], data )
284295
285296 return data
286297
287298 def _handle_interaction (self , data ):
288-
289299 # if no interaction step, just forward data
290300 if self .interaction is None :
291301 return data
@@ -299,6 +309,7 @@ def _handle_resolution(self, data):
299309 if self .resolution .get ('Path' ):
300310 data = jmespath .search (self .resolution ['Path' ], data )
301311 self ._env .store (self .resolution ['Key' ], data )
312+ return data
302313
303314 def get_next_stage (self ):
304315 """Resolve the next stage name for the stage after this one.
@@ -322,7 +333,8 @@ def execute(self):
322333 """
323334 retrieved_options = self ._handle_retrieval ()
324335 selected_data = self ._handle_interaction (retrieved_options )
325- self ._handle_resolution (selected_data )
336+ resolved_data = self ._handle_resolution (selected_data )
337+ return resolved_data
326338
327339
328340class Environment (object ):
0 commit comments