view simpypi/factory.py @ 23:e72d9655d753

start stubbing a directory server
author Jeff Hammel <jhammel@mozilla.com>
date Tue, 28 Feb 2012 16:59:20 -0800
parents de28a619880e
children 13ed82d10144
line wrap: on
line source

#!/usr/bin/env python

"""
factories for simpypi
"""

import optparse
import os
import shutil
import sys
import tempfile

from paste.httpexceptions import HTTPExceptionHandler
from paste.urlparser import StaticURLParser
from pkg_resources import resource_filename
from wsgi import SimPyPI
from wsgiref import simple_server

class DirectoryServer(StaticURLParser):
    def __init__(self, directory):
        StaticUrlParser.__init__(self, directory)

    def __call__(self, environ, start_response):
        import pdb; pdb.set_trace()

class PassthroughFileserver(object):
    """serve files if they exist"""

    def __init__(self, app, directory):
        self.app = app
        self.directory = directory
        self.fileserver = StaticURLParser(directory)

    def __call__(self, environ, start_response):
        path = self.path(environ['PATH_INFO'].strip('/'))
        if path and os.path.exists(os.path.join(self.directory, path)):
            return self.fileserver(environ, start_response)
        return self.app(environ, start_response)

class NamespacedFileserver(DirectoryServer):

    def __init__(self, app, directory, namespace):
        DirectoryServer.__init__(self, directory)
        self.app = app
        self.namespace = namespace

    def __call__(self, environ, start_response):
        path = environ['PATH_INFO']
        if path == self.namespace:
            environ['PATH_INFO'] = '/'
            return self.fileserver(environ, start_response)
        elif path.startswith(self.namespace + '/'):
            environ['PATH_INFO'] = path[len(self.namespace):]
            return self.fileserver(environ, start_response)
        return self.app(environ, start_response)


def factory(**app_conf):
    """create a webob view and wrap it in middleware"""
    directory = app_conf['directory']
    app = SimPyPI(**app_conf)
    return NamespacedFileserver(app, directory, '/index')

def main(args=sys.argv[:]):

    # parse command line options
    usage = '%prog [options]'
    parser = optparse.OptionParser(usage=usage)
    parser.add_option('-p', '--port', dest='port',
                      type='int', default=8080,
                      help="port to run the server on")
    parser.add_option('-d', '--directory', dest='directory',
                      help='directory to serve')
    options, args = parser.parse_args(args)

    # create a temporary directory, if none specified
    tmpdir = None
    if not options.directory:
        tmpdir = tempfile.mkdtemp()
        options.directory = tmpdir

    # serve
    print "http://localhost:%d/" % options.port
    try:
        app = factory(directory=options.directory)
        server = simple_server.make_server(host='0.0.0.0', port=options.port, app=app)
        server.serve_forever()
    finally:
        if tmpdir:
            shutil.rmtree(tmpdir)

if __name__ == '__main__':
    main()