def __getattr__(self, key): config = APPLICATIONS.get(key) if config is None: raise AttributeError('Missing application %s' % key) if self.request.application_name == key: attribute = self.request.api else: session_manager = config.registry.queryUtility( IBaseSessionManager, name='api') attribute = session_manager(self.request) setattr(self, key, attribute) return attribute
def static_url(self, path, **kw): if not isabs(path) and ':' not in path: package = caller_package() package_name = package.__name__ path = '%s:%s' % (package_name, path) else: package_name = path.split(':', 1)[0] if package_name == self.package_name: registry = self.registry else: for application_name, config in APPLICATIONS.items(): if config.package_name == package_name: registry = config.registry break else: registry = get_current_registry() # b/c info = registry.queryUtility(IStaticURLInfo) if info is None: raise ValueError('No static URL definition matching %s' % path) registrations = info._get_registrations(registry) api_route_url = getattr(self.applications, registry.application_name).route_url for (url, spec, route_name, cachebust) in registrations: if path.startswith(spec): subpath = path[len(spec):] if WIN: # pragma: no cover subpath = subpath.replace('\\', '/') # windows if cachebust: subpath, kw = cachebust(subpath, kw) if url is None: kw['subpath'] = subpath return api_route_url(route_name, **kw) else: app_url, scheme, host, port, qs, anchor = parse_url_overrides(kw) parsed = urlparse(url) if not parsed.scheme: url = urlunparse(parsed._replace(scheme=self.environ['wsgi.url_scheme'])) subpath = url_quote(subpath) result = urljoin(url, subpath) return result + qs + anchor raise ValueError('No static URL definition matching %s' % path)
def __getattribute__(self, key): try: attribute = object.__getattribute__(self, key) except AttributeError: config = APPLICATIONS.get(key) if config is None: message = u'Missing application %s' % key raise NotImplementedError(message) if self._request.application_name == key: attribute = self._request.api else: attribute = config.registry.queryUtility(IBaseSessionManager, name='api')( self._request) setattr(self, key, attribute) return attribute
def __init__( self, application_name=None, global_settings=None, **kwargs): if 'registry' in kwargs: for application_config in APPLICATIONS.values(): if application_config.registry is kwargs['registry']: # Nothing to do where. .scan() Configuration super(Configurator, self).__init__(**kwargs) return # Nothing else to do where if 'package' in kwargs: # Nothing to do where. super(Configurator, self).__init__(**kwargs) return kwargs['package'] = caller_package() settings = kwargs['settings'] = dict(kwargs.get('settings') or {}) kwargs['settings'].update(global_settings or {}) # Define pyramid debugs settings['debug'] = asbool(settings.get('debug', False)) if 'reload_all' not in settings: settings['reload_all'] = settings['debug'] if 'debug_all' not in settings: settings['debug_all'] = settings['debug'] if 'reload_templates' not in settings: settings['reload_templates'] = settings['debug'] if 'root_factory' not in kwargs: kwargs['root_factory'] = RootFactory if 'request_factory' not in kwargs: kwargs['request_factory'] = InesRequest super(Configurator, self).__init__(**kwargs) self.registry.config = self self.registry.package_name = self.registry.__name__ # Define application_name self.application_name = application_name or self.package_name self.registry.application_name = self.application_name # Define global cache cache_settings = dict( (key[6:], value) for key, value in self.settings.items() if key.startswith('cache.')) cache_type = cache_settings.pop('type', None) if cache_type == 'memcached': self.cache = SaveMeMemcached(**cache_settings) else: if 'path' not in cache_settings: cache_settings['path'] = DEFAULT_CACHE_DIRPATH self.cache = SaveMe(**cache_settings) # Find extensions on settings bases = APIWarningDict('Duplicated name "{key}" for API Class') sessions = APIWarningDict('Duplicated name "{key}" for API Session') for key, value in self.settings.items(): if key.startswith('api.'): options = key.split('.', 2)[1:] if len(options) == 1: name, option = options[0], 'session_path' else: name, option = options if option == 'session_path': if isinstance(value, string_types): sessions[name] = get_object_on_path(value) else: sessions[name] = value elif option == 'class_path': if isinstance(value, string_types): bases[name] = get_object_on_path(value) else: bases[name] = value # Find sessions on module for session in find_class_on_module(self.package, BaseSession): app_name = getattr(session, '__app_name__', None) if not app_name or app_name == application_name: sessions[session.__api_name__] = session # Find session manager on module for session_manager in find_class_on_module( self.package, BaseSessionManager): app_name = getattr(session_manager, '__app_name__', None) if not app_name or app_name == application_name: bases[session_manager.__api_name__] = session_manager # Find default session manager default_bases = defaultdict(list) for session_manager in find_class_on_module('ines.api', BaseSessionManager): api_name = getattr(session_manager, '__api_name__', None) default_bases[api_name].append(session_manager) # Define extensions for api_name, session in sessions.items(): session_manager = bases.get(api_name) if session_manager is None: session_manager = getattr(session, '__default_session_manager__', None) if session_manager is None: default_session_managers = default_bases.get(api_name) if not default_session_managers: session_manager = BaseSessionManager else: session_manager = default_session_managers[0] self.registry.registerUtility( session_manager(self, session, api_name), provided=IBaseSessionManager, name=api_name) # Middlewares self.middlewares = [] # Register package APPLICATIONS[self.application_name] = self # Default translations dirs self.add_translation_dirs('colander:locale') self.add_translation_dirs('ines:locale')
def __init__(self, application_name=None, global_settings=None, **kwargs): if 'registry' in kwargs: for application_config in APPLICATIONS.values(): if application_config.registry is kwargs['registry']: # Nothing to do where. .scan() Configuration super(APIConfigurator, self).__init__(**kwargs) return # Nothing else to do where if 'package' not in kwargs: kwargs['package'] = caller_package() settings = kwargs['settings'] = dict(kwargs.get('settings') or {}) kwargs['settings'].update(global_settings or {}) # Define pyramid debugs settings['debug'] = asbool(settings.get('debug', False)) if 'reload_all' not in settings: settings['reload_all'] = settings['debug'] if 'debug_all' not in settings: settings['debug_all'] = settings['debug'] if 'reload_templates' not in settings: settings['reload_templates'] = settings['debug'] if 'root_factory' not in kwargs: kwargs['root_factory'] = RootFactory if 'request_factory' not in kwargs: kwargs['request_factory'] = inesRequest super(APIConfigurator, self).__init__(**kwargs) self.registry.config = self self.registry.package_name = self.registry.__name__ # Define application_name self.application_name = application_name or self.package_name self.registry.application_name = self.application_name # Find extensions on settings bases = WarningDict('Duplicated name "{key}" for API Class') sessions = WarningDict('Duplicated name "{key}" for API Session') for key, value in self.settings.items(): if key.startswith('api.extension.'): options = key.split('.', 3)[2:] if len(options) == 1: name, option = options[0], 'session_path' else: name, option = options if option == 'session_path': if isinstance(value, basestring): sessions[name] = get_object_on_path(value) else: sessions[name] = value elif option == 'class_path': if isinstance(value, basestring): bases[name] = get_object_on_path(value) else: bases[name] = value # Find sessions on module for session in find_class_on_module(self.package, BaseSession): app_name = getattr(session, '__app_name__', None) if not app_name or app_name == application_name: sessions[session.__api_name__] = session # Find class on module for session_class in find_class_on_module(self.package, BaseSessionManager): app_name = getattr(session_class, '__app_name__', None) if not app_name or app_name == application_name: bases[session_class.__api_name__] = session_class # Find default session class for session_class in find_class_on_module('ines.api', BaseSessionManager): if session_class.__api_name__ not in bases: app_name = getattr(session_class, '__app_name__', None) if not app_name or app_name == application_name: bases[session_class.__api_name__] = session_class # Define extensions for api_name, session in sessions.items(): session_class = (bases.get(api_name, BaseSessionManager)(self, session, api_name)) self.registry.registerUtility(session_class, provided=IBaseSessionManager, name=api_name) # Middlewares self.middlewares = [] # Register package APPLICATIONS[self.application_name] = self # Default translations dirs self.add_translation_dirs('colander:locale')
def names(self): return list(APPLICATIONS.keys())
def __init__( self, application_name=None, global_settings=None, **kwargs): if 'registry' in kwargs: for application_config in APPLICATIONS.values(): if application_config.registry is kwargs['registry']: # Nothing to do where. .scan() Configuration super(APIConfigurator, self).__init__(**kwargs) return # Nothing else to do where if 'package' not in kwargs: kwargs['package'] = caller_package() settings = kwargs['settings'] = dict(kwargs.get('settings') or {}) kwargs['settings'].update(global_settings or {}) # Define pyramid debugs settings['debug'] = asbool(settings.get('debug', False)) if 'reload_all' not in settings: settings['reload_all'] = settings['debug'] if 'debug_all' not in settings: settings['debug_all'] = settings['debug'] if 'reload_templates' not in settings: settings['reload_templates'] = settings['debug'] if 'root_factory' not in kwargs: kwargs['root_factory'] = RootFactory if 'request_factory' not in kwargs: kwargs['request_factory'] = inesRequest super(APIConfigurator, self).__init__(**kwargs) self.registry.config = self self.registry.package_name = self.registry.__name__ # Define application_name self.application_name = application_name or self.package_name self.registry.application_name = self.application_name # Find extensions on settings bases = WarningDict('Duplicated name "{key}" for API Class') sessions = WarningDict('Duplicated name "{key}" for API Session') for key, value in self.settings.items(): if key.startswith('api.extension.'): options = key.split('.', 3)[2:] if len(options) == 1: name, option = options[0], 'session_path' else: name, option = options if option == 'session_path': if isinstance(value, basestring): sessions[name] = get_object_on_path(value) else: sessions[name] = value elif option == 'class_path': if isinstance(value, basestring): bases[name] = get_object_on_path(value) else: bases[name] = value # Find sessions on module for session in find_class_on_module(self.package, BaseSession): app_name = getattr(session, '__app_name__', None) if not app_name or app_name == application_name: sessions[session.__api_name__] = session # Find class on module for session_class in find_class_on_module( self.package, BaseSessionManager): app_name = getattr(session_class, '__app_name__', None) if not app_name or app_name == application_name: bases[session_class.__api_name__] = session_class # Find default session class for session_class in find_class_on_module( 'ines.api', BaseSessionManager): if session_class.__api_name__ not in bases: app_name = getattr(session_class, '__app_name__', None) if not app_name or app_name == application_name: bases[session_class.__api_name__] = session_class # Define extensions for api_name, session in sessions.items(): session_class = ( bases.get(api_name, BaseSessionManager) (self, session, api_name)) self.registry.registerUtility( session_class, provided=IBaseSessionManager, name=api_name) # Middlewares self.middlewares = [] # Register package APPLICATIONS[self.application_name] = self # Default translations dirs self.add_translation_dirs('colander:locale')