Mercurial > hg > decoupage
annotate decoupage/web.py @ 113:cc54fa8065c5 default tip
py3
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Wed, 25 Nov 2020 10:52:36 -0800 |
parents | fb4bdbfbce83 |
children |
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 """ |
87 | 2 decoupage: a dynamic file server |
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: |
92 | 6 |
82 | 7 # handle files with `#`s like like `#index.ini` |
78
5330cd62e179
something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents:
76
diff
changeset
|
8 # -> http://k0s.org/portfolio/ideas/#index.ini# |
5330cd62e179
something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents:
76
diff
changeset
|
9 # |
5330cd62e179
something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents:
76
diff
changeset
|
10 # oops. Handle it better |
5330cd62e179
something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents:
76
diff
changeset
|
11 # - either # is a magic hide character |
5330cd62e179
something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents:
76
diff
changeset
|
12 # - or you urlescape that guy |
5330cd62e179
something about hash marks in filenames
Jeff Hammel <jhammel@mozilla.com>
parents:
76
diff
changeset
|
13 |
92 | 14 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
15 import os |
43
8621a6e2fe38
actual sane error handling that human beings can read and decipher
Jeff Hammel <jhammel@mozilla.com>
parents:
42
diff
changeset
|
16 import sys |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
17 |
92 | 18 from collections import OrderedDict |
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
|
19 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
|
20 from contenttransformer.app import transformers |
48
af73a3fda723
add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents:
43
diff
changeset
|
21 from datetime import datetime |
110 | 22 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
23 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
|
24 from genshi.template import TemplateLoader |
21 | 25 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
|
26 from genshi.template.base import TemplateSyntaxError |
101
747c7e337c56
add local directory for template rendering
Jeff Hammel <k0scist@gmail.com>
parents:
100
diff
changeset
|
27 from genshi.template.loader import TemplateNotFound |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
28 from martini.config import ConfigMunger |
2 | 29 from paste.fileapp import FileApp |
49
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
30 from pkg_resources import iter_entry_points |
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
31 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
|
32 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
|
33 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
|
34 |
110 | 35 from .formatters import formatters |
101
747c7e337c56
add local directory for template rendering
Jeff Hammel <k0scist@gmail.com>
parents:
100
diff
changeset
|
36 |
61 | 37 transformers = transformers() |
111 | 38 |
39 try: | |
40 # python2 | |
41 string = (str, unicode) | |
42 except NameError: | |
43 # python3 | |
44 string = (str,) | |
84 | 45 |
101
747c7e337c56
add local directory for template rendering
Jeff Hammel <k0scist@gmail.com>
parents:
100
diff
changeset
|
46 |
100
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
47 class FileSorter(object): |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
48 def __init__(self, *keys): |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
49 self.keys = keys |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
50 def __call__(self, item): |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
51 try: |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
52 index = self.keys.index(item['name']) |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
53 except ValueError: |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
54 index = len(self.keys) |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
55 return (index, item['name'].lower(), item['name']) |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
56 |
96 | 57 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
58 class Decoupage(object): |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
59 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
60 ### class level variables |
84 | 61 defaults = { 'auto_reload': False, |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
62 'configuration': None, |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
63 'directory': None, # directory to serve |
84 | 64 'cascade': True, # whether to cascade configuration |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
65 'template': 'index.html', # XXX see below |
82 | 66 'template_directories': '', # list of directories to look for templates |
67 'charset': 'utf-8', # content encoding for index.html files; -> `Content-Type: text/html; charset=ISO-8859-1` | |
100
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
68 'file_sorter': FileSorter |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
69 } |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
70 |
63
9c570aed2246
move app_conf parsing logic to factory.py
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
71 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
|
72 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
73 # set defaults from app configuration |
84 | 74 for key, default_value in self.defaults.items(): |
75 | |
76 value = kw.get(key, default_value) | |
77 | |
78 # handle non-string bools | |
79 if isinstance(default_value, bool) and isinstance(value, string): | |
80 value = {'true': True, | |
81 'false': False}[value.lower()] | |
82 # TODO: error handling for bad strings | |
83 | |
84 setattr(self, key, value) | |
85 | |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
86 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
87 # configure defaults |
63
9c570aed2246
move app_conf parsing logic to factory.py
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
88 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
|
89 self.directory = self.directory.rstrip(os.path.sep) |
75 | 90 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
|
91 self.template_directories = self.template_directories.split() # no spaces in directory names, for now |
30 | 92 |
93 for directory in self.template_directories: | |
94 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
|
95 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
96 # static file server |
61 | 97 self.fileserver = FileApp |
49
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
98 |
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
99 # pluggable formats |
63
9c570aed2246
move app_conf parsing logic to factory.py
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
100 s = 'format.' |
9c570aed2246
move app_conf parsing logic to factory.py
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
101 _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
|
102 if i.startswith(s) ] |
07cf168aa98c
make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents:
56
diff
changeset
|
103 format_args = {} |
07cf168aa98c
make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents:
56
diff
changeset
|
104 for i, j in _format_args: |
07cf168aa98c
make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents:
56
diff
changeset
|
105 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
|
106 format_name, var_name = i.split('.') |
07cf168aa98c
make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents:
56
diff
changeset
|
107 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
|
108 self.formats = {} |
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
109 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
|
110 try: |
59
07cf168aa98c
make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents:
56
diff
changeset
|
111 _cls = _format.load() |
07cf168aa98c
make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents:
56
diff
changeset
|
112 _instance = _cls(self, **format_args.get(_format.name, {})) |
107 | 113 except Exception as e: |
49
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
114 # record the error, but persist |
107 | 115 sys.stderr.write("Couldn't load format: {}\n{}\n".format(_format, e)) |
49
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
116 continue |
59
07cf168aa98c
make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents:
56
diff
changeset
|
117 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
|
118 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
119 # pluggable index data formatters |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
120 self.formatters = {} |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
121 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
|
122 try: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
123 _formatter = formatter.load() |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
124 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
|
125 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
|
126 self.template_directories.append(template_dir) |
107 | 127 except Exception as e: |
49
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
128 # record the error, but persist |
107 | 129 sys.stderr.write("Couldn't load formatter: {}\n{}\n".format(formatter, e)) |
70
262fb90a54b4
make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents:
69
diff
changeset
|
130 continue |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
131 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
|
132 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
133 # template loader |
70
262fb90a54b4
make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents:
69
diff
changeset
|
134 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
|
135 variable_lookup="lenient", |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
136 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
|
137 |
70
262fb90a54b4
make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents:
69
diff
changeset
|
138 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
139 ### methods dealing with HTTP |
70
262fb90a54b4
make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents:
69
diff
changeset
|
140 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
141 def __call__(self, environ, start_response): |
96 | 142 """WSGI application""" |
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
|
143 |
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
|
144 # 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
|
145 request = Request(environ) |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
146 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
|
147 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
|
148 |
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
|
149 # 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
|
150 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
|
151 |
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 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
|
153 # 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
|
154 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
|
155 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
|
156 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
|
157 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
|
158 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
|
159 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
160 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
|
161 # 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
|
162 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
|
163 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
|
164 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
|
165 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
|
166 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
|
167 if i.startswith('/'): |
61 | 168 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
|
169 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
|
170 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
|
171 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
|
172 else: |
61 | 173 fileserver = self.fileserver |
70
262fb90a54b4
make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents:
69
diff
changeset
|
174 |
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
|
175 fileserver = fileserver(path) |
2 | 176 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
|
177 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
|
178 # file does not exist |
73
12ee37017538
introduce templated 404s; works, just doesnt do anything yet
Jeff Hammel <jhammel@mozilla.com>
parents:
70
diff
changeset
|
179 conf = self.conf('/') |
12ee37017538
introduce templated 404s; works, just doesnt do anything yet
Jeff Hammel <jhammel@mozilla.com>
parents:
70
diff
changeset
|
180 data = dict(request=request, |
12ee37017538
introduce templated 404s; works, just doesnt do anything yet
Jeff Hammel <jhammel@mozilla.com>
parents:
70
diff
changeset
|
181 title="Not Found") |
12ee37017538
introduce templated 404s; works, just doesnt do anything yet
Jeff Hammel <jhammel@mozilla.com>
parents:
70
diff
changeset
|
182 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
|
183 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
|
184 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
|
185 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
|
186 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
187 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
188 def get(self, request): |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
189 """ |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
190 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
|
191 """ |
70
262fb90a54b4
make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents:
69
diff
changeset
|
192 |
262fb90a54b4
make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents:
69
diff
changeset
|
193 # 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
|
194 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
|
195 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
|
196 path = '/%s' % path |
70
262fb90a54b4
make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents:
69
diff
changeset
|
197 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
198 # get the configuraton |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
199 conf = self.conf(path) |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
200 |
33
e384d4569ac3
include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents:
26
diff
changeset
|
201 ### 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
|
202 # 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
|
203 files = self.filedata(path, directory, conf) |
96 | 204 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
|
205 |
65 | 206 # add a function to get the path to files |
207 data['filepath'] = lambda *segments: os.path.join(*([directory] + list(segments))) | |
208 | |
70
262fb90a54b4
make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents:
69
diff
changeset
|
209 # defaults |
15 | 210 data['directory'] = directory |
14
4ca2530f8be1
stub for putting stylesheets and includes on templates"
k0s <k0scist@gmail.com>
parents:
13
diff
changeset
|
211 data['css'] = () |
33
e384d4569ac3
include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents:
26
diff
changeset
|
212 data['scripts'] = () |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
213 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
214 # apply formatters |
85 | 215 formatters = self.get_formatters(path) |
216 for formatter in formatters: | |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
217 formatter(request, data) |
10 | 218 |
49
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
219 # return an alternate format if specified |
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
220 # decoupage.formats should return a 2-tuple: |
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
221 # (content_type, body) |
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
222 if 'format' in request.GET: |
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
223 format_name = request.GET['format'] |
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
224 if format_name in self.formats: |
59
07cf168aa98c
make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents:
56
diff
changeset
|
225 _format = self.formats[format_name] |
07cf168aa98c
make formats classes that can take arguments
Jeff Hammel <jhammel@mozilla.com>
parents:
56
diff
changeset
|
226 content_type, body = _format(request, data) |
49
ac693b8df32c
add idea of formats and json format
Jeff Hammel <jhammel@mozilla.com>
parents:
48
diff
changeset
|
227 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
|
228 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
229 # render the template |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
230 template = conf.get('/template') |
69 | 231 local_index = False |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
232 if template is None: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
233 if 'index.html' in [ f['name'] for f in files ]: |
20 | 234 local_index = os.path.join(directory, 'index.html') |
235 template = local_index | |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
236 else: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
237 template = self.template |
13
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
238 else: |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
239 if not os.path.isabs(template): |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
240 _template = os.path.join(directory, template) |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
241 if os.path.exists(_template): |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
242 template = _template |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
243 else: |
65 | 244 for _directory in self.template_directories: |
245 if template in os.listdir(_directory): | |
13
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
246 break |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
247 else: |
101
747c7e337c56
add local directory for template rendering
Jeff Hammel <k0scist@gmail.com>
parents:
100
diff
changeset
|
248 raise TemplateNotFound("template %s not found" % template) |
747c7e337c56
add local directory for template rendering
Jeff Hammel <k0scist@gmail.com>
parents:
100
diff
changeset
|
249 |
747c7e337c56
add local directory for template rendering
Jeff Hammel <k0scist@gmail.com>
parents:
100
diff
changeset
|
250 # extend template `search_path` to include local directory |
747c7e337c56
add local directory for template rendering
Jeff Hammel <k0scist@gmail.com>
parents:
100
diff
changeset
|
251 self.loader.search_path.insert(0, directory) |
20 | 252 try: |
21 | 253 template = self.loader.load(template) |
20 | 254 res = template.generate(**data).render('html', doctype='html') |
107 | 255 except (TemplateError, TemplateSyntaxError, TemplateNotFound) as e: |
20 | 256 if local_index: |
107 | 257 print (repr(e)) |
20 | 258 return self.fileserver(local_index) |
259 raise | |
101
747c7e337c56
add local directory for template rendering
Jeff Hammel <k0scist@gmail.com>
parents:
100
diff
changeset
|
260 finally: |
747c7e337c56
add local directory for template rendering
Jeff Hammel <k0scist@gmail.com>
parents:
100
diff
changeset
|
261 self.loader.search_path.pop(0) |
20 | 262 |
82 | 263 # set charset if given |
264 kw = {} | |
265 if self.charset: | |
266 kw['charset'] = self.charset | |
267 | |
48
af73a3fda723
add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents:
43
diff
changeset
|
268 # return response |
82 | 269 return Response(content_type='text/html', body=res, **kw) |
25
d5775f3667a2
remove pointless get_response method
k0s <k0scist@gmail.com>
parents:
21
diff
changeset
|
270 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
271 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
272 ### internal methods |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
273 |
100
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
274 def file_sort_key(filename, keys): |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
275 try: |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
276 index = keys.index(filename) |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
277 except ValueError: |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
278 index = len(keys) |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
279 return (index, filename.lower(), filename) |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
280 |
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
|
281 def filedata(self, path, directory, conf=None): |
92 | 282 conf = conf or OrderedDict() |
12
9f91acf9874c
* split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents:
10
diff
changeset
|
283 files = [] |
56
0cc1af24602b
dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents:
52
diff
changeset
|
284 |
0cc1af24602b
dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents:
52
diff
changeset
|
285 # 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
|
286 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
|
287 for i in filenames: |
48
af73a3fda723
add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents:
43
diff
changeset
|
288 filepath = os.path.join(directory, i) |
af73a3fda723
add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents:
43
diff
changeset
|
289 filetype = 'file' |
af73a3fda723
add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents:
43
diff
changeset
|
290 if os.path.isdir(filepath): |
af73a3fda723
add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents:
43
diff
changeset
|
291 filetype = 'directory' |
76 | 292 try: |
293 modified = os.path.getmtime(filepath) | |
294 except OSError: | |
295 # the file (mysteriously) may not exist by this time(!) | |
296 # File "/home/jhammel/web/src/decoupage/decoupage/web.py", line 114, in __call__ | |
297 # res = self.get(request) | |
298 # File "/home/jhammel/web/src/decoupage/decoupage/web.py", line 162, in get | |
299 # files = self.filedata(path, directory, conf) | |
300 # File "/home/jhammel/web/src/decoupage/decoupage/web.py", line 246, in filedata | |
301 # modified = os.path.getmtime(filepath) | |
302 # File "/home/jhammel/web/lib/python2.6/genericpath.py", line 54, in getmtime | |
303 # return os.stat(filename).st_mtime | |
304 # OSError: [Errno 2] No such file or directory: '/home/jhammel/web/site/portfolio/ideas/.#index.ini' | |
305 continue # wt{h,f}??? | |
306 | |
48
af73a3fda723
add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents:
43
diff
changeset
|
307 modified = datetime.fromtimestamp(modified) |
56
0cc1af24602b
dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents:
52
diff
changeset
|
308 data = {'path' : '%s/%s' % (path.rstrip('/'), i), |
0cc1af24602b
dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents:
52
diff
changeset
|
309 'name': i, |
0cc1af24602b
dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents:
52
diff
changeset
|
310 'modified': modified, |
0cc1af24602b
dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents:
52
diff
changeset
|
311 'type': filetype} |
0cc1af24602b
dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents:
52
diff
changeset
|
312 if filetype == 'file': |
0cc1af24602b
dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents:
52
diff
changeset
|
313 data['size'] = os.path.getsize(filepath) |
0cc1af24602b
dont show size for directories
Jeff Hammel <jhammel@mozilla.com>
parents:
52
diff
changeset
|
314 files.append(data) |
69 | 315 |
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
|
316 for i in conf: |
98
abf23c2e4e82
make sure all hashes are ordered
Jeff Hammel <k0scist@gmail.com>
parents:
96
diff
changeset
|
317 |
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
|
318 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
|
319 continue |
100
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
320 # TODO: deal with other links in conf; |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
321 # this actually doesn't work because the ':' is magical to .ini 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
|
322 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
|
323 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
|
324 '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
|
325 'type': link}) |
69 | 326 |
100
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
327 # TODO: sort files |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
328 files = sorted(files, key=self.file_sorter(*conf.keys())) |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
329 |
82ee67b95a0c
sort by index order now works
Jeff Hammel <k0scist@gmail.com>
parents:
98
diff
changeset
|
330 # get the description |
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
|
331 for f in files: |
61 | 332 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
|
333 |
12
9f91acf9874c
* split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents:
10
diff
changeset
|
334 return files |
9f91acf9874c
* split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents:
10
diff
changeset
|
335 |
10 | 336 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
|
337 """returns configuration dictionary appropriate to a path""" |
10 | 338 if cascade is None: |
339 cascase = self.cascade | |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
340 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
341 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
|
342 if path.strip('/'): |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
343 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
|
344 else: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
345 path_tuple = () |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
346 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
347 # return cached configuration |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
348 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
|
349 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
|
350 |
92 | 351 conf = OrderedDict() |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
352 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
353 # local configuration |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
354 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
|
355 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
|
356 _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
|
357 if len(_conf) == 1: |
112 | 358 conf = _conf[list(_conf.keys())[0]].copy() |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
359 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
360 # global configuration |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
361 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
|
362 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
|
363 |
10 | 364 # inherit and cascade configuration |
365 inherit_directory = None | |
366 if '/inherit' in conf: | |
367 inherit_directory = conf['/inherit'] | |
368 elif self.cascade and path_tuple: | |
369 inherit_directory = '/%s' % '/'.join(path_tuple[:-1]) | |
370 if inherit_directory: | |
371 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
|
372 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
|
373 if key.startswith('/') and key not in conf: |
69 | 374 conf[key] = value |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
375 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
376 # cache configuration |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
377 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
|
378 if not hasattr(self, '_conf'): |
98
abf23c2e4e82
make sure all hashes are ordered
Jeff Hammel <k0scist@gmail.com>
parents:
96
diff
changeset
|
379 self._conf = OrderedDict() |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
380 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
|
381 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
382 return conf |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
383 |
85 | 384 def get_formatters(self, path): |
385 """return formatters for a path""" | |
386 retval = [] | |
387 conf = self.conf(path) | |
388 # apply formatters | |
389 # XXX this should be cached if not self.auto_reload | |
390 if '/formatters' in conf: | |
391 # ordered list of formatters to be applied first | |
392 formatters = [ i for i in conf['/formatters'].split() | |
393 if i in self.formatters ] | |
394 else: | |
395 formatters = [] | |
396 for key in conf: | |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
397 if key.startswith('/'): |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
398 key = key[1:] |
85 | 399 if key in self.formatters and key not in formatters: |
400 formatters.append(key) | |
401 for name in formatters: | |
402 retval.append(self.formatters[name](conf.get('/%s' % name, ''))) | |
89 | 403 return retval |