Mercurial > caja-test
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 |
| 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 | 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 | 6 from paver.easy import * |
| 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 | 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 | 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() |
