annotate simpypi/factory.py @ 4:7caedb575794

serve multiple directories
author Jeff Hammel <jhammel@mozilla.com>
date Mon, 27 Feb 2012 16:20:08 -0800
parents f5360bb59e41
children 39080c0f1b08
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
1 import os
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
2
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
3 from dispatcher import Dispatcher
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
4 from paste.httpexceptions import HTTPExceptionHandler
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
5 from paste.urlparser import StaticURLParser
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
6 from pkg_resources import resource_filename
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
7
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
8 class PassthroughFileserver(object):
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
9 """serve files if they exist"""
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
10
4
7caedb575794 serve multiple directories
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
11 def __init__(self, app, *directories):
0
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
12 self.app = app
4
7caedb575794 serve multiple directories
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
13 missing = [i for i in directories
7caedb575794 serve multiple directories
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
14 if not os.path.exists(i) or not os.path.isdir(i)]
7caedb575794 serve multiple directories
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
15 assert not missing, "Missing directories: %s" % missing
7caedb575794 serve multiple directories
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
16 self.directories = [(directory, StaticURLParser(directory))
7caedb575794 serve multiple directories
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
17 for directory in directories]
0
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
18
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
19 def __call__(self, environ, start_response):
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
20 path = environ['PATH_INFO'].strip('/')
4
7caedb575794 serve multiple directories
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
21 for directory, fileserver in self.directories:
7caedb575794 serve multiple directories
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
22 if path and os.path.exists(os.path.join(directory, path)):
7caedb575794 serve multiple directories
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
23 return fileserver(environ, start_response)
0
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
24 return self.app(environ, start_response)
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
25
1
24b8d06eae53 stub out a simple view
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
26 def factory(**app_conf):
0
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
27 """create a webob view and wrap it in middleware"""
4
7caedb575794 serve multiple directories
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
28 directory = app_conf['directory']
1
24b8d06eae53 stub out a simple view
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
29 app = Dispatcher(**app_conf)
3
f5360bb59e41 this now serves
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
30 return PassthroughFileserver(app, resource_filename(__name__, 'static'))
0
93e830409685 initial stub commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
31
1
24b8d06eae53 stub out a simple view
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
32 if __name__ == '__main__':
2
b03602153de2 removing more cruft
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
33 import shutil
1
24b8d06eae53 stub out a simple view
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
34 import tempfile
24b8d06eae53 stub out a simple view
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
35 from wsgiref import simple_server
2
b03602153de2 removing more cruft
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
36 tempdir = tempfile.mkdtemp()
b03602153de2 removing more cruft
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
37 try:
3
f5360bb59e41 this now serves
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
38 app = factory(directory=tempdir)
f5360bb59e41 this now serves
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
39 server = simple_server.make_server(host='0.0.0.0', port=8080, app=app)
f5360bb59e41 this now serves
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
40 server.serve_forever()
2
b03602153de2 removing more cruft
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
41 finally:
b03602153de2 removing more cruft
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
42 shutil.rmtree(tempdir)