| 291 | |
| 292 | |
| 293 | class WizardValues(MutableMapping): |
| 294 | def __init__( |
| 295 | self, definition, value_retrieval_steps=None, exception_handler=None |
| 296 | ): |
| 297 | self._definition = definition |
| 298 | if value_retrieval_steps is None: |
| 299 | value_retrieval_steps = {} |
| 300 | self._value_retrieval_steps = value_retrieval_steps |
| 301 | self._values = {} |
| 302 | self._value_definitions = self._collect_all_value_definitions() |
| 303 | self._exception_handler = exception_handler |
| 304 | |
| 305 | def __getitem__(self, key): |
| 306 | if key not in self._values and key in self._value_definitions: |
| 307 | value_definition = self._value_definitions[key] |
| 308 | if value_definition['type'] in self._value_retrieval_steps: |
| 309 | retrieval_step = self._value_retrieval_steps[ |
| 310 | value_definition['type'] |
| 311 | ] |
| 312 | try: |
| 313 | return retrieval_step.run_step(value_definition, self) |
| 314 | except Exception as e: |
| 315 | if self._exception_handler is not None: |
| 316 | return self._exception_handler(e) |
| 317 | raise |
| 318 | return self._values[key] |
| 319 | |
| 320 | def __setitem__(self, key, value): |
| 321 | self._values[key] = value |
| 322 | |
| 323 | def __delitem__(self, key): |
| 324 | del self._values[key] |
| 325 | |
| 326 | def __iter__(self): |
| 327 | return iter(self._values) |
| 328 | |
| 329 | def __len__(self): |
| 330 | return len(self._values) |
| 331 | |
| 332 | def __str__(self): |
| 333 | return str(self._values) |
| 334 | |
| 335 | def _collect_all_value_definitions(self): |
| 336 | value_definitions = {} |
| 337 | plan = self._definition['plan'] |
| 338 | for section_name, section_definition in plan.items(): |
| 339 | if section_name == core.DONE_SECTION_NAME: |
| 340 | continue |
| 341 | for name, value_definition in section_definition['values'].items(): |
| 342 | value_definitions[name] = value_definition |
| 343 | return value_definitions |
| 344 | |
| 345 | def __copy__(self): |
| 346 | new_vars = type(self)( |
| 347 | self._definition, |
| 348 | self._value_retrieval_steps, |
| 349 | ) |
| 350 | for varname, value in self.items(): |
no outgoing calls