annotate decoupage/web.py @ 70:262fb90a54b4

make template loading lenient and other fixes; bump version
author Jeff Hammel <jhammel@mozilla.com>
date Sat, 04 Aug 2012 15:55:52 -0700
parents 9fac58348520
children 12ee37017538
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
61
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
23 transformers = transformers()
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
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
63
9c570aed2246 move app_conf parsing logic to factory.py
Jeff Hammel <jhammel@mozilla.com>
parents: 61
diff changeset
36 def __init__(self, **kw):
0
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 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
40 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
41
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
42 # configure defaults
63
9c570aed2246 move app_conf parsing logic to factory.py
Jeff Hammel <jhammel@mozilla.com>
parents: 61
diff changeset
43 assert self.directory, "Decoupage: directory not specified"
0
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
61
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
54 self.fileserver = FileApp
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
63
9c570aed2246 move app_conf parsing logic to factory.py
Jeff Hammel <jhammel@mozilla.com>
parents: 61
diff changeset
57 s = 'format.'
9c570aed2246 move app_conf parsing logic to factory.py
Jeff Hammel <jhammel@mozilla.com>
parents: 61
diff changeset
58 _format_args = [ (i.split(s, 1)[-1], j) for i, j in kw.items()
59
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
59 if i.startswith(s) ]
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
60 format_args = {}
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
61 for i, j in _format_args:
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
62 assert i.count('.') == 1, 'Illegal string or something'
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
63 format_name, var_name = i.split('.')
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
64 format_args.setdefault(format_name, {})[var_name] = j
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
65 self.formats = {}
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
66 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
67 try:
59
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
68 _cls = _format.load()
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
69 _instance = _cls(self, **format_args.get(_format.name, {}))
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
70 except Exception, e:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
71 # record the error, but persist
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
72 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
73 print >> sys.stderr, e
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
74 continue
59
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
75 self.formats[_format.name] = _instance
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
76
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
77 # pluggable index data formatters
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
78 self.formatters = {}
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
79 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
80 try:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
81 _formatter = formatter.load()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
82 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
83 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
84 self.template_directories.append(template_dir)
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
85 except Exception, e:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
86 # record the error, but persist
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
87 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
88 print >> sts.stderr, e
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
89 continue
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
90 self.formatters[formatter.name] = _formatter
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
91
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
92 # template loader
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
93 self.loader = TemplateLoader(self.template_directories,
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
94 variable_lookup="lenient",
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
95 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
96
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
97
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
98
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
99 ### methods dealing with HTTP
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
100
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
101 def __call__(self, environ, start_response):
64
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
102
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
103 # boilerplate: request and filename
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
104 request = Request(environ)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
105 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
106 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
107
64
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
108 # check to see what we have to serve
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
109 if os.path.exists(path):
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
110
64
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
111 if os.path.isdir(path):
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
112 # serve an index
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
113 if request.path_info.endswith('/'):
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
114 res = self.get(request)
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
115 else:
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
116 res = exc.HTTPMovedPermanently(add_slash=True)
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
117 return res(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
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
119 else:
64
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
120 # serve a file
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
121 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
122 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
123 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
124 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
125 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
126 if i.startswith('/'):
61
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
127 name = i[1:]
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
128 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
129 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
130 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
131 else:
61
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
132 fileserver = self.fileserver
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
133
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
134 fileserver = fileserver(path)
2
041958c8c8f2 use paste.fileapp as the fileserver
k0s <k0scist@gmail.com>
parents: 0
diff changeset
135 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
136 else:
64
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
137 # file does not exist
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
138 response = exc.HTTPNotFound()
613ffeec2be5 return exceptions rather than just raise them; needed for wsgiref and who knows what other servers
Jeff Hammel <jhammel@mozilla.com>
parents: 63
diff changeset
139 return response(environ, start_response)
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
140
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
141
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
142 def get(self, request):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
143 """
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
144 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
145 """
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
146
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
147 # ensure a sane path
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
148 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
149 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
150 path = '/%s' % path
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
151
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
152 # get the configuraton
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
153 conf = self.conf(path)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
154
33
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
155 ### 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
156 # 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
157 files = self.filedata(path, directory, conf)
13
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
158 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
159
65
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
160 # add a function to get the path to files
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
161 data['filepath'] = lambda *segments: os.path.join(*([directory] + list(segments)))
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
162
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
163 # defaults
15
8923fda80bd4 misspelling
k0s <k0scist@gmail.com>
parents: 14
diff changeset
164 data['directory'] = directory
14
4ca2530f8be1 stub for putting stylesheets and includes on templates"
k0s <k0scist@gmail.com>
parents: 13
diff changeset
165 data['css'] = ()
33
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
166 data['scripts'] = ()
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
167
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
168 # apply formatters
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
169 # 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
170 if '/formatters' in conf:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
171 # 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
172 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
173 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
174 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
175 formatters = []
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
176 for key in conf:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
177 if key.startswith('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
178 key = key[1:]
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
179 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
180 formatters.append(key)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
181 for name in formatters:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
182 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
183 formatter(request, data)
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
184
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
185 # return an alternate format if specified
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
186 # decoupage.formats should return a 2-tuple:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
187 # (content_type, body)
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
188 if 'format' in request.GET:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
189 format_name = request.GET['format']
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
190 if format_name in self.formats:
59
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
191 _format = self.formats[format_name]
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
192 content_type, body = _format(request, data)
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
193 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
194
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
195 # render the template
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
196 template = conf.get('/template')
69
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
197 local_index = False
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
198 if template is None:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
199 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
200 local_index = os.path.join(directory, 'index.html')
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
201 template = local_index
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
202 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
203 template = self.template
13
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
204 else:
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
205 if not os.path.isabs(template):
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
206 _template = os.path.join(directory, template)
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
207 if os.path.exists(_template):
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
208 template = _template
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
209 else:
65
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
210 for _directory in self.template_directories:
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
211 if template in os.listdir(_directory):
13
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
212 break
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
213 else:
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
214 raise IOError("template %s not found" % template)
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
215 try:
21
64ae0d2f402b fix breakages
egj@egj-laptop
parents: 20
diff changeset
216 template = self.loader.load(template)
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
217 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
218 except (TemplateError, TemplateSyntaxError), e:
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
219 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
220 print repr(e)
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
221 return self.fileserver(local_index)
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
222 raise
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
223
48
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
224 # return response
25
d5775f3667a2 remove pointless get_response method
k0s <k0scist@gmail.com>
parents: 21
diff changeset
225 return Response(content_type='text/html', body=res)
d5775f3667a2 remove pointless get_response method
k0s <k0scist@gmail.com>
parents: 21
diff changeset
226
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
227
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
228 ### internal methods
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
229
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
230 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
231 conf = conf or {}
12
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
232 files = []
56
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
233
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
234 # 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
235 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
236 for i in filenames:
48
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
237 filepath = os.path.join(directory, i)
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
238 filetype = 'file'
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
239 if os.path.isdir(filepath):
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
240 filetype = 'directory'
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
241 modified = os.path.getmtime(filepath)
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
242 modified = datetime.fromtimestamp(modified)
56
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
243 data = {'path' : '%s/%s' % (path.rstrip('/'), i),
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
244 'name': i,
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
245 'modified': modified,
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
246 'type': filetype}
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
247 if filetype == 'file':
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
248 data['size'] = os.path.getsize(filepath)
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
249 files.append(data)
69
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
250
35
20e3d138dc98 better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents: 34
diff changeset
251 # 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
252 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
253 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
254 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
255 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
256 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
257 '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
258 'type': link})
69
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
259
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
260 for f in files:
61
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
261 f['description'] = conf.get(f['name'], None)
35
20e3d138dc98 better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents: 34
diff changeset
262
12
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
263 return files
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
264
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
265 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
266 """returns configuration dictionary appropriate to a path"""
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
267 if cascade is None:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
268 cascase = self.cascade
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
269
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
270 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
271 if path.strip('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
272 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
273 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
274 path_tuple = ()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
275
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
276 # return cached configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
277 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
278 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
279
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
280 conf = {}
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
281
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
282 # local configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
283 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
284 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
285 _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
286 if len(_conf) == 1:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
287 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
288
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
289 # global configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
290 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
291 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
292
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
293 # inherit and cascade configuration
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
294 inherit_directory = None
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
295 if '/inherit' in conf:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
296 inherit_directory = conf['/inherit']
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
297 elif self.cascade and path_tuple:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
298 inherit_directory = '/%s' % '/'.join(path_tuple[:-1])
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
299 if inherit_directory:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
300 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
301 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
302 if key.startswith('/') and key not in conf:
69
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
303 conf[key] = value
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
304
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
305 # cache configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
306 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
307 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
308 self._conf = {}
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
309 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
310
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
311 return conf
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
312
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
313 def fmtrs(self, path):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
314 formatters = []
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
315 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
316 if key.startswith('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
317 key = key[1:]
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
318 if key in self.formatters:
69
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
319 formatter = self.formatters[key](value)
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
320