diff options
-rw-r--r-- | .gitignore | 9 | ||||
-rw-r--r-- | mediagoblin/__init__.py | 0 | ||||
-rw-r--r-- | mediagoblin/app.py | 64 | ||||
-rw-r--r-- | mediagoblin/routing.py | 7 | ||||
-rw-r--r-- | mediagoblin/util.py | 11 | ||||
-rw-r--r-- | mediagoblin/views.py | 4 | ||||
-rw-r--r-- | setup.py | 17 |
7 files changed, 112 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..0ed4802a --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +dist/ +bin/ +develop-eggs/ +build/ +eggs/ +.installed.cfg +wsgit.egg-info +*.pyc +*.pyo
\ No newline at end of file diff --git a/mediagoblin/__init__.py b/mediagoblin/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/mediagoblin/__init__.py diff --git a/mediagoblin/app.py b/mediagoblin/app.py new file mode 100644 index 00000000..41ab7f20 --- /dev/null +++ b/mediagoblin/app.py @@ -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')) diff --git a/mediagoblin/routing.py b/mediagoblin/routing.py new file mode 100644 index 00000000..fec08370 --- /dev/null +++ b/mediagoblin/routing.py @@ -0,0 +1,7 @@ +from routes import Mapper + +mapping = Mapper() +mapping.minimization = False + +mapping.connect( + "index", "/", controller="mediagoblin.views:root_view") diff --git a/mediagoblin/util.py b/mediagoblin/util.py new file mode 100644 index 00000000..2af9b380 --- /dev/null +++ b/mediagoblin/util.py @@ -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) diff --git a/mediagoblin/views.py b/mediagoblin/views.py new file mode 100644 index 00000000..1b109453 --- /dev/null +++ b/mediagoblin/views.py @@ -0,0 +1,4 @@ +from webob import Response, exc + +def root_view(request): + return Response("This is the root") diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..c19e801f --- /dev/null +++ b/setup.py @@ -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 + """, + ) |