SVN: r25573 - trunk/quixote/demo

David Binger <dbinger-fVcApmY9cLvQ3/1i3zOLAti2O/[email protected]> Thu, 11 Nov 2004 11:57:31 -0500
Newsgroups gmane.comp.web.quixote.cvs
Message-ID <[email protected]>
Author: dbinger
Date: 2004-11-11 10:18:24 -0500 (Thu, 11 Nov 2004)
New Revision: 25573

Added:
   trunk/quixote/demo/demo1.py
   trunk/quixote/demo/demonstrate.py
Log:
Add demonstrate.py, a script for running a demo on a local port.
Add demo1.py, a basic traversal demo.


Added: trunk/quixote/demo/demo1.py
===================================================================
--- trunk/quixote/demo/demo1.py	2004-11-11 15:12:00 UTC (rev 25572)
+++ trunk/quixote/demo/demo1.py	2004-11-11 15:18:24 UTC (rev 25573)
@@ -0,0 +1,84 @@
+"""$URL$
+$Id$
+"""
+from quixote import get_response
+from quixote.directory import Directory
+from quixote.errors import PublishError
+from quixote.html import href
+from quixote.util import dump_request
+
+def format_page(title, content, style_sheet="/base.css"):
+    return ('<html><head><title>%(title)s</title>'
+            '<link rel="stylesheet" href="%(style_sheet)s" type="text/css">'
+            '</head><body>%(content)s</body></html>') % locals()
+
+def format_request():
+    return format_page('Request', dump_request())
+
+def format_link_list(targets):
+    return '<ul>%s</ul>' % ''.join([
+        '<li>%s</li>' % href(target, target) for target in targets])
+
+class SubDirectory(Directory):
+
+    _q_exports = ["", "dumpreq"]
+
+    dumpreq = format_request
+
+    def _q_index(self):
+        return format_page('Lookup', format_link_list(range(5)))
+
+    def _q_lookup(self, component):
+        return format_page(
+            'Found: %s' % component,
+            '<div style="font-size:x-large">%s</div>' % component)
+        
+class RootDirectory(Directory):
+
+    _q_exports = ["",
+                  "simple",
+                  "error",
+                  "publish_error", 
+                  "dumpreq", 
+                  ("base.css", "css"),
+                  "sub"]
+
+    def _q_index(self):
+        """
+        This is exported as "".
+        """
+        s = ('This demonstation is intended to show the basic '
+             'Quixote traversal pattern in action. ')
+        s += '<ul>'
+        for item in self._q_exports:
+            if item:
+                if type(item) is tuple:
+                    name = item[0]
+                elif callable(getattr(self, item)):
+                    name = item
+                else:
+                    name = item + '/'
+                s += '<li>%s</li>' % href(name, name)
+        s += '</ul>'
+        return format_page('Demo1', s)
+
+    def simple(self):
+        # This function returns a plain text document, not HTML.
+        get_response().set_content_type("text/plain")
+        return "This is the Python function 'quixote.demo.simple'.\n"
+
+    def error(self):
+        raise ValueError, "this is a Python exception"
+
+    def publish_error(self):
+        raise PublishError("Publishing error raised by publish_error")
+
+    def css(self):
+        get_response().set_content_type("text/css")
+        return 'body { border: thick solid green; padding: 2em; }'
+
+    def dumpreq(self):
+        return format_request()
+
+    sub = SubDirectory()
+        


Property changes on: trunk/quixote/demo/demo1.py
___________________________________________________________________
Name: svn:keywords
   + HeadURL Id

Added: trunk/quixote/demo/demonstrate.py
===================================================================
--- trunk/quixote/demo/demonstrate.py	2004-11-11 15:12:00 UTC (rev 25572)
+++ trunk/quixote/demo/demonstrate.py	2004-11-11 15:18:24 UTC (rev 25573)
@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+"""
+$URL$
+$Id$
+
+Run a simple HTTPServer on a local port, processing all requests
+using a Quixote Directory instance.  Command line options allow
+the specification of Directory and/or Publisher classes.
+"""
+import sys
+from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
+from quixote import enable_ptl
+from quixote.http_request import HTTPRequest
+from quixote.publish import get_publisher
+
+class HTTPRequestHandler(BaseHTTPRequestHandler):
+
+    def get_cgi_env(self, method):
+        env = dict(
+            SERVER_SOFTWARE="demonstrate.py/1.0",
+            SERVER_NAME=self.server.server_name,
+            GATEWAY_INTERFACE='CGI/1.1',
+            SERVER_PROTOCOL=self.protocol_version,
+            SERVER_PORT=str(self.server.server_port),
+            REQUEST_METHOD=method,
+            REMOTE_ADDR=self.client_address[0],
+            SCRIPT_NAME='')
+        if '?' in self.path:
+            env['PATH_INFO'], env['QUERY_STRING'] = self.path.split('?')
+        else:
+            env['PATH_INFO'] = self.path
+        if self.headers.typeheader is None:
+            env['CONTENT_TYPE'] = self.headers.type
+        else:
+            env['CONTENT_TYPE'] = self.headers.typeheader
+        env['CONTENT_LENGTH'] = self.headers.getheader('content-length') or "0"
+        accept = []
+        for line in self.headers.getallmatchingheaders('accept'):
+            if line[:1] in "\t\n\r ":
+                accept.append(line.strip())
+            else:
+                accept = accept + line[7:].split(',')
+        env['HTTP_ACCEPT'] = ','.join(accept)
+        ua = self.headers.getheader('user-agent')
+        if ua:
+            env['HTTP_USER_AGENT'] = ua
+        co = filter(None, self.headers.getheaders('cookie'))
+        if co:
+            env['HTTP_COOKIE'] = ', '.join(co)
+        return env
+
+    def process(self, env):
+        request = HTTPRequest(self.rfile, env)
+        response = get_publisher().process_request(request)
+        try:
+            self.send_response(response.get_status_code(),
+                               'Script output follows')
+            response.write(self.wfile)
+        except IOError, err:
+            print "IOError while sending response ignored: %s" % err
+
+    def do_POST(self):
+        return self.process(self.get_cgi_env('POST'))
+
+    def do_GET(self):
+        return self.process(self.get_cgi_env('GET'))
+
+def demo_directory(port=8000,
+                   root_directory='quixote.demo.DemoUI',
+                   publisher='quixote.publish.Publisher'):
+    enable_ptl()
+    def import_class(name):
+        i = name.rfind('.')
+        module_name = name[:i]
+        class_name = name[i+1:]
+        __import__(module_name)
+        return getattr(sys.modules[module_name], class_name)
+    root_directory_instance = import_class(root_directory)()
+    if get_publisher() is None:
+        publisher_class = import_class(publisher)
+        publisher_class(root_directory_instance, display_exceptions='plain')
+    HTTPRequestHandler.protocol_version = 'HTTP/1.0'
+    httpd = HTTPServer(('', port), HTTPRequestHandler)
+    sa = httpd.socket.getsockname()
+    print "Serving HTTP on", sa[0], "port", sa[1], "..."
+    httpd.serve_forever()
+
+if __name__ == '__main__':
+    from optparse import OptionParser
+    parser = OptionParser()
+    parser.set_description(
+        "Runs a simple HTTP server that processes all requests "
+        "through a Directory.\n  "
+        "This is for demonstration purposes only.\n")
+    default_port = 8000
+    parser.add_option(
+        '--port', dest="port", default=default_port,
+        type="int",
+        help="Port for the server to listen on. (default=%s)" % default_port)
+    default_root_directory = 'quixote.demo.demo1.RootDirectory'
+    parser.add_option(
+        '--directory', dest="root_directory",
+        default=default_root_directory,
+        help="The root Directory class. (default=%s)" % default_root_directory)
+    default_publisher = 'quixote.publish.Publisher'
+    parser.add_option(
+        '--publisher', dest="publisher",
+        default=default_publisher,
+        help="The Publisher class. (default=%s)" % default_publisher)
+    (options, args) = parser.parse_args()
+    demo_directory(port=options.port,
+                   root_directory=options.root_directory,
+                   publisher = options.publisher)


Property changes on: trunk/quixote/demo/demonstrate.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + HeadURL Id