Initial mediagoblin structure

This commit is contained in:
Christopher Allan Webber 2010-07-17 11:33:08 -05:00
commit 31a8ff4288
7 changed files with 112 additions and 0 deletions

9
.gitignore vendored Normal file
View File

@ -0,0 +1,9 @@
dist/
bin/
develop-eggs/
build/
eggs/
.installed.cfg
wsgit.egg-info
*.pyc
*.pyo

0
mediagoblin/__init__.py Normal file
View File

64
mediagoblin/app.py Normal file
View File

@ -0,0 +1,64 @@
import sys
import urllib
from webob import Request, exc
import routes
from mediagoblin import routing, util
class Error(Exception): pass
class ImproperlyConfigured(Error): pass
def load_controller(string):
module_name, func_name = string.split(':', 1)
__import__(module_name)
module = sys.modules[module_name]
func = getattr(module, func_name)
return func
class MediagoblinApp(object):
"""
Really basic wsgi app using routes and WebOb.
"""
def __init__(self, user_template_path=None):
self.template_env = util.get_jinja_env(user_template_path)
def __call__(self, environ, start_response):
request = Request(environ)
path_info = request.path_info
route_match = routing.mapping.match(path_info)
# No matching page?
if route_match is None:
# Try to do see if we have a match with a trailing slash
# added and if so, redirect
if not path_info.endswith('/') \
and request.method == 'GET' \
and routing.mapping.match(path_info + '/'):
new_path_info = path_info + '/'
if request.GET:
new_path_info = '%s?%s' % (
new_path_info, urllib.urlencode(request.GET))
redirect = exc.HTTPTemporaryRedirect(location=new_path_info)
return request.get_response(redirect)(environ, start_response)
# Okay, no matches. 404 time!
return exc.HTTPNotFound()(environ, start_response)
controller = load_controller(route_match['controller'])
request.start_response = start_response
request.matchdict = route_match
request.app = self
request.template_env = self.template_env
request.urlgen = routes.URLGenerator(routing.mapping, environ)
return controller(request)(environ, start_response)
def paste_app_factory(global_config, **kw):
return MediagoblinApp(
user_template_path=kw.get('local_templates'))

7
mediagoblin/routing.py Normal file
View File

@ -0,0 +1,7 @@
from routes import Mapper
mapping = Mapper()
mapping.minimization = False
mapping.connect(
"index", "/", controller="mediagoblin.views:root_view")

11
mediagoblin/util.py Normal file
View File

@ -0,0 +1,11 @@
import jinja2
def get_jinja_env(user_template_path=None):
if user_template_path:
loader = jinja2.ChoiceLoader(
[jinja2.FileSystemLoader(user_template_path),
jinja2.PackageLoader('mediagoblin', 'templates')])
else:
loader = jinja2.PackageLoader('mediagoblin', 'templates')
return jinja2.Environment(loader=loader, autoescape=True)

4
mediagoblin/views.py Normal file
View File

@ -0,0 +1,4 @@
from webob import Response, exc
def root_view(request):
return Response("This is the root")

17
setup.py Normal file
View File

@ -0,0 +1,17 @@
from setuptools import setup, find_packages
import sys
setup(
name = "mediagoblin",
version = "0.0.1",
packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
zip_safe=False,
license = 'AGPLv3',
author = 'Christopher Webber',
author_email = 'cwebber@dustycloud.org',
entry_points = """\
[paste.app_factory]
mediagoblin = mediagoblin.app:paste_app_factory
""",
)