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