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
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 """
87
ced29a73c561 decoupage/web.py
Jeff Hammel <k0scist@gmail.com>
parents: 85
diff changeset
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
c5895d87c65e lets get these ordered
Jeff Hammel <k0scist@gmail.com>
parents: 89
diff changeset
6
82
8596a1d97740 unicode
Jeff Hammel <jhammel@mozilla.com>
parents: 78
diff changeset
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
c5895d87c65e lets get these ordered
Jeff Hammel <k0scist@gmail.com>
parents: 89
diff changeset
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
c5895d87c65e lets get these ordered
Jeff Hammel <k0scist@gmail.com>
parents: 89
diff changeset
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
Jeff Hammel <k0scist@gmail.com>
parents: 107
diff changeset
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
64ae0d2f402b fix breakages
egj@egj-laptop
parents: 20
diff changeset
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
041958c8c8f2 use paste.fileapp as the fileserver
k0s <k0scist@gmail.com>
parents: 0
diff changeset
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
Jeff Hammel <k0scist@gmail.com>
parents: 107
diff changeset
35 from .formatters import formatters
101
747c7e337c56 add local directory for template rendering
Jeff Hammel <k0scist@gmail.com>
parents: 100
diff changeset
36
61
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
37 transformers = transformers()
111
Jeff Hammel <k0scist@gmail.com>
parents: 110
diff changeset
38
Jeff Hammel <k0scist@gmail.com>
parents: 110
diff changeset
39 try:
Jeff Hammel <k0scist@gmail.com>
parents: 110
diff changeset
40 # python2
Jeff Hammel <k0scist@gmail.com>
parents: 110
diff changeset
41 string = (str, unicode)
Jeff Hammel <k0scist@gmail.com>
parents: 110
diff changeset
42 except NameError:
Jeff Hammel <k0scist@gmail.com>
parents: 110
diff changeset
43 # python3
Jeff Hammel <k0scist@gmail.com>
parents: 110
diff changeset
44 string = (str,)
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
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
21273cdb2047 minor polish
Jeff Hammel <k0scist@gmail.com>
parents: 92
diff changeset
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
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
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
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
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
8596a1d97740 unicode
Jeff Hammel <jhammel@mozilla.com>
parents: 78
diff changeset
66 'template_directories': '', # list of directories to look for templates
8596a1d97740 unicode
Jeff Hammel <jhammel@mozilla.com>
parents: 78
diff changeset
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
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
74 for key, default_value in self.defaults.items():
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
75
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
76 value = kw.get(key, default_value)
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
77
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
78 # handle non-string bools
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
79 if isinstance(default_value, bool) and isinstance(value, string):
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
80 value = {'true': True,
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
81 'false': False}[value.lower()]
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
82 # TODO: error handling for bad strings
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
83
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
84 setattr(self, key, value)
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents: 82
diff changeset
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
7db9d9b82a06 better error message
Jeff Hammel <jhammel@mozilla.com>
parents: 74
diff changeset
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
81607129a45e better error message
egj@socialplanning.org
parents: 21
diff changeset
92
81607129a45e better error message
egj@socialplanning.org
parents: 21
diff changeset
93 for directory in self.template_directories:
81607129a45e better error message
egj@socialplanning.org
parents: 21
diff changeset
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
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
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
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 101
diff changeset
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
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 101
diff changeset
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
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 101
diff changeset
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
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 101
diff changeset
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
21273cdb2047 minor polish
Jeff Hammel <k0scist@gmail.com>
parents: 92
diff changeset
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
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
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
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
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
041958c8c8f2 use paste.fileapp as the fileserver
k0s <k0scist@gmail.com>
parents: 0
diff changeset
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
21273cdb2047 minor polish
Jeff Hammel <k0scist@gmail.com>
parents: 92
diff changeset
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
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
206 # add a function to get the path to files
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
207 data['filepath'] = lambda *segments: os.path.join(*([directory] + list(segments)))
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
208
70
262fb90a54b4 make template loading lenient and other fixes; bump version
Jeff Hammel <jhammel@mozilla.com>
parents: 69
diff changeset
209 # defaults
15
8923fda80bd4 misspelling
k0s <k0scist@gmail.com>
parents: 14
diff changeset
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
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
215 formatters = self.get_formatters(path)
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
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
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
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
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
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
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
234 local_index = os.path.join(directory, 'index.html')
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
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
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
244 for _directory in self.template_directories:
ac1dc088e37e add inclusion template
Jeff Hammel <jhammel@mozilla.com>
parents: 64
diff changeset
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
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
252 try:
21
64ae0d2f402b fix breakages
egj@egj-laptop
parents: 20
diff changeset
253 template = self.loader.load(template)
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
254 res = template.generate(**data).render('html', doctype='html')
107
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 101
diff changeset
255 except (TemplateError, TemplateSyntaxError, TemplateNotFound) as e:
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
256 if local_index:
107
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 101
diff changeset
257 print (repr(e))
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
258 return self.fileserver(local_index)
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
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
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
262
82
8596a1d97740 unicode
Jeff Hammel <jhammel@mozilla.com>
parents: 78
diff changeset
263 # set charset if given
8596a1d97740 unicode
Jeff Hammel <jhammel@mozilla.com>
parents: 78
diff changeset
264 kw = {}
8596a1d97740 unicode
Jeff Hammel <jhammel@mozilla.com>
parents: 78
diff changeset
265 if self.charset:
8596a1d97740 unicode
Jeff Hammel <jhammel@mozilla.com>
parents: 78
diff changeset
266 kw['charset'] = self.charset
8596a1d97740 unicode
Jeff Hammel <jhammel@mozilla.com>
parents: 78
diff changeset
267
48
af73a3fda723 add more metadata to files: modification time, type
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
268 # return response
82
8596a1d97740 unicode
Jeff Hammel <jhammel@mozilla.com>
parents: 78
diff changeset
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
c5895d87c65e lets get these ordered
Jeff Hammel <k0scist@gmail.com>
parents: 89
diff changeset
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
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
292 try:
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
293 modified = os.path.getmtime(filepath)
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
294 except OSError:
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
295 # the file (mysteriously) may not exist by this time(!)
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
296 # File "/home/jhammel/web/src/decoupage/decoupage/web.py", line 114, in __call__
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
297 # res = self.get(request)
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
298 # File "/home/jhammel/web/src/decoupage/decoupage/web.py", line 162, in get
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
299 # files = self.filedata(path, directory, conf)
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
300 # File "/home/jhammel/web/src/decoupage/decoupage/web.py", line 246, in filedata
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
301 # modified = os.path.getmtime(filepath)
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
302 # File "/home/jhammel/web/lib/python2.6/genericpath.py", line 54, in getmtime
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
303 # return os.stat(filename).st_mtime
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
304 # 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
305 continue # wt{h,f}???
Jeff Hammel <jhammel@mozilla.com>
parents: 75
diff changeset
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
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
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
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
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
f5ca54558292 remove previous hacks
Jeff Hammel <jhammel@mozilla.com>
parents: 59
diff changeset
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
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
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
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
338 if cascade is None:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
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
c5895d87c65e lets get these ordered
Jeff Hammel <k0scist@gmail.com>
parents: 89
diff changeset
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
Jeff Hammel <k0scist@gmail.com>
parents: 111
diff changeset
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
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
364 # inherit and cascade configuration
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
365 inherit_directory = None
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
366 if '/inherit' in conf:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
367 inherit_directory = conf['/inherit']
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
368 elif self.cascade and path_tuple:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
369 inherit_directory = '/%s' % '/'.join(path_tuple[:-1])
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
370 if inherit_directory:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
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
9fac58348520 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
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
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
384 def get_formatters(self, path):
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
385 """return formatters for a path"""
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
386 retval = []
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
387 conf = self.conf(path)
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
388 # apply formatters
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
389 # XXX this should be cached if not self.auto_reload
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
390 if '/formatters' in conf:
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
391 # ordered list of formatters to be applied first
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
392 formatters = [ i for i in conf['/formatters'].split()
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
393 if i in self.formatters ]
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
394 else:
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
395 formatters = []
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
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
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
399 if key in self.formatters and key not in formatters:
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
400 formatters.append(key)
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
401 for name in formatters:
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
402 retval.append(self.formatters[name](conf.get('/%s' % name, '')))
89
fca150947fb1 STUB: decoupage/web.py
Jeff Hammel <k0scist@gmail.com>
parents: 87
diff changeset
403 return retval