annotate pavement.py @ 2:6737bc744b46

Added a TODO.
author Atul Varma <varmaa@toolness.com>
date Sun, 07 Jun 2009 20:21:24 -0700
parents 00d50391d378
children cf673c093b61
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
1 import md5
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
2 import os
0
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3 import subprocess
1
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
4 import wsgiref
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
5 import wsgiref.simple_server
0
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
6 from paver.easy import *
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
7
1
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
8 DEFAULT_PORT = 8080
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
9 DEFAULT_HOST = '127.0.0.1'
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
10
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
11 class CajolerWebApp(object):
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
12 def __init__(self, cajoler_path):
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
13 self.cajoler_path = cajoler_path
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
14 self.cache = {}
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
15
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
16 def cajole(self, filename):
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
17 contents = open(filename).read()
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
18 hash = md5.md5(contents).hexdigest()
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
19 if hash not in self.cache:
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
20 # TODO: This isn't threadsafe.
2
6737bc744b46 Added a TODO.
Atul Varma <varmaa@toolness.com>
parents: 1
diff changeset
21 # TODO: There's no way to evict entries from the cache.
1
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
22 output_filename = "output.co.js"
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
23 retval = subprocess.call([self.cajoler_path,
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
24 "-i", filename,
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
25 "-o", output_filename])
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
26 if retval == 0:
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
27 self.cache[hash] = open(output_filename).read()
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
28 os.remove(output_filename)
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
29 else:
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
30 self.cache[hash] = None
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
31 return self.cache[hash]
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
32
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
33 def app(self, env, start_response):
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
34 path = env['PATH_INFO']
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
35 parts = path.split('/')[1:]
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
36 if len(parts) == 1:
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
37 filename = os.path.join('caja-js', parts[0])
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
38 if os.path.exists(filename) and not os.path.isdir(filename):
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
39 cajoled = self.cajole(filename)
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
40 if cajoled is None:
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
41 start_response('500 Internal Server Error',
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
42 [('Content-type', 'text/plain')])
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
43 return ["Cajoling failed."]
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
44 start_response('200 OK',
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
45 [('Content-type', 'text/javascript')])
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
46 return [cajoled]
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
47 start_response('404 Not Found',
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
48 [('Content-type', 'text/plain')])
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
49 return ['Not found: %s' % path]
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
50
0
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
51 @task
1
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
52 @cmdopts((['port=', 'p', 'port to bind to'],
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
53 ['host=', 'o', 'host to bind to'],
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
54 ['cajoler-path=', 'c', 'path to cajole_html']))
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
55 def runserver(options):
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
56 port = int(options.get('port', DEFAULT_PORT))
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
57 host = options.get('host', DEFAULT_HOST)
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
58 if not options.get('cajoler_path'):
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
59 raise Exception('Required option: --cajoler-path.')
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
60 print "Running server at %s port %d, press Ctrl-C to stop." % (host,
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
61 port)
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
62 app = CajolerWebApp(options.cajoler_path)
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
63 server = wsgiref.simple_server.make_server(host, port, app.app)
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
64 server.serve_forever()