view wordstream/dispatcher.py @ 9:ab37ae0e9cc0

fix imports
author Jeff Hammel <k0scist@gmail.com>
date Tue, 24 Nov 2020 08:55:28 -0800
parents ffe01043ecea
children
line wrap: on
line source

"""
request dispatcher:
data persisting across requests should go here
"""

import os

from .api import Corpus
from .handlers import Index, Feed, Eat, ViewCorpus, Dissociate

from genshi.template import TemplateLoader
from paste.fileapp import FileApp
from pkg_resources import resource_filename
from webob import Request, Response, exc


class Dispatcher(object):

    ### class level variables
    defaults = { 'auto_reload': 'False',
                 'jquery': 'jquery.js',
                 'template_dirs': '',
                 'seed': '' }

    def __init__(self, **kw):

        # set instance parameters from kw and defaults
        for key in self.defaults:
            setattr(self, key, kw.get(key, self.defaults[key]))
        self.auto_reload = self.auto_reload.lower() == 'true'
        self.corpus = Corpus()
        self.corpus.feed_stuff(*self.seed.split())

        # request handlers
        self.handlers = [ Index, ViewCorpus, Feed, Eat ]

        # template loader
        self.template_dirs = self.template_dirs.split()
        self.template_dirs.append(resource_filename(__name__, 'templates'))
        self.loader = TemplateLoader(self.template_dirs,
                                     auto_reload=self.auto_reload)

    def __call__(self, environ, start_response):

        # get a request object
        request = Request(environ)

        # get the path 
        path = request.path_info.strip('/').split('/')
        if path == ['']:
            path = []
        request.environ['path'] = path

        # match the request to a handler
        for h in self.handlers:
            handler = h.match(self, request)
            if handler is not None:
                break
        else:
            handler = exc.HTTPNotFound

        # add data to handler
        if hasattr(handler, 'data'):
            handler.data['jquery'] = self.jquery

        # get response
        res = handler()
        return res(environ, start_response)


class Scrambler(object):

    ### class level variables
    defaults = { 'auto_reload': 'False',
                 'template_dirs': '', }

    def __init__(self, **kw):

        # set instance parameters from kw and defaults
        for key in self.defaults:
            setattr(self, key, kw.get(key, self.defaults[key]))
        self.auto_reload = self.auto_reload.lower() == 'true'

        # request handlers
        self.handlers = [ Dissociate ]

        # template loader
        self.template_dirs = self.template_dirs.split()
        self.template_dirs.append(resource_filename(__name__, 'templates'))
        self.loader = TemplateLoader(self.template_dirs,
                                     auto_reload=self.auto_reload)

    def __call__(self, environ, start_response):

        # get a request object
        request = Request(environ)

        # get the path 
        path = request.path_info.strip('/').split('/')
        if path == ['']:
            path = []
        request.environ['path'] = path

        # match the request to a handler
        for h in self.handlers:
            handler = h.match(self, request)
            if handler is not None:
                break
        else:
            handler = exc.HTTPNotFound

        # get response
        res = handler()
        return res(environ, start_response)