Beispiel #1
0
    def load_resource(self, resource, **kwargs):
        self.logger.debug('Load resource: %s' % resource)
        m = self.import_package_pattern.search(resource)
        if m:
            package_name = m.group(1)
            if m.group(2):
                file_path = m.group(3)
            else:
                file_path = 'conf/services.yml'

            package_module = get_module(package_name)
            full_file_path = os.path.join(os.path.dirname(package_module.__file__), file_path)

            self.load_file(full_file_path)
        else:
            # Load as file
            base_dir = kwargs.get('base_dir')

            file_path = os.path.join(base_dir, resource)

            self.load_file(file_path)
Beispiel #2
0
    def build_service(self, name):
        self.logger.debug('Build service: %s' % name)
        service_config = ServiceConfig(self.service_config[name], alias_func=self._get_service_alias)

        if service_config.is_alias:
            return self.get(service_config.alias_name)

        if service_config.is_method:
            return get_method_from_full_name(service_config.full_name)

        if service_config.is_factory_object_property_method:
            parent_service = self.get(service_config.service_name)
            method = getattr(parent_service, service_config.property_name)

            obj = self._build_args_execute_method(service_config, method)
        elif service_config.is_factory_method:
            method = self.get(service_config.method_name)

            obj = self._build_args_execute_method(service_config, method)
        elif service_config.is_method_call:
            method = get_method_from_full_name(service_config.full_name)

            obj = self._build_args_execute_method(service_config, method)
        elif service_config.is_object:
            if service_config.is_class:
                clazz = get_class(service_config.full_name)
                args = self.build_arguments(service_config.arguments)
                kwargs = self._build_kwargs(service_config.kwargs)

                try:
                    obj = clazz(*args, **kwargs)
                except Exception as e:
                    raise InitObjectFromClassError(name, service_config.full_name, args, str(e))

            elif service_config.is_delegate:
                obj = self.get(service_config.delegate_obj_name)

                return getattr(obj, service_config.delegate_name)
            elif service_config.is_factory_object:
                factory_service_name = service_config.service_name
                factory_obj = self.get(factory_service_name)
                method = getattr(factory_obj, 'get')
                args = self.build_arguments(service_config.arguments)
                obj = method(*args)
            else:
                module_name, class_name = parse_module_class(service_config.factory_class_name)

                module = get_module(module_name)
                clazz = getattr(module, class_name)

                method = getattr(clazz, service_config.method_name)

                args = self.build_arguments(service_config.arguments)

                obj = method(*args)
        else:
            raise Exception('Config for service {0} must be string or dict. Got {1}'.format(name, service_config))

        calls = service_config.calls
        for call in calls:
            assert isinstance(call, list)
            assert len(call) == 1 or len(call) == 2

            if len(call) == 2:
                method_name, method_args = call
            elif len(call) == 1:
                method_name, = call
                method_args = []
            else:
                raise Exception(
                    'Service {0}.calls error: Expect a list of 1 or 2 items. Got: {1}'.format(name, call))

            method_args = self.build_arguments(method_args)
            method = getattr(obj, method_name)
            method(*method_args)

        return obj