Commits

Lynn Rees committed 6b81c2d

[svn] made a copy

Comments (0)

Files changed (2)

branches/0.1/trunk/setup.py

+# Copyright (c) 2006 L. C. Rees.  All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1.  Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3.  Neither the name of the Portable Site Information Project nor the names
+# of its contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+from setuptools import setup, find_packages
+
+setup(
+    name = 'wsgiview',
+    version = '0.1',
+    description='TurboGears/Buffet Plug-in Adapter for WSGI.',
+    long_description='''Enables TurboGears/Buffet Plug-ins to be used as WSGI Middleware.
+    
+Extremely simplistic usage example:
+
+from wsgiview import view
+
+@view('webstring:template.html', format='html')
+def simple_app(environ, start_response):            
+    start_response('200 OK', [('Content-type','text/html')])            
+    return {'test':'Hello world!\n'}
+
+if __name__ == '__main__':
+    from wsgiref.simple_server import make_server
+    http = make_server('', 8080, simple_app)
+    http.serve_forever()''',
+    author='L. C. Rees',
+    author_email='lcrees@gmail.com',
+    py_modules=['wsgiview', 'setup'],
+    packages = [],
+    classifiers = [
+    'Development Status :: 3 - Alpha',
+    'Environment :: Web Environment',
+    'License :: OSI Approved :: BSD License',
+    'Natural Language :: English',
+    'Operating System :: OS Independent',
+    'Programming Language :: Python',
+    'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
+    'Topic :: Text Processing :: Markup :: HTML',
+    'Topic :: Text Processing :: Markup :: XML',
+    'Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware'], 
+    install_requires = ['setuptools'],
+    zip_safe=False)

branches/0.1/trunk/wsgiview.py

+# Copyright (c) 2006 L. C. Rees
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification,
+# are permitted provided that the following conditions are met:
+#
+#    1. Redistributions of source code must retain the above copyright notice, 
+#       this list of conditions and the following disclaimer.
+#    
+#    2. Redistributions in binary form must reproduce the above copyright 
+#       notice, this list of conditions and the following disclaimer in the
+#       documentation and/or other materials provided with the distribution.
+#
+#    3. Neither the name of wsgiview nor the names of its contributors may be
+#       used to endorse or promote products derived from this software without
+#       specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+'''TurboGears/Buffet Plug-in WSGI Middleware Adapter.'''
+
+__author__ = 'L.C. Rees'
+__revision__ = '0.1'
+
+import pkg_resources
+
+__all__ = ['WsgiView', 'view']
+
+# Load available TurboGears/Buffet plug-ins
+_engines = dict((_engine.name, _engine.load()) for _engine in
+    pkg_resources.iter_entry_points('python.templating.engines'))
+
+def view(template=None, **kw):
+    '''Decorator for WsgiView.'''
+    def decorator(application):
+        return WsgiView(application, template, **kw)
+    return decorator
+
+
+class WsgiView(object):
+
+    '''TurboGears/Buffet Plug-in WSGI Middleware.'''    
+
+    def __init__(self, application, template=None, **kw):
+        if template is not None:
+            # Template is passed in form 'templateName:templatePath'
+            # 'templateName' is the prefix of the template engine e.g. 'kid'
+            # 'templatePath' is a location minus extension in the PYTHONPATH            
+            engine_name, template = template.split(':')
+            # Get parameters
+            extra_vars_func = kw.get('extra_vars')
+            options = kw.get('options', dict())
+            # Load Engine
+            self.engine = _engines[engine_name](extra_vars_func, options)
+        self.template = template
+        self.format = kw.get('format', 'html')
+        self.fragment = kw.get('fragment', False)
+        self.application = application
+
+    def __call__(self, environ, start_response):
+        # Get info dict from WSGI app
+        info = self.application(environ, start_response)
+        # See if app specified its own engine
+        engine_name = environ.get('wsgiview.engine')
+        # Load new engine on demand if app called for it
+        if engine_name is not None:
+            extra_vars_func = environ.get('wsgiview.extra_vars_func')
+            options = environ.get('wsgiview.options')
+            engine = _engines[engine_name](extra_vars_func, options)
+        # By default, use template passed to class constructor
+        else:
+            engine = self.engine
+        # Get app specified template using self.template as default
+        template = environ.get('wsgiview.template', self.template)
+        # Get app specified format use self.format as default
+        format = environ.get('wsgiview.format', self.format)        
+        fragment = environ.get('wsgiview.fragment', self.fragment)
+        # Call plug-in's 'render' method to return a string
+        return [engine.render(info, format, fragment, template)]
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.