Mercurial > hg > decoupage
comparison 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 |
comparison
equal
deleted
inserted
replaced
69:9fac58348520 | 70:262fb90a54b4 |
---|---|
71 # record the error, but persist | 71 # record the error, but persist |
72 print >> sys.stderr, "Couldn't load format: %s" % _format | 72 print >> sys.stderr, "Couldn't load format: %s" % _format |
73 print >> sys.stderr, e | 73 print >> sys.stderr, e |
74 continue | 74 continue |
75 self.formats[_format.name] = _instance | 75 self.formats[_format.name] = _instance |
76 | 76 |
77 # pluggable index data formatters | 77 # pluggable index data formatters |
78 self.formatters = {} | 78 self.formatters = {} |
79 for formatter in iter_entry_points('decoupage.formatters'): | 79 for formatter in iter_entry_points('decoupage.formatters'): |
80 try: | 80 try: |
81 _formatter = formatter.load() | 81 _formatter = formatter.load() |
84 self.template_directories.append(template_dir) | 84 self.template_directories.append(template_dir) |
85 except Exception, e: | 85 except Exception, e: |
86 # record the error, but persist | 86 # record the error, but persist |
87 print >> sys.stderr, "Couldn't load formatter: %s" % formatter | 87 print >> sys.stderr, "Couldn't load formatter: %s" % formatter |
88 print >> sts.stderr, e | 88 print >> sts.stderr, e |
89 continue | 89 continue |
90 self.formatters[formatter.name] = _formatter | 90 self.formatters[formatter.name] = _formatter |
91 | 91 |
92 # template loader | 92 # template loader |
93 self.loader = TemplateLoader(self.template_directories, | 93 self.loader = TemplateLoader(self.template_directories, |
94 variable_lookup="lenient", | |
94 auto_reload=self.auto_reload) | 95 auto_reload=self.auto_reload) |
95 | 96 |
96 | 97 |
97 | 98 |
98 ### methods dealing with HTTP | 99 ### methods dealing with HTTP |
99 | 100 |
100 def __call__(self, environ, start_response): | 101 def __call__(self, environ, start_response): |
101 | 102 |
102 # boilerplate: request and filename | 103 # boilerplate: request and filename |
103 request = Request(environ) | 104 request = Request(environ) |
104 filename = request.path_info.strip('/') | 105 filename = request.path_info.strip('/') |
105 path = os.path.join(self.directory, filename) | 106 path = os.path.join(self.directory, filename) |
106 | 107 |
107 # check to see what we have to serve | 108 # check to see what we have to serve |
108 if os.path.exists(path): | 109 if os.path.exists(path): |
109 | 110 |
110 if os.path.isdir(path): | 111 if os.path.isdir(path): |
111 # serve an index | 112 # serve an index |
112 if request.path_info.endswith('/'): | 113 if request.path_info.endswith('/'): |
113 res = self.get(request) | 114 res = self.get(request) |
114 else: | 115 else: |
127 if name in transformers: | 128 if name in transformers: |
128 kwargs[name] = dict([j.split('=', 1) for j in conf[i].split(',') if '=' in j]) | 129 kwargs[name] = dict([j.split('=', 1) for j in conf[i].split(',') if '=' in j]) |
129 fileserver = FileTypeTransformer(*args, **kwargs) | 130 fileserver = FileTypeTransformer(*args, **kwargs) |
130 else: | 131 else: |
131 fileserver = self.fileserver | 132 fileserver = self.fileserver |
132 | 133 |
133 fileserver = fileserver(path) | 134 fileserver = fileserver(path) |
134 return fileserver(environ, start_response) | 135 return fileserver(environ, start_response) |
135 else: | 136 else: |
136 # file does not exist | 137 # file does not exist |
137 response = exc.HTTPNotFound() | 138 response = exc.HTTPNotFound() |
140 | 141 |
141 def get(self, request): | 142 def get(self, request): |
142 """ | 143 """ |
143 return response to a GET requst | 144 return response to a GET requst |
144 """ | 145 """ |
145 | 146 |
146 # ensure a sane path | 147 # ensure a sane path |
147 path = request.path_info.strip('/') | 148 path = request.path_info.strip('/') |
148 directory = os.path.join(self.directory, path) | 149 directory = os.path.join(self.directory, path) |
149 path = '/%s' % path | 150 path = '/%s' % path |
150 | 151 |
151 # get the configuraton | 152 # get the configuraton |
152 conf = self.conf(path) | 153 conf = self.conf(path) |
153 | 154 |
154 ### build data dictionary | 155 ### build data dictionary |
155 # TODO: separate these out into several formatters | 156 # TODO: separate these out into several formatters |
157 data = {'path': path, 'files': files, 'request': request } | 158 data = {'path': path, 'files': files, 'request': request } |
158 | 159 |
159 # add a function to get the path to files | 160 # add a function to get the path to files |
160 data['filepath'] = lambda *segments: os.path.join(*([directory] + list(segments))) | 161 data['filepath'] = lambda *segments: os.path.join(*([directory] + list(segments))) |
161 | 162 |
162 # defaults; TODO: make this better | 163 # defaults |
163 # there shouldn't need to be defaults; | |
164 # iirc, genshi has a mode where these will default to None | |
165 data['title'] = conf.get('/title') | |
166 data['directory'] = directory | 164 data['directory'] = directory |
167 data['include'] = None | |
168 data['css'] = () | 165 data['css'] = () |
169 data['scripts'] = () | 166 data['scripts'] = () |
170 data['icon'] = None | |
171 | 167 |
172 # apply formatters | 168 # apply formatters |
173 # XXX this should be cached if not self.auto_reload | 169 # XXX this should be cached if not self.auto_reload |
174 if '/formatters' in conf: | 170 if '/formatters' in conf: |
175 # ordered list of formatters to be applied first | 171 # ordered list of formatters to be applied first |