annotate wordstream/handlers.py @ 14:57a44140a43b

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