def assert_not_cyclical_dependency(self, property, component): component_args, var_args, var_kwargs = reflection.get_arguments_for_method(component) for component_arg in component_args.keys(): if component_arg in self.components: parent_component_type, parent_lifestyle_type, parent_component, parent_args, parent_kwargs = self.components[component_arg] if parent_component_type == "instance": return parent_args, var_args, var_kwargs = reflection.get_arguments_for_method(parent_component) if property in parent_args: raise errors.CyclicalDependencyError("There is a cyclical dependency between %s and %s. Cyclical dependencies are not supported yet!" % (component.__name__, parent_component.__name__))
def _instantiate(self, name, factory, factory_args, factory_kw, custom_kw=None): # static values if not callable(factory): return factory # resolves all the dependencies for the component being resolved factory_kwargs = self._resolve_dependencies(factory, custom_kw) argument_list, var_args, var_kwargs = ref.get_arguments_for_method(factory) kwargs = dict([(key, factory_kwargs[key]) for key in factory_kwargs.keys() if key in argument_list.keys()]) if factory_args == None: factory_args = () if kwargs == None: kwargs = {} instance = factory(*factory_args, **kwargs) return instance
def _resolve_dependencies(self, factory, custom_kw): arguments_with_defaults, var_args, var_kwargs = ref.get_arguments_for_method(factory) dependencies = {} for arg, default in arguments_with_defaults.iteritems(): if custom_kw and arg in custom_kw: dependencies[arg] = custom_kw[arg] elif arg in self.config.components: dependencies[arg] = self._get(arg, factory, custom_kw) elif default == None: raise KeyError( "Argument %s in class %s's constructor was not found! Did you forget to register it in the container, or to pass it as a named argument?" % (arg, factory.__name__) ) return dependencies