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)
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