annotate licenser/web.py @ 28:eb3749dbdbf5 default tip

finish web handler
author Jeff Hammel <jhammel@mozilla.com>
date Fri, 25 Nov 2011 17:30:28 -0800
parents 7e0c931a201d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
1 #!/usr/bin/env python
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
2
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
3 """
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
4 web handler for MPL licenser
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
5 """
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
6
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
7 import licenses
26
0faf3e7b593a more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
8 import tempfile
28
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
9 import urllib2
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
10 import urlparse
27
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
11 from StringIO import StringIO
25
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
12 from webob import Request, Response, exc
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
13
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
14 class Handler(object):
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
15
27
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
16 required = set(['author', 'email', 'url'])
25
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
17
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
18 template = """<html>
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
19 <head><title>MPL licenser</title></head>
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
20 <body>
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
21 <h1>MPL Licenser</h1>
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
22 <div><i>license your files with MPL. Currently works for files of type: %(filetypes)s</i></div>
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
23 <div><form method="POST" enctype="multipart/form-data">
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
24 <p>Enter a file: <input type="file" name="file"/></p>
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
25 <p>or a URL: <input type="text" name="url" value="%(url)s"/></p>
27
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
26 <p>And enter your name: <input type="text" name="author" value="%(author)s"/></p>
25
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
27 <p>and email: <input type="text" name="email" value="%(email)s"/></p>
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
28 <input type="submit"/>
28
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
29 <p>
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
30 You can use this with curl on a local file if you have <tt>tempfile</tt> (<tt>/bin/tempfile</tt>):
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
31 </p>
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
32 <pre>
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
33 export TEMPFILE=$(tempfile) && curl -F "file=@foo.py" 'http://localhost:8080/?author=Jeff+Hammel&email=jhammel@example.com' > ${TEMPFILE} && mv ${TEMPFILE} foo.py
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
34 </pre>
25
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
35 </body>
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
36 </html>"""
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
37
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
38 def __init__(self, **kw):
27
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
39 self.license = licenses.MPL()
25
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
40 self.methods = {'GET': self.GET,
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
41 'POST': self.POST}
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
42
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
43 def __call__(self, environ, start_response):
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
44 request = Request(environ)
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
45 if request.method in self.methods:
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
46 response = self.methods[request.method](request)
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
47 else:
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
48 response = exc.HTTPMethodNotAllowed()
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
49 return response(environ, start_response)
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
50
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
51 def GET(self, request):
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
52 variables = {}
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
53 for i in self.required:
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
54 if i in request.GET:
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
55 variables[i] = request.GET[i]
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
56 if set(variables.keys()) == self.required:
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
57 try:
28
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
58 filename, body = self.fetch(request.GET['url'])
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
59 author = request.GET['author']
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
60 email = request.GET['email']
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
61 retval = self.interpolate(filename, body, author, email)
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
62 return Response(content_type='text/plain', body=retval)
25
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
63 except:
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
64 pass
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
65 return self.render(**variables)
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
66
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
67 def render(self, **variables):
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
68 for i in self.required:
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
69 if i not in variables:
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
70 variables[i] = ''
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
71 variables['filetypes'] = licenses.filetypes_string()
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
72 return Response(content_type='text/html', body=(self.template % variables))
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
73
28
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
74 def fetch(self, url):
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
75 """fetch a url. returns body, filename"""
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
76 parsed = urlparse.urlsplit(url)
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
77 path = parsed[2].rstrip('/')
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
78 body = urllib2.urlopen(url).read()
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
79 filename = path.split('/')[-1]
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
80 return filename, body
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
81
25
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
82 def POST(self, request):
27
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
83 variables = dict([(i, request.params[i])
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
84 for i in self.required
28
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
85 if i in request.params])
27
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
86 if 'file' in request.POST and hasattr(request.POST['file'], 'filename'):
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
87 body = request.POST['file'].file.getvalue()
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
88 filename = request.POST['file'].filename
28
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
89 elif 'url' in request.params:
27
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
90 try:
28
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
91 filename, body = self.fetch(request.params['url'])
27
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
92 except:
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
93 return self.render(**variables)
28
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
94 else:
eb3749dbdbf5 finish web handler
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
95 return self.render(variables)
27
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
96 if not set(['author', 'email']).issubset(request.params):
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
97 return self.render(**variables)
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
98 author = request.params['author']
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
99 email = request.params['email']
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
100 retval = self.interpolate(filename, body, author, email)
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
101 return Response(content_type='text/plain', body=retval)
25
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
102
27
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
103 def interpolate(self, filename, body, author, email):
26
0faf3e7b593a more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
104
27
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
105 buffer = StringIO()
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
106 buffer.write(body)
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
107 value = buffer.getvalue().splitlines()
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
108 if self.license.has_license(buffer):
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
109 return body
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
110 filetype = self.license.filetype(filename)
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
111 if not filetype:
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
112 return body
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
113 variables = self.license.obtain_variables(author=author, email=email)
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
114 license = self.license.interpolate_license(**variables)
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
115 value = [i + '\r\n' for i in value]
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
116 filetype._lines = value
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
117 buffer = StringIO()
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
118 filetype.filename = buffer
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
119 filetype(license)
7e0c931a201d web licenser now works
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
120 return buffer.getvalue()
26
0faf3e7b593a more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
121
25
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
122 if __name__ == '__main__':
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
123 from wsgiref import simple_server
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
124 app = Handler()
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
125 server = simple_server.make_server(host='0.0.0.0', port=8080, app=app)
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
126 server.serve_forever()
8729685a2cf6 stub web interface
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
127