annotate decoupage/web.py @ 56:0cc1af24602b

dont show size for directories
author Jeff Hammel <jhammel@mozilla.com>
date Thu, 18 Nov 2010 08:25:00 -0800
parents a2f09d749a3f
children 07cf168aa98c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
1 """
33
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
2 decoupage: a view with webob to index and serve static content
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
3 """
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
4
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
5 import os
43
8621a6e2fe38 actual sane error handling that human beings can read and decipher
Jeff Hammel <jhammel@mozilla.com>
parents: 42
diff changeset
6 import sys
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
7
26
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
8 from contenttransformer.app import FileTypeTransformer
40
89f7a8ca965c add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
9 from contenttransformer.app import transformers
48
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
10 from datetime import datetime
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
11 from formatters import formatters
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
12 from genshi.builder import Markup
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
13 from genshi.template import TemplateLoader
21
64ae0d2f402b fix breakages
egj@egj-laptop
parents: 20
diff changeset
14 from genshi.template.base import TemplateError
43
8621a6e2fe38 actual sane error handling that human beings can read and decipher
Jeff Hammel <jhammel@mozilla.com>
parents: 42
diff changeset
15 from genshi.template.base import TemplateSyntaxError
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
16 from martini.config import ConfigMunger
2
041958c8c8f2 use paste.fileapp as the fileserver
k0s <k0scist@gmail.com>
parents: 0
diff changeset
17 from paste.fileapp import FileApp
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
18 from pkg_resources import iter_entry_points
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
19 from pkg_resources import load_entry_point
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
20 from pkg_resources import resource_filename
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
21 from webob import Request, Response, exc
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
22
40
89f7a8ca965c add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
23 transformers = [i.lower() for i in transformers()]
89f7a8ca965c add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
24
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
25 class Decoupage(object):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
26
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
27 ### class level variables
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
28 defaults = { 'auto_reload': 'False',
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
29 'configuration': None,
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
30 'directory': None, # directory to serve
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
31 'cascade': 'True', # whether to cascade configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
32 'template': 'index.html', # XXX see below
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
33 'template_directories': '' # list of directories to look for templates
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
34 }
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
35
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
36 def __init__(self, **app_conf):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
37
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
38 # set defaults from app configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
39 kw = self.app_conf('decoupage', app_conf)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
40 for key in self.defaults:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
41 setattr(self, key, kw.get(key, self.defaults[key]))
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
42
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
43 # configure defaults
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
44 self.auto_reload = self.auto_reload.lower() == 'true'
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
45 self.cascade = self.cascade.lower() == 'true'
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
46 self.directory = self.directory.rstrip(os.path.sep)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
47 assert os.path.isdir(self.directory)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
48 self.template_directories = self.template_directories.split() # no spaces in directory names, for now
30
81607129a45e better error message
egj@socialplanning.org
parents: 21
diff changeset
49
81607129a45e better error message
egj@socialplanning.org
parents: 21
diff changeset
50 for directory in self.template_directories:
81607129a45e better error message
egj@socialplanning.org
parents: 21
diff changeset
51 assert os.path.isdir(directory), "Decoupage template directory %s does not exist!" % directory
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
52
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
53 # static file server
40
89f7a8ca965c add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
54 self.fileserver = FileApp # XXX still used?!?
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
55
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
56 # pluggable formats
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
57 self.formats = {}
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
58 for _format in iter_entry_points('decoupage.formats'):
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
59 try:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
60 function = _format.load()
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
61 except Exception, e:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
62 # record the error, but persist
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
63 print >> sys.stderr, "Couldn't load format: %s" % _format
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
64 print >> sys.stderr, e
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
65 continue
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
66 self.formats[_format.name] = function
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
67
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
68 # pluggable index data formatters
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
69 self.formatters = {}
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
70 for formatter in iter_entry_points('decoupage.formatters'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
71 try:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
72 _formatter = formatter.load()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
73 template_dir = resource_filename(formatter.module_name, 'templates')
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
74 if template_dir not in self.template_directories and os.path.isdir(template_dir):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
75 self.template_directories.append(template_dir)
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
76 except Exception, e:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
77 # record the error, but persist
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
78 print >> sys.stderr, "Couldn't load formatter: %s" % formatter
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
79 print >> sts.stderr, e
42
e0e1a339070c print which formmaters werent available
Jeff Hammel <jhammel@mozilla.com>
parents: 40
diff changeset
80 continue
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
81 self.formatters[formatter.name] = _formatter
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
82
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
83 # template loader
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
84 self.loader = TemplateLoader(self.template_directories,
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
85 auto_reload=self.auto_reload)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
86
26
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
87
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
88
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
89 ### methods dealing with HTTP
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
90 def __call__(self, environ, start_response):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
91 request = Request(environ)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
92 filename = request.path_info.strip('/')
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
93 path = os.path.join(self.directory, filename)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
94 if os.path.exists(path):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
95 if os.path.isdir(path):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
96
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
97 if not request.path_info.endswith('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
98 raise exc.HTTPMovedPermanently(add_slash=True)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
99
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
100 res = self.get(request)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
101 return res(environ, start_response)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
102 else:
26
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
103 conf = self.conf(request.path_info.rsplit('/',1)[0])
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
104 if '/transformer' in conf:
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
105 args = [i.split('=', 1) for i in conf['/transformer'].split(',') if '=' in i]
40
89f7a8ca965c add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
106 kwargs = {}
89f7a8ca965c add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
107 for i in conf:
89f7a8ca965c add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
108 if i.startswith('/'):
89f7a8ca965c add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
109 name = i[1:].lower()
89f7a8ca965c add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
110 if name in transformers:
89f7a8ca965c add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
111 kwargs[name] = dict([j.split('=', 1) for j in conf[i].split(',') if '=' in j])
89f7a8ca965c add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
112 fileserver = FileTypeTransformer(*args, **kwargs)
26
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
113 else:
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
114 fileserver = FileApp
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
115
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
116 fileserver = fileserver(path)
2
041958c8c8f2 use paste.fileapp as the fileserver
k0s <k0scist@gmail.com>
parents: 0
diff changeset
117 return fileserver(environ, start_response)
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
118 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
119 raise exc.HTTPNotFound()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
120
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
121
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
122 def get(self, request):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
123 """
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
124 return response to a GET requst
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
125 """
48
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
126
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
127 # ensure a sane path
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
128 path = request.path_info.strip('/')
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
129 directory = os.path.join(self.directory, path)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
130 path = '/%s' % path
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
131
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
132 # get the configuraton
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
133 conf = self.conf(path)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
134
33
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
135 ### build data dictionary
52
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
136 # TODO: separate these out into several formatters
12
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
137 files = self.filedata(path, directory, conf)
13
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
138 data = {'path': path, 'files': files, 'request': request }
33
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
139
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
140 # defaults; TODO: make this better
48
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
141 # there shouldn't need to be defaults;
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
142 # iirc, genshi has a mode where these will default to None
13
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
143 data['title'] = conf.get('/title')
15
8923fda80bd4 misspelling
k0s <k0scist@gmail.com>
parents: 14
diff changeset
144 data['directory'] = directory
14
4ca2530f8be1 stub for putting stylesheets and includes on templates"
k0s <k0scist@gmail.com>
parents: 13
diff changeset
145 data['include'] = None
4ca2530f8be1 stub for putting stylesheets and includes on templates"
k0s <k0scist@gmail.com>
parents: 13
diff changeset
146 data['css'] = ()
33
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
147 data['scripts'] = ()
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
148 data['icon'] = None
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
149
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
150 # apply formatters
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
151 # XXX this should be cached if not self.auto_reload
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
152 if '/formatters' in conf:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
153 # ordered list of formatters to be applied first
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
154 formatters = [ i for i in conf['/formatters'].split()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
155 if i in self.formatters ]
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
156 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
157 formatters = []
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
158 for key in conf:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
159 if key.startswith('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
160 key = key[1:]
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
161 if key in self.formatters and key not in formatters:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
162 formatters.append(key)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
163 for name in formatters:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
164 formatter = self.formatters[name](conf.get('/%s' % name, ''))
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
165 formatter(request, data)
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
166
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
167 # return an alternate format if specified
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
168 # decoupage.formats should return a 2-tuple:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
169 # (content_type, body)
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
170 if 'format' in request.GET:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
171 format_name = request.GET['format']
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
172 if format_name in self.formats:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
173 function = self.formats[format_name]
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
174 content_type, body = function(data)
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
175 return Response(content_type=content_type, body=body)
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
176
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
177 # render the template
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
178 template = conf.get('/template')
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
179 local_index = False
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
180 if template is None:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
181 if 'index.html' in [ f['name'] for f in files ]:
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
182 local_index = os.path.join(directory, 'index.html')
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
183 template = local_index
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
184 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
185 template = self.template
13
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
186 else:
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
187 if not os.path.isabs(template):
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
188 _template = os.path.join(directory, template)
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
189 if os.path.exists(_template):
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
190 template = _template
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
191 else:
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
192 for directory in self.template_directories:
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
193 if template in os.listdir(directory):
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
194 break
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
195 else:
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
196 raise IOError("template %s not found" % template)
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
197 try:
21
64ae0d2f402b fix breakages
egj@egj-laptop
parents: 20
diff changeset
198 template = self.loader.load(template)
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
199 res = template.generate(**data).render('html', doctype='html')
43
8621a6e2fe38 actual sane error handling that human beings can read and decipher
Jeff Hammel <jhammel@mozilla.com>
parents: 42
diff changeset
200 except (TemplateError, TemplateSyntaxError), e:
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
201 if local_index:
43
8621a6e2fe38 actual sane error handling that human beings can read and decipher
Jeff Hammel <jhammel@mozilla.com>
parents: 42
diff changeset
202 print repr(e)
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
203 return self.fileserver(local_index)
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
204 raise
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
205
48
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
206 # return response
25
d5775f3667a2 remove pointless get_response method
k0s <k0scist@gmail.com>
parents: 21
diff changeset
207 return Response(content_type='text/html', body=res)
d5775f3667a2 remove pointless get_response method
k0s <k0scist@gmail.com>
parents: 21
diff changeset
208
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
209
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
210 ### internal methods
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
211
52
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
212 def filedata(self, path, directory, conf=None):
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
213 conf = conf or {}
12
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
214 files = []
56
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
215
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
216 # get data for files
52
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
217 filenames = os.listdir(directory)
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
218 for i in filenames:
48
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
219 filepath = os.path.join(directory, i)
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
220 filetype = 'file'
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
221 if os.path.isdir(filepath):
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
222 filetype = 'directory'
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
223 modified = os.path.getmtime(filepath)
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
224 modified = datetime.fromtimestamp(modified)
56
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
225 data = {'path' : '%s/%s' % (path.rstrip('/'), i),
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
226 'name': i,
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
227 'modified': modified,
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
228 'type': filetype}
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
229 if filetype == 'file':
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
230 data['size'] = os.path.getsize(filepath)
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
231 files.append(data)
35
20e3d138dc98 better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents: 34
diff changeset
232
20e3d138dc98 better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents: 34
diff changeset
233 # TODO: deal with other links in conf
52
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
234 for i in conf:
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
235 if i in filenames or i.startswith('/'):
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
236 continue
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
237 if i.startswith('http://') or i.startswith('https://'):
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
238 files.append({'path': i,
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
239 'name': i,
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
240 'type': link})
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
241
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
242 for f in files:
a2f09d749a3f work towards refactor letting links (and maybe other things in the future) dwell in a decoupage namespace
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
243 f['description'] = conf.get(f['name'].lower(), None)
35
20e3d138dc98 better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents: 34
diff changeset
244
12
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
245 return files
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
246
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
247 def conf(self, path, cascade=None):
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
248 """returns configuration dictionary appropriate to a path"""
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
249 if cascade is None:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
250 cascase = self.cascade
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
251
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
252 directory = os.path.join(self.directory, path.strip('/'))
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
253 if path.strip('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
254 path_tuple = tuple(path.strip('/').split('/'))
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
255 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
256 path_tuple = ()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
257
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
258 # return cached configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
259 if hasattr(self, '_conf') and path_tuple in self._conf:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
260 return self._conf[path_tuple]
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
261
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
262 conf = {}
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
263
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
264 # local configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
265 ini_path = os.path.join(directory, 'index.ini')
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
266 if os.path.exists(ini_path):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
267 _conf = ConfigMunger(ini_path).dict()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
268 if len(_conf) == 1:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
269 conf = _conf[_conf.keys()[0]].copy()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
270
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
271 # global configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
272 if not conf and self.configuration and os.path.exists(self.configuration):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
273 conf = ConfigMunger(self.configuration).dict().get('/%s' % path.rstrip('/'), {})
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
274
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
275 # inherit and cascade configuration
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
276 inherit_directory = None
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
277 if '/inherit' in conf:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
278 inherit_directory = conf['/inherit']
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
279 elif self.cascade and path_tuple:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
280 inherit_directory = '/%s' % '/'.join(path_tuple[:-1])
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
281 if inherit_directory:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
282 parent_configuration = self.conf(inherit_directory)
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
283 for key, value in parent_configuration.items():
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
284 if key.startswith('/') and key not in conf:
26
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
285 conf[key] = value
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
286
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
287 # cache configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
288 if not self.auto_reload:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
289 if not hasattr(self, '_conf'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
290 self._conf = {}
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
291 self._conf[path_tuple] = conf
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
292
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
293 return conf
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
294
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
295 def fmtrs(self, path):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
296 formatters = []
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
297 for key, value in self.conf(path).items():
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
298 if key.startswith('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
299 key = key[1:]
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
300 if key in self.formatters:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
301 formatter = self.formatters[key](value)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
302
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
303
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
304 def app_conf(self, keystr, app_conf):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
305 keystr += '.'
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
306 return dict([(key.split(keystr, 1)[-1], value)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
307 for key, value in app_conf.items()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
308 if key.startswith(keystr) ])