annotate wordstream/dispatcher.py @ 0:8af3412e907a

initial import of wordstream
author k0s <k0scist@gmail.com>
date Fri, 01 Jan 2010 19:35:32 -0500
parents
children e21f53582267
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
1 """
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
2 request dispatcher:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
3 data persisting across requests should go here
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
4 """
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
5
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
6 import os
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
7
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
8 from handlers import Index, Feed, Eat, ViewCorpus
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
9
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
10 from genshi.template import TemplateLoader
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
11 from paste.fileapp import FileApp
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
12 from pkg_resources import resource_filename
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
13 from webob import Request, Response, exc
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
14 from wordstream.api import Corpus
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
15
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
16 class Dispatcher(object):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
17
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
18 ### class level variables
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
19 defaults = { 'auto_reload': 'False',
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
20 'template_dirs': '',
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
21 'seed': '' }
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
22
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
23 def __init__(self, **kw):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
24
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
25 # set instance parameters from kw and defaults
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
26 for key in self.defaults:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
27 setattr(self, key, kw.get(key, self.defaults[key]))
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
28 self.auto_reload = self.auto_reload.lower() == 'true'
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
29 self.corpus = Corpus()
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
30 self.corpus.feed_stuff(*self.seed.split())
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
31
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
32 # request handlers
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
33 self.handlers = [ Index, ViewCorpus, Feed, Eat ]
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
34
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
35 # template loader
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
36 self.template_dirs = self.template_dirs.split()
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
37 self.template_dirs.append(resource_filename(__name__, 'templates'))
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
38 self.loader = TemplateLoader(self.template_dirs,
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
39 auto_reload=self.auto_reload)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
40
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
41 def __call__(self, environ, start_response):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
42
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
43 # get a request object
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
44 request = Request(environ)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
45
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
46 # get the path
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
47 path = request.path_info.strip('/').split('/')
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
48 if path == ['']:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
49 path = []
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
50 request.environ['path'] = path
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
51
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
52 # match the request to a handler
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
53 for h in self.handlers:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
54 handler = h.match(self, request)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
55 if handler is not None:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
56 break
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
57 else:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
58 handler = exc.HTTPNotFound
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
59
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
60 # add navigation links to handler [example]
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
61 if hasattr(handler, 'data'):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
62 handler.data.setdefault('links', [])
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
63 for h in self.handlers:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
64 handler.data['links'].append((handler.link(h.handler_path),
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
65 h.__name__))
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
66
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
67 # get response
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
68 res = handler()
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
69 return res(environ, start_response)