Example #1
0
 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__))
Example #2
0
    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
Example #3
0
    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