annotate wordstream/handlers.py @ 3:e21f53582267

adding final dissociation stuff
author k0s <k0scist@gmail.com>
date Fri, 12 Feb 2010 01:37:38 -0500
parents 8af3412e907a
children c576f5877459
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 handlers:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
3 these are instantiated for every request, then called
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
3
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
6 import urllib2
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
7
0
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
8 from pprint import pprint
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
9 from urlparse import urlparse
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
10 from webob import Response, exc
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
11 from StringIO import StringIO
3
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
12 from wordstream.api import Corpus
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
13 from wordstream.dissociate import dissociate
0
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
14
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
15 class HandlerMatchException(Exception):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
16 """the handler doesn't match the request"""
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 Handler(object):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
19
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
20 methods = set(['GET']) # methods to listen to
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
21 handler_path = [] # path elements to match
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 @classmethod
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
24 def match(cls, app, request):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
25
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
26 # check the method
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
27 if request.method not in cls.methods:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
28 return None
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
29
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
30 # check the path
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
31 if request.environ['path'][:len(cls.handler_path)] != cls.handler_path:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
32 return None
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
33
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
34 try:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
35 return cls(app, request)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
36 except HandlerMatchException:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
37 return None
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
38
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
39 def __init__(self, app, request):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
40 self.app = app
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
41 self.request = request
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
42 self.application_path = urlparse(request.application_url)[2]
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
43
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
44 def link(self, path=(), permanant=False):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
45 if isinstance(path, basestring):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
46 path = [ path ]
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
47 path = [ i.strip('/') for i in path ]
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
48 if permanant:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
49 application_url = [ self.request.application_url ]
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
50 else:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
51 application_url = [ self.application_path ]
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
52 path = application_url + path
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
53 return '/'.join(path)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
54
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
55 def redirect(self, location):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
56 raise exc.HTTPSeeOther(location=location)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
57
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
58 class GenshiHandler(Handler):
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 def __init__(self, app, request):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
61 Handler.__init__(self, app, request)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
62 self.data = { 'request': request,
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
63 'link': self.link }
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
64
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
65 def __call__(self):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
66 return getattr(self, self.request.method.title())()
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
67
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
68 def Get(self):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
69 # needs to have self.template set
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
70 template = self.app.loader.load(self.template)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
71 return Response(content_type='text/html',
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
72 body=template.generate(**self.data).render('html'))
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
73
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
74 class Index(GenshiHandler):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
75 template = 'index.html'
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
76 methods=set(['GET'])
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
77
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
78 @classmethod
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
79 def match(cls, app, request):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
80 if not request.path_info.strip('/'):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
81 return cls(app, request)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
82
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
83 class ViewCorpus(GenshiHandler):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
84 template = 'corpus.html'
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
85 handler_path = ['corpus']
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
86
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
87 def Get(self):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
88 buffer = StringIO()
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
89 pprint(self.app.corpus, buffer)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
90 self.data['corpus'] = buffer.getvalue()
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
91 return GenshiHandler.Get(self)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
92
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
93 class Eat(Handler):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
94
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
95 methods = set(['GET'])
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
96
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
97 @classmethod
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
98 def match(cls, app, request):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
99
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
100 # check the method
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
101 if request.method not in cls.methods:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
102 return None
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
103
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
104 if len(request.environ['path']) == 1:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
105 return cls(app, request)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
106
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
107 def __call__(self):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
108 word = self.request.path_info.strip('/')
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
109 association = self.app.corpus.eat(word) or ''
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
110 return Response(content_type='text/plain',
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
111 body=association)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
112
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
113
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
114
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
115 class Feed(Handler):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
116
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
117 methods = set(['POST'])
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
118
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
119 @classmethod
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
120 def match(cls, app, request):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
121
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
122 # check the method
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
123 if request.method not in cls.methods:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
124 return None
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
125
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
126 if len(request.environ['path']) > 1:
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
127 return cls(app, request)
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
128
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
129 def __call__(self):
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
130 self.app.corpus.feed_stream(self.request.environ['path'])
8af3412e907a initial import of wordstream
k0s <k0scist@gmail.com>
parents:
diff changeset
131 return exc.HTTPOk()
3
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
132
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
133
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
134 class Dissociate(GenshiHandler):
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
135 template = 'post.html'
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
136 methods = set(['GET', 'POST'])
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
137
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
138
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
139 @classmethod
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
140 def match(cls, app, request):
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
141
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
142 # check the method
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
143 if request.method not in cls.methods:
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
144 return None
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
145
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
146 return cls(app, request)
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
147
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
148 def Get(self):
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
149 if 'url' in self.request.GET:
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
150 contents = self.url_contents(self.request.GET['url'])
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
151 dissociation = self.dissociation(contents)
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
152 return Response(content_type='text/html',
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
153 body='<html><body>%s</body></html>' % dissociation)
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
154
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
155
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
156 return GenshiHandler.Get(self)
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
157
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
158 def url_contents(self, url):
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
159 return urllib2.urlopen(url).read()
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
160
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
161 def dissociation(self, contents):
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
162 corpus = Corpus()
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
163 corpus.feed_stream(contents)
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
164 corpus.scramble()
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
165 buffer = StringIO()
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
166 dissociate(corpus, buffer)
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
167 return buffer.getvalue()
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
168
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
169 def Post(self):
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
170 if 'url' in self.request.POST:
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
171 contents = self.url_contents(self.request.POST['url'])
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
172 elif 'text' in self.request.POST:
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
173 contents = self.request.POST['text']
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
174 elif 'file' in self.request.POST:
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
175 contents = self.request.POST['file'].file.read()
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
176 dissociation = self.dissociation(contents)
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
177 return Response(content_type='text/html',
e21f53582267 adding final dissociation stuff
k0s <k0scist@gmail.com>
parents: 0
diff changeset
178 body='<html><body>%s</body></html>' % dissociation)