Example #1
0
    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
Example #2
0
    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)
Example #3
0
    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
Example #4
0
    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')
Example #5
0
    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')
Example #6
0
 def names(self):
     return list(APPLICATIONS.keys())
Example #7
0
    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')