forked from jan/debianmemberportfolio
Merge branch 'pylons'
This commit is contained in:
commit
f1841af0ee
37 changed files with 942 additions and 142 deletions
2
MANIFEST.in
Normal file
2
MANIFEST.in
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
recursive-include ddportfolioservice/public *
|
||||||
|
recursive-include ddportfolioservice/templates *
|
19
README.txt
Normal file
19
README.txt
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
This file is for you to describe the ddportfolioservice application. Typically
|
||||||
|
you would include information such as the information below:
|
||||||
|
|
||||||
|
Installation and Setup
|
||||||
|
======================
|
||||||
|
|
||||||
|
Install ``ddportfolioservice`` using easy_install::
|
||||||
|
|
||||||
|
easy_install ddportfolioservice
|
||||||
|
|
||||||
|
Make a config file as follows::
|
||||||
|
|
||||||
|
paster make-config ddportfolioservice config.ini
|
||||||
|
|
||||||
|
Tweak the config file as appropriate and then setup the application::
|
||||||
|
|
||||||
|
paster setup-app config.ini
|
||||||
|
|
||||||
|
Then you are ready to go.
|
|
@ -1 +0,0 @@
|
||||||
#
|
|
0
ddportfolioservice/config/__init__.py
Normal file
0
ddportfolioservice/config/__init__.py
Normal file
33
ddportfolioservice/config/environment.py
Normal file
33
ddportfolioservice/config/environment.py
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
"""Pylons environment configuration"""
|
||||||
|
import os
|
||||||
|
|
||||||
|
from pylons import config
|
||||||
|
|
||||||
|
import ddportfolioservice.lib.app_globals as app_globals
|
||||||
|
import ddportfolioservice.lib.helpers
|
||||||
|
from ddportfolioservice.config.routing import make_map
|
||||||
|
|
||||||
|
def load_environment(global_conf, app_conf):
|
||||||
|
"""Configure the Pylons environment via the ``pylons.config``
|
||||||
|
object
|
||||||
|
"""
|
||||||
|
# Pylons paths
|
||||||
|
root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
paths = dict(root=root,
|
||||||
|
controllers=os.path.join(root, 'controllers'),
|
||||||
|
static_files=os.path.join(root, 'public'),
|
||||||
|
templates=[os.path.join(root, 'templates')])
|
||||||
|
|
||||||
|
# Initialize config with the basic options
|
||||||
|
config.init_app(global_conf, app_conf, package='ddportfolioservice',
|
||||||
|
template_engine='mako', paths=paths)
|
||||||
|
|
||||||
|
config['routes.map'] = make_map()
|
||||||
|
config['pylons.g'] = app_globals.Globals()
|
||||||
|
config['pylons.h'] = ddportfolioservice.lib.helpers
|
||||||
|
|
||||||
|
# Customize templating options via this variable
|
||||||
|
tmpl_options = config['buffet.template_options']
|
||||||
|
|
||||||
|
# CONFIGURATION OPTIONS HERE (note: all config options will override
|
||||||
|
# any Pylons config options)
|
57
ddportfolioservice/config/middleware.py
Normal file
57
ddportfolioservice/config/middleware.py
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
"""Pylons middleware initialization"""
|
||||||
|
from paste.cascade import Cascade
|
||||||
|
from paste.registry import RegistryManager
|
||||||
|
from paste.urlparser import StaticURLParser
|
||||||
|
from paste.deploy.converters import asbool
|
||||||
|
|
||||||
|
from pylons import config
|
||||||
|
from pylons.error import error_template
|
||||||
|
from pylons.middleware import error_mapper, ErrorDocuments, ErrorHandler, \
|
||||||
|
StaticJavascripts
|
||||||
|
from pylons.wsgiapp import PylonsApp
|
||||||
|
|
||||||
|
from ddportfolioservice.config.environment import load_environment
|
||||||
|
|
||||||
|
def make_app(global_conf, full_stack=True, **app_conf):
|
||||||
|
"""Create a Pylons WSGI application and return it
|
||||||
|
|
||||||
|
``global_conf``
|
||||||
|
The inherited configuration for this application. Normally from
|
||||||
|
the [DEFAULT] section of the Paste ini file.
|
||||||
|
|
||||||
|
``full_stack``
|
||||||
|
Whether or not this application provides a full WSGI stack (by
|
||||||
|
default, meaning it handles its own exceptions and errors).
|
||||||
|
Disable full_stack when this application is "managed" by
|
||||||
|
another WSGI middleware.
|
||||||
|
|
||||||
|
``app_conf``
|
||||||
|
The application's local configuration. Normally specified in the
|
||||||
|
[app:<name>] section of the Paste ini file (where <name>
|
||||||
|
defaults to main).
|
||||||
|
"""
|
||||||
|
# Configure the Pylons environment
|
||||||
|
load_environment(global_conf, app_conf)
|
||||||
|
|
||||||
|
# The Pylons WSGI app
|
||||||
|
app = PylonsApp()
|
||||||
|
|
||||||
|
# CUSTOM MIDDLEWARE HERE (filtered by error handling middlewares)
|
||||||
|
|
||||||
|
if asbool(full_stack):
|
||||||
|
# Handle Python exceptions
|
||||||
|
app = ErrorHandler(app, global_conf, error_template=error_template,
|
||||||
|
**config['pylons.errorware'])
|
||||||
|
|
||||||
|
# Display error documents for 401, 403, 404 status codes (and
|
||||||
|
# 500 when debug is disabled)
|
||||||
|
app = ErrorDocuments(app, global_conf, mapper=error_mapper, **app_conf)
|
||||||
|
|
||||||
|
# Establish the Registry for this application
|
||||||
|
app = RegistryManager(app)
|
||||||
|
|
||||||
|
# Static files
|
||||||
|
javascripts_app = StaticJavascripts()
|
||||||
|
static_app = StaticURLParser(config['pylons.paths']['static_files'])
|
||||||
|
app = Cascade([static_app, javascripts_app, app])
|
||||||
|
return app
|
24
ddportfolioservice/config/routing.py
Normal file
24
ddportfolioservice/config/routing.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
"""Routes configuration
|
||||||
|
|
||||||
|
The more specific and detailed routes should be defined first so they
|
||||||
|
may take precedent over the more generic routes. For more information
|
||||||
|
refer to the routes manual at http://routes.groovie.org/docs/
|
||||||
|
"""
|
||||||
|
from pylons import config
|
||||||
|
from routes import Mapper
|
||||||
|
|
||||||
|
def make_map():
|
||||||
|
"""Create, configure and return the routes Mapper"""
|
||||||
|
map = Mapper(directory=config['pylons.paths']['controllers'],
|
||||||
|
always_scan=config['debug'])
|
||||||
|
|
||||||
|
# The ErrorController route (handles 404/500 error pages); it should
|
||||||
|
# likely stay at the top, ensuring it can always be resolved
|
||||||
|
map.connect('error/:action/:id', controller='error')
|
||||||
|
|
||||||
|
# CUSTOM ROUTES HERE
|
||||||
|
map.connect('', controller='ddportfolio', action='index')
|
||||||
|
map.connect(':controller/:action/:id')
|
||||||
|
map.connect('*url', controller='template', action='view')
|
||||||
|
|
||||||
|
return map
|
0
ddportfolioservice/controllers/__init__.py
Normal file
0
ddportfolioservice/controllers/__init__.py
Normal file
30
ddportfolioservice/controllers/ddportfolio.py
Normal file
30
ddportfolioservice/controllers/ddportfolio.py
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
import logging
|
||||||
|
import simplejson
|
||||||
|
|
||||||
|
from ddportfolioservice.lib.base import *
|
||||||
|
from ddportfolioservice.model.form import *
|
||||||
|
from ddportfolioservice.model.urlbuilder import *
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
class DdportfolioController(BaseController):
|
||||||
|
|
||||||
|
def index(self):
|
||||||
|
# Return a rendered template
|
||||||
|
# return render('/some/template.mako')
|
||||||
|
# or, Return a response
|
||||||
|
return render('/showform.mako')
|
||||||
|
|
||||||
|
def handle_post(self):
|
||||||
|
schema = DeveloperData()
|
||||||
|
try:
|
||||||
|
form_result = schema.to_python(request.params)
|
||||||
|
except formencode.validators.Invalid, error:
|
||||||
|
c.messages = { 'errors' : error.unpack_errors() }
|
||||||
|
return render('/showform.mako')
|
||||||
|
data = build_urls(form_result)
|
||||||
|
if 'mode' in request.params and request.params['mode'] == 'json':
|
||||||
|
response.headers['Content-Type'] = 'text/json'
|
||||||
|
return simplejson.dumps(data['data'])
|
||||||
|
c.urldata = data
|
||||||
|
return render('/showurls.mako')
|
41
ddportfolioservice/controllers/error.py
Normal file
41
ddportfolioservice/controllers/error.py
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
import cgi
|
||||||
|
import os.path
|
||||||
|
|
||||||
|
from paste.urlparser import StaticURLParser
|
||||||
|
from pylons.middleware import error_document_template, media_path
|
||||||
|
|
||||||
|
from ddportfolioservice.lib.base import *
|
||||||
|
|
||||||
|
class ErrorController(BaseController):
|
||||||
|
"""Generates error documents as and when they are required.
|
||||||
|
|
||||||
|
The ErrorDocuments middleware forwards to ErrorController when error
|
||||||
|
related status codes are returned from the application.
|
||||||
|
|
||||||
|
This behaviour can be altered by changing the parameters to the
|
||||||
|
ErrorDocuments middleware in your config/middleware.py file.
|
||||||
|
|
||||||
|
"""
|
||||||
|
def document(self):
|
||||||
|
"""Render the error document"""
|
||||||
|
page = error_document_template % \
|
||||||
|
dict(prefix=request.environ.get('SCRIPT_NAME', ''),
|
||||||
|
code=cgi.escape(request.params.get('code', '')),
|
||||||
|
message=cgi.escape(request.params.get('message', '')))
|
||||||
|
return page
|
||||||
|
|
||||||
|
def img(self, id):
|
||||||
|
"""Serve Pylons' stock images"""
|
||||||
|
return self._serve_file(os.path.join(media_path, 'img'), id)
|
||||||
|
|
||||||
|
def style(self, id):
|
||||||
|
"""Serve Pylons' stock stylesheets"""
|
||||||
|
return self._serve_file(os.path.join(media_path, 'style'), id)
|
||||||
|
|
||||||
|
def _serve_file(self, root, path):
|
||||||
|
"""Call Paste's FileApp (a WSGI application) to serve the file
|
||||||
|
at the specified path
|
||||||
|
"""
|
||||||
|
static = StaticURLParser(root)
|
||||||
|
request.environ['PATH_INFO'] = '/%s' % path
|
||||||
|
return static(request.environ, self.start_response)
|
27
ddportfolioservice/controllers/template.py
Normal file
27
ddportfolioservice/controllers/template.py
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
from ddportfolioservice.lib.base import *
|
||||||
|
|
||||||
|
class TemplateController(BaseController):
|
||||||
|
|
||||||
|
def view(self, url):
|
||||||
|
"""By default, the final controller tried to fulfill the request
|
||||||
|
when no other routes match. It may be used to display a template
|
||||||
|
when all else fails, e.g.::
|
||||||
|
|
||||||
|
def view(self, url):
|
||||||
|
return render('/%s' % url)
|
||||||
|
|
||||||
|
Or if you're using Mako and want to explicitly send a 404 (Not
|
||||||
|
Found) response code when the requested template doesn't exist::
|
||||||
|
|
||||||
|
import mako.exceptions
|
||||||
|
|
||||||
|
def view(self, url):
|
||||||
|
try:
|
||||||
|
return render('/%s' % url)
|
||||||
|
except mako.exceptions.TopLevelLookupException:
|
||||||
|
abort(404)
|
||||||
|
|
||||||
|
By default this controller aborts the request with a 404 (Not
|
||||||
|
Found)
|
||||||
|
"""
|
||||||
|
abort(404)
|
|
@ -1,101 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf8 -*-
|
|
||||||
|
|
||||||
from paste.request import parse_formvars
|
|
||||||
import pkg_resources
|
|
||||||
import simplejson
|
|
||||||
from ConfigParser import ConfigParser
|
|
||||||
from urllib import quote_plus
|
|
||||||
import logging
|
|
||||||
import sys
|
|
||||||
import formencode
|
|
||||||
from gettext import gettext as _
|
|
||||||
from formencode import validators
|
|
||||||
|
|
||||||
logging.basicConfig(level=logging.DEBUG, stream=sys.stderr)
|
|
||||||
|
|
||||||
my_config = ConfigParser()
|
|
||||||
my_config.readfp(pkg_resources.resource_stream(__name__, 'ddportfolio.ini'))
|
|
||||||
|
|
||||||
|
|
||||||
def build_urls(fields):
|
|
||||||
"""Build personalized URLs using the developer information in
|
|
||||||
fields."""
|
|
||||||
result = {}
|
|
||||||
qfields = dict([(key, quote_plus(fields[key])) for key in fields])
|
|
||||||
for section in my_config.sections():
|
|
||||||
if my_config.has_option(section, 'urls'):
|
|
||||||
for url in my_config.get(section, 'urls').split(','):
|
|
||||||
if my_config.has_option(section, url + '.pattern'):
|
|
||||||
try:
|
|
||||||
result[section + '.' + url] = \
|
|
||||||
my_config.get(section, url + '.pattern',
|
|
||||||
False, qfields)
|
|
||||||
except Exception, e:
|
|
||||||
logging.error(_("unable to parse %s: %s") %
|
|
||||||
(my_config.get(section, url +
|
|
||||||
'.pattern', True), e))
|
|
||||||
return result
|
|
||||||
|
|
||||||
class DeveloperData(formencode.Schema):
|
|
||||||
name = validators.String(not_empty=True)
|
|
||||||
email = validators.Email(not_empty=True)
|
|
||||||
username = validators.PlainText(not_empty=True)
|
|
||||||
|
|
||||||
def validate_input(fields):
|
|
||||||
logging.debug(fields)
|
|
||||||
return DeveloperData().to_python(fields)
|
|
||||||
|
|
||||||
def gather_additional_info(fields):
|
|
||||||
logging.debug(fields)
|
|
||||||
return fields
|
|
||||||
|
|
||||||
def application(environ, start_response):
|
|
||||||
"""WSGI application entry point."""
|
|
||||||
if environ['REQUEST_METHOD'] == 'POST':
|
|
||||||
try:
|
|
||||||
fields = gather_additional_info(
|
|
||||||
validate_input(parse_formvars(environ)))
|
|
||||||
except formencode.Invalid, e:
|
|
||||||
start_response('400 Bad Request', [('content-type', 'text/plain')])
|
|
||||||
return ["input validation failed\n", e.unpack_errors()]
|
|
||||||
data = build_urls(fields)
|
|
||||||
if ('mode' in fields and fields['mode'] == 'json'):
|
|
||||||
start_response('200 OK', [('content-type', 'text/json')])
|
|
||||||
return [simplejson.dumps(data)]
|
|
||||||
else:
|
|
||||||
start_response('200 OK', [('content-type', 'text/html')])
|
|
||||||
return ['''<html>
|
|
||||||
<head><title>''', _("Debian Developer Portfolio"),'''</title></head>
|
|
||||||
<body>
|
|
||||||
<ul>
|
|
||||||
<li>''',
|
|
||||||
'</li><li>'.join([
|
|
||||||
'%(key)s: <a href="%(url)s">%(url)s</a>' %
|
|
||||||
{'key': key, 'url': data[key]} for key in data]),
|
|
||||||
'</li></ul></body></html>']
|
|
||||||
else:
|
|
||||||
start_response('200 OK', [('content-type', 'text/html')])
|
|
||||||
return ['''<html>
|
|
||||||
<head>
|
|
||||||
<title>''', _('Debian Developer Portfolio'), '''</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<form method="post">
|
|
||||||
<fieldset id="ddportfolio">
|
|
||||||
<legend>''', _('Debian Developer Portfolio'), '''</legend>
|
|
||||||
<label for="name">''', _('Name:'), '''</label><br />
|
|
||||||
<input type="text" name="name" /><br />
|
|
||||||
<label for="email">''', _('E-Mail:'), '''</label><br />
|
|
||||||
<input type="text" name="email" /><br />
|
|
||||||
<label for="username">''', _('User name:'), '''</label><br />
|
|
||||||
<input type="text" name="username" /><br />
|
|
||||||
<input type="submit" value="''', _('Build DD Portfolio URLs'), '''" />
|
|
||||||
</fieldset>
|
|
||||||
</form>
|
|
||||||
</body>
|
|
||||||
</html>''']
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
from paste import httpserver
|
|
||||||
httpserver.serve(application, host='127.0.0.1', port='8080')
|
|
55
ddportfolioservice/i18n/ddportfolioservice.pot
Normal file
55
ddportfolioservice/i18n/ddportfolioservice.pot
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
# Translations template for ddportfolioservice.
|
||||||
|
# Copyright (C) 2009 ORGANIZATION
|
||||||
|
# This file is distributed under the same license as the ddportfolioservice
|
||||||
|
# project.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2009.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: ddportfolioservice 0.1\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2009-01-20 23:13+0100\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=utf-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Generated-By: Babel 0.9.1\n"
|
||||||
|
|
||||||
|
#: ddportfolioservice/ddportfolio.py:35
|
||||||
|
#, python-format
|
||||||
|
msgid "unable to parse %s: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ddportfolioservice/ddportfolio.py:69 ddportfolioservice/ddportfolio.py:81
|
||||||
|
#: ddportfolioservice/ddportfolio.py:86
|
||||||
|
#: ddportfolioservice/templates/showform.mako:5
|
||||||
|
#: ddportfolioservice/templates/showform.mako:10
|
||||||
|
msgid "Debian Developer Portfolio"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ddportfolioservice/ddportfolio.py:87
|
||||||
|
#: ddportfolioservice/templates/showform.mako:11
|
||||||
|
msgid "Name:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ddportfolioservice/ddportfolio.py:89
|
||||||
|
msgid "E-Mail:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ddportfolioservice/ddportfolio.py:91
|
||||||
|
#: ddportfolioservice/templates/showform.mako:15
|
||||||
|
msgid "User name:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ddportfolioservice/ddportfolio.py:93
|
||||||
|
#: ddportfolioservice/templates/showform.mako:17
|
||||||
|
msgid "Build DD Portfolio URLs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ddportfolioservice/templates/showform.mako:13
|
||||||
|
msgid "E-Mail address:"
|
||||||
|
msgstr ""
|
||||||
|
|
BIN
ddportfolioservice/i18n/de/LC_MESSAGES/ddportfolioservice.mo
Normal file
BIN
ddportfolioservice/i18n/de/LC_MESSAGES/ddportfolioservice.mo
Normal file
Binary file not shown.
55
ddportfolioservice/i18n/de/LC_MESSAGES/ddportfolioservice.po
Normal file
55
ddportfolioservice/i18n/de/LC_MESSAGES/ddportfolioservice.po
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
# German translations for ddportfolioservice.
|
||||||
|
# Copyright (C) 2009 Jan Dittberner
|
||||||
|
# This file is distributed under the same license as the ddportfolioservice
|
||||||
|
# project.
|
||||||
|
# Jan Dittberner <jan@dittberner.info>, 2009.
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: ddportfolioservice 0.1\n"
|
||||||
|
"Report-Msgid-Bugs-To: jan@dittberner.info\n"
|
||||||
|
"POT-Creation-Date: 2009-01-20 23:13+0100\n"
|
||||||
|
"PO-Revision-Date: 2009-01-20 23:24+0100\n"
|
||||||
|
"Last-Translator: Jan Dittberner <jan@dittberner.info>\n"
|
||||||
|
"Language-Team: de <LL@li.org>\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=utf-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Generated-By: Babel 0.9.1\n"
|
||||||
|
|
||||||
|
#: ddportfolioservice/ddportfolio.py:35
|
||||||
|
#, python-format
|
||||||
|
msgid "unable to parse %s: %s"
|
||||||
|
msgstr "Konnte %s nicht parsen: %s"
|
||||||
|
|
||||||
|
#: ddportfolioservice/ddportfolio.py:69 ddportfolioservice/ddportfolio.py:81
|
||||||
|
#: ddportfolioservice/ddportfolio.py:86
|
||||||
|
#: ddportfolioservice/templates/showform.mako:5
|
||||||
|
#: ddportfolioservice/templates/showform.mako:10
|
||||||
|
msgid "Debian Developer Portfolio"
|
||||||
|
msgstr "Debian-Entwicklerportfolio"
|
||||||
|
|
||||||
|
#: ddportfolioservice/ddportfolio.py:87
|
||||||
|
#: ddportfolioservice/templates/showform.mako:11
|
||||||
|
msgid "Name:"
|
||||||
|
msgstr "Name:"
|
||||||
|
|
||||||
|
#: ddportfolioservice/ddportfolio.py:89
|
||||||
|
msgid "E-Mail:"
|
||||||
|
msgstr "E-Mail"
|
||||||
|
|
||||||
|
#: ddportfolioservice/ddportfolio.py:91
|
||||||
|
#: ddportfolioservice/templates/showform.mako:15
|
||||||
|
msgid "User name:"
|
||||||
|
msgstr "Benutzername:"
|
||||||
|
|
||||||
|
#: ddportfolioservice/ddportfolio.py:93
|
||||||
|
#: ddportfolioservice/templates/showform.mako:17
|
||||||
|
msgid "Build DD Portfolio URLs"
|
||||||
|
msgstr "Debian-Entwicklerportfolio-URLs bauen"
|
||||||
|
|
||||||
|
#: ddportfolioservice/templates/showform.mako:13
|
||||||
|
msgid "E-Mail address:"
|
||||||
|
msgstr "E-Mailadresse:"
|
||||||
|
|
0
ddportfolioservice/lib/__init__.py
Normal file
0
ddportfolioservice/lib/__init__.py
Normal file
14
ddportfolioservice/lib/app_globals.py
Normal file
14
ddportfolioservice/lib/app_globals.py
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
"""The application's Globals object"""
|
||||||
|
from pylons import config
|
||||||
|
|
||||||
|
class Globals(object):
|
||||||
|
"""Globals acts as a container for objects available throughout the
|
||||||
|
life of the application
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
"""One instance of Globals is created during application
|
||||||
|
initialization and is available during requests via the 'g'
|
||||||
|
variable
|
||||||
|
"""
|
||||||
|
pass
|
34
ddportfolioservice/lib/base.py
Normal file
34
ddportfolioservice/lib/base.py
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
"""The base Controller API
|
||||||
|
|
||||||
|
Provides the BaseController class for subclassing, and other objects
|
||||||
|
utilized by Controllers.
|
||||||
|
"""
|
||||||
|
from pylons import c, cache, config, g, request, response, session
|
||||||
|
from pylons.controllers import WSGIController
|
||||||
|
from pylons.controllers.util import abort, etag_cache, redirect_to
|
||||||
|
from pylons.decorators import jsonify, validate
|
||||||
|
from pylons.i18n import _, ungettext, N_, add_fallback
|
||||||
|
from pylons.templating import render
|
||||||
|
|
||||||
|
import ddportfolioservice.lib.helpers as h
|
||||||
|
import ddportfolioservice.model as model
|
||||||
|
|
||||||
|
class BaseController(WSGIController):
|
||||||
|
|
||||||
|
def __call__(self, environ, start_response):
|
||||||
|
"""Invoke the Controller"""
|
||||||
|
# WSGIController.__call__ dispatches to the Controller method
|
||||||
|
# the request is routed to. This routing information is
|
||||||
|
# available in environ['pylons.routes_dict']
|
||||||
|
# set language environment
|
||||||
|
for lang in request.languages:
|
||||||
|
try:
|
||||||
|
add_fallback(lang)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
c.messages = { 'errors': [], 'messages': [] }
|
||||||
|
return WSGIController.__call__(self, environ, start_response)
|
||||||
|
|
||||||
|
# Include the '_' function in the public names
|
||||||
|
__all__ = [__name for __name in locals().keys() if not __name.startswith('_') \
|
||||||
|
or __name == '_']
|
7
ddportfolioservice/lib/helpers.py
Normal file
7
ddportfolioservice/lib/helpers.py
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
"""Helper functions
|
||||||
|
|
||||||
|
Consists of functions to typically be used within templates, but also
|
||||||
|
available to Controllers. This module is available to both as 'h'.
|
||||||
|
"""
|
||||||
|
from webhelpers import *
|
||||||
|
from webhelpers.rails import *
|
0
ddportfolioservice/model/__init__.py
Normal file
0
ddportfolioservice/model/__init__.py
Normal file
|
@ -9,13 +9,13 @@ received.pattern=http://bugs.debian.org/%(email)s
|
||||||
reported.pattern=http://bugs.debian.org/from:%(email)s
|
reported.pattern=http://bugs.debian.org/from:%(email)s
|
||||||
bugstats.pattern=http://asdfasdf.debian.net/~tar/bugstats/?%(email)s
|
bugstats.pattern=http://asdfasdf.debian.net/~tar/bugstats/?%(email)s
|
||||||
usertags.pattern=http://bugs.debian.org/cgi-bin/pkgreport.cgi?users=%(email)s
|
usertags.pattern=http://bugs.debian.org/cgi-bin/pkgreport.cgi?users=%(email)s
|
||||||
searchall.pattern=http://merkel.debian.org/~don/cgi/search.cgi?phrase=%(name)s&search=search
|
searchall.pattern=http://merkel.debian.org/~don/cgi/search.cgi?phrase=%(name)s&search=search
|
||||||
wnpp.pattern=http://qa.debian.org/developer.php?wnpp=%(email)s
|
wnpp.pattern=http://qa.debian.org/developer.php?wnpp=%(email)s
|
||||||
|
|
||||||
[build]
|
[build]
|
||||||
urls=buildd,igloo,svnbuildstat
|
urls=buildd,igloo,svnbuildstat
|
||||||
buildd.pattern=http://buildd.debian.org/pkg.cgi?maint=%(email)s
|
buildd.pattern=http://buildd.debian.org/pkg.cgi?maint=%(email)s
|
||||||
igloo.pattern=http://oldpeople.debian.org/~igloo/status.php?email=%(email)s&thin=on
|
igloo.pattern=http://oldpeople.debian.org/~igloo/status.php?email=%(email)s&thin=on
|
||||||
svnbuildstat.pattern=http://svnbuildstat.debian.net/packages/list/%(email)s
|
svnbuildstat.pattern=http://svnbuildstat.debian.net/packages/list/%(email)s
|
||||||
|
|
||||||
[qa]
|
[qa]
|
||||||
|
@ -30,9 +30,9 @@ keylog.pattern=http://merkel.debian.org/~enrico/keylog/%(gpgfp)s.html
|
||||||
|
|
||||||
[lists]
|
[lists]
|
||||||
urls=dolists,adolists,gmane
|
urls=dolists,adolists,gmane
|
||||||
dolists.pattern=http://lists.debian.org/cgi-bin/search?author=%(name)s&sort=date
|
dolists.pattern=http://lists.debian.org/cgi-bin/search?author=%(name)s&sort=date
|
||||||
adolists.pattern=http://www.google.com/search?q=site%%3Alists.alioth.debian.org+%%22%(name)s%%22
|
adolists.pattern=http://www.google.com/search?q=site%%3Alists.alioth.debian.org+%%22%(name)s%%22
|
||||||
gmane.pattern=http://search.gmane.org/?email=%(name)s&group=gmane.linux.debian.*
|
gmane.pattern=http://search.gmane.org/?email=%(name)s&group=gmane.linux.debian.*
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
urls=people,alioth
|
urls=people,alioth
|
||||||
|
@ -42,10 +42,10 @@ alioth.pattern=http://alioth.debian.org/~%(username)s/
|
||||||
[membership]
|
[membership]
|
||||||
urls=nm,db,alioth
|
urls=nm,db,alioth
|
||||||
nm.pattern=https://nm.debian.org/nmstatus.php?email=%(email)s
|
nm.pattern=https://nm.debian.org/nmstatus.php?email=%(email)s
|
||||||
db.pattern=http://db.debian.org/search.cgi?uid=%(username)s&dosearch=Search
|
db.pattern=http://db.debian.org/search.cgi?uid=%(username)s&dosearch=Search
|
||||||
alioth.pattern=http://alioth.debian.org/users/%(username)s/
|
alioth.pattern=http://alioth.debian.org/users/%(username)s/
|
||||||
|
|
||||||
[miscellaneous]
|
[miscellaneous]
|
||||||
urls=debtags,links
|
urls=debtags,links
|
||||||
debtags.pattern=http://debtags.alioth.debian.org/todo.html?maint=%(email)s
|
debtags.pattern=http://debtags.alioth.debian.org/todo.html?maint=%(email)s
|
||||||
links.pattern=http://www.google.com/search?hl=en&lr=&q=site%%3Adebian.org+%%22%(name)s%%22+-site%%3Anm.debian.org+-site%%3Alintian.debian.org+-site%%3Abugs.debian.org+-site%%3Alists.debian.org+-site%%3Apackages.debian.org+-site%%3Alists.alioth.debian.org+-site%%3Aftp.debian.org++-site%%3Apackages.qa.debian.org++-site%%3Aftp*.*.debian.org+-inurl%%3Adebian.org%%2Fdevel%%2Fpeople.+-inurl%%3Aindices%%2FMaintainers+-inurl%%3Adebian.org%%2Fdebian%%2Fproject++-inurl%%3A%%2Fdists%%2F&btnG=Search
|
links.pattern=http://www.google.com/search?hl=en&lr=&q=site%%3Adebian.org+%%22%(name)s%%22+-site%%3Anm.debian.org+-site%%3Alintian.debian.org+-site%%3Abugs.debian.org+-site%%3Alists.debian.org+-site%%3Apackages.debian.org+-site%%3Alists.alioth.debian.org+-site%%3Aftp.debian.org++-site%%3Apackages.qa.debian.org++-site%%3Aftp*.*.debian.org+-inurl%%3Adebian.org%%2Fdevel%%2Fpeople.+-inurl%%3Aindices%%2FMaintainers+-inurl%%3Adebian.org%%2Fdebian%%2Fproject++-inurl%%3A%%2Fdists%%2F&btnG=Search
|
8
ddportfolioservice/model/form.py
Normal file
8
ddportfolioservice/model/form.py
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import formencode
|
||||||
|
|
||||||
|
class DeveloperData(formencode.Schema):
|
||||||
|
allow_extra_fields = True
|
||||||
|
filter_extra_fields = True
|
||||||
|
name = formencode.validators.String(not_empty=True)
|
||||||
|
email = formencode.validators.Email(not_empty=True)
|
||||||
|
username = formencode.validators.PlainText(not_empty=True)
|
30
ddportfolioservice/model/urlbuilder.py
Normal file
30
ddportfolioservice/model/urlbuilder.py
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# -*- python -*-
|
||||||
|
# -*- coding: utf8 -*-
|
||||||
|
|
||||||
|
import ConfigParser
|
||||||
|
import pkg_resources
|
||||||
|
from urllib import quote_plus
|
||||||
|
|
||||||
|
my_config = ConfigParser.ConfigParser()
|
||||||
|
my_config.readfp(pkg_resources.resource_stream(__name__, 'ddportfolio.ini'))
|
||||||
|
|
||||||
|
|
||||||
|
def build_urls(fields):
|
||||||
|
"""Build personalized URLs using the developer information in
|
||||||
|
fields."""
|
||||||
|
data = {}
|
||||||
|
errors = {}
|
||||||
|
qfields = dict([(key, quote_plus(fields[key])) for key in fields])
|
||||||
|
for section in my_config.sections():
|
||||||
|
if my_config.has_option(section, 'urls'):
|
||||||
|
for url in my_config.get(section, 'urls').split(','):
|
||||||
|
if my_config.has_option(section, url + '.pattern'):
|
||||||
|
try:
|
||||||
|
data[section + '.' + url] = \
|
||||||
|
my_config.get(section, url + '.pattern',
|
||||||
|
False, qfields)
|
||||||
|
except Exception, e:
|
||||||
|
errors['%s.%s.pattern' % (section, url)] = \
|
||||||
|
[my_config.get(section, '%s.pattern' % url,
|
||||||
|
True), str(e)]
|
||||||
|
return {'data' : data, 'errors' : errors}
|
4
ddportfolioservice/public/stylesheets/style.css
Normal file
4
ddportfolioservice/public/stylesheets/style.css
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
.errormsg {
|
||||||
|
font-size: 80%;
|
||||||
|
color: red;
|
||||||
|
}
|
36
ddportfolioservice/templates/showform.mako
Normal file
36
ddportfolioservice/templates/showform.mako
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>${_('Debian Developer Portfolio')}</title>
|
||||||
|
${h.stylesheet_link_tag('style')}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
${h.start_form(h.url_for(action='handle_post'), method='post')}
|
||||||
|
<fieldset id="ddportfolio">
|
||||||
|
<legend>${_('Debian Developer Portfolio')}</legend>
|
||||||
|
<label for="name">${_('Name:')}
|
||||||
|
% if 'name' in c.messages['errors']:
|
||||||
|
<br /><span class="errormsg">${c.messages['errors']['name']}</span>
|
||||||
|
% endif
|
||||||
|
</label><br />
|
||||||
|
${h.text_field('name', value=request.params.get('name', None))}<br />
|
||||||
|
<label for="email">${_('E-Mail address:')}
|
||||||
|
% if 'email' in c.messages['errors']:
|
||||||
|
<br /><span class="errormsg">${c.messages['errors']['email']}</span>
|
||||||
|
% endif
|
||||||
|
</label><br />
|
||||||
|
${h.text_field('email', value=request.params.get('email', None))}<br />
|
||||||
|
<label for="username">${_('User name:')}
|
||||||
|
% if 'username' in c.messages['errors']:
|
||||||
|
<br /><span class="errormsg">${c.messages['errors']['username']}</span>
|
||||||
|
% endif
|
||||||
|
</label><br />
|
||||||
|
${h.text_field('username', value=request.params.get('username', None))}<br />
|
||||||
|
<label for="mode_html">${_('Output format:')}</label><br />
|
||||||
|
${_('HTML')} ${h.radio_button('mode', 'html', checked=(request.params.get('mode', 'html') == 'html'))} ${_('JSON')} ${h.radio_button('mode', 'json', checked=(request.params.get('mode', 'html') == 'json'))}<br />
|
||||||
|
${h.submit(value=_('Build DD Portfolio URLs'))}
|
||||||
|
</fieldset>
|
||||||
|
${h.end_form()}
|
||||||
|
</body>
|
||||||
|
</html>
|
34
ddportfolioservice/templates/showurls.mako
Normal file
34
ddportfolioservice/templates/showurls.mako
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>${_('Debian Developer Portfolio')}</title>
|
||||||
|
${h.stylesheet_link_tag('style')}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
% if c.urldata['data']:
|
||||||
|
<fieldset id="ddportfolio">
|
||||||
|
<legend>${_('Debian Developer Portfolio')}</legend>
|
||||||
|
<ul>
|
||||||
|
% for key in c.urldata['data']:
|
||||||
|
<li>${key}<br />${h.link_to(h.truncate(
|
||||||
|
c.urldata['data'][key], length=120), c.urldata['data'][key])}</li>
|
||||||
|
% endfor
|
||||||
|
</ul>
|
||||||
|
</fieldset>
|
||||||
|
% endif
|
||||||
|
% if c.urldata['errors']:
|
||||||
|
<fieldset id="ddportfolioerrors">
|
||||||
|
<legend>${_('Errors during URL creation')}</legend>
|
||||||
|
<ul>
|
||||||
|
% for key in c.urldata['errors']:
|
||||||
|
<li>${key}<br />
|
||||||
|
<span class="errormsg">${c.urldata['errors'][key][0]}<br />
|
||||||
|
${c.urldata['errors'][key][1]}</span></li>
|
||||||
|
% endfor
|
||||||
|
</ul>
|
||||||
|
</fieldset>
|
||||||
|
% endif
|
||||||
|
<p>${h.link_to(_('Restart'), h.url_for(action='index'))}</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
40
ddportfolioservice/tests/__init__.py
Normal file
40
ddportfolioservice/tests/__init__.py
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
"""Pylons application test package
|
||||||
|
|
||||||
|
When the test runner finds and executes tests within this directory,
|
||||||
|
this file will be loaded to setup the test environment.
|
||||||
|
|
||||||
|
It registers the root directory of the project in sys.path and
|
||||||
|
pkg_resources, in case the project hasn't been installed with
|
||||||
|
setuptools. It also initializes the application via websetup (paster
|
||||||
|
setup-app) with the project's test.ini configuration file.
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from unittest import TestCase
|
||||||
|
|
||||||
|
import pkg_resources
|
||||||
|
import paste.fixture
|
||||||
|
import paste.script.appinstall
|
||||||
|
from paste.deploy import loadapp
|
||||||
|
from routes import url_for
|
||||||
|
|
||||||
|
__all__ = ['url_for', 'TestController']
|
||||||
|
|
||||||
|
here_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
conf_dir = os.path.dirname(os.path.dirname(here_dir))
|
||||||
|
|
||||||
|
sys.path.insert(0, conf_dir)
|
||||||
|
pkg_resources.working_set.add_entry(conf_dir)
|
||||||
|
pkg_resources.require('Paste')
|
||||||
|
pkg_resources.require('PasteScript')
|
||||||
|
|
||||||
|
test_file = os.path.join(conf_dir, 'test.ini')
|
||||||
|
cmd = paste.script.appinstall.SetupCommand('setup-app')
|
||||||
|
cmd.run([test_file])
|
||||||
|
|
||||||
|
class TestController(TestCase):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
wsgiapp = loadapp('config:test.ini', relative_to=conf_dir)
|
||||||
|
self.app = paste.fixture.TestApp(wsgiapp)
|
||||||
|
TestCase.__init__(self, *args, **kwargs)
|
0
ddportfolioservice/tests/functional/__init__.py
Normal file
0
ddportfolioservice/tests/functional/__init__.py
Normal file
7
ddportfolioservice/tests/functional/test_ddportfolio.py
Normal file
7
ddportfolioservice/tests/functional/test_ddportfolio.py
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
from ddportfolioservice.tests import *
|
||||||
|
|
||||||
|
class TestDdportfolioController(TestController):
|
||||||
|
|
||||||
|
def test_index(self):
|
||||||
|
response = self.app.get(url_for(controller='ddportfolio'))
|
||||||
|
# Test response...
|
0
ddportfolioservice/tests/test_models.py
Normal file
0
ddportfolioservice/tests/test_models.py
Normal file
14
ddportfolioservice/websetup.py
Normal file
14
ddportfolioservice/websetup.py
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
"""Setup the ddportfolioservice application"""
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from paste.deploy import appconfig
|
||||||
|
from pylons import config
|
||||||
|
|
||||||
|
from ddportfolioservice.config.environment import load_environment
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
def setup_config(command, filename, section, vars):
|
||||||
|
"""Place any commands to setup ddportfolioservice here"""
|
||||||
|
conf = appconfig('config:' + filename)
|
||||||
|
load_environment(conf.global_conf, conf.local_conf)
|
64
development.ini
Normal file
64
development.ini
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
#
|
||||||
|
# ddportfolioservice - Pylons development environment configuration
|
||||||
|
#
|
||||||
|
# The %(here)s variable will be replaced with the parent directory of this file
|
||||||
|
#
|
||||||
|
[DEFAULT]
|
||||||
|
debug = true
|
||||||
|
# Uncomment and replace with the address which should receive any error reports
|
||||||
|
#email_to = you@yourdomain.com
|
||||||
|
smtp_server = localhost
|
||||||
|
error_email_from = paste@localhost
|
||||||
|
|
||||||
|
[server:main]
|
||||||
|
use = egg:Paste#http
|
||||||
|
host = 0.0.0.0
|
||||||
|
port = 5000
|
||||||
|
|
||||||
|
[app:main]
|
||||||
|
use = egg:ddportfolioservice
|
||||||
|
full_stack = true
|
||||||
|
cache_dir = %(here)s/data
|
||||||
|
beaker.session.key = ddportfolioservice
|
||||||
|
beaker.session.secret = somesecret
|
||||||
|
|
||||||
|
# If you'd like to fine-tune the individual locations of the cache data dirs
|
||||||
|
# for the Cache data, or the Session saves, un-comment the desired settings
|
||||||
|
# here:
|
||||||
|
#beaker.cache.data_dir = %(here)s/data/cache
|
||||||
|
#beaker.session.data_dir = %(here)s/data/sessions
|
||||||
|
|
||||||
|
# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*
|
||||||
|
# Debug mode will enable the interactive debugging tool, allowing ANYONE to
|
||||||
|
# execute malicious code after an exception is raised.
|
||||||
|
#set debug = false
|
||||||
|
|
||||||
|
|
||||||
|
# Logging configuration
|
||||||
|
[loggers]
|
||||||
|
keys = root, ddportfolioservice
|
||||||
|
|
||||||
|
[handlers]
|
||||||
|
keys = console
|
||||||
|
|
||||||
|
[formatters]
|
||||||
|
keys = generic
|
||||||
|
|
||||||
|
[logger_root]
|
||||||
|
level = INFO
|
||||||
|
handlers = console
|
||||||
|
|
||||||
|
[logger_ddportfolioservice]
|
||||||
|
level = DEBUG
|
||||||
|
handlers =
|
||||||
|
qualname = ddportfolioservice
|
||||||
|
|
||||||
|
[handler_console]
|
||||||
|
class = StreamHandler
|
||||||
|
args = (sys.stderr,)
|
||||||
|
level = NOTSET
|
||||||
|
formatter = generic
|
||||||
|
|
||||||
|
[formatter_generic]
|
||||||
|
format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
|
||||||
|
datefmt = %H:%M:%S
|
190
docs/conf.py
Normal file
190
docs/conf.py
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Debian Developer Portfolio Service documentation build configuration file, created by
|
||||||
|
# sphinx-quickstart on Tue Jan 20 22:27:21 2009.
|
||||||
|
#
|
||||||
|
# This file is execfile()d with the current directory set to its containing dir.
|
||||||
|
#
|
||||||
|
# The contents of this file are pickled, so don't put values in the namespace
|
||||||
|
# that aren't pickleable (module imports are okay, they're removed automatically).
|
||||||
|
#
|
||||||
|
# Note that not all possible configuration values are present in this
|
||||||
|
# autogenerated file.
|
||||||
|
#
|
||||||
|
# All configuration values have a default; values that are commented out
|
||||||
|
# serve to show the default.
|
||||||
|
|
||||||
|
import sys, os
|
||||||
|
|
||||||
|
# If your extensions are in another directory, add it here. If the directory
|
||||||
|
# is relative to the documentation root, use os.path.abspath to make it
|
||||||
|
# absolute, like shown here.
|
||||||
|
#sys.path.append(os.path.abspath('.'))
|
||||||
|
|
||||||
|
# General configuration
|
||||||
|
# ---------------------
|
||||||
|
|
||||||
|
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||||
|
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||||
|
extensions = ['sphinx.ext.autodoc']
|
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
|
templates_path = ['.templates']
|
||||||
|
|
||||||
|
# The suffix of source filenames.
|
||||||
|
source_suffix = '.rst'
|
||||||
|
|
||||||
|
# The encoding of source files.
|
||||||
|
#source_encoding = 'utf-8'
|
||||||
|
|
||||||
|
# The master toctree document.
|
||||||
|
master_doc = 'index'
|
||||||
|
|
||||||
|
# General information about the project.
|
||||||
|
project = u'Debian Developer Portfolio Service'
|
||||||
|
copyright = u'2009, Jan Dittberner'
|
||||||
|
|
||||||
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
|
# |version| and |release|, also used in various other places throughout the
|
||||||
|
# built documents.
|
||||||
|
#
|
||||||
|
# The short X.Y version.
|
||||||
|
version = '0.1'
|
||||||
|
# The full version, including alpha/beta/rc tags.
|
||||||
|
release = '0.1dev'
|
||||||
|
|
||||||
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
|
# for a list of supported languages.
|
||||||
|
#language = None
|
||||||
|
|
||||||
|
# There are two options for replacing |today|: either, you set today to some
|
||||||
|
# non-false value, then it is used:
|
||||||
|
#today = ''
|
||||||
|
# Else, today_fmt is used as the format for a strftime call.
|
||||||
|
#today_fmt = '%B %d, %Y'
|
||||||
|
|
||||||
|
# List of documents that shouldn't be included in the build.
|
||||||
|
#unused_docs = []
|
||||||
|
|
||||||
|
# List of directories, relative to source directory, that shouldn't be searched
|
||||||
|
# for source files.
|
||||||
|
exclude_trees = []
|
||||||
|
|
||||||
|
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||||
|
#default_role = None
|
||||||
|
|
||||||
|
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||||
|
#add_function_parentheses = True
|
||||||
|
|
||||||
|
# If true, the current module name will be prepended to all description
|
||||||
|
# unit titles (such as .. function::).
|
||||||
|
#add_module_names = True
|
||||||
|
|
||||||
|
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||||
|
# output. They are ignored by default.
|
||||||
|
#show_authors = False
|
||||||
|
|
||||||
|
# The name of the Pygments (syntax highlighting) style to use.
|
||||||
|
pygments_style = 'sphinx'
|
||||||
|
|
||||||
|
|
||||||
|
# Options for HTML output
|
||||||
|
# -----------------------
|
||||||
|
|
||||||
|
# The style sheet to use for HTML and HTML Help pages. A file of that name
|
||||||
|
# must exist either in Sphinx' static/ path, or in one of the custom paths
|
||||||
|
# given in html_static_path.
|
||||||
|
html_style = 'default.css'
|
||||||
|
|
||||||
|
# The name for this set of Sphinx documents. If None, it defaults to
|
||||||
|
# "<project> v<release> documentation".
|
||||||
|
#html_title = None
|
||||||
|
|
||||||
|
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||||
|
#html_short_title = None
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top
|
||||||
|
# of the sidebar.
|
||||||
|
#html_logo = None
|
||||||
|
|
||||||
|
# The name of an image file (within the static path) to use as favicon of the
|
||||||
|
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||||
|
# pixels large.
|
||||||
|
#html_favicon = None
|
||||||
|
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
|
html_static_path = ['.static']
|
||||||
|
|
||||||
|
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||||
|
# using the given strftime format.
|
||||||
|
#html_last_updated_fmt = '%b %d, %Y'
|
||||||
|
|
||||||
|
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||||
|
# typographically correct entities.
|
||||||
|
#html_use_smartypants = True
|
||||||
|
|
||||||
|
# Custom sidebar templates, maps document names to template names.
|
||||||
|
#html_sidebars = {}
|
||||||
|
|
||||||
|
# Additional templates that should be rendered to pages, maps page names to
|
||||||
|
# template names.
|
||||||
|
#html_additional_pages = {}
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
html_use_modindex = False
|
||||||
|
|
||||||
|
# If false, no index is generated.
|
||||||
|
#html_use_index = True
|
||||||
|
|
||||||
|
# If true, the index is split into individual pages for each letter.
|
||||||
|
#html_split_index = False
|
||||||
|
|
||||||
|
# If true, the reST sources are included in the HTML build as _sources/<name>.
|
||||||
|
#html_copy_source = True
|
||||||
|
|
||||||
|
# If true, an OpenSearch description file will be output, and all pages will
|
||||||
|
# contain a <link> tag referring to it. The value of this option must be the
|
||||||
|
# base URL from which the finished HTML is served.
|
||||||
|
#html_use_opensearch = ''
|
||||||
|
|
||||||
|
# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
|
||||||
|
#html_file_suffix = ''
|
||||||
|
|
||||||
|
# Output file base name for HTML help builder.
|
||||||
|
htmlhelp_basename = 'DebianDeveloperPortfolioServicedoc'
|
||||||
|
|
||||||
|
|
||||||
|
# Options for LaTeX output
|
||||||
|
# ------------------------
|
||||||
|
|
||||||
|
# The paper size ('letter' or 'a4').
|
||||||
|
#latex_paper_size = 'letter'
|
||||||
|
|
||||||
|
# The font size ('10pt', '11pt' or '12pt').
|
||||||
|
#latex_font_size = '10pt'
|
||||||
|
|
||||||
|
# Grouping the document tree into LaTeX files. List of tuples
|
||||||
|
# (source start file, target name, title, author, document class [howto/manual]).
|
||||||
|
latex_documents = [
|
||||||
|
('index', 'DebianDeveloperPortfolioService.tex', ur'Debian Developer Portfolio Service Documentation',
|
||||||
|
ur'Jan Dittberner', 'manual'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
|
# the title page.
|
||||||
|
#latex_logo = None
|
||||||
|
|
||||||
|
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||||
|
# not chapters.
|
||||||
|
#latex_use_parts = False
|
||||||
|
|
||||||
|
# Additional stuff for the LaTeX preamble.
|
||||||
|
#latex_preamble = ''
|
||||||
|
|
||||||
|
# Documents to append as an appendix to all manuals.
|
||||||
|
#latex_appendices = []
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#latex_use_modindex = True
|
18
docs/index.rst
Normal file
18
docs/index.rst
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
.. Debian Developer Portfolio Service documentation master file, created by sphinx-quickstart on Tue Jan 20 22:27:21 2009.
|
||||||
|
You can adapt this file completely to your liking, but it should at least
|
||||||
|
contain the root `toctree` directive.
|
||||||
|
|
||||||
|
Welcome to Debian Developer Portfolio Service's documentation!
|
||||||
|
==============================================================
|
||||||
|
|
||||||
|
Contents:
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
Indices and tables
|
||||||
|
==================
|
||||||
|
|
||||||
|
* :ref:`genindex`
|
||||||
|
* :ref:`search`
|
||||||
|
|
32
setup.cfg
32
setup.cfg
|
@ -1,3 +1,35 @@
|
||||||
[egg_info]
|
[egg_info]
|
||||||
tag_build = dev
|
tag_build = dev
|
||||||
tag_svn_revision = true
|
tag_svn_revision = true
|
||||||
|
|
||||||
|
[easy_install]
|
||||||
|
find_links = http://www.pylonshq.com/download/
|
||||||
|
|
||||||
|
[build_sphinx]
|
||||||
|
source-dir = docs
|
||||||
|
|
||||||
|
[publish]
|
||||||
|
doc-dir=docs/html
|
||||||
|
make-dirs=1
|
||||||
|
|
||||||
|
# Babel configuration
|
||||||
|
[compile_catalog]
|
||||||
|
domain = ddportfolioservice
|
||||||
|
directory = ddportfolioservice/i18n
|
||||||
|
statistics = true
|
||||||
|
|
||||||
|
[extract_messages]
|
||||||
|
add_comments = TRANSLATORS:
|
||||||
|
output_file = ddportfolioservice/i18n/ddportfolioservice.pot
|
||||||
|
width = 80
|
||||||
|
|
||||||
|
[init_catalog]
|
||||||
|
domain = ddportfolioservice
|
||||||
|
input_file = ddportfolioservice/i18n/ddportfolioservice.pot
|
||||||
|
output_dir = ddportfolioservice/i18n
|
||||||
|
|
||||||
|
[update_catalog]
|
||||||
|
domain = ddportfolioservice
|
||||||
|
input_file = ddportfolioservice/i18n/ddportfolioservice.pot
|
||||||
|
output_dir = ddportfolioservice/i18n
|
||||||
|
previous = true
|
||||||
|
|
46
setup.py
46
setup.py
|
@ -1,11 +1,14 @@
|
||||||
|
try:
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
except ImportError:
|
||||||
|
from ez_setup import use_setuptools
|
||||||
|
use_setuptools()
|
||||||
from setuptools import setup, find_packages
|
from setuptools import setup, find_packages
|
||||||
import sys, os
|
|
||||||
|
|
||||||
version = '0.1'
|
setup(
|
||||||
|
name='ddportfolioservice',
|
||||||
setup(name='ddportfolioservice',
|
version='0.1',
|
||||||
version=version,
|
description='service to create DDPortfolio URLs',
|
||||||
description="service to create DDPortfolio URLs",
|
|
||||||
long_description="""This is a service implementation that
|
long_description="""This is a service implementation that
|
||||||
returns a set of personalized URLs as outlined in
|
returns a set of personalized URLs as outlined in
|
||||||
http://wiki.debian.org/DDPortfolio. It takes the Debian developers
|
http://wiki.debian.org/DDPortfolio. It takes the Debian developers
|
||||||
|
@ -21,19 +24,22 @@ array of URLs.""",
|
||||||
keywords='Debian service JSON',
|
keywords='Debian service JSON',
|
||||||
author='Jan Dittberner',
|
author='Jan Dittberner',
|
||||||
author_email='jan@dittberner.info',
|
author_email='jan@dittberner.info',
|
||||||
url='http://debian-stuff.dittberner.info/ddportfolioservice/',
|
url='http://debian-stuff.dittberner.info/ddportfolioservice',
|
||||||
license='AGPLv3',
|
license='AGPL-3.0+',
|
||||||
packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
|
install_requires=["Pylons>=0.9.6.2"],
|
||||||
|
packages=find_packages(exclude=['ez_setup']),
|
||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
zip_safe=False,
|
test_suite='nose.collector',
|
||||||
package_data= {
|
package_data={'ddportfolioservice': ['*.ini', 'i18n/*/LC_MESSAGES/*.mo']},
|
||||||
'ddportfolioservice' : ['*.ini'],
|
message_extractors = {'ddportfolioservice': [
|
||||||
},
|
('**.py', 'python', None),
|
||||||
install_requires=[
|
('templates/**.mako', 'mako', None),
|
||||||
# -*- Extra requirements: -*-
|
('public/**', 'ignore', None)]},
|
||||||
'Paste',
|
entry_points="""
|
||||||
'PasteDeploy',
|
[paste.app_factory]
|
||||||
'simplejson',
|
main = ddportfolioservice.config.middleware:make_app
|
||||||
'formencode'
|
|
||||||
],
|
[paste.app_install]
|
||||||
|
main = pylons.util:PylonsInstaller
|
||||||
|
""",
|
||||||
)
|
)
|
||||||
|
|
21
test.ini
Normal file
21
test.ini
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#
|
||||||
|
# ddportfolioservice - Pylons testing environment configuration
|
||||||
|
#
|
||||||
|
# The %(here)s variable will be replaced with the parent directory of this file
|
||||||
|
#
|
||||||
|
[DEFAULT]
|
||||||
|
debug = true
|
||||||
|
# Uncomment and replace with the address which should receive any error reports
|
||||||
|
#email_to = you@yourdomain.com
|
||||||
|
smtp_server = localhost
|
||||||
|
error_email_from = paste@localhost
|
||||||
|
|
||||||
|
[server:main]
|
||||||
|
use = egg:Paste#http
|
||||||
|
host = 0.0.0.0
|
||||||
|
port = 5000
|
||||||
|
|
||||||
|
[app:main]
|
||||||
|
use = config:development.ini
|
||||||
|
|
||||||
|
# Add additional test specific configuration options as necessary.
|
Loading…
Reference in a new issue