annotate pavement.py @ 4:cf673c093b61 default tip

paver runserver now shows errors if cajoling failed.
author Atul Varma <varmaa@toolness.com>
date Sun, 07 Jun 2009 20:44:44 -0700
parents 6737bc744b46
children
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.
4
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
22 cajoled_filename = "output.co.js"
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
23 output_filename = "output.txt"
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
24 popen = subprocess.Popen([self.cajoler_path,
1
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
25 "-i", filename,
4
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
26 "-o", cajoled_filename],
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
27 stdout=open(output_filename, 'w'),
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
28 stderr=subprocess.STDOUT)
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
29 popen.wait()
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
30 if popen.returncode == 0:
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
31 content = open(cajoled_filename).read()
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
32 self.cache[hash] = Bunch(success = True,
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
33 content = content)
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
34 os.remove(cajoled_filename)
1
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
35 else:
4
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
36 output = open(output_filename).read()
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
37 self.cache[hash] = Bunch(success = False,
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
38 content = output)
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
39 os.remove(output_filename)
1
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
40 return self.cache[hash]
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
41
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
42 def app(self, env, start_response):
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
43 path = env['PATH_INFO']
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
44 parts = path.split('/')[1:]
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
45 if len(parts) == 1:
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
46 filename = os.path.join('caja-js', parts[0])
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
47 if os.path.exists(filename) and not os.path.isdir(filename):
4
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
48 result = self.cajole(filename)
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
49 if not result.success:
1
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
50 start_response('500 Internal Server Error',
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
51 [('Content-type', 'text/plain')])
4
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
52 return ["Cajoling failed:\n\n%s" % result.content]
1
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
53 start_response('200 OK',
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
54 [('Content-type', 'text/javascript')])
4
cf673c093b61 paver runserver now shows errors if cajoling failed.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
55 return [result.content]
1
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
56 start_response('404 Not Found',
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
57 [('Content-type', 'text/plain')])
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
58 return ['Not found: %s' % path]
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
59
0
633c9cb05555 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
60 @task
1
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
61 @cmdopts((['port=', 'p', 'port to bind to'],
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
62 ['host=', 'o', 'host to bind to'],
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
63 ['cajoler-path=', 'c', 'path to cajole_html']))
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
64 def runserver(options):
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
65 port = int(options.get('port', DEFAULT_PORT))
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
66 host = options.get('host', DEFAULT_HOST)
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
67 if not options.get('cajoler_path'):
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
68 raise Exception('Required option: --cajoler-path.')
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
69 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
70 port)
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
71 app = CajolerWebApp(options.cajoler_path)
00d50391d378 Added runserver target to paver.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
72 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
73 server.serve_forever()