annotate decoupage/web.py @ 78:5330cd62e179

something about hash marks in filenames
author Jeff Hammel <jhammel@mozilla.com>
date Tue, 16 Apr 2013 00:45:31 -0700
parents 1892ac35e9c8
children 8596a1d97740
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
78
5330cd62e179 something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents: 76
diff changeset
5 # TODO:
5330cd62e179 something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents: 76
diff changeset
6 # files like `index.ini`
5330cd62e179 something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents: 76
diff changeset
7 # -> http://k0s.org/portfolio/ideas/#index.ini#
5330cd62e179 something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents: 76
diff changeset
8 #
5330cd62e179 something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents: 76
diff changeset
9 # oops. Handle it better
5330cd62e179 something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents: 76
diff changeset
10 # - either # is a magic hide character
5330cd62e179 something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents: 76
diff changeset
11 # - or you urlescape that guy
5330cd62e179 something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents: 76
diff changeset
12
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
13 import os
43
8621a6e2fe38 actual sane error handling that human beings can read and decipher
Jeff Hammel <jhammel@mozilla.com>
parents: 42
diff changeset
14 import sys
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
15
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
16 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
17 from contenttransformer.app import transformers
48
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
18 from datetime import datetime
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
19 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
20 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
21 from genshi.template import TemplateLoader
21
64ae0d2f402b fix breakages
egj@egj-laptop
parents: 20
diff changeset
22 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
23 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
24 from martini.config import ConfigMunger
2
041958c8c8f2 use paste.fileapp as the fileserver
k0s <k0scist@gmail.com>
parents: 0
diff changeset
25 from paste.fileapp import FileApp
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
26 from pkg_resources import iter_entry_points
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
27 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
28 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
29 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
30
61
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
31 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
32
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
33 class Decoupage(object):
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 ### class level variables
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
36 defaults = { 'auto_reload': 'False',
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
37 'configuration': None,
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
38 '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
39 '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
40 '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
41 '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
42 }
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
43
63
9c570aed2246 move app_conf parsing logic to factory.py
Jeff Hammel <jhammel@mozilla.com>
parents: 61
diff changeset
44 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
45
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
46 # 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
47 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
48 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
49
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
50 # configure defaults
63
9c570aed2246 move app_conf parsing logic to factory.py
Jeff Hammel <jhammel@mozilla.com>
parents: 61
diff changeset
51 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
52 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
53 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
54 self.directory = self.directory.rstrip(os.path.sep)
75
7db9d9b82a06 better error message
Jeff Hammel <jhammel@mozilla.com>
parents: 74
diff changeset
55 assert os.path.isdir(self.directory), "'%s' is not a directory" % self.directory
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
56 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
57
81607129a45e better error message
egj@socialplanning.org
parents: 21
diff changeset
58 for directory in self.template_directories:
81607129a45e better error message
egj@socialplanning.org
parents: 21
diff changeset
59 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
60
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
61 # static file server
61
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
62 self.fileserver = FileApp
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
63
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
64 # pluggable formats
63
9c570aed2246 move app_conf parsing logic to factory.py
Jeff Hammel <jhammel@mozilla.com>
parents: 61
diff changeset
65 s = 'format.'
9c570aed2246 move app_conf parsing logic to factory.py
Jeff Hammel <jhammel@mozilla.com>
parents: 61
diff changeset
66 _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
67 if i.startswith(s) ]
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
68 format_args = {}
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
69 for i, j in _format_args:
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
70 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
71 format_name, var_name = i.split('.')
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
72 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
73 self.formats = {}
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
74 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
75 try:
59
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
76 _cls = _format.load()
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
77 _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
78 except Exception, e:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
79 # record the error, but persist
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
80 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
81 print >> sys.stderr, e
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
82 continue
59
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
83 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
84
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
85 # pluggable index data formatters
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
86 self.formatters = {}
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
87 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
88 try:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
89 _formatter = formatter.load()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
90 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
91 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
92 self.template_directories.append(template_dir)
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
93 except Exception, e:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
94 # record the error, but persist
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
95 print >> sys.stderr, "Couldn't load formatter: %s" % formatter
74
dd7d385e11ea error and bump
Jeff Hammel <jhammel@mozilla.com>
parents: 73
diff changeset
96 print >> sys.stderr, e
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
97 continue
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
98 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
99
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
100 # template loader
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
101 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
102 variable_lookup="lenient",
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
103 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
104
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
105
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
106
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
107 ### methods dealing with HTTP
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
108
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
109 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
110
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 # 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
112 request = Request(environ)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
113 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
114 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
115
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
116 # 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
117 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
118
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
119 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
120 # 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
121 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
122 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
123 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
124 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
125 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
126
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
127 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
128 # 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
129 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
130 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
131 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
132 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
133 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
134 if i.startswith('/'):
61
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
135 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
136 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
137 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
138 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
139 else:
61
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
140 fileserver = self.fileserver
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
141
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
142 fileserver = fileserver(path)
2
041958c8c8f2 use paste.fileapp as the fileserver
k0s <k0scist@gmail.com>
parents: 0
diff changeset
143 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
144 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
145 # file does not exist
73
12ee37017538 introduce templated 404s; works, just doesnt do anything yet
Jeff Hammel <jhammel@mozilla.com>
parents: 70
diff changeset
146 conf = self.conf('/')
12ee37017538 introduce templated 404s; works, just doesnt do anything yet
Jeff Hammel <jhammel@mozilla.com>
parents: 70
diff changeset
147 data = dict(request=request,
12ee37017538 introduce templated 404s; works, just doesnt do anything yet
Jeff Hammel <jhammel@mozilla.com>
parents: 70
diff changeset
148 title="Not Found")
12ee37017538 introduce templated 404s; works, just doesnt do anything yet
Jeff Hammel <jhammel@mozilla.com>
parents: 70
diff changeset
149 template = self.loader.load('HTTPNotFound.html')
12ee37017538 introduce templated 404s; works, just doesnt do anything yet
Jeff Hammel <jhammel@mozilla.com>
parents: 70
diff changeset
150 body = template.generate(**data).render('html', doctype='html')
12ee37017538 introduce templated 404s; works, just doesnt do anything yet
Jeff Hammel <jhammel@mozilla.com>
parents: 70
diff changeset
151 response = Response(content_type='text/html', body=body, status=404)
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
152 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
153
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
154
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
155 def get(self, request):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
156 """
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
157 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
158 """
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
159
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
160 # 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
161 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
162 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
163 path = '/%s' % path
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
164
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
165 # get the configuraton
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
166 conf = self.conf(path)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
167
33
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
168 ### 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
169 # 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
170 files = self.filedata(path, directory, conf)
13
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
171 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
172
65
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
173 # add a function to get the path to files
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
174 data['filepath'] = lambda *segments: os.path.join(*([directory] + list(segments)))
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
175
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
176 # defaults
15
8923fda80bd4 misspelling
k0s <k0scist@gmail.com>
parents: 14
diff changeset
177 data['directory'] = directory
14
4ca2530f8be1 stub for putting stylesheets and includes on templates"
k0s <k0scist@gmail.com>
parents: 13
diff changeset
178 data['css'] = ()
33
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
179 data['scripts'] = ()
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
180
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
181 # apply formatters
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
182 # 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
183 if '/formatters' in conf:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
184 # 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
185 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
186 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
187 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
188 formatters = []
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
189 for key in conf:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
190 if key.startswith('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
191 key = key[1:]
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
192 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
193 formatters.append(key)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
194 for name in formatters:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
195 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
196 formatter(request, data)
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
197
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
198 # return an alternate format if specified
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
199 # decoupage.formats should return a 2-tuple:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
200 # (content_type, body)
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
201 if 'format' in request.GET:
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
202 format_name = request.GET['format']
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
203 if format_name in self.formats:
59
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
204 _format = self.formats[format_name]
07cf168aa98c make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents: 56
diff changeset
205 content_type, body = _format(request, data)
49
ac693b8df32c add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents: 48
diff changeset
206 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
207
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
208 # render the template
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
209 template = conf.get('/template')
69
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
210 local_index = False
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
211 if template is None:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
212 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
213 local_index = os.path.join(directory, 'index.html')
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
214 template = local_index
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
215 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
216 template = self.template
13
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
217 else:
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
218 if not os.path.isabs(template):
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
219 _template = os.path.join(directory, template)
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
220 if os.path.exists(_template):
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
221 template = _template
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
222 else:
65
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
223 for _directory in self.template_directories:
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
224 if template in os.listdir(_directory):
13
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
225 break
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
226 else:
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
227 raise IOError("template %s not found" % template)
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
228 try:
21
64ae0d2f402b fix breakages
egj@egj-laptop
parents: 20
diff changeset
229 template = self.loader.load(template)
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
230 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
231 except (TemplateError, TemplateSyntaxError), e:
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
232 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
233 print repr(e)
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
234 return self.fileserver(local_index)
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
235 raise
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
236
48
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
237 # return response
25
d5775f3667a2 remove pointless get_response method
k0s <k0scist@gmail.com>
parents: 21
diff changeset
238 return Response(content_type='text/html', body=res)
d5775f3667a2 remove pointless get_response method
k0s <k0scist@gmail.com>
parents: 21
diff changeset
239
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
240
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
241 ### internal methods
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
242
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
243 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
244 conf = conf or {}
12
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
245 files = []
56
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
246
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
247 # 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
248 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
249 for i in filenames:
48
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
250 filepath = os.path.join(directory, i)
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
251 filetype = 'file'
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
252 if os.path.isdir(filepath):
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
253 filetype = 'directory'
76
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
254 try:
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
255 modified = os.path.getmtime(filepath)
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
256 except OSError:
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
257 # the file (mysteriously) may not exist by this time(!)
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
258 # File "/home/jhammel/web/src/decoupage/decoupage/web.py", line 114, in __call__
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
259 # res = self.get(request)
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
260 # File "/home/jhammel/web/src/decoupage/decoupage/web.py", line 162, in get
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
261 # files = self.filedata(path, directory, conf)
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
262 # File "/home/jhammel/web/src/decoupage/decoupage/web.py", line 246, in filedata
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
263 # modified = os.path.getmtime(filepath)
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
264 # File "/home/jhammel/web/lib/python2.6/genericpath.py", line 54, in getmtime
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
265 # return os.stat(filename).st_mtime
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
266 # OSError: [Errno 2] No such file or directory: '/home/jhammel/web/site/portfolio/ideas/.#index.ini'
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
267 continue # wt{h,f}???
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
268
48
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
269 modified = datetime.fromtimestamp(modified)
56
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
270 data = {'path' : '%s/%s' % (path.rstrip('/'), i),
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
271 'name': i,
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
272 'modified': modified,
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
273 'type': filetype}
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
274 if filetype == 'file':
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
275 data['size'] = os.path.getsize(filepath)
0cc1af24602b dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents: 52
diff changeset
276 files.append(data)
69
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
277
35
20e3d138dc98 better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents: 34
diff changeset
278 # 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
279 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
280 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
281 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
282 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
283 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
284 '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
285 'type': link})
69
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
286
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
287 for f in files:
61
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
288 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
289
12
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
290 return files
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
291
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
292 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
293 """returns configuration dictionary appropriate to a path"""
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
294 if cascade is None:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
295 cascase = self.cascade
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
296
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
297 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
298 if path.strip('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
299 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
300 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
301 path_tuple = ()
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 # return cached configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
304 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
305 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
306
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
307 conf = {}
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
308
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
309 # local configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
310 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
311 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
312 _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
313 if len(_conf) == 1:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
314 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
315
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
316 # global configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
317 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
318 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
319
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
320 # inherit and cascade configuration
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
321 inherit_directory = None
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
322 if '/inherit' in conf:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
323 inherit_directory = conf['/inherit']
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
324 elif self.cascade and path_tuple:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
325 inherit_directory = '/%s' % '/'.join(path_tuple[:-1])
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
326 if inherit_directory:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
327 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
328 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
329 if key.startswith('/') and key not in conf:
69
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
330 conf[key] = value
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
331
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
332 # cache configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
333 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
334 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
335 self._conf = {}
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
336 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
337
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
338 return conf
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
339
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
340 def fmtrs(self, path):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
341 formatters = []
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
342 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
343 if key.startswith('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
344 key = key[1:]
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
345 if key in self.formatters:
69
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
346 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
347